internal.c 1.1 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094
  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. */
  59. #ifdef EXTERNAL_OPTS_OPENVPN
  60. #error EXTERNAL_OPTS_OPENVPN should not be defined\
  61. when building wolfSSL
  62. #endif
  63. #ifndef WOLFCRYPT_ONLY
  64. #include <wolfssl/internal.h>
  65. #include <wolfssl/error-ssl.h>
  66. #include <wolfssl/wolfcrypt/asn.h>
  67. #include <wolfssl/wolfcrypt/dh.h>
  68. #ifdef NO_INLINE
  69. #include <wolfssl/wolfcrypt/misc.h>
  70. #else
  71. #define WOLFSSL_MISC_INCLUDED
  72. #include <wolfcrypt/src/misc.c>
  73. #endif
  74. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
  75. #include <wolfssl/wolfcrypt/srp.h>
  76. #endif
  77. #ifdef HAVE_LIBZ
  78. #include "zlib.h"
  79. #endif
  80. #ifdef HAVE_NTRU
  81. #include "libntruencrypt/ntru_crypto.h"
  82. #endif
  83. #ifdef WOLFSSL_QNX_CAAM
  84. /* included to get CAAM devId value */
  85. #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
  86. #endif
  87. #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
  88. defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
  89. #ifndef NO_STDIO_FILESYSTEM
  90. #ifdef FUSION_RTOS
  91. #include <fclstdio.h>
  92. #else
  93. #include <stdio.h>
  94. #endif
  95. #endif
  96. #endif
  97. #ifdef __sun
  98. #include <sys/filio.h>
  99. #endif
  100. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  101. #ifdef _MSC_VER
  102. /* disable for while(0) cases at the .c level for now */
  103. #pragma warning(disable:4127)
  104. #endif
  105. #if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
  106. #error \
  107. WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
  108. #endif
  109. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
  110. #error Cannot use both secure-renegotiation and renegotiation-indication
  111. #endif
  112. #ifndef WOLFSSL_NO_TLS12
  113. #ifndef NO_WOLFSSL_CLIENT
  114. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32*,
  115. word32);
  116. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input, word32*,
  117. word32);
  118. #ifndef NO_CERTS
  119. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*,
  120. word32);
  121. #endif
  122. #ifdef HAVE_SESSION_TICKET
  123. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32*,
  124. word32);
  125. #endif
  126. #endif
  127. #ifndef NO_WOLFSSL_SERVER
  128. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32*, word32);
  129. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  130. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  131. static int DoCertificateVerify(WOLFSSL* ssl, byte*, word32*, word32);
  132. #endif
  133. #ifdef WOLFSSL_DTLS
  134. static int SendHelloVerifyRequest(WOLFSSL*, const byte*, byte);
  135. #endif /* WOLFSSL_DTLS */
  136. #endif /* !NO_WOLFSSL_SERVER */
  137. #endif /* !WOLFSSL_NO_TLS12 */
  138. #ifndef NO_WOLFSSL_SERVER
  139. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  140. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx,
  141. TicketEncCbCtx* keyCtx);
  142. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx);
  143. static int DefTicketEncCb(WOLFSSL* ssl,
  144. byte key_name[WOLFSSL_TICKET_NAME_SZ],
  145. byte iv[WOLFSSL_TICKET_IV_SZ],
  146. byte mac[WOLFSSL_TICKET_MAC_SZ],
  147. int enc, byte* ticket, int inLen, int* outLen,
  148. void* userCtx);
  149. #endif
  150. #endif
  151. static int cipherExtraData(WOLFSSL* ssl);
  152. #ifdef WOLFSSL_DTLS
  153. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl);
  154. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl);
  155. #endif
  156. enum processReply {
  157. doProcessInit = 0,
  158. #ifndef NO_WOLFSSL_SERVER
  159. runProcessOldClientHello,
  160. #endif
  161. getRecordLayerHeader,
  162. getData,
  163. verifyEncryptedMessage,
  164. decryptMessage,
  165. verifyMessage,
  166. runProcessingOneMessage
  167. };
  168. #ifndef WOLFSSL_NO_TLS12
  169. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  170. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  171. static const byte tls13Downgrade[7] = {
  172. 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
  173. };
  174. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  175. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  176. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  177. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  178. int padSz, int content, int verify, int epochOrder);
  179. #endif
  180. #endif /* !WOLFSSL_NO_TLS12 */
  181. #ifdef HAVE_QSH
  182. int QSH_Init(WOLFSSL* ssl);
  183. #endif
  184. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  185. int tsip_useable(const WOLFSSL *ssl);
  186. int tsip_generatePremasterSecret();
  187. int tsip_generateEncryptPreMasterSecret(WOLFSSL *ssl, byte *out, word32 *outSz);
  188. #endif
  189. int IsTLS(const WOLFSSL* ssl)
  190. {
  191. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  192. return 1;
  193. return 0;
  194. }
  195. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  196. {
  197. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  198. return 1;
  199. #ifdef WOLFSSL_DTLS
  200. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  201. return 1;
  202. #endif
  203. return 0;
  204. }
  205. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  206. {
  207. return (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  208. }
  209. static WC_INLINE int IsEncryptionOn(WOLFSSL* ssl, int isSend)
  210. {
  211. #ifdef WOLFSSL_DTLS
  212. /* For DTLS, epoch 0 is always not encrypted. */
  213. if (ssl->options.dtls && !isSend && ssl->keys.curEpoch == 0)
  214. return 0;
  215. #endif /* WOLFSSL_DTLS */
  216. return ssl->keys.encryptionOn &&
  217. (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
  218. }
  219. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  220. /* If SCTP is not enabled returns the state of the dtls option.
  221. * If SCTP is enabled returns dtls && !sctp. */
  222. static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl)
  223. {
  224. #ifdef WOLFSSL_SCTP
  225. return ssl->options.dtls && !ssl->options.dtlsSctp;
  226. #else
  227. return ssl->options.dtls;
  228. #endif
  229. }
  230. #endif /* DTLS || !WOLFSSL_NO_TLS12 */
  231. #ifdef HAVE_QSH
  232. /* free all structs that where used with QSH */
  233. static int QSH_FreeAll(WOLFSSL* ssl)
  234. {
  235. QSHKey* key = ssl->QSH_Key;
  236. QSHKey* preKey = NULL;
  237. QSHSecret* secret = ssl->QSH_secret;
  238. QSHScheme* list = NULL;
  239. QSHScheme* preList = NULL;
  240. /* free elements in struct */
  241. while (key) {
  242. preKey = key;
  243. if (key->pri.buffer) {
  244. ForceZero(key->pri.buffer, key->pri.length);
  245. XFREE(key->pri.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  246. }
  247. if (key->pub.buffer)
  248. XFREE(key->pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  249. key = (QSHKey*)key->next;
  250. /* free struct */
  251. XFREE(preKey, ssl->heap, DYNAMIC_TYPE_QSH);
  252. }
  253. /* free all of peers QSH keys */
  254. key = ssl->peerQSHKey;
  255. while (key) {
  256. preKey = key;
  257. if (key->pri.buffer) {
  258. ForceZero(key->pri.buffer, key->pri.length);
  259. XFREE(key->pri.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  260. }
  261. if (key->pub.buffer)
  262. XFREE(key->pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  263. key = (QSHKey*)key->next;
  264. /* free struct */
  265. XFREE(preKey, ssl->heap, DYNAMIC_TYPE_QSH);
  266. }
  267. key = NULL;
  268. /* free secret information */
  269. if (secret) {
  270. /* free up the QSHScheme list in QSHSecret */
  271. if (secret->list)
  272. list = secret->list;
  273. while (list) {
  274. preList = list;
  275. if (list->PK)
  276. XFREE(list->PK, ssl->heap, DYNAMIC_TYPE_SECRET);
  277. list = (QSHScheme*)list->next;
  278. XFREE(preList, ssl->heap, DYNAMIC_TYPE_QSH);
  279. }
  280. /* free secret buffers */
  281. if (secret->SerSi) {
  282. if (secret->SerSi->buffer) {
  283. /* clear extra secret material that supplemented Master Secret*/
  284. ForceZero(secret->SerSi->buffer, secret->SerSi->length);
  285. XFREE(secret->SerSi->buffer, ssl->heap, DYNAMIC_TYPE_SECRET);
  286. }
  287. XFREE(secret->SerSi, ssl->heap, DYNAMIC_TYPE_SECRET);
  288. }
  289. if (secret->CliSi) {
  290. if (secret->CliSi->buffer) {
  291. /* clear extra secret material that supplemented Master Secret*/
  292. ForceZero(secret->CliSi->buffer, secret->CliSi->length);
  293. XFREE(secret->CliSi->buffer, ssl->heap, DYNAMIC_TYPE_SECRET);
  294. }
  295. XFREE(secret->CliSi, ssl->heap, DYNAMIC_TYPE_SECRET);
  296. }
  297. }
  298. XFREE(secret, ssl->heap, DYNAMIC_TYPE_QSH);
  299. secret = NULL;
  300. return 0;
  301. }
  302. #endif
  303. #ifdef HAVE_NTRU
  304. static WOLFSSL_GLOBAL WC_RNG* rng;
  305. static WOLFSSL_GLOBAL wolfSSL_Mutex* rngMutex;
  306. static word32 GetEntropy(unsigned char* out, word32 num_bytes)
  307. {
  308. int ret = 0;
  309. if (rng == NULL) {
  310. if ((rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), 0,
  311. DYNAMIC_TYPE_RNG)) == NULL)
  312. return DRBG_OUT_OF_MEMORY;
  313. wc_InitRng(rng);
  314. }
  315. if (rngMutex == NULL) {
  316. if ((rngMutex = (wolfSSL_Mutex*)XMALLOC(sizeof(wolfSSL_Mutex), 0,
  317. DYNAMIC_TYPE_MUTEX)) == NULL)
  318. return DRBG_OUT_OF_MEMORY;
  319. wc_InitMutex(rngMutex);
  320. }
  321. ret |= wc_LockMutex(rngMutex);
  322. ret |= wc_RNG_GenerateBlock(rng, out, num_bytes);
  323. ret |= wc_UnLockMutex(rngMutex);
  324. if (ret != 0)
  325. return DRBG_ENTROPY_FAIL;
  326. return DRBG_OK;
  327. }
  328. #endif /* HAVE_NTRU */
  329. #ifdef HAVE_LIBZ
  330. /* alloc user allocs to work with zlib */
  331. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  332. {
  333. (void)opaque;
  334. return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  335. }
  336. static void myFree(void* opaque, void* memory)
  337. {
  338. (void)opaque;
  339. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  340. }
  341. /* init zlib comp/decomp streams, 0 on success */
  342. static int InitStreams(WOLFSSL* ssl)
  343. {
  344. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  345. ssl->c_stream.zfree = (free_func)myFree;
  346. ssl->c_stream.opaque = (voidpf)ssl->heap;
  347. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  348. return ZLIB_INIT_ERROR;
  349. ssl->didStreamInit = 1;
  350. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  351. ssl->d_stream.zfree = (free_func)myFree;
  352. ssl->d_stream.opaque = (voidpf)ssl->heap;
  353. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  354. return 0;
  355. }
  356. static void FreeStreams(WOLFSSL* ssl)
  357. {
  358. if (ssl->didStreamInit) {
  359. deflateEnd(&ssl->c_stream);
  360. inflateEnd(&ssl->d_stream);
  361. }
  362. }
  363. /* compress in to out, return out size or error */
  364. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  365. {
  366. int err;
  367. int currTotal = (int)ssl->c_stream.total_out;
  368. ssl->c_stream.next_in = in;
  369. ssl->c_stream.avail_in = inSz;
  370. ssl->c_stream.next_out = out;
  371. ssl->c_stream.avail_out = outSz;
  372. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  373. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  374. return (int)ssl->c_stream.total_out - currTotal;
  375. }
  376. /* decompress in to out, return out size or error */
  377. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  378. {
  379. int err;
  380. int currTotal = (int)ssl->d_stream.total_out;
  381. ssl->d_stream.next_in = in;
  382. ssl->d_stream.avail_in = inSz;
  383. ssl->d_stream.next_out = out;
  384. ssl->d_stream.avail_out = outSz;
  385. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  386. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  387. return (int)ssl->d_stream.total_out - currTotal;
  388. }
  389. #endif /* HAVE_LIBZ */
  390. #ifdef WOLFSSL_SESSION_EXPORT
  391. #ifdef WOLFSSL_DTLS
  392. /* serializes the cipher specs struct for exporting */
  393. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  394. {
  395. word32 idx = 0;
  396. CipherSpecs* specs;
  397. WOLFSSL_ENTER("ExportCipherSpecState");
  398. if (exp == NULL || ssl == NULL) {
  399. return BAD_FUNC_ARG;
  400. }
  401. specs= &(ssl->specs);
  402. if (DTLS_EXPORT_SPC_SZ > len) {
  403. return BUFFER_E;
  404. }
  405. XMEMSET(exp, 0, DTLS_EXPORT_SPC_SZ);
  406. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  407. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  408. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  409. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  410. exp[idx++] = specs->bulk_cipher_algorithm;
  411. exp[idx++] = specs->cipher_type;
  412. exp[idx++] = specs->mac_algorithm;
  413. exp[idx++] = specs->kea;
  414. exp[idx++] = specs->sig_algo;
  415. exp[idx++] = specs->hash_size;
  416. exp[idx++] = specs->pad_size;
  417. exp[idx++] = specs->static_ecdh;
  418. if (idx != DTLS_EXPORT_SPC_SZ) {
  419. WOLFSSL_MSG("DTLS_EXPORT_SPC_SZ needs updated and export version");
  420. return DTLS_EXPORT_VER_E;
  421. }
  422. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  423. (void)ver;
  424. return idx;
  425. }
  426. /* serializes the key struct for exporting */
  427. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  428. byte small)
  429. {
  430. word32 idx = 0;
  431. byte sz;
  432. Keys* keys;
  433. WOLFSSL_ENTER("ExportKeyState");
  434. if (exp == NULL || ssl == NULL) {
  435. return BAD_FUNC_ARG;
  436. }
  437. keys = &(ssl->keys);
  438. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  439. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  440. return BUFFER_E;
  441. }
  442. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  443. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  444. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  445. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  446. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  447. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  448. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  449. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  450. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  451. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  452. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  453. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  454. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  455. c16toa(keys->dtls_peer_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  456. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  457. idx += OPAQUE16_LEN;
  458. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  459. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  460. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  461. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  462. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  463. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  464. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  465. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  466. exp[idx++] = keys->encryptionOn;
  467. exp[idx++] = keys->decryptedCur;
  468. /* from here on the buffer needs checked because is variable length that
  469. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  470. {
  471. word32 i;
  472. if ((OPAQUE16_LEN * 2) + idx +
  473. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  474. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  475. return BUFFER_E;
  476. }
  477. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  478. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  479. c32toa(keys->peerSeq[0].window[i], exp + idx);
  480. idx += OPAQUE32_LEN;
  481. }
  482. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  483. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  484. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  485. idx += OPAQUE32_LEN;
  486. }
  487. }
  488. if (idx >= len) {
  489. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  490. return BUFFER_E;
  491. }
  492. #ifdef HAVE_TRUNCATED_HMAC
  493. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  494. exp[idx++] = ssl->truncated_hmac;
  495. #else
  496. sz = ssl->specs.hash_size;
  497. exp[idx++] = 0; /* no truncated hmac */
  498. #endif
  499. sz = (small)? 0: sz;
  500. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  501. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  502. return BUFFER_E;
  503. }
  504. exp[idx++] = sz;
  505. if (sz > 0) {
  506. #ifndef WOLFSSL_AEAD_ONLY
  507. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  508. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  509. #else
  510. XMEMSET(exp + idx, 0, sz); idx += sz;
  511. XMEMSET(exp + idx, 0, sz); idx += sz;
  512. #endif
  513. }
  514. sz = (small)? 0: ssl->specs.key_size;
  515. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  516. WOLFSSL_MSG("Buffer not large enough for write key");
  517. return BUFFER_E;
  518. }
  519. exp[idx++] = sz;
  520. if (sz > 0) {
  521. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  522. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  523. }
  524. sz = (small)? 0: ssl->specs.iv_size;
  525. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  526. WOLFSSL_MSG("Buffer not large enough for IVs");
  527. return BUFFER_E;
  528. }
  529. exp[idx++] = sz;
  530. if (sz > 0) {
  531. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  532. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  533. }
  534. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  535. idx += AEAD_MAX_EXP_SZ;
  536. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  537. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  538. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  539. return BUFFER_E;
  540. }
  541. exp[idx++] = sz;
  542. if (sz > 0) {
  543. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  544. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  545. }
  546. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  547. if (idx > DTLS_EXPORT_KEY_SZ) {
  548. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  549. return DTLS_EXPORT_VER_E;
  550. }
  551. WOLFSSL_LEAVE("ExportKeyState", idx);
  552. (void)ver;
  553. return idx;
  554. }
  555. static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver)
  556. {
  557. word32 idx = 0;
  558. CipherSpecs* specs;
  559. WOLFSSL_ENTER("ImportCipherSpecState");
  560. if (exp == NULL || ssl == NULL) {
  561. return BAD_FUNC_ARG;
  562. }
  563. specs= &(ssl->specs);
  564. if (DTLS_EXPORT_SPC_SZ > len) {
  565. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  566. return BUFFER_E;
  567. }
  568. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  569. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  570. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  571. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  572. specs->bulk_cipher_algorithm = exp[idx++];
  573. specs->cipher_type = exp[idx++];
  574. specs->mac_algorithm = exp[idx++];
  575. specs->kea = exp[idx++];
  576. specs->sig_algo = exp[idx++];
  577. specs->hash_size = exp[idx++];
  578. specs->pad_size = exp[idx++];
  579. specs->static_ecdh = exp[idx++];
  580. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  581. (void)ver;
  582. return idx;
  583. }
  584. static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver)
  585. {
  586. word32 idx = 0;
  587. byte sz;
  588. Keys* keys;
  589. WOLFSSL_ENTER("ImportKeyState");
  590. if (exp == NULL || ssl == NULL) {
  591. return BAD_FUNC_ARG;
  592. }
  593. keys = &(ssl->keys);
  594. /* check minimum length -- includes byte used for size indicators */
  595. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  596. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  597. return BUFFER_E;
  598. }
  599. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  600. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  601. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  602. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  603. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  604. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  605. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  606. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  607. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  608. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  609. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  610. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  611. ato16(exp + idx, &keys->dtls_peer_handshake_number); idx += OPAQUE16_LEN;
  612. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  613. idx += OPAQUE16_LEN;
  614. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  615. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  616. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi); idx += OPAQUE16_LEN;
  617. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo); idx += OPAQUE32_LEN;
  618. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  619. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  620. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  621. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  622. keys->encryptionOn = exp[idx++];
  623. keys->decryptedCur = exp[idx++];
  624. {
  625. word16 i, wordCount, wordAdj = 0;
  626. /* do window */
  627. ato16(exp + idx, &wordCount);
  628. idx += OPAQUE16_LEN;
  629. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  630. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  631. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  632. }
  633. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  634. for (i = 0; i < wordCount; i++) {
  635. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  636. idx += OPAQUE32_LEN;
  637. }
  638. idx += wordAdj;
  639. /* do prevWindow */
  640. ato16(exp + idx, &wordCount);
  641. idx += OPAQUE16_LEN;
  642. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  643. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  644. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  645. }
  646. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  647. for (i = 0; i < wordCount; i++) {
  648. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  649. idx += OPAQUE32_LEN;
  650. }
  651. idx += wordAdj;
  652. }
  653. #ifdef HAVE_TRUNCATED_HMAC
  654. ssl->truncated_hmac = exp[idx++];
  655. #else
  656. idx++; /* no truncated hmac */
  657. #endif
  658. sz = exp[idx++];
  659. #ifndef WOLFSSL_AEAD_ONLY
  660. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  661. WOLFSSL_MSG("Buffer not large enough for MAC import");
  662. return BUFFER_E;
  663. }
  664. if (sz > 0) {
  665. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  666. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  667. }
  668. #else
  669. if (sz + idx > len) {
  670. return BUFFER_E;
  671. }
  672. idx += sz; idx += sz;
  673. #endif
  674. sz = exp[idx++];
  675. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  676. WOLFSSL_MSG("Buffer not large enough for key import");
  677. return BUFFER_E;
  678. }
  679. if (sz > 0) {
  680. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  681. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  682. }
  683. sz = exp[idx++];
  684. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  685. WOLFSSL_MSG("Buffer not large enough for write IV import");
  686. return BUFFER_E;
  687. }
  688. if (sz > 0) {
  689. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  690. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  691. }
  692. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  693. idx += AEAD_MAX_EXP_SZ;
  694. sz = exp[idx++];
  695. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  696. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  697. return BUFFER_E;
  698. }
  699. if (sz > 0) {
  700. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  701. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  702. }
  703. WOLFSSL_LEAVE("ImportKeyState", idx);
  704. (void)ver;
  705. return idx;
  706. }
  707. /* copy over necessary information from Options struct to buffer
  708. * On success returns size of buffer used on failure returns a negative value */
  709. static int dtls_export_new(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  710. {
  711. int idx = 0;
  712. word16 zero = 0;
  713. Options* options = &ssl->options;
  714. WOLFSSL_ENTER("dtls_export_new");
  715. if (exp == NULL || options == NULL || len < DTLS_EXPORT_OPT_SZ) {
  716. return BAD_FUNC_ARG;
  717. }
  718. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  719. /* these options are kept and sent to indicate verify status and strength
  720. * of handshake */
  721. exp[idx++] = options->sendVerify;
  722. exp[idx++] = options->verifyPeer;
  723. exp[idx++] = options->verifyNone;
  724. exp[idx++] = options->downgrade;
  725. #ifndef NO_DH
  726. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  727. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  728. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  729. #else
  730. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  731. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  732. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  733. #endif
  734. #ifndef NO_RSA
  735. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  736. #else
  737. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  738. #endif
  739. #ifdef HAVE_ECC
  740. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  741. #else
  742. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  743. #endif
  744. /* these options are kept to indicate state and behavior */
  745. #ifndef NO_PSK
  746. exp[idx++] = options->havePSK;
  747. #else
  748. exp[idx++] = 0;
  749. #endif
  750. exp[idx++] = options->sessionCacheOff;
  751. exp[idx++] = options->sessionCacheFlushOff;
  752. exp[idx++] = options->side;
  753. exp[idx++] = options->resuming;
  754. exp[idx++] = options->haveSessionId;
  755. exp[idx++] = options->tls;
  756. exp[idx++] = options->tls1_1;
  757. exp[idx++] = options->dtls;
  758. exp[idx++] = options->connReset;
  759. exp[idx++] = options->isClosed;
  760. exp[idx++] = options->closeNotify;
  761. exp[idx++] = options->sentNotify;
  762. exp[idx++] = options->usingCompression;
  763. exp[idx++] = options->haveRSA;
  764. exp[idx++] = options->haveECC;
  765. exp[idx++] = options->haveDH;
  766. exp[idx++] = options->haveNTRU;
  767. exp[idx++] = options->haveQSH;
  768. exp[idx++] = options->haveECDSAsig;
  769. exp[idx++] = options->haveStaticECC;
  770. exp[idx++] = options->havePeerVerify;
  771. exp[idx++] = options->usingPSK_cipher;
  772. exp[idx++] = options->usingAnon_cipher;
  773. exp[idx++] = options->sendAlertState;
  774. exp[idx++] = options->partialWrite;
  775. exp[idx++] = options->quietShutdown;
  776. exp[idx++] = options->groupMessages;
  777. #ifdef HAVE_POLY1305
  778. exp[idx++] = options->oldPoly;
  779. #else
  780. exp[idx++] = 0;
  781. #endif
  782. #ifdef HAVE_ANON
  783. exp[idx++] = options->haveAnon;
  784. #else
  785. exp[idx++] = 0;
  786. #endif
  787. #ifdef HAVE_SESSION_TICKET
  788. exp[idx++] = options->createTicket;
  789. exp[idx++] = options->useTicket;
  790. exp[idx++] = options->noTicketTls12;
  791. #ifdef WOLFSSL_TLS13
  792. if (ver > DTLS_EXPORT_VERSION_3) {
  793. exp[idx++] = options->noTicketTls13;
  794. }
  795. #else
  796. if (ver > DTLS_EXPORT_VERSION_3) {
  797. exp[idx++] = 0;
  798. }
  799. #endif
  800. #else
  801. exp[idx++] = 0;
  802. exp[idx++] = 0;
  803. if (ver > DTLS_EXPORT_VERSION_3) {
  804. exp[idx++] = 0;
  805. }
  806. #endif
  807. exp[idx++] = options->processReply;
  808. exp[idx++] = options->cipherSuite0;
  809. exp[idx++] = options->cipherSuite;
  810. exp[idx++] = options->serverState;
  811. exp[idx++] = options->clientState;
  812. exp[idx++] = options->handShakeState;
  813. exp[idx++] = options->handShakeDone;
  814. exp[idx++] = options->minDowngrade;
  815. exp[idx++] = options->connectState;
  816. exp[idx++] = options->acceptState;
  817. exp[idx++] = options->asyncState;
  818. /* version of connection */
  819. exp[idx++] = ssl->version.major;
  820. exp[idx++] = ssl->version.minor;
  821. (void)zero;
  822. /* check if changes were made and notify of need to update export version */
  823. switch (ver) {
  824. case DTLS_EXPORT_VERSION_3:
  825. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  826. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  827. return DTLS_EXPORT_VER_E;
  828. }
  829. break;
  830. case DTLS_EXPORT_VERSION:
  831. if (idx != DTLS_EXPORT_OPT_SZ) {
  832. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  833. return DTLS_EXPORT_VER_E;
  834. }
  835. break;
  836. default:
  837. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  838. return DTLS_EXPORT_VER_E;
  839. }
  840. WOLFSSL_LEAVE("dtls_export_new", idx);
  841. return idx;
  842. }
  843. /* copy items from Export struct to Options struct
  844. * On success returns size of buffer used on failure returns a negative value */
  845. static int dtls_export_load(WOLFSSL* ssl, const byte* exp, word32 len, byte ver)
  846. {
  847. int idx = 0;
  848. Options* options = &ssl->options;
  849. switch (ver) {
  850. case DTLS_EXPORT_VERSION:
  851. if (len < DTLS_EXPORT_OPT_SZ) {
  852. WOLFSSL_MSG("Sanity check on buffer size failed");
  853. return BAD_FUNC_ARG;
  854. }
  855. break;
  856. case DTLS_EXPORT_VERSION_3:
  857. if (len < DTLS_EXPORT_OPT_SZ_3) {
  858. WOLFSSL_MSG("Sanity check on buffer size failed");
  859. return BAD_FUNC_ARG;
  860. }
  861. break;
  862. default:
  863. WOLFSSL_MSG("Export version not supported");
  864. return BAD_FUNC_ARG;
  865. }
  866. if (exp == NULL || options == NULL) {
  867. return BAD_FUNC_ARG;
  868. }
  869. /* these options are kept and sent to indicate verify status and strength
  870. * of handshake */
  871. options->sendVerify = exp[idx++];
  872. options->verifyPeer = exp[idx++];
  873. options->verifyNone = exp[idx++];
  874. options->downgrade = exp[idx++];
  875. #ifndef NO_DH
  876. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  877. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  878. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  879. #else
  880. idx += OPAQUE16_LEN;
  881. idx += OPAQUE16_LEN;
  882. idx += OPAQUE16_LEN;
  883. #endif
  884. #ifndef NO_RSA
  885. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  886. #else
  887. idx += OPAQUE16_LEN;
  888. #endif
  889. #ifdef HAVE_ECC
  890. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  891. #else
  892. idx += OPAQUE16_LEN;
  893. #endif
  894. /* these options are kept to indicate state and behavior */
  895. #ifndef NO_PSK
  896. options->havePSK = exp[idx++];
  897. #else
  898. idx++;
  899. #endif
  900. options->sessionCacheOff = exp[idx++];
  901. options->sessionCacheFlushOff = exp[idx++];
  902. options->side = exp[idx++];
  903. options->resuming = exp[idx++];
  904. options->haveSessionId = exp[idx++];
  905. options->tls = exp[idx++];
  906. options->tls1_1 = exp[idx++];
  907. options->dtls = exp[idx++];
  908. options->connReset = exp[idx++];
  909. options->isClosed = exp[idx++];
  910. options->closeNotify = exp[idx++];
  911. options->sentNotify = exp[idx++];
  912. options->usingCompression = exp[idx++];
  913. options->haveRSA = exp[idx++];
  914. options->haveECC = exp[idx++];
  915. options->haveDH = exp[idx++];
  916. options->haveNTRU = exp[idx++];
  917. options->haveQSH = exp[idx++];
  918. options->haveECDSAsig = exp[idx++];
  919. options->haveStaticECC = exp[idx++];
  920. options->havePeerVerify = exp[idx++];
  921. options->usingPSK_cipher = exp[idx++];
  922. options->usingAnon_cipher = exp[idx++];
  923. options->sendAlertState = exp[idx++];
  924. options->partialWrite = exp[idx++];
  925. options->quietShutdown = exp[idx++];
  926. options->groupMessages = exp[idx++];
  927. #ifdef HAVE_POLY1305
  928. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  929. #else
  930. idx++;
  931. #endif
  932. #ifdef HAVE_ANON
  933. options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */
  934. #else
  935. idx++;
  936. #endif
  937. #ifdef HAVE_SESSION_TICKET
  938. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  939. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  940. options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
  941. #ifdef WOLFSSL_TLS13
  942. if (ver > DTLS_EXPORT_VERSION_3) {
  943. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  944. }
  945. #else
  946. if (ver > DTLS_EXPORT_VERSION_3) {
  947. idx++;
  948. }
  949. #endif
  950. #else
  951. idx++;
  952. idx++;
  953. if (ver > DTLS_EXPORT_VERSION_3) {
  954. idx++;
  955. }
  956. #endif
  957. options->processReply = exp[idx++];
  958. options->cipherSuite0 = exp[idx++];
  959. options->cipherSuite = exp[idx++];
  960. options->serverState = exp[idx++];
  961. options->clientState = exp[idx++];
  962. options->handShakeState = exp[idx++];
  963. options->handShakeDone = exp[idx++];
  964. options->minDowngrade = exp[idx++];
  965. options->connectState = exp[idx++];
  966. options->acceptState = exp[idx++];
  967. options->asyncState = exp[idx++];
  968. /* version of connection */
  969. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  970. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  971. return VERSION_ERROR;
  972. }
  973. return idx;
  974. }
  975. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  976. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  977. {
  978. int idx = 0;
  979. int ipSz = DTLS_EXPORT_IP; /* start as max size */
  980. int fam = 0;
  981. word16 port = 0;
  982. char ip[DTLS_EXPORT_IP];
  983. if (ver != DTLS_EXPORT_VERSION) {
  984. WOLFSSL_MSG("Export version not supported");
  985. return BAD_FUNC_ARG;
  986. }
  987. if (ssl == NULL || exp == NULL || len < sizeof(ip) + 3 * DTLS_EXPORT_LEN) {
  988. return BAD_FUNC_ARG;
  989. }
  990. if (ssl->ctx->CBGetPeer == NULL) {
  991. WOLFSSL_MSG("No get peer call back set");
  992. return BAD_FUNC_ARG;
  993. }
  994. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  995. WOLFSSL_MSG("Get peer callback error");
  996. return SOCKET_ERROR_E;
  997. }
  998. /* check that ipSz/fam is not negative or too large since user can set cb */
  999. if (ipSz < 0 || ipSz > DTLS_EXPORT_IP || fam < 0) {
  1000. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  1001. return SOCKET_ERROR_E;
  1002. }
  1003. c16toa((word16)fam, exp + idx); idx += DTLS_EXPORT_LEN;
  1004. c16toa((word16)ipSz, exp + idx); idx += DTLS_EXPORT_LEN;
  1005. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  1006. c16toa(port, exp + idx); idx += DTLS_EXPORT_LEN;
  1007. return idx;
  1008. }
  1009. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  1010. static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
  1011. {
  1012. word16 idx = 0;
  1013. word16 ipSz;
  1014. word16 fam;
  1015. word16 port;
  1016. char ip[DTLS_EXPORT_IP];
  1017. if (ver != DTLS_EXPORT_VERSION && ver != DTLS_EXPORT_VERSION_3) {
  1018. WOLFSSL_MSG("Export version not supported");
  1019. return BAD_FUNC_ARG;
  1020. }
  1021. if (len == 0) {
  1022. WOLFSSL_MSG("No peer info sent");
  1023. return 0;
  1024. }
  1025. if (ssl == NULL || buf == NULL || len < 3 * DTLS_EXPORT_LEN) {
  1026. return BAD_FUNC_ARG;
  1027. }
  1028. /* import sin family */
  1029. ato16(buf + idx, &fam); idx += DTLS_EXPORT_LEN;
  1030. /* import ip address idx, and ipSz are unsigned but cast for enum */
  1031. ato16(buf + idx, &ipSz); idx += DTLS_EXPORT_LEN;
  1032. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + DTLS_EXPORT_LEN) > len) {
  1033. return BUFFER_E;
  1034. }
  1035. XMEMSET(ip, 0, sizeof(ip));
  1036. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  1037. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  1038. ato16(buf + idx, &port); idx += DTLS_EXPORT_LEN;
  1039. /* sanity check for a function to call, then use it to import peer info */
  1040. if (ssl->ctx->CBSetPeer == NULL) {
  1041. WOLFSSL_MSG("No set peer function");
  1042. return BAD_FUNC_ARG;
  1043. }
  1044. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  1045. WOLFSSL_MSG("Error setting peer info");
  1046. return SOCKET_ERROR_E;
  1047. }
  1048. return idx;
  1049. }
  1050. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1051. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1052. * passed in.
  1053. * On success returns the size of serialized session state.*/
  1054. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1055. {
  1056. int ret;
  1057. word32 idx = 0;
  1058. word32 totalLen = 0;
  1059. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1060. if (buf == NULL || ssl == NULL) {
  1061. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1062. return BAD_FUNC_ARG;
  1063. }
  1064. totalLen += DTLS_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1065. /* each of the following have a 2 byte length before data */
  1066. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1067. if (totalLen > sz) {
  1068. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1069. return BUFFER_E;
  1070. }
  1071. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1072. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1073. ((byte)DTLS_EXPORT_VERSION & 0X0F);
  1074. idx += DTLS_EXPORT_LEN; /* leave room for total length */
  1075. /* export keys struct and dtls state -- variable length stored in ret */
  1076. idx += DTLS_EXPORT_LEN; /* leave room for length */
  1077. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1078. DTLS_EXPORT_VERSION, 1)) < 0) {
  1079. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1080. return ret;
  1081. }
  1082. c16toa((word16)ret, buf + idx - DTLS_EXPORT_LEN); idx += ret;
  1083. /* place total length of exported buffer minus 2 bytes protocol/version */
  1084. c16toa((word16)(idx - DTLS_EXPORT_LEN), buf + DTLS_EXPORT_LEN);
  1085. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1086. /* if compiled with debug options then print the version, protocol, size */
  1087. {
  1088. char debug[256];
  1089. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1090. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1091. , (int)DTLS_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1092. WOLFSSL_MSG(debug);
  1093. }
  1094. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1095. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1096. return idx;
  1097. }
  1098. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session
  1099. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1100. * passed in.
  1101. * On success returns the size of serialized session.*/
  1102. int wolfSSL_dtls_export_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1103. {
  1104. int ret;
  1105. word32 idx = 0;
  1106. word32 totalLen = 0;
  1107. WOLFSSL_ENTER("wolfSSL_dtls_export_internal");
  1108. if (buf == NULL || ssl == NULL) {
  1109. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", BAD_FUNC_ARG);
  1110. return BAD_FUNC_ARG;
  1111. }
  1112. totalLen += DTLS_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1113. /* each of the following have a 2 byte length before data */
  1114. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1115. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1116. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_SPC_SZ;
  1117. totalLen += DTLS_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1118. if (totalLen > sz) {
  1119. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", BUFFER_E);
  1120. return BUFFER_E;
  1121. }
  1122. buf[idx++] = (byte)DTLS_EXPORT_PRO;
  1123. buf[idx++] = ((byte)DTLS_EXPORT_PRO & 0xF0) |
  1124. ((byte)DTLS_EXPORT_VERSION & 0X0F);
  1125. idx += DTLS_EXPORT_LEN; /* leave spot for length */
  1126. c16toa((word16)DTLS_EXPORT_OPT_SZ, buf + idx); idx += DTLS_EXPORT_LEN;
  1127. if ((ret = dtls_export_new(ssl, buf + idx, sz - idx,
  1128. DTLS_EXPORT_VERSION)) < 0) {
  1129. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1130. return ret;
  1131. }
  1132. idx += ret;
  1133. /* export keys struct and dtls state -- variable length stored in ret */
  1134. idx += DTLS_EXPORT_LEN; /* leave room for length */
  1135. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1136. DTLS_EXPORT_VERSION, 0)) < 0) {
  1137. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1138. return ret;
  1139. }
  1140. c16toa((word16)ret, buf + idx - DTLS_EXPORT_LEN); idx += ret;
  1141. /* export of cipher specs struct */
  1142. c16toa((word16)DTLS_EXPORT_SPC_SZ, buf + idx); idx += DTLS_EXPORT_LEN;
  1143. if ((ret = ExportCipherSpecState(ssl, buf + idx, sz - idx,
  1144. DTLS_EXPORT_VERSION)) < 0) {
  1145. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1146. return ret;
  1147. }
  1148. idx += ret;
  1149. /* export of dtls peer information */
  1150. idx += DTLS_EXPORT_LEN;
  1151. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1152. ret = 0; /* not saving peer port/ip information */
  1153. #else
  1154. if ((ret = ExportPeerInfo(ssl, buf + idx, sz - idx,
  1155. DTLS_EXPORT_VERSION)) < 0) {
  1156. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1157. return ret;
  1158. }
  1159. #endif
  1160. c16toa(ret, buf + idx - DTLS_EXPORT_LEN);
  1161. idx += ret;
  1162. /* place total length of exported buffer minus 2 bytes protocol/version */
  1163. c16toa((word16)(idx - DTLS_EXPORT_LEN), buf + DTLS_EXPORT_LEN);
  1164. /* if compiled with debug options then print the version, protocol, size */
  1165. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1166. {
  1167. char debug[256];
  1168. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session\n"
  1169. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1170. , (int)DTLS_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1171. WOLFSSL_MSG(debug);
  1172. }
  1173. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1174. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", idx);
  1175. return idx;
  1176. }
  1177. /* On success return amount of buffer consumed */
  1178. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1179. {
  1180. word32 idx = 0;
  1181. word16 length = 0;
  1182. int version;
  1183. int ret;
  1184. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1185. /* check at least enough room for protocol and length */
  1186. if (sz < DTLS_EXPORT_LEN * 2 || ssl == NULL) {
  1187. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1188. return BAD_FUNC_ARG;
  1189. }
  1190. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1191. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1192. WOLFSSL_MSG("Incorrect protocol");
  1193. return BAD_FUNC_ARG;
  1194. }
  1195. version = buf[idx++] & 0x0F;
  1196. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1197. if (length > sz - DTLS_EXPORT_LEN) { /* subtract 2 for protocol */
  1198. WOLFSSL_MSG("Buffer size sanity check failed");
  1199. return BUFFER_E;
  1200. }
  1201. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1202. /* if compiled with debug options then print the version, protocol, size */
  1203. {
  1204. char debug[256];
  1205. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1206. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1207. , (int)version, buf[0], (buf[1] >> 4), length);
  1208. WOLFSSL_MSG(debug);
  1209. }
  1210. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1211. /* perform sanity checks and extract Options information used */
  1212. switch (version) {
  1213. case DTLS_EXPORT_VERSION:
  1214. break;
  1215. default:
  1216. WOLFSSL_MSG("Bad export state version");
  1217. return BAD_FUNC_ARG;
  1218. }
  1219. /* perform sanity checks and extract Keys struct */
  1220. if (DTLS_EXPORT_LEN + idx > sz) {
  1221. WOLFSSL_MSG("Import Key struct error");
  1222. return BUFFER_E;
  1223. }
  1224. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1225. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1226. WOLFSSL_MSG("Import Key struct error");
  1227. return BUFFER_E;
  1228. }
  1229. if ((ret = ImportKeyState(ssl, buf + idx, length, version)) < 0) {
  1230. WOLFSSL_MSG("Import Key struct error");
  1231. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1232. return ret;
  1233. }
  1234. idx += ret;
  1235. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1236. return idx;
  1237. }
  1238. /* On success return amount of buffer consumed */
  1239. int wolfSSL_dtls_import_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1240. {
  1241. word32 idx = 0;
  1242. word16 length = 0;
  1243. int version;
  1244. int ret;
  1245. int optSz;
  1246. WOLFSSL_ENTER("wolfSSL_dtls_import_internal");
  1247. /* check at least enough room for protocol and length */
  1248. if (sz < DTLS_EXPORT_LEN * 2 || ssl == NULL) {
  1249. return BAD_FUNC_ARG;
  1250. }
  1251. /* sanity check on protocol ID and size of buffer */
  1252. if (buf[idx++] != (byte)DTLS_EXPORT_PRO ||
  1253. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1254. /* don't increment on second idx to next get version */
  1255. /* check if importing state only */
  1256. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1257. }
  1258. version = buf[idx++] & 0x0F;
  1259. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1260. if (length > sz - DTLS_EXPORT_LEN) { /* subtract 2 for protocol */
  1261. return BUFFER_E;
  1262. }
  1263. /* if compiled with debug options then print the version, protocol, size */
  1264. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1265. {
  1266. char debug[256];
  1267. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1268. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1269. , (int)version, buf[0], (buf[1] >> 4), length);
  1270. WOLFSSL_MSG(debug);
  1271. }
  1272. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1273. /* perform sanity checks and extract Options information used */
  1274. switch (version) {
  1275. case DTLS_EXPORT_VERSION:
  1276. optSz = DTLS_EXPORT_OPT_SZ;
  1277. break;
  1278. case DTLS_EXPORT_VERSION_3:
  1279. WOLFSSL_MSG("Importing older version 3");
  1280. optSz = DTLS_EXPORT_OPT_SZ_3;
  1281. break;
  1282. default:
  1283. WOLFSSL_MSG("Bad export version");
  1284. return BAD_FUNC_ARG;
  1285. }
  1286. if (DTLS_EXPORT_LEN + optSz + idx > sz) {
  1287. WOLFSSL_MSG("Import Options struct error");
  1288. return BUFFER_E;
  1289. }
  1290. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1291. if (length != optSz) {
  1292. WOLFSSL_MSG("Import Options struct error");
  1293. return BUFFER_E;
  1294. }
  1295. if ((ret = dtls_export_load(ssl, buf + idx, length, version)) < 0) {
  1296. WOLFSSL_MSG("Import Options struct error");
  1297. return ret;
  1298. }
  1299. idx += length;
  1300. /* perform sanity checks and extract Keys struct */
  1301. if (DTLS_EXPORT_LEN + idx > sz) {
  1302. WOLFSSL_MSG("Import Key struct error");
  1303. return BUFFER_E;
  1304. }
  1305. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1306. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1307. WOLFSSL_MSG("Import Key struct error");
  1308. return BUFFER_E;
  1309. }
  1310. if ((ret = ImportKeyState(ssl, buf + idx, length, version)) < 0) {
  1311. WOLFSSL_MSG("Import Key struct error");
  1312. return ret;
  1313. }
  1314. idx += ret;
  1315. /* perform sanity checks and extract CipherSpecs struct */
  1316. if (DTLS_EXPORT_LEN + DTLS_EXPORT_SPC_SZ + idx > sz) {
  1317. WOLFSSL_MSG("Import CipherSpecs struct error");
  1318. return BUFFER_E;
  1319. }
  1320. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1321. if ( length != DTLS_EXPORT_SPC_SZ) {
  1322. WOLFSSL_MSG("Import CipherSpecs struct error");
  1323. return BUFFER_E;
  1324. }
  1325. if ((ret = ImportCipherSpecState(ssl, buf + idx, length, version)) < 0) {
  1326. WOLFSSL_MSG("Import CipherSpecs struct error");
  1327. return ret;
  1328. }
  1329. idx += ret;
  1330. /* perform sanity checks and extract DTLS peer info */
  1331. if (DTLS_EXPORT_LEN + idx > sz) {
  1332. WOLFSSL_MSG("Import DTLS peer info error");
  1333. return BUFFER_E;
  1334. }
  1335. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1336. if (idx + length > sz) {
  1337. WOLFSSL_MSG("Import DTLS peer info error");
  1338. return BUFFER_E;
  1339. }
  1340. if ((ret = ImportPeerInfo(ssl, buf + idx, length, version)) < 0) {
  1341. WOLFSSL_MSG("Import Peer Addr error");
  1342. return ret;
  1343. }
  1344. idx += ret;
  1345. SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  1346. /* make sure is a valid suite used */
  1347. if (wolfSSL_get_cipher(ssl) == NULL) {
  1348. WOLFSSL_MSG("Can not match cipher suite imported");
  1349. return MATCH_SUITE_ERROR;
  1350. }
  1351. #ifndef WOLFSSL_AEAD_ONLY
  1352. /* set hmac function to use when verifying */
  1353. if (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1354. ssl->options.dtls == 1) {
  1355. ssl->hmac = TLS_hmac;
  1356. }
  1357. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1358. if (ssl->specs.cipher_type == stream &&
  1359. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1360. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1361. return SANITY_CIPHER_E;
  1362. }
  1363. #endif /* !WOLFSSL_AEAD_ONLY */
  1364. return idx;
  1365. }
  1366. #endif /* WOLFSSL_DTLS */
  1367. #endif /* WOLFSSL_SESSION_EXPORT */
  1368. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1369. {
  1370. method->version = pv;
  1371. method->side = WOLFSSL_CLIENT_END;
  1372. method->downgrade = 0;
  1373. }
  1374. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  1375. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1376. {
  1377. if (ssl == NULL)
  1378. return BAD_FUNC_ARG;
  1379. /* set side */
  1380. ssl->options.side = side;
  1381. /* reset options that are side specific */
  1382. #ifdef HAVE_NTRU
  1383. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1384. ssl->options.haveNTRU = 1; /* always on client side */
  1385. /* server can turn on by loading key */
  1386. }
  1387. #endif
  1388. #ifdef HAVE_ECC
  1389. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1390. ssl->options.haveECDSAsig = 1; /* always on client side */
  1391. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1392. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1393. }
  1394. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1395. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1396. ssl->options.haveECDSAsig = 1; /* always on client side */
  1397. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1398. }
  1399. #endif
  1400. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1401. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1402. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1403. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1404. ssl->options.haveEMS = 1;
  1405. }
  1406. #ifdef WOLFSSL_DTLS
  1407. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1408. ssl->options.haveEMS = 1;
  1409. #endif /* WOLFSSL_DTLS */
  1410. }
  1411. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1412. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  1413. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  1414. int ret;
  1415. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  1416. if (ret != 0) {
  1417. WOLFSSL_MSG("DTLS Cookie Secret error");
  1418. return ret;
  1419. }
  1420. }
  1421. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  1422. return InitSSL_Suites(ssl);
  1423. }
  1424. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1425. /* Initialize SSL context, return 0 on success */
  1426. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1427. {
  1428. int ret = 0;
  1429. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1430. ctx->method = method;
  1431. ctx->refCount = 1; /* so either CTX_free or SSL_free can release */
  1432. ctx->heap = ctx; /* defaults to self */
  1433. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1434. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE; /* current default: TLSv1_MINOR */
  1435. if (wc_InitMutex(&ctx->countMutex) < 0) {
  1436. WOLFSSL_MSG("Mutex error on CTX init");
  1437. ctx->err = CTX_INIT_MUTEX_E;
  1438. return BAD_MUTEX_E;
  1439. }
  1440. #ifndef NO_CERTS
  1441. ctx->privateKeyDevId = INVALID_DEVID;
  1442. #endif
  1443. #ifndef NO_DH
  1444. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1445. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1446. #endif
  1447. #ifndef NO_RSA
  1448. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1449. #endif
  1450. #ifdef HAVE_ECC
  1451. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1452. ctx->eccTempKeySz = ECDHE_SIZE;
  1453. #endif
  1454. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  1455. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1456. #endif
  1457. #ifdef OPENSSL_EXTRA
  1458. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1459. #endif
  1460. #ifndef WOLFSSL_USER_IO
  1461. #ifdef MICRIUM
  1462. ctx->CBIORecv = MicriumReceive;
  1463. ctx->CBIOSend = MicriumSend;
  1464. #ifdef WOLFSSL_DTLS
  1465. if (method->version.major == DTLS_MAJOR) {
  1466. ctx->CBIORecv = MicriumReceiveFrom;
  1467. ctx->CBIOSend = MicriumSendTo;
  1468. }
  1469. #ifdef WOLFSSL_SESSION_EXPORT
  1470. #error Micrium port does not support DTLS session export yet
  1471. #endif
  1472. #endif
  1473. #elif defined WOLFSSL_UIP
  1474. ctx->CBIORecv = uIPReceive;
  1475. ctx->CBIOSend = uIPSend;
  1476. #ifdef WOLFSSL_DTLS
  1477. if (method->version.major == DTLS_MAJOR) {
  1478. ctx->CBIOSendTo = uIPSendTo;
  1479. ctx->CBIORecvFrom = uIPRecvFrom;
  1480. }
  1481. #endif
  1482. #else
  1483. ctx->CBIORecv = EmbedReceive;
  1484. ctx->CBIOSend = EmbedSend;
  1485. #ifdef WOLFSSL_DTLS
  1486. if (method->version.major == DTLS_MAJOR) {
  1487. ctx->CBIORecv = EmbedReceiveFrom;
  1488. ctx->CBIOSend = EmbedSendTo;
  1489. }
  1490. #ifdef WOLFSSL_SESSION_EXPORT
  1491. ctx->CBGetPeer = EmbedGetPeer;
  1492. ctx->CBSetPeer = EmbedSetPeer;
  1493. #endif
  1494. #endif
  1495. #endif /* MICRIUM */
  1496. #endif /* WOLFSSL_USER_IO */
  1497. #ifdef HAVE_NETX
  1498. ctx->CBIORecv = NetX_Receive;
  1499. ctx->CBIOSend = NetX_Send;
  1500. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1501. ctx->CBIORecv = Mynewt_Receive;
  1502. ctx->CBIOSend = Mynewt_Send;
  1503. #elif defined(WOLFSSL_GNRC)
  1504. ctx->CBIORecv = GNRC_ReceiveFrom;
  1505. ctx->CBIOSend = GNRC_SendTo;
  1506. #endif
  1507. #ifdef HAVE_NTRU
  1508. if (method->side == WOLFSSL_CLIENT_END)
  1509. ctx->haveNTRU = 1; /* always on client side */
  1510. /* server can turn on by loading key */
  1511. #endif
  1512. #ifdef HAVE_ECC
  1513. if (method->side == WOLFSSL_CLIENT_END) {
  1514. ctx->haveECDSAsig = 1; /* always on client side */
  1515. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1516. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  1517. }
  1518. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1519. if (method->side == WOLFSSL_CLIENT_END) {
  1520. ctx->haveECDSAsig = 1; /* always on client side */
  1521. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1522. }
  1523. #endif
  1524. #ifdef WOLFSSL_QNX_CAAM
  1525. /* default to try using CAAM when built */
  1526. ctx->devId = WOLFSSL_CAAM_DEVID;
  1527. #else
  1528. ctx->devId = INVALID_DEVID;
  1529. #endif
  1530. #if defined(WOLFSSL_DTLS)
  1531. #ifdef WOLFSSL_SCTP
  1532. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  1533. #elif defined(WOLFSSL_DTLS_MTU)
  1534. ctx->dtlsMtuSz = MAX_MTU;
  1535. #endif
  1536. #endif
  1537. #ifndef NO_CERTS
  1538. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  1539. if (ctx->cm == NULL) {
  1540. WOLFSSL_MSG("Bad Cert Manager New");
  1541. return BAD_CERT_MANAGER_ERROR;
  1542. }
  1543. #ifdef OPENSSL_EXTRA
  1544. /* setup WOLFSSL_X509_STORE */
  1545. ctx->x509_store.cm = ctx->cm;
  1546. /* set pointer back to x509 store */
  1547. ctx->cm->x509_store_p = &ctx->x509_store;
  1548. /* WOLFSSL_X509_VERIFY_PARAM */
  1549. if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  1550. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  1551. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  1552. WOLFSSL_MSG("ctx->param memory error");
  1553. return MEMORY_E;
  1554. }
  1555. XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  1556. /* WOLFSSL_X509_LOOKUP */
  1557. if ((ctx->x509_store.lookup.dirs =
  1558. (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR),
  1559. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  1560. WOLFSSL_MSG("ctx-x509_store.lookup.dir memory allocation error");
  1561. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  1562. return MEMORY_E;
  1563. }
  1564. XMEMSET(ctx->x509_store.lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
  1565. if (wc_InitMutex(&ctx->x509_store.lookup.dirs->lock) != 0) {
  1566. WOLFSSL_MSG("Bad mutex init");
  1567. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  1568. XFREE(ctx->x509_store.lookup.dirs, heap, DYNAMIC_TYPE_OPENSSL);
  1569. return BAD_MUTEX_E;
  1570. }
  1571. #endif
  1572. #endif
  1573. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1574. if (method->side == WOLFSSL_CLIENT_END) {
  1575. if ((method->version.major == SSLv3_MAJOR) &&
  1576. (method->version.minor >= TLSv1_MINOR)) {
  1577. ctx->haveEMS = 1;
  1578. }
  1579. #ifdef WOLFSSL_DTLS
  1580. if (method->version.major == DTLS_MAJOR)
  1581. ctx->haveEMS = 1;
  1582. #endif /* WOLFSSL_DTLS */
  1583. }
  1584. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1585. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  1586. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  1587. ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
  1588. if (ret != 0) return ret;
  1589. ctx->ticketEncCb = DefTicketEncCb;
  1590. ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
  1591. #endif
  1592. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  1593. #endif
  1594. #ifdef HAVE_WOLF_EVENT
  1595. if (ret == 0)
  1596. ret = wolfEventQueue_Init(&ctx->event_queue);
  1597. #endif /* HAVE_WOLF_EVENT */
  1598. #ifdef WOLFSSL_EARLY_DATA
  1599. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  1600. #endif
  1601. #if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
  1602. ctx->noPskDheKe = 1;
  1603. #endif
  1604. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  1605. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1606. return ret;
  1607. }
  1608. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  1609. void wolfSSL_CRYPTO_cleanup_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data)
  1610. {
  1611. int n_ex_data = (int)(sizeof ex_data->ex_data / sizeof ex_data->ex_data[0]);
  1612. for (--n_ex_data; n_ex_data >= 0; --n_ex_data) {
  1613. if (ex_data->ex_data[n_ex_data] != NULL)
  1614. (void)wolfSSL_CRYPTO_set_ex_data_with_cleanup(ex_data, n_ex_data,
  1615. NULL, NULL);
  1616. }
  1617. }
  1618. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  1619. /* In case contexts are held in array and don't want to free actual ctx */
  1620. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  1621. {
  1622. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
  1623. defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
  1624. int i;
  1625. #endif
  1626. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  1627. wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
  1628. #endif
  1629. #ifdef HAVE_WOLF_EVENT
  1630. wolfEventQueue_Free(&ctx->event_queue);
  1631. #endif /* HAVE_WOLF_EVENT */
  1632. #ifdef WOLFSSL_STATIC_MEMORY
  1633. if (ctx->onHeap == 1) {
  1634. XFREE(ctx->method, ctx->heap, DYNAMIC_TYPE_METHOD);
  1635. }
  1636. else {
  1637. XFREE(ctx->method, NULL, DYNAMIC_TYPE_METHOD);
  1638. }
  1639. #else
  1640. XFREE(ctx->method, ctx->heap, DYNAMIC_TYPE_METHOD);
  1641. #endif
  1642. ctx->method = NULL;
  1643. if (ctx->suites) {
  1644. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  1645. ctx->suites = NULL;
  1646. }
  1647. #ifndef NO_DH
  1648. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1649. ctx->serverDH_G.buffer = NULL;
  1650. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1651. ctx->serverDH_P.buffer = NULL;
  1652. #endif /* !NO_DH */
  1653. #ifdef SINGLE_THREADED
  1654. if (ctx->rng) {
  1655. wc_FreeRng(ctx->rng);
  1656. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  1657. ctx->rng = NULL;
  1658. }
  1659. #endif /* SINGLE_THREADED */
  1660. #ifndef NO_CERTS
  1661. FreeDer(&ctx->privateKey);
  1662. FreeDer(&ctx->certificate);
  1663. #ifdef KEEP_OUR_CERT
  1664. if (ctx->ourCert && ctx->ownOurCert) {
  1665. wolfSSL_X509_free(ctx->ourCert);
  1666. ctx->ourCert = NULL;
  1667. }
  1668. #endif /* KEEP_OUR_CERT */
  1669. FreeDer(&ctx->certChain);
  1670. wolfSSL_CertManagerFree(ctx->cm);
  1671. ctx->cm = NULL;
  1672. #ifdef OPENSSL_EXTRA
  1673. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  1674. while (ctx->ca_names != NULL) {
  1675. WOLFSSL_STACK *next = ctx->ca_names->next;
  1676. wolfSSL_X509_NAME_free(ctx->ca_names->data.name);
  1677. XFREE(ctx->ca_names, NULL, DYNAMIC_TYPE_OPENSSL);
  1678. ctx->ca_names = next;
  1679. }
  1680. #endif
  1681. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  1682. if (ctx->x509Chain) {
  1683. wolfSSL_sk_X509_free(ctx->x509Chain);
  1684. ctx->x509Chain = NULL;
  1685. }
  1686. #endif
  1687. #endif /* !NO_CERTS */
  1688. #ifdef HAVE_TLS_EXTENSIONS
  1689. TLSX_FreeAll(ctx->extensions, ctx->heap);
  1690. #ifndef NO_WOLFSSL_SERVER
  1691. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  1692. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  1693. if (ctx->certOcspRequest) {
  1694. FreeOcspRequest(ctx->certOcspRequest);
  1695. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  1696. }
  1697. #endif
  1698. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1699. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  1700. if (ctx->chainOcspRequest[i]) {
  1701. FreeOcspRequest(ctx->chainOcspRequest[i]);
  1702. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  1703. ctx->chainOcspRequest[i] = NULL;
  1704. }
  1705. }
  1706. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  1707. #endif /* !NO_WOLFSSL_SERVER */
  1708. #endif /* HAVE_TLS_EXTENSIONS */
  1709. #ifdef OPENSSL_EXTRA
  1710. if(ctx->alpn_cli_protos) {
  1711. XFREE((void *)ctx->alpn_cli_protos, NULL, DYNAMIC_TYPE_OPENSSL);
  1712. ctx->alpn_cli_protos = NULL;
  1713. }
  1714. if (ctx->param) {
  1715. XFREE(ctx->param, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  1716. }
  1717. if (ctx->x509_store.lookup.dirs) {
  1718. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  1719. if (ctx->x509_store.lookup.dirs->dir_entry) {
  1720. wolfSSL_sk_BY_DIR_entry_free(ctx->x509_store.lookup.dirs->dir_entry);
  1721. }
  1722. #endif
  1723. wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
  1724. XFREE(ctx->x509_store.lookup.dirs, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  1725. }
  1726. #endif
  1727. #ifdef WOLFSSL_STATIC_EPHEMERAL
  1728. #ifndef NO_DH
  1729. if (ctx->staticKE.dhKey)
  1730. FreeDer(&ctx->staticKE.dhKey);
  1731. #endif
  1732. #ifdef HAVE_ECC
  1733. if (ctx->staticKE.ecKey)
  1734. FreeDer(&ctx->staticKE.ecKey);
  1735. #endif
  1736. #endif
  1737. #ifdef WOLFSSL_STATIC_MEMORY
  1738. if (ctx->heap != NULL) {
  1739. #ifdef WOLFSSL_HEAP_TEST
  1740. /* avoid dereferencing a test value */
  1741. if (ctx->heap != (void*)WOLFSSL_HEAP_TEST)
  1742. #endif
  1743. {
  1744. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)(ctx->heap);
  1745. wc_FreeMutex(&((WOLFSSL_HEAP*)(hint->memory))->memory_mutex);
  1746. }
  1747. }
  1748. #endif /* WOLFSSL_STATIC_MEMORY */
  1749. }
  1750. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  1751. {
  1752. int refCount;
  1753. /* decrement CTX reference count */
  1754. if ((refCount = SSL_CTX_RefCount(ctx, -1)) < 0) {
  1755. /* check error state, if mutex error code then mutex init failed but
  1756. * CTX was still malloc'd */
  1757. if (ctx->err == CTX_INIT_MUTEX_E) {
  1758. SSL_CtxResourceFree(ctx);
  1759. XFREE(ctx, ctx->heap, DYNAMIC_TYPE_CTX);
  1760. }
  1761. return;
  1762. }
  1763. if (refCount == 0) {
  1764. void* heap = ctx->heap;
  1765. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  1766. SSL_CtxResourceFree(ctx);
  1767. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  1768. !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  1769. TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
  1770. #endif
  1771. wc_FreeMutex(&ctx->countMutex);
  1772. #ifdef WOLFSSL_STATIC_MEMORY
  1773. if (ctx->onHeap == 0) {
  1774. heap = NULL;
  1775. }
  1776. #endif
  1777. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  1778. (void)heap; /* not used in some builds */
  1779. }
  1780. else {
  1781. (void)ctx;
  1782. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  1783. }
  1784. }
  1785. /* Set cipher pointers to null */
  1786. void InitCiphers(WOLFSSL* ssl)
  1787. {
  1788. #ifdef BUILD_ARC4
  1789. ssl->encrypt.arc4 = NULL;
  1790. ssl->decrypt.arc4 = NULL;
  1791. #endif
  1792. #ifdef BUILD_DES3
  1793. ssl->encrypt.des3 = NULL;
  1794. ssl->decrypt.des3 = NULL;
  1795. #endif
  1796. #ifdef BUILD_AES
  1797. ssl->encrypt.aes = NULL;
  1798. ssl->decrypt.aes = NULL;
  1799. #endif
  1800. #ifdef HAVE_CAMELLIA
  1801. ssl->encrypt.cam = NULL;
  1802. ssl->decrypt.cam = NULL;
  1803. #endif
  1804. #ifdef HAVE_HC128
  1805. ssl->encrypt.hc128 = NULL;
  1806. ssl->decrypt.hc128 = NULL;
  1807. #endif
  1808. #ifdef BUILD_RABBIT
  1809. ssl->encrypt.rabbit = NULL;
  1810. ssl->decrypt.rabbit = NULL;
  1811. #endif
  1812. #ifdef HAVE_CHACHA
  1813. ssl->encrypt.chacha = NULL;
  1814. ssl->decrypt.chacha = NULL;
  1815. #endif
  1816. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  1817. ssl->auth.poly1305 = NULL;
  1818. #endif
  1819. ssl->encrypt.setup = 0;
  1820. ssl->decrypt.setup = 0;
  1821. #ifdef HAVE_ONE_TIME_AUTH
  1822. ssl->auth.setup = 0;
  1823. #endif
  1824. #ifdef HAVE_IDEA
  1825. ssl->encrypt.idea = NULL;
  1826. ssl->decrypt.idea = NULL;
  1827. #endif
  1828. }
  1829. /* Free ciphers */
  1830. void FreeCiphers(WOLFSSL* ssl)
  1831. {
  1832. (void)ssl;
  1833. #ifdef BUILD_ARC4
  1834. wc_Arc4Free(ssl->encrypt.arc4);
  1835. wc_Arc4Free(ssl->decrypt.arc4);
  1836. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1837. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1838. #endif
  1839. #ifdef BUILD_DES3
  1840. wc_Des3Free(ssl->encrypt.des3);
  1841. wc_Des3Free(ssl->decrypt.des3);
  1842. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1843. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1844. #endif
  1845. #if defined(BUILD_AES) || defined(BUILD_AESGCM) /* See: InitKeys() in keys.c
  1846. * on addition of BUILD_AESGCM
  1847. * check (enc->aes, dec->aes) */
  1848. wc_AesFree(ssl->encrypt.aes);
  1849. wc_AesFree(ssl->decrypt.aes);
  1850. #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \
  1851. !defined(WOLFSSL_NO_TLS12)
  1852. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1853. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1854. #endif
  1855. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1856. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1857. #endif
  1858. #ifdef CIPHER_NONCE
  1859. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1860. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1861. #endif
  1862. #ifdef HAVE_CAMELLIA
  1863. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1864. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1865. #endif
  1866. #ifdef HAVE_HC128
  1867. XFREE(ssl->encrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1868. XFREE(ssl->decrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1869. #endif
  1870. #ifdef BUILD_RABBIT
  1871. XFREE(ssl->encrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1872. XFREE(ssl->decrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1873. #endif
  1874. #ifdef HAVE_CHACHA
  1875. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1876. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1877. #endif
  1878. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  1879. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1880. #endif
  1881. #ifdef HAVE_IDEA
  1882. XFREE(ssl->encrypt.idea, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1883. XFREE(ssl->decrypt.idea, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1884. #endif
  1885. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  1886. wc_HmacFree(ssl->encrypt.hmac);
  1887. wc_HmacFree(ssl->decrypt.hmac);
  1888. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1889. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1890. #endif
  1891. }
  1892. void InitCipherSpecs(CipherSpecs* cs)
  1893. {
  1894. XMEMSET(cs, 0, sizeof(CipherSpecs));
  1895. cs->bulk_cipher_algorithm = INVALID_BYTE;
  1896. cs->cipher_type = INVALID_BYTE;
  1897. cs->mac_algorithm = INVALID_BYTE;
  1898. cs->kea = INVALID_BYTE;
  1899. cs->sig_algo = INVALID_BYTE;
  1900. }
  1901. #if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
  1902. defined(HAVE_ECC))
  1903. static int GetMacDigestSize(byte macAlgo)
  1904. {
  1905. switch (macAlgo) {
  1906. #ifndef NO_SHA
  1907. case sha_mac:
  1908. return WC_SHA_DIGEST_SIZE;
  1909. #endif
  1910. #ifndef NO_SHA256
  1911. case sha256_mac:
  1912. return WC_SHA256_DIGEST_SIZE;
  1913. #endif
  1914. #ifdef WOLFSSL_SHA384
  1915. case sha384_mac:
  1916. return WC_SHA384_DIGEST_SIZE;
  1917. #endif
  1918. #ifdef WOLFSSL_SHA512
  1919. case sha512_mac:
  1920. return WC_SHA512_DIGEST_SIZE;
  1921. #endif
  1922. default:
  1923. break;
  1924. }
  1925. return NOT_COMPILED_IN;
  1926. }
  1927. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  1928. static WC_INLINE void AddSuiteHashSigAlgo(Suites* suites, byte macAlgo, byte sigAlgo,
  1929. int keySz, word16* inOutIdx)
  1930. {
  1931. int addSigAlgo = 1;
  1932. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  1933. if (sigAlgo == ecc_dsa_sa_algo) {
  1934. int digestSz = GetMacDigestSize(macAlgo);
  1935. /* do not add sig/algos with digest size larger than key size */
  1936. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  1937. addSigAlgo = 0;
  1938. }
  1939. }
  1940. #else
  1941. (void)keySz;
  1942. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  1943. if (addSigAlgo) {
  1944. #ifdef WC_RSA_PSS
  1945. if (sigAlgo == rsa_pss_sa_algo) {
  1946. /* RSA PSS is sig then mac */
  1947. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1948. *inOutIdx += 1;
  1949. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  1950. *inOutIdx += 1;
  1951. #ifdef WOLFSSL_TLS13
  1952. /* Add the certificate algorithm as well */
  1953. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1954. *inOutIdx += 1;
  1955. suites->hashSigAlgo[*inOutIdx] = PSS_RSAE_TO_PSS_PSS(macAlgo);
  1956. *inOutIdx += 1;
  1957. #endif
  1958. }
  1959. else
  1960. #endif
  1961. {
  1962. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  1963. *inOutIdx += 1;
  1964. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1965. *inOutIdx += 1;
  1966. }
  1967. }
  1968. }
  1969. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  1970. int haveAnon, int tls1_2, int keySz)
  1971. {
  1972. word16 idx = 0;
  1973. (void)tls1_2;
  1974. (void)keySz;
  1975. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  1976. if (haveECDSAsig) {
  1977. #ifdef HAVE_ECC
  1978. #ifdef WOLFSSL_SHA512
  1979. AddSuiteHashSigAlgo(suites, sha512_mac, ecc_dsa_sa_algo, keySz, &idx);
  1980. #endif
  1981. #ifdef WOLFSSL_SHA384
  1982. AddSuiteHashSigAlgo(suites, sha384_mac, ecc_dsa_sa_algo, keySz, &idx);
  1983. #endif
  1984. #ifndef NO_SHA256
  1985. AddSuiteHashSigAlgo(suites, sha256_mac, ecc_dsa_sa_algo, keySz, &idx);
  1986. #endif
  1987. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  1988. defined(WOLFSSL_ALLOW_TLS_SHA1))
  1989. AddSuiteHashSigAlgo(suites, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  1990. #endif
  1991. #endif
  1992. #ifdef HAVE_ED25519
  1993. AddSuiteHashSigAlgo(suites, ED25519_SA_MAJOR, ED25519_SA_MINOR, keySz,
  1994. &idx);
  1995. #endif
  1996. #ifdef HAVE_ED448
  1997. AddSuiteHashSigAlgo(suites, ED448_SA_MAJOR, ED448_SA_MINOR, keySz,
  1998. &idx);
  1999. #endif
  2000. }
  2001. #endif /* HAVE_ECC || HAVE_ED25519 || defined(HAVE_ED448 */
  2002. if (haveRSAsig) {
  2003. #ifdef WC_RSA_PSS
  2004. if (tls1_2) {
  2005. #ifdef WOLFSSL_SHA512
  2006. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_pss_sa_algo, keySz,
  2007. &idx);
  2008. #endif
  2009. #ifdef WOLFSSL_SHA384
  2010. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_pss_sa_algo, keySz,
  2011. &idx);
  2012. #endif
  2013. #ifndef NO_SHA256
  2014. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_pss_sa_algo, keySz,
  2015. &idx);
  2016. #endif
  2017. }
  2018. #endif
  2019. #ifdef WOLFSSL_SHA512
  2020. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_sa_algo, keySz, &idx);
  2021. #endif
  2022. #ifdef WOLFSSL_SHA384
  2023. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_sa_algo, keySz, &idx);
  2024. #endif
  2025. #ifndef NO_SHA256
  2026. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_sa_algo, keySz, &idx);
  2027. #endif
  2028. #ifdef WOLFSSL_SHA224
  2029. AddSuiteHashSigAlgo(suites, sha224_mac, rsa_sa_algo, keySz, &idx);
  2030. #endif
  2031. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2032. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2033. AddSuiteHashSigAlgo(suites, sha_mac, rsa_sa_algo, keySz, &idx);
  2034. #endif
  2035. }
  2036. #ifdef HAVE_ANON
  2037. if (haveAnon) {
  2038. AddSuiteHashSigAlgo(suites, sha_mac, anonymous_sa_algo, keySz, &idx);
  2039. }
  2040. #endif
  2041. (void)haveAnon;
  2042. (void)haveECDSAsig;
  2043. suites->hashSigAlgoSz = idx;
  2044. }
  2045. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  2046. word16 havePSK, word16 haveDH, word16 haveNTRU,
  2047. word16 haveECDSAsig, word16 haveECC,
  2048. word16 haveStaticECC, word16 haveAnon, int side)
  2049. {
  2050. word16 idx = 0;
  2051. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  2052. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  2053. #ifdef WOLFSSL_TLS13
  2054. int tls1_3 = IsAtLeastTLSv1_3(pv);
  2055. #endif
  2056. int dtls = 0;
  2057. int haveRSAsig = 1;
  2058. (void)tls; /* shut up compiler */
  2059. (void)tls1_2;
  2060. (void)dtls;
  2061. (void)haveDH;
  2062. (void)havePSK;
  2063. (void)haveNTRU;
  2064. (void)haveStaticECC;
  2065. (void)haveECC;
  2066. (void)side;
  2067. (void)haveRSA; /* some builds won't read */
  2068. (void)haveRSAsig; /* non ecc builds won't read */
  2069. (void)haveAnon; /* anon ciphers optional */
  2070. if (suites == NULL) {
  2071. WOLFSSL_MSG("InitSuites pointer error");
  2072. return;
  2073. }
  2074. if (suites->setSuites)
  2075. return; /* trust user settings, don't override */
  2076. #ifdef WOLFSSL_TLS13
  2077. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  2078. if (tls1_3) {
  2079. suites->suites[idx++] = TLS13_BYTE;
  2080. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  2081. }
  2082. #endif
  2083. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  2084. if (tls1_3) {
  2085. suites->suites[idx++] = TLS13_BYTE;
  2086. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  2087. }
  2088. #endif
  2089. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  2090. if (tls1_3) {
  2091. suites->suites[idx++] = TLS13_BYTE;
  2092. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  2093. }
  2094. #endif
  2095. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  2096. if (tls1_3) {
  2097. suites->suites[idx++] = TLS13_BYTE;
  2098. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  2099. }
  2100. #endif
  2101. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  2102. if (tls1_3) {
  2103. suites->suites[idx++] = TLS13_BYTE;
  2104. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  2105. }
  2106. #endif
  2107. #ifdef HAVE_NULL_CIPHER
  2108. #ifdef BUILD_TLS_SHA256_SHA256
  2109. if (tls1_3) {
  2110. suites->suites[idx++] = ECC_BYTE;
  2111. suites->suites[idx++] = TLS_SHA256_SHA256;
  2112. }
  2113. #endif
  2114. #ifdef BUILD_TLS_SHA384_SHA384
  2115. if (tls1_3) {
  2116. suites->suites[idx++] = ECC_BYTE;
  2117. suites->suites[idx++] = TLS_SHA384_SHA384;
  2118. }
  2119. #endif
  2120. #endif
  2121. #endif /* WOLFSSL_TLS13 */
  2122. #ifndef WOLFSSL_NO_TLS12
  2123. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  2124. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  2125. haveRSA = 0; /* can't do RSA with ECDSA key */
  2126. }
  2127. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  2128. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  2129. }
  2130. #endif /* !NO_WOLFSSL_SERVER */
  2131. #ifdef WOLFSSL_DTLS
  2132. if (pv.major == DTLS_MAJOR) {
  2133. dtls = 1;
  2134. tls = 1;
  2135. /* May be dead assignments dependent upon configuration */
  2136. (void) dtls;
  2137. (void) tls;
  2138. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  2139. }
  2140. #endif
  2141. #ifdef HAVE_RENEGOTIATION_INDICATION
  2142. if (side == WOLFSSL_CLIENT_END) {
  2143. suites->suites[idx++] = CIPHER_BYTE;
  2144. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  2145. }
  2146. #endif
  2147. #ifdef BUILD_TLS_QSH
  2148. if (tls) {
  2149. suites->suites[idx++] = QSH_BYTE;
  2150. suites->suites[idx++] = TLS_QSH;
  2151. }
  2152. #endif
  2153. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  2154. if (tls && haveNTRU && haveRSA) {
  2155. suites->suites[idx++] = CIPHER_BYTE;
  2156. suites->suites[idx++] = TLS_NTRU_RSA_WITH_AES_256_CBC_SHA;
  2157. }
  2158. #endif
  2159. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  2160. if (tls && haveNTRU && haveRSA) {
  2161. suites->suites[idx++] = CIPHER_BYTE;
  2162. suites->suites[idx++] = TLS_NTRU_RSA_WITH_AES_128_CBC_SHA;
  2163. }
  2164. #endif
  2165. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  2166. if (!dtls && tls && haveNTRU && haveRSA) {
  2167. suites->suites[idx++] = CIPHER_BYTE;
  2168. suites->suites[idx++] = TLS_NTRU_RSA_WITH_RC4_128_SHA;
  2169. }
  2170. #endif
  2171. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  2172. if (tls && haveNTRU && haveRSA) {
  2173. suites->suites[idx++] = CIPHER_BYTE;
  2174. suites->suites[idx++] = TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA;
  2175. }
  2176. #endif
  2177. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2178. if (tls1_2 && haveECC) {
  2179. suites->suites[idx++] = ECC_BYTE;
  2180. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2181. }
  2182. #endif
  2183. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2184. if (tls1_2 && haveECC) {
  2185. suites->suites[idx++] = ECC_BYTE;
  2186. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2187. }
  2188. #endif
  2189. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2190. if (tls1_2 && haveRSA) {
  2191. suites->suites[idx++] = ECC_BYTE;
  2192. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2193. }
  2194. #endif
  2195. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2196. if (tls1_2 && haveRSA) {
  2197. suites->suites[idx++] = ECC_BYTE;
  2198. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2199. }
  2200. #endif
  2201. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2202. if (tls1_2 && haveDH && haveRSA) {
  2203. suites->suites[idx++] = CIPHER_BYTE;
  2204. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2205. }
  2206. #endif
  2207. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2208. if (tls1_2 && haveDH && haveRSA) {
  2209. suites->suites[idx++] = CIPHER_BYTE;
  2210. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2211. }
  2212. #endif
  2213. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  2214. if (tls1_2 && haveRSA) {
  2215. suites->suites[idx++] = CIPHER_BYTE;
  2216. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  2217. }
  2218. #endif
  2219. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  2220. if (tls1_2 && haveRSA) {
  2221. suites->suites[idx++] = CIPHER_BYTE;
  2222. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  2223. }
  2224. #endif
  2225. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  2226. if (tls1_2 && haveECC && haveStaticECC) {
  2227. suites->suites[idx++] = ECC_BYTE;
  2228. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  2229. }
  2230. #endif
  2231. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  2232. if (tls1_2 && haveECC && haveStaticECC) {
  2233. suites->suites[idx++] = ECC_BYTE;
  2234. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  2235. }
  2236. #endif
  2237. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  2238. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2239. suites->suites[idx++] = ECC_BYTE;
  2240. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  2241. }
  2242. #endif
  2243. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  2244. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2245. suites->suites[idx++] = ECC_BYTE;
  2246. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  2247. }
  2248. #endif
  2249. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  2250. if (tls1_2 && haveDH && havePSK) {
  2251. suites->suites[idx++] = CIPHER_BYTE;
  2252. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  2253. }
  2254. #endif
  2255. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  2256. if (tls1_2 && haveDH && haveAnon) {
  2257. suites->suites[idx++] = CIPHER_BYTE;
  2258. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  2259. }
  2260. #endif
  2261. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  2262. if (tls1_2 && haveDH && haveAnon) {
  2263. suites->suites[idx++] = CIPHER_BYTE;
  2264. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  2265. }
  2266. #endif
  2267. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  2268. if (tls1_2 && haveDH && havePSK) {
  2269. suites->suites[idx++] = CIPHER_BYTE;
  2270. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  2271. }
  2272. #endif
  2273. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  2274. if (tls1_2 && havePSK) {
  2275. suites->suites[idx++] = CIPHER_BYTE;
  2276. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  2277. }
  2278. #endif
  2279. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  2280. if (tls1_2 && havePSK) {
  2281. suites->suites[idx++] = CIPHER_BYTE;
  2282. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  2283. }
  2284. #endif
  2285. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  2286. if (tls1_2 && haveECC) {
  2287. suites->suites[idx++] = CHACHA_BYTE;
  2288. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  2289. }
  2290. #endif
  2291. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2292. if (tls1_2 && haveRSA) {
  2293. suites->suites[idx++] = CHACHA_BYTE;
  2294. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2295. }
  2296. #endif
  2297. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2298. if (tls1_2 && haveRSA) {
  2299. suites->suites[idx++] = CHACHA_BYTE;
  2300. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2301. }
  2302. #endif
  2303. /* Place as higher priority for MYSQL */
  2304. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  2305. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2306. if (tls && haveDH && haveRSA) {
  2307. suites->suites[idx++] = CIPHER_BYTE;
  2308. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2309. }
  2310. #endif
  2311. #endif
  2312. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  2313. if (tls1_2 && haveRSA) {
  2314. suites->suites[idx++] = ECC_BYTE;
  2315. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  2316. }
  2317. #endif
  2318. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  2319. if (tls1_2 && haveECC) {
  2320. suites->suites[idx++] = ECC_BYTE;
  2321. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  2322. }
  2323. #endif
  2324. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  2325. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2326. suites->suites[idx++] = ECC_BYTE;
  2327. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  2328. }
  2329. #endif
  2330. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  2331. if (tls1_2 && haveECC && haveStaticECC) {
  2332. suites->suites[idx++] = ECC_BYTE;
  2333. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  2334. }
  2335. #endif
  2336. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  2337. if (tls1_2 && haveRSA) {
  2338. suites->suites[idx++] = ECC_BYTE;
  2339. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  2340. }
  2341. #endif
  2342. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2343. if (tls1_2 && haveECC) {
  2344. suites->suites[idx++] = ECC_BYTE;
  2345. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  2346. }
  2347. #endif
  2348. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  2349. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2350. suites->suites[idx++] = ECC_BYTE;
  2351. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  2352. }
  2353. #endif
  2354. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  2355. if (tls1_2 && haveECC && haveStaticECC) {
  2356. suites->suites[idx++] = ECC_BYTE;
  2357. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  2358. }
  2359. #endif
  2360. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  2361. if (tls && haveECC) {
  2362. suites->suites[idx++] = ECC_BYTE;
  2363. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  2364. }
  2365. #endif
  2366. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  2367. if (tls && haveECC && haveStaticECC) {
  2368. suites->suites[idx++] = ECC_BYTE;
  2369. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  2370. }
  2371. #endif
  2372. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  2373. if (tls && haveECC) {
  2374. suites->suites[idx++] = ECC_BYTE;
  2375. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  2376. }
  2377. #endif
  2378. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  2379. if (tls && haveECC && haveStaticECC) {
  2380. suites->suites[idx++] = ECC_BYTE;
  2381. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  2382. }
  2383. #endif
  2384. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  2385. if (!dtls && tls && haveECC) {
  2386. suites->suites[idx++] = ECC_BYTE;
  2387. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  2388. }
  2389. #endif
  2390. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  2391. if (!dtls && tls && haveECC && haveStaticECC) {
  2392. suites->suites[idx++] = ECC_BYTE;
  2393. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  2394. }
  2395. #endif
  2396. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  2397. if (tls && haveECC) {
  2398. suites->suites[idx++] = ECC_BYTE;
  2399. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2400. }
  2401. #endif
  2402. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  2403. if (tls && haveECC && haveStaticECC) {
  2404. suites->suites[idx++] = ECC_BYTE;
  2405. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2406. }
  2407. #endif
  2408. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  2409. if (tls && haveRSA) {
  2410. suites->suites[idx++] = ECC_BYTE;
  2411. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  2412. }
  2413. #endif
  2414. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  2415. if (tls && haveRSAsig && haveStaticECC) {
  2416. suites->suites[idx++] = ECC_BYTE;
  2417. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  2418. }
  2419. #endif
  2420. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  2421. if (tls && haveRSA) {
  2422. suites->suites[idx++] = ECC_BYTE;
  2423. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  2424. }
  2425. #endif
  2426. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  2427. if (tls && haveRSAsig && haveStaticECC) {
  2428. suites->suites[idx++] = ECC_BYTE;
  2429. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  2430. }
  2431. #endif
  2432. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  2433. if (!dtls && tls && haveRSA) {
  2434. suites->suites[idx++] = ECC_BYTE;
  2435. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  2436. }
  2437. #endif
  2438. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  2439. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  2440. suites->suites[idx++] = ECC_BYTE;
  2441. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  2442. }
  2443. #endif
  2444. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  2445. if (tls && haveRSA) {
  2446. suites->suites[idx++] = ECC_BYTE;
  2447. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2448. }
  2449. #endif
  2450. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  2451. if (tls && haveRSAsig && haveStaticECC) {
  2452. suites->suites[idx++] = ECC_BYTE;
  2453. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  2454. }
  2455. #endif
  2456. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  2457. if (tls1_2 && haveECC) {
  2458. suites->suites[idx++] = ECC_BYTE;
  2459. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  2460. }
  2461. #endif
  2462. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  2463. if (tls1_2 && haveECC) {
  2464. suites->suites[idx++] = ECC_BYTE;
  2465. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  2466. }
  2467. #endif
  2468. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  2469. if (tls1_2 && haveECC) {
  2470. suites->suites[idx++] = ECC_BYTE;
  2471. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  2472. }
  2473. #endif
  2474. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  2475. if (tls1_2 && haveRSA) {
  2476. suites->suites[idx++] = ECC_BYTE;
  2477. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  2478. }
  2479. #endif
  2480. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  2481. if (tls1_2 && haveRSA) {
  2482. suites->suites[idx++] = ECC_BYTE;
  2483. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  2484. }
  2485. #endif
  2486. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  2487. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2488. if (tls1_2 && haveDH && haveRSA)
  2489. #else
  2490. if (tls && haveDH && haveRSA)
  2491. #endif
  2492. {
  2493. suites->suites[idx++] = CIPHER_BYTE;
  2494. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  2495. }
  2496. #endif
  2497. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  2498. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2499. if (tls1_2 && haveDH && haveRSA)
  2500. #else
  2501. if (tls && haveDH && haveRSA)
  2502. #endif
  2503. {
  2504. suites->suites[idx++] = CIPHER_BYTE;
  2505. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  2506. }
  2507. #endif
  2508. /* Place as higher priority for MYSQL testing */
  2509. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  2510. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2511. if (tls && haveDH && haveRSA) {
  2512. suites->suites[idx++] = CIPHER_BYTE;
  2513. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2514. }
  2515. #endif
  2516. #endif
  2517. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  2518. if (tls && haveDH && haveRSA) {
  2519. suites->suites[idx++] = CIPHER_BYTE;
  2520. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  2521. }
  2522. #endif
  2523. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  2524. if (tls && haveDH && haveRSA) {
  2525. suites->suites[idx++] = CIPHER_BYTE;
  2526. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2527. }
  2528. #endif
  2529. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  2530. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2531. if (tls1_2 && haveRSA)
  2532. #else
  2533. if (tls && haveRSA)
  2534. #endif
  2535. {
  2536. suites->suites[idx++] = CIPHER_BYTE;
  2537. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  2538. }
  2539. #endif
  2540. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  2541. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2542. if (tls1_2 && haveRSA)
  2543. #else
  2544. if (tls && haveRSA)
  2545. #endif
  2546. {
  2547. suites->suites[idx++] = CIPHER_BYTE;
  2548. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  2549. }
  2550. #endif
  2551. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  2552. if (tls && haveRSA) {
  2553. suites->suites[idx++] = CIPHER_BYTE;
  2554. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  2555. }
  2556. #endif
  2557. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  2558. if (tls && haveRSA) {
  2559. suites->suites[idx++] = CIPHER_BYTE;
  2560. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  2561. }
  2562. #endif
  2563. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2564. if (tls1_2 && haveECC) {
  2565. suites->suites[idx++] = CHACHA_BYTE;
  2566. suites->suites[idx++] =
  2567. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2568. }
  2569. #endif
  2570. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2571. if (tls1_2 && haveRSA) {
  2572. suites->suites[idx++] = CHACHA_BYTE;
  2573. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2574. }
  2575. #endif
  2576. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2577. if (tls1_2 && haveRSA) {
  2578. suites->suites[idx++] = CHACHA_BYTE;
  2579. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2580. }
  2581. #endif
  2582. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  2583. if (tls && haveECC) {
  2584. suites->suites[idx++] = ECC_BYTE;
  2585. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  2586. }
  2587. #endif
  2588. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  2589. if (tls && haveRSA) {
  2590. suites->suites[idx++] = CIPHER_BYTE;
  2591. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  2592. }
  2593. #endif
  2594. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  2595. if (tls && haveRSA) {
  2596. suites->suites[idx++] = CIPHER_BYTE;
  2597. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  2598. }
  2599. #endif
  2600. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  2601. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2602. if (tls1_2 && haveRSA)
  2603. #else
  2604. if (tls && haveRSA)
  2605. #endif
  2606. {
  2607. suites->suites[idx++] = CIPHER_BYTE;
  2608. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  2609. }
  2610. #endif
  2611. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  2612. if (tls && havePSK) {
  2613. suites->suites[idx++] = CIPHER_BYTE;
  2614. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  2615. }
  2616. #endif
  2617. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  2618. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2619. if (tls1_2 && haveDH && havePSK)
  2620. #else
  2621. if (tls && haveDH && havePSK)
  2622. #endif
  2623. {
  2624. suites->suites[idx++] = CIPHER_BYTE;
  2625. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  2626. }
  2627. #endif
  2628. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  2629. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2630. if (tls1_2 && havePSK)
  2631. #else
  2632. if (tls && havePSK)
  2633. #endif
  2634. {
  2635. suites->suites[idx++] = CIPHER_BYTE;
  2636. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  2637. }
  2638. #endif
  2639. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  2640. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2641. if (tls1_2 && haveDH && havePSK)
  2642. #else
  2643. if (tls && haveDH && havePSK)
  2644. #endif
  2645. {
  2646. suites->suites[idx++] = CIPHER_BYTE;
  2647. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  2648. }
  2649. #endif
  2650. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  2651. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2652. if (tls1_2 && havePSK)
  2653. #else
  2654. if (tls1 && havePSK)
  2655. #endif
  2656. {
  2657. suites->suites[idx++] = CIPHER_BYTE;
  2658. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  2659. }
  2660. #endif
  2661. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  2662. if (tls && havePSK) {
  2663. suites->suites[idx++] = CIPHER_BYTE;
  2664. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  2665. }
  2666. #endif
  2667. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  2668. if (tls && haveDH && havePSK) {
  2669. suites->suites[idx++] = ECC_BYTE;
  2670. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  2671. }
  2672. #endif
  2673. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  2674. if (tls && haveDH && havePSK) {
  2675. suites->suites[idx++] = ECC_BYTE;
  2676. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  2677. }
  2678. #endif
  2679. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  2680. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2681. if (tls1_2 && havePSK)
  2682. #else
  2683. if (tls && havePSK)
  2684. #endif
  2685. {
  2686. suites->suites[idx++] = CHACHA_BYTE;
  2687. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2688. }
  2689. #endif
  2690. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  2691. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2692. if (tls1_2 && havePSK)
  2693. #else
  2694. if (tls && havePSK)
  2695. #endif
  2696. {
  2697. suites->suites[idx++] = CHACHA_BYTE;
  2698. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2699. }
  2700. #endif
  2701. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  2702. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2703. if (tls1_2 && havePSK)
  2704. #else
  2705. if (tls && havePSK)
  2706. #endif
  2707. {
  2708. suites->suites[idx++] = CHACHA_BYTE;
  2709. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2710. }
  2711. #endif
  2712. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  2713. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2714. if (tls1_2 && havePSK)
  2715. #else
  2716. if (tls && havePSK)
  2717. #endif
  2718. {
  2719. suites->suites[idx++] = ECC_BYTE;
  2720. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  2721. }
  2722. #endif
  2723. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  2724. if (tls && havePSK) {
  2725. suites->suites[idx++] = ECC_BYTE;
  2726. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  2727. }
  2728. #endif
  2729. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  2730. if (tls && havePSK) {
  2731. suites->suites[idx++] = ECC_BYTE;
  2732. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  2733. }
  2734. #endif
  2735. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  2736. if (tls && havePSK) {
  2737. suites->suites[idx++] = ECC_BYTE;
  2738. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  2739. }
  2740. #endif
  2741. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  2742. if (tls && havePSK) {
  2743. suites->suites[idx++] = ECC_BYTE;
  2744. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  2745. }
  2746. #endif
  2747. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  2748. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2749. if (tls1_2 && haveDH && havePSK)
  2750. #else
  2751. if (tls && haveDH && havePSK)
  2752. #endif
  2753. {
  2754. suites->suites[idx++] = CIPHER_BYTE;
  2755. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  2756. }
  2757. #endif
  2758. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  2759. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2760. if (tls1_2 && havePSK)
  2761. #else
  2762. if (tls && havePSK)
  2763. #endif
  2764. {
  2765. suites->suites[idx++] = CIPHER_BYTE;
  2766. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  2767. }
  2768. #endif
  2769. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  2770. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2771. if (tls1_2 && havePSK)
  2772. #else
  2773. if (tls && havePSK)
  2774. #endif
  2775. {
  2776. suites->suites[idx++] = ECC_BYTE;
  2777. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  2778. }
  2779. #endif
  2780. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  2781. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2782. if (tls1_2 && haveDH && havePSK)
  2783. #else
  2784. if (tls && haveDH && havePSK)
  2785. #endif
  2786. {
  2787. suites->suites[idx++] = CIPHER_BYTE;
  2788. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  2789. }
  2790. #endif
  2791. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  2792. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2793. if (tls1_2 && havePSK)
  2794. #else
  2795. if (tls && havePSK)
  2796. #endif
  2797. {
  2798. suites->suites[idx++] = CIPHER_BYTE;
  2799. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  2800. }
  2801. #endif
  2802. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  2803. if (tls && havePSK) {
  2804. suites->suites[idx++] = CIPHER_BYTE;
  2805. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  2806. }
  2807. #endif
  2808. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  2809. if (!dtls && haveRSA) {
  2810. suites->suites[idx++] = CIPHER_BYTE;
  2811. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  2812. }
  2813. #endif
  2814. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  2815. if (!dtls && haveRSA) {
  2816. suites->suites[idx++] = CIPHER_BYTE;
  2817. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  2818. }
  2819. #endif
  2820. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  2821. if (haveRSA ) {
  2822. suites->suites[idx++] = CIPHER_BYTE;
  2823. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  2824. }
  2825. #endif
  2826. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  2827. if (!dtls && tls && haveRSA) {
  2828. suites->suites[idx++] = CIPHER_BYTE;
  2829. suites->suites[idx++] = TLS_RSA_WITH_HC_128_MD5;
  2830. }
  2831. #endif
  2832. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  2833. if (!dtls && tls && haveRSA) {
  2834. suites->suites[idx++] = CIPHER_BYTE;
  2835. suites->suites[idx++] = TLS_RSA_WITH_HC_128_SHA;
  2836. }
  2837. #endif
  2838. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  2839. if (!dtls && tls && haveRSA) {
  2840. suites->suites[idx++] = CIPHER_BYTE;
  2841. suites->suites[idx++] = TLS_RSA_WITH_RABBIT_SHA;
  2842. }
  2843. #endif
  2844. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  2845. if (tls && haveRSA) {
  2846. suites->suites[idx++] = CIPHER_BYTE;
  2847. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  2848. }
  2849. #endif
  2850. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  2851. if (tls && haveDH && haveRSA) {
  2852. suites->suites[idx++] = CIPHER_BYTE;
  2853. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  2854. }
  2855. #endif
  2856. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  2857. if (tls && haveRSA) {
  2858. suites->suites[idx++] = CIPHER_BYTE;
  2859. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  2860. }
  2861. #endif
  2862. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  2863. if (tls && haveDH && haveRSA) {
  2864. suites->suites[idx++] = CIPHER_BYTE;
  2865. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  2866. }
  2867. #endif
  2868. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  2869. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2870. if (tls1_2 && haveRSA)
  2871. #else
  2872. if (tls && haveRSA)
  2873. #endif
  2874. {
  2875. suites->suites[idx++] = CIPHER_BYTE;
  2876. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  2877. }
  2878. #endif
  2879. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  2880. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2881. if (tls1_2 && haveDH && haveRSA)
  2882. #else
  2883. if (tls && haveDH && haveRSA)
  2884. #endif
  2885. {
  2886. suites->suites[idx++] = CIPHER_BYTE;
  2887. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  2888. }
  2889. #endif
  2890. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  2891. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2892. if (tls1_2 && haveRSA)
  2893. #else
  2894. if (tls && haveRSA)
  2895. #endif
  2896. {
  2897. suites->suites[idx++] = CIPHER_BYTE;
  2898. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  2899. }
  2900. #endif
  2901. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  2902. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2903. if (tls1_2 && haveDH && haveRSA)
  2904. #else
  2905. if (tls && haveDH && haveRSA)
  2906. #endif
  2907. {
  2908. suites->suites[idx++] = CIPHER_BYTE;
  2909. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  2910. }
  2911. #endif
  2912. #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA
  2913. if (haveRSA) {
  2914. suites->suites[idx++] = CIPHER_BYTE;
  2915. suites->suites[idx++] = SSL_RSA_WITH_IDEA_CBC_SHA;
  2916. }
  2917. #endif
  2918. #endif /* !WOLFSSL_NO_TLS12 */
  2919. suites->suiteSz = idx;
  2920. InitSuitesHashSigAlgo(suites, haveECDSAsig | haveECC, haveRSAsig | haveRSA,
  2921. 0, tls1_2, keySz);
  2922. }
  2923. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  2924. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  2925. /* Decode the signature algorithm.
  2926. *
  2927. * input The encoded signature algorithm.
  2928. * hashalgo The hash algorithm.
  2929. * hsType The signature type.
  2930. */
  2931. static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  2932. {
  2933. switch (input[0]) {
  2934. case NEW_SA_MAJOR:
  2935. #ifdef HAVE_ED25519
  2936. /* ED25519: 0x0807 */
  2937. if (input[1] == ED25519_SA_MINOR) {
  2938. *hsType = ed25519_sa_algo;
  2939. /* Hash performed as part of sign/verify operation. */
  2940. *hashAlgo = sha512_mac;
  2941. }
  2942. else
  2943. #endif
  2944. #ifdef HAVE_ED448
  2945. /* ED448: 0x0808 */
  2946. if (input[1] == ED448_SA_MINOR) {
  2947. *hsType = ed448_sa_algo;
  2948. /* Hash performed as part of sign/verify operation. */
  2949. *hashAlgo = sha512_mac;
  2950. }
  2951. else
  2952. #endif
  2953. #ifdef WC_RSA_PSS
  2954. /* PSS PSS signatures: 0x080[9-b] */
  2955. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  2956. *hsType = rsa_pss_pss_algo;
  2957. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  2958. }
  2959. else
  2960. #endif
  2961. {
  2962. *hsType = input[0];
  2963. *hashAlgo = input[1];
  2964. }
  2965. break;
  2966. default:
  2967. *hashAlgo = input[0];
  2968. *hsType = input[1];
  2969. break;
  2970. }
  2971. }
  2972. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  2973. #ifndef WOLFSSL_NO_TLS12
  2974. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  2975. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  2976. defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
  2977. static enum wc_HashType HashAlgoToType(int hashAlgo)
  2978. {
  2979. switch (hashAlgo) {
  2980. #ifdef WOLFSSL_SHA512
  2981. case sha512_mac:
  2982. return WC_HASH_TYPE_SHA512;
  2983. #endif
  2984. #ifdef WOLFSSL_SHA384
  2985. case sha384_mac:
  2986. return WC_HASH_TYPE_SHA384;
  2987. #endif
  2988. #ifndef NO_SHA256
  2989. case sha256_mac:
  2990. return WC_HASH_TYPE_SHA256;
  2991. #endif
  2992. #ifdef WOLFSSL_SHA224
  2993. case sha224_mac:
  2994. return WC_HASH_TYPE_SHA224;
  2995. #endif
  2996. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2997. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2998. case sha_mac:
  2999. return WC_HASH_TYPE_SHA;
  3000. #endif
  3001. default:
  3002. WOLFSSL_MSG("Bad hash sig algo");
  3003. break;
  3004. }
  3005. return WC_HASH_TYPE_NONE;
  3006. }
  3007. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  3008. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3009. #endif /* !WOLFSSL_NO_TLS12 */
  3010. #ifndef NO_CERTS
  3011. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
  3012. {
  3013. (void)dynamicFlag;
  3014. (void)heap;
  3015. if (name != NULL) {
  3016. XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME));
  3017. name->name = name->staticName;
  3018. name->heap = heap;
  3019. }
  3020. }
  3021. void FreeX509Name(WOLFSSL_X509_NAME* name)
  3022. {
  3023. if (name != NULL) {
  3024. if (name->dynamicName) {
  3025. XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
  3026. name->name = NULL;
  3027. }
  3028. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3029. {
  3030. int i;
  3031. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  3032. if (name->entry[i].set) {
  3033. wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
  3034. wolfSSL_ASN1_STRING_free(name->entry[i].value);
  3035. }
  3036. }
  3037. }
  3038. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3039. }
  3040. }
  3041. /* Initialize wolfSSL X509 type */
  3042. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  3043. {
  3044. if (x509 == NULL) {
  3045. WOLFSSL_MSG("Null parameter passed in!");
  3046. return;
  3047. }
  3048. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  3049. x509->heap = heap;
  3050. InitX509Name(&x509->issuer, 0, heap);
  3051. InitX509Name(&x509->subject, 0, heap);
  3052. x509->dynamicMemory = (byte)dynamicFlag;
  3053. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3054. x509->refCount = 1;
  3055. (void)wc_InitMutex(&x509->refMutex);
  3056. #endif
  3057. }
  3058. /* Free wolfSSL X509 type */
  3059. void FreeX509(WOLFSSL_X509* x509)
  3060. {
  3061. if (x509 == NULL)
  3062. return;
  3063. FreeX509Name(&x509->issuer);
  3064. FreeX509Name(&x509->subject);
  3065. if (x509->pubKey.buffer) {
  3066. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  3067. x509->pubKey.buffer = NULL;
  3068. }
  3069. FreeDer(&x509->derCert);
  3070. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  3071. x509->sig.buffer = NULL;
  3072. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3073. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3074. x509->authKeyId = NULL;
  3075. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3076. x509->subjKeyId = NULL;
  3077. if (x509->authInfo != NULL) {
  3078. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3079. x509->authInfo = NULL;
  3080. }
  3081. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  3082. if (x509->authInfoCaIssuer != NULL) {
  3083. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3084. }
  3085. if (x509->ext_sk != NULL) {
  3086. wolfSSL_sk_X509_EXTENSION_free(x509->ext_sk);
  3087. }
  3088. if (x509->ext_sk_full != NULL) {
  3089. wolfSSL_sk_X509_EXTENSION_free(x509->ext_sk_full);
  3090. }
  3091. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  3092. #ifdef OPENSSL_EXTRA
  3093. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  3094. if (x509->serialNumber != NULL) {
  3095. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  3096. }
  3097. #endif
  3098. if (x509->extKeyUsageSrc != NULL) {
  3099. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3100. x509->extKeyUsageSrc= NULL;
  3101. }
  3102. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3103. #if defined(OPENSSL_ALL)
  3104. if (x509->algor.algorithm) {
  3105. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  3106. x509->algor.algorithm = NULL;
  3107. }
  3108. if (x509->key.algor) {
  3109. wolfSSL_X509_ALGOR_free(x509->key.algor);
  3110. x509->key.algor = NULL;
  3111. }
  3112. if (x509->key.pkey) {
  3113. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  3114. x509->key.pkey = NULL;
  3115. }
  3116. #endif /* OPENSSL_ALL */
  3117. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
  3118. if (x509->challengePwAttr) {
  3119. wolfSSL_X509_ATTRIBUTE_free(x509->challengePwAttr);
  3120. }
  3121. #endif /* WOLFSSL_CERT_REQ */
  3122. if (x509->altNames) {
  3123. FreeAltNames(x509->altNames, x509->heap);
  3124. x509->altNames = NULL;
  3125. }
  3126. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3127. wc_FreeMutex(&x509->refMutex);
  3128. #endif
  3129. }
  3130. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3131. #if !defined(WOLFSSL_NO_TLS12)
  3132. /* Encode the signature algorithm into buffer.
  3133. *
  3134. * hashalgo The hash algorithm.
  3135. * hsType The signature type.
  3136. * output The buffer to encode into.
  3137. */
  3138. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  3139. {
  3140. switch (hsType) {
  3141. #ifdef HAVE_ECC
  3142. case ecc_dsa_sa_algo:
  3143. output[0] = hashAlgo;
  3144. output[1] = ecc_dsa_sa_algo;
  3145. break;
  3146. #endif
  3147. #ifdef HAVE_ED25519
  3148. case ed25519_sa_algo:
  3149. output[0] = ED25519_SA_MAJOR;
  3150. output[1] = ED25519_SA_MINOR;
  3151. (void)hashAlgo;
  3152. break;
  3153. #endif
  3154. #ifdef HAVE_ED448
  3155. case ed448_sa_algo:
  3156. output[0] = ED448_SA_MAJOR;
  3157. output[1] = ED448_SA_MINOR;
  3158. (void)hashAlgo;
  3159. break;
  3160. #endif
  3161. #ifndef NO_RSA
  3162. case rsa_sa_algo:
  3163. output[0] = hashAlgo;
  3164. output[1] = rsa_sa_algo;
  3165. break;
  3166. #ifdef WC_RSA_PSS
  3167. /* PSS signatures: 0x080[4-6] */
  3168. case rsa_pss_sa_algo:
  3169. output[0] = rsa_pss_sa_algo;
  3170. output[1] = hashAlgo;
  3171. break;
  3172. #endif
  3173. #endif
  3174. default:
  3175. break;
  3176. }
  3177. (void)hashAlgo;
  3178. (void)output;
  3179. }
  3180. #endif
  3181. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  3182. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  3183. {
  3184. switch (hashAlgo) {
  3185. #ifndef NO_SHA
  3186. case sha_mac:
  3187. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  3188. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  3189. break;
  3190. #endif /* !NO_SHA */
  3191. #ifndef NO_SHA256
  3192. case sha256_mac:
  3193. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  3194. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  3195. break;
  3196. #endif /* !NO_SHA256 */
  3197. #ifdef WOLFSSL_SHA384
  3198. case sha384_mac:
  3199. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  3200. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  3201. break;
  3202. #endif /* WOLFSSL_SHA384 */
  3203. #ifdef WOLFSSL_SHA512
  3204. case sha512_mac:
  3205. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  3206. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  3207. break;
  3208. #endif /* WOLFSSL_SHA512 */
  3209. default:
  3210. break;
  3211. } /* switch */
  3212. }
  3213. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  3214. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3215. #endif /* !NO_CERTS */
  3216. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3217. static word32 MacSize(WOLFSSL* ssl)
  3218. {
  3219. #ifdef HAVE_TRUNCATED_HMAC
  3220. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  3221. : ssl->specs.hash_size;
  3222. #else
  3223. word32 digestSz = ssl->specs.hash_size;
  3224. #endif
  3225. return digestSz;
  3226. }
  3227. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  3228. #ifndef NO_RSA
  3229. #ifndef WOLFSSL_NO_TLS12
  3230. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3231. static int TypeHash(int hashAlgo)
  3232. {
  3233. switch (hashAlgo) {
  3234. #ifdef WOLFSSL_SHA512
  3235. case sha512_mac:
  3236. return SHA512h;
  3237. #endif
  3238. #ifdef WOLFSSL_SHA384
  3239. case sha384_mac:
  3240. return SHA384h;
  3241. #endif
  3242. #ifndef NO_SHA256
  3243. case sha256_mac:
  3244. return SHA256h;
  3245. #endif
  3246. #ifdef WOLFSSL_SHA224
  3247. case sha224_mac:
  3248. return SHA224h;
  3249. #endif
  3250. #ifndef NO_SHA
  3251. case sha_mac:
  3252. return SHAh;
  3253. #endif
  3254. default:
  3255. break;
  3256. }
  3257. return 0;
  3258. }
  3259. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  3260. #endif /* !WOLFSSL_NO_TLS12 */
  3261. #if defined(WC_RSA_PSS)
  3262. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  3263. {
  3264. switch (hashAlgo) {
  3265. #ifdef WOLFSSL_SHA512
  3266. case sha512_mac:
  3267. *hashType = WC_HASH_TYPE_SHA512;
  3268. if (mgf != NULL)
  3269. *mgf = WC_MGF1SHA512;
  3270. break;
  3271. #endif
  3272. #ifdef WOLFSSL_SHA384
  3273. case sha384_mac:
  3274. *hashType = WC_HASH_TYPE_SHA384;
  3275. if (mgf != NULL)
  3276. *mgf = WC_MGF1SHA384;
  3277. break;
  3278. #endif
  3279. #ifndef NO_SHA256
  3280. case sha256_mac:
  3281. *hashType = WC_HASH_TYPE_SHA256;
  3282. if (mgf != NULL)
  3283. *mgf = WC_MGF1SHA256;
  3284. break;
  3285. #endif
  3286. default:
  3287. return BAD_FUNC_ARG;
  3288. }
  3289. return 0;
  3290. }
  3291. #endif
  3292. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3293. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3294. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3295. DerBuffer* keyBufInfo)
  3296. {
  3297. int ret;
  3298. #ifdef HAVE_PK_CALLBACKS
  3299. const byte* keyBuf = NULL;
  3300. word32 keySz = 0;
  3301. if (keyBufInfo) {
  3302. keyBuf = keyBufInfo->buffer;
  3303. keySz = keyBufInfo->length;
  3304. }
  3305. #endif
  3306. (void)ssl;
  3307. (void)keyBufInfo;
  3308. (void)sigAlgo;
  3309. (void)hashAlgo;
  3310. WOLFSSL_ENTER("RsaSign");
  3311. #ifdef WOLFSSL_ASYNC_CRYPT
  3312. /* initialize event */
  3313. if (key) {
  3314. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3315. if (ret != 0)
  3316. return ret;
  3317. }
  3318. #endif
  3319. #if defined(WC_RSA_PSS)
  3320. if (sigAlgo == rsa_pss_sa_algo) {
  3321. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3322. int mgf = 0;
  3323. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3324. if (ret != 0)
  3325. return ret;
  3326. #if defined(HAVE_PK_CALLBACKS)
  3327. if (ssl->ctx->RsaPssSignCb) {
  3328. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3329. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  3330. TypeHash(hashAlgo), mgf,
  3331. keyBuf, keySz, ctx);
  3332. }
  3333. else
  3334. #endif
  3335. {
  3336. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  3337. ssl->rng);
  3338. }
  3339. }
  3340. else
  3341. #endif
  3342. #if defined(HAVE_PK_CALLBACKS)
  3343. if (ssl->ctx->RsaSignCb) {
  3344. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3345. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3346. ctx);
  3347. }
  3348. else
  3349. #endif /*HAVE_PK_CALLBACKS */
  3350. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  3351. /* Handle async pending response */
  3352. #ifdef WOLFSSL_ASYNC_CRYPT
  3353. if (key && ret == WC_PENDING_E) {
  3354. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3355. }
  3356. #endif /* WOLFSSL_ASYNC_CRYPT */
  3357. /* For positive response return in outSz */
  3358. if (ret > 0) {
  3359. *outSz = ret;
  3360. ret = 0;
  3361. }
  3362. WOLFSSL_LEAVE("RsaSign", ret);
  3363. return ret;
  3364. }
  3365. #endif
  3366. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  3367. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  3368. {
  3369. int ret;
  3370. #ifdef HAVE_PK_CALLBACKS
  3371. const byte* keyBuf = NULL;
  3372. word32 keySz = 0;
  3373. if (keyBufInfo) {
  3374. keyBuf = keyBufInfo->buffer;
  3375. keySz = keyBufInfo->length;
  3376. }
  3377. #endif
  3378. (void)ssl;
  3379. (void)keyBufInfo;
  3380. (void)sigAlgo;
  3381. (void)hashAlgo;
  3382. WOLFSSL_ENTER("RsaVerify");
  3383. #ifdef WOLFSSL_ASYNC_CRYPT
  3384. /* initialize event */
  3385. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3386. if (ret != 0)
  3387. return ret;
  3388. #endif
  3389. #if defined(WC_RSA_PSS)
  3390. if (sigAlgo == rsa_pss_sa_algo) {
  3391. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3392. int mgf = 0;
  3393. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3394. if (ret != 0)
  3395. return ret;
  3396. #ifdef HAVE_PK_CALLBACKS
  3397. if (ssl->ctx->RsaPssVerifyCb) {
  3398. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  3399. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  3400. TypeHash(hashAlgo), mgf,
  3401. keyBuf, keySz, ctx);
  3402. }
  3403. else
  3404. #endif /*HAVE_PK_CALLBACKS */
  3405. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  3406. }
  3407. else
  3408. #endif
  3409. #ifdef HAVE_PK_CALLBACKS
  3410. if (ssl->ctx->RsaVerifyCb) {
  3411. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  3412. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3413. }
  3414. else
  3415. #endif /*HAVE_PK_CALLBACKS */
  3416. {
  3417. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  3418. }
  3419. /* Handle async pending response */
  3420. #ifdef WOLFSSL_ASYNC_CRYPT
  3421. if (ret == WC_PENDING_E) {
  3422. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3423. }
  3424. #endif /* WOLFSSL_ASYNC_CRYPT */
  3425. WOLFSSL_LEAVE("RsaVerify", ret);
  3426. return ret;
  3427. }
  3428. /* Verify RSA signature, 0 on success */
  3429. /* This function is used to check the sign result */
  3430. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  3431. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3432. DerBuffer* keyBufInfo)
  3433. {
  3434. byte* out = NULL; /* inline result */
  3435. int ret;
  3436. #ifdef HAVE_PK_CALLBACKS
  3437. const byte* keyBuf = NULL;
  3438. word32 keySz = 0;
  3439. if (keyBufInfo) {
  3440. keyBuf = keyBufInfo->buffer;
  3441. keySz = keyBufInfo->length;
  3442. }
  3443. #endif
  3444. (void)ssl;
  3445. (void)keyBufInfo;
  3446. (void)sigAlgo;
  3447. (void)hashAlgo;
  3448. WOLFSSL_ENTER("VerifyRsaSign");
  3449. if (verifySig == NULL || plain == NULL) {
  3450. return BAD_FUNC_ARG;
  3451. }
  3452. if (sigSz > ENCRYPT_LEN) {
  3453. WOLFSSL_MSG("Signature buffer too big");
  3454. return BUFFER_E;
  3455. }
  3456. #ifdef WOLFSSL_ASYNC_CRYPT
  3457. /* initialize event */
  3458. if (key) {
  3459. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3460. if (ret != 0)
  3461. return ret;
  3462. }
  3463. #endif
  3464. #if defined(WC_RSA_PSS)
  3465. if (sigAlgo == rsa_pss_sa_algo) {
  3466. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3467. int mgf = 0;
  3468. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3469. if (ret != 0)
  3470. return ret;
  3471. #ifdef HAVE_PK_CALLBACKS
  3472. if (ssl->ctx->RsaPssSignCheckCb) {
  3473. /* The key buffer includes private/public portion,
  3474. but only public is used */
  3475. /* If HSM hardware is checking the signature result you can
  3476. optionally skip the sign check and return 0 */
  3477. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3478. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3479. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  3480. TypeHash(hashAlgo), mgf,
  3481. keyBuf, keySz, ctx);
  3482. if (ret > 0) {
  3483. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  3484. hashType);
  3485. if (ret != 0)
  3486. ret = VERIFY_CERT_ERROR;
  3487. }
  3488. }
  3489. else
  3490. #endif /* HAVE_PK_CALLBACKS */
  3491. {
  3492. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  3493. key);
  3494. if (ret > 0) {
  3495. #ifdef HAVE_SELFTEST
  3496. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  3497. hashType);
  3498. #else
  3499. ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret,
  3500. hashType, -1,
  3501. mp_count_bits(&key->n));
  3502. #endif
  3503. if (ret != 0)
  3504. ret = VERIFY_CERT_ERROR;
  3505. }
  3506. }
  3507. }
  3508. else
  3509. #endif /* WC_RSA_PSS */
  3510. {
  3511. #ifdef HAVE_PK_CALLBACKS
  3512. if (ssl->ctx->RsaSignCheckCb) {
  3513. /* The key buffer includes private/public portion,
  3514. but only public is used */
  3515. /* If HSM hardware is checking the signature result you can
  3516. optionally skip the sign check and return 0 */
  3517. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3518. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3519. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  3520. keyBuf, keySz, ctx);
  3521. }
  3522. else
  3523. #endif /* HAVE_PK_CALLBACKS */
  3524. {
  3525. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  3526. }
  3527. if (ret > 0) {
  3528. if (ret != (int)plainSz || !out ||
  3529. XMEMCMP(plain, out, plainSz) != 0) {
  3530. WOLFSSL_MSG("RSA Signature verification failed");
  3531. ret = RSA_SIGN_FAULT;
  3532. } else {
  3533. ret = 0; /* RSA reset */
  3534. }
  3535. }
  3536. }
  3537. /* Handle async pending response */
  3538. #ifdef WOLFSSL_ASYNC_CRYPT
  3539. if (key && ret == WC_PENDING_E) {
  3540. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3541. }
  3542. #endif /* WOLFSSL_ASYNC_CRYPT */
  3543. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  3544. return ret;
  3545. }
  3546. #ifndef WOLFSSL_NO_TLS12
  3547. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3548. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  3549. RsaKey* key, DerBuffer* keyBufInfo)
  3550. {
  3551. int ret;
  3552. #ifdef HAVE_PK_CALLBACKS
  3553. const byte* keyBuf = NULL;
  3554. word32 keySz = 0;
  3555. if (keyBufInfo) {
  3556. keyBuf = keyBufInfo->buffer;
  3557. keySz = keyBufInfo->length;
  3558. }
  3559. #endif
  3560. (void)ssl;
  3561. (void)keyBufInfo;
  3562. WOLFSSL_ENTER("RsaDec");
  3563. #ifdef WOLFSSL_ASYNC_CRYPT
  3564. /* initialize event */
  3565. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3566. if (ret != 0)
  3567. return ret;
  3568. #endif
  3569. #ifdef HAVE_PK_CALLBACKS
  3570. if (ssl->ctx->RsaDecCb) {
  3571. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  3572. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3573. }
  3574. else
  3575. #endif /* HAVE_PK_CALLBACKS */
  3576. {
  3577. #ifdef WC_RSA_BLINDING
  3578. ret = wc_RsaSetRNG(key, ssl->rng);
  3579. if (ret != 0)
  3580. return ret;
  3581. #endif
  3582. ret = wc_RsaPrivateDecryptInline(in, inSz, out, key);
  3583. }
  3584. /* Handle async pending response */
  3585. #ifdef WOLFSSL_ASYNC_CRYPT
  3586. if (ret == WC_PENDING_E) {
  3587. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3588. }
  3589. #endif /* WOLFSSL_ASYNC_CRYPT */
  3590. /* For positive response return in outSz */
  3591. if (ret > 0) {
  3592. *outSz = ret;
  3593. ret = 0;
  3594. }
  3595. WOLFSSL_LEAVE("RsaDec", ret);
  3596. return ret;
  3597. }
  3598. #endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
  3599. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  3600. RsaKey* key, buffer* keyBufInfo)
  3601. {
  3602. int ret;
  3603. #ifdef HAVE_PK_CALLBACKS
  3604. const byte* keyBuf = NULL;
  3605. word32 keySz = 0;
  3606. if (keyBufInfo) {
  3607. keyBuf = keyBufInfo->buffer;
  3608. keySz = keyBufInfo->length;
  3609. }
  3610. #endif
  3611. (void)ssl;
  3612. (void)keyBufInfo;
  3613. WOLFSSL_ENTER("RsaEnc");
  3614. #ifdef WOLFSSL_ASYNC_CRYPT
  3615. /* initialize event */
  3616. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3617. if (ret != 0)
  3618. return ret;
  3619. #endif
  3620. #ifdef HAVE_PK_CALLBACKS
  3621. if (ssl->ctx->RsaEncCb) {
  3622. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  3623. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  3624. }
  3625. else
  3626. #endif /* HAVE_PK_CALLBACKS */
  3627. {
  3628. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  3629. }
  3630. /* Handle async pending response */
  3631. #ifdef WOLFSSL_ASYNC_CRYPT
  3632. if (ret == WC_PENDING_E) {
  3633. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3634. }
  3635. #endif /* WOLFSSL_ASYNC_CRYPT */
  3636. /* For positive response return in outSz */
  3637. if (ret > 0) {
  3638. *outSz = ret;
  3639. ret = 0;
  3640. }
  3641. WOLFSSL_LEAVE("RsaEnc", ret);
  3642. return ret;
  3643. }
  3644. #endif /* !WOLFSSL_NO_TLS12 */
  3645. #endif /* NO_RSA */
  3646. #ifdef HAVE_ECC
  3647. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3648. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  3649. {
  3650. int ret;
  3651. #ifdef HAVE_PK_CALLBACKS
  3652. const byte* keyBuf = NULL;
  3653. word32 keySz = 0;
  3654. if (keyBufInfo) {
  3655. keyBuf = keyBufInfo->buffer;
  3656. keySz = keyBufInfo->length;
  3657. }
  3658. #endif
  3659. (void)ssl;
  3660. (void)keyBufInfo;
  3661. WOLFSSL_ENTER("EccSign");
  3662. #ifdef WOLFSSL_ASYNC_CRYPT
  3663. /* initialize event */
  3664. if (key) {
  3665. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3666. if (ret != 0)
  3667. return ret;
  3668. }
  3669. #endif
  3670. #if defined(HAVE_PK_CALLBACKS)
  3671. if (ssl->ctx->EccSignCb) {
  3672. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  3673. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  3674. keySz, ctx);
  3675. }
  3676. else
  3677. #endif /* HAVE_PK_CALLBACKS */
  3678. {
  3679. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  3680. }
  3681. /* Handle async pending response */
  3682. #ifdef WOLFSSL_ASYNC_CRYPT
  3683. if (key && ret == WC_PENDING_E) {
  3684. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3685. }
  3686. #endif /* WOLFSSL_ASYNC_CRYPT */
  3687. WOLFSSL_LEAVE("EccSign", ret);
  3688. return ret;
  3689. }
  3690. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  3691. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  3692. {
  3693. int ret;
  3694. #ifdef HAVE_PK_CALLBACKS
  3695. const byte* keyBuf = NULL;
  3696. word32 keySz = 0;
  3697. if (keyBufInfo) {
  3698. keyBuf = keyBufInfo->buffer;
  3699. keySz = keyBufInfo->length;
  3700. }
  3701. #endif
  3702. (void)ssl;
  3703. (void)keyBufInfo;
  3704. WOLFSSL_ENTER("EccVerify");
  3705. #ifdef WOLFSSL_ASYNC_CRYPT
  3706. /* initialize event */
  3707. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3708. if (ret != 0)
  3709. return ret;
  3710. #endif
  3711. #ifdef HAVE_PK_CALLBACKS
  3712. if (ssl->ctx->EccVerifyCb) {
  3713. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  3714. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3715. &ssl->eccVerifyRes, ctx);
  3716. }
  3717. else
  3718. #endif /* HAVE_PK_CALLBACKS */
  3719. {
  3720. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  3721. }
  3722. /* Handle async pending response */
  3723. #ifdef WOLFSSL_ASYNC_CRYPT
  3724. if (ret == WC_PENDING_E) {
  3725. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3726. }
  3727. else
  3728. #endif /* WOLFSSL_ASYNC_CRYPT */
  3729. {
  3730. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  3731. }
  3732. WOLFSSL_LEAVE("EccVerify", ret);
  3733. return ret;
  3734. }
  3735. #ifdef HAVE_PK_CALLBACKS
  3736. /* Gets ECC key for shared secret callback testing
  3737. * Client side: returns peer key
  3738. * Server side: returns private key
  3739. */
  3740. static int EccGetKey(WOLFSSL* ssl, ecc_key** otherKey)
  3741. {
  3742. int ret = NO_PEER_KEY;
  3743. ecc_key* tmpKey = NULL;
  3744. if (ssl == NULL || otherKey == NULL) {
  3745. return BAD_FUNC_ARG;
  3746. }
  3747. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  3748. if (ssl->specs.static_ecdh) {
  3749. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent ||
  3750. !ssl->peerEccDsaKey->dp) {
  3751. return NO_PEER_KEY;
  3752. }
  3753. tmpKey = (struct ecc_key*)ssl->peerEccDsaKey;
  3754. }
  3755. else {
  3756. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  3757. !ssl->peerEccKey->dp) {
  3758. return NO_PEER_KEY;
  3759. }
  3760. tmpKey = (struct ecc_key*)ssl->peerEccKey;
  3761. }
  3762. }
  3763. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  3764. if (ssl->specs.static_ecdh) {
  3765. if (ssl->hsKey == NULL) {
  3766. return NO_PRIVATE_KEY;
  3767. }
  3768. tmpKey = (struct ecc_key*)ssl->hsKey;
  3769. }
  3770. else {
  3771. if (!ssl->eccTempKeyPresent) {
  3772. return NO_PRIVATE_KEY;
  3773. }
  3774. tmpKey = (struct ecc_key*)ssl->eccTempKey;
  3775. }
  3776. }
  3777. if (tmpKey) {
  3778. *otherKey = tmpKey;
  3779. ret = 0;
  3780. }
  3781. return ret;
  3782. }
  3783. #endif /* HAVE_PK_CALLBACKS */
  3784. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  3785. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  3786. int side)
  3787. {
  3788. int ret;
  3789. #ifdef HAVE_PK_CALLBACKS
  3790. ecc_key* otherKey = NULL;
  3791. #endif
  3792. #ifdef WOLFSSL_ASYNC_CRYPT
  3793. WC_ASYNC_DEV* asyncDev = &priv_key->asyncDev;
  3794. #endif
  3795. (void)ssl;
  3796. (void)pubKeyDer;
  3797. (void)pubKeySz;
  3798. (void)side;
  3799. WOLFSSL_ENTER("EccSharedSecret");
  3800. #ifdef HAVE_PK_CALLBACKS
  3801. if (ssl->ctx->EccSharedSecretCb) {
  3802. ret = EccGetKey(ssl, &otherKey);
  3803. if (ret != 0)
  3804. return ret;
  3805. #ifdef WOLFSSL_ASYNC_CRYPT
  3806. asyncDev = &otherKey->asyncDev;
  3807. #endif
  3808. }
  3809. #endif
  3810. #ifdef WOLFSSL_ASYNC_CRYPT
  3811. /* initialize event */
  3812. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3813. if (ret != 0)
  3814. return ret;
  3815. #endif
  3816. #ifdef HAVE_PK_CALLBACKS
  3817. if (ssl->ctx->EccSharedSecretCb) {
  3818. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  3819. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  3820. pubKeySz, out, outlen, side, ctx);
  3821. }
  3822. else
  3823. #endif
  3824. {
  3825. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  3826. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \
  3827. !defined(HAVE_SELFTEST)
  3828. ret = wc_ecc_set_rng(priv_key, ssl->rng);
  3829. if (ret == 0)
  3830. #endif
  3831. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  3832. }
  3833. /* Handle async pending response */
  3834. #ifdef WOLFSSL_ASYNC_CRYPT
  3835. if (ret == WC_PENDING_E) {
  3836. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  3837. }
  3838. #endif /* WOLFSSL_ASYNC_CRYPT */
  3839. WOLFSSL_LEAVE("EccSharedSecret", ret);
  3840. return ret;
  3841. }
  3842. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  3843. {
  3844. int ret = 0;
  3845. int keySz = 0;
  3846. int ecc_curve = ECC_CURVE_DEF;
  3847. WOLFSSL_ENTER("EccMakeKey");
  3848. #ifdef WOLFSSL_ASYNC_CRYPT
  3849. /* initialize event */
  3850. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  3851. if (ret != 0)
  3852. return ret;
  3853. #endif
  3854. /* get key size */
  3855. if (peer == NULL || peer->dp == NULL) {
  3856. keySz = ssl->eccTempKeySz;
  3857. }
  3858. else {
  3859. keySz = peer->dp->size;
  3860. ecc_curve = peer->dp->id;
  3861. }
  3862. /* get curve type */
  3863. if (ssl->ecdhCurveOID > 0) {
  3864. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  3865. }
  3866. #ifdef HAVE_PK_CALLBACKS
  3867. if (ssl->ctx->EccKeyGenCb) {
  3868. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  3869. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  3870. }
  3871. else
  3872. #endif
  3873. {
  3874. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  3875. }
  3876. /* make sure the curve is set for TLS */
  3877. if (ret == 0 && key->dp) {
  3878. ssl->ecdhCurveOID = key->dp->oidSum;
  3879. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  3880. ssl->namedGroup = 0;
  3881. #endif
  3882. }
  3883. /* Handle async pending response */
  3884. #ifdef WOLFSSL_ASYNC_CRYPT
  3885. if (ret == WC_PENDING_E) {
  3886. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3887. }
  3888. #endif /* WOLFSSL_ASYNC_CRYPT */
  3889. WOLFSSL_LEAVE("EccMakeKey", ret);
  3890. return ret;
  3891. }
  3892. #endif /* HAVE_ECC */
  3893. #ifdef HAVE_ED25519
  3894. /* Check whether the key contains a public key.
  3895. * If not then pull it out of the leaf certificate.
  3896. *
  3897. * ssl SSL/TLS object.
  3898. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  3899. * 0 on success.
  3900. */
  3901. int Ed25519CheckPubKey(WOLFSSL* ssl)
  3902. {
  3903. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  3904. int ret = 0;
  3905. /* Public key required for signing. */
  3906. if (!key->pubKeySet) {
  3907. DerBuffer* leaf = ssl->buffers.certificate;
  3908. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert),
  3909. ssl->heap, DYNAMIC_TYPE_DCERT);
  3910. if (cert == NULL)
  3911. ret = MEMORY_E;
  3912. if (ret == 0) {
  3913. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  3914. ret = DecodeToKey(cert, 0);
  3915. }
  3916. if (ret == 0) {
  3917. ret = wc_ed25519_import_public(cert->publicKey, cert->pubKeySize,
  3918. key);
  3919. }
  3920. if (cert != NULL) {
  3921. FreeDecodedCert(cert);
  3922. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  3923. }
  3924. }
  3925. return ret;
  3926. }
  3927. /* Sign the data using EdDSA and key using Ed25519.
  3928. *
  3929. * ssl SSL object.
  3930. * in Data or message to sign.
  3931. * inSz Length of the data.
  3932. * out Buffer to hold signature.
  3933. * outSz On entry, size of the buffer. On exit, the size of the signature.
  3934. * key The private Ed25519 key data.
  3935. * keySz The length of the private key data in bytes.
  3936. * ctx The callback context.
  3937. * returns 0 on success, otherwise the value is an error.
  3938. */
  3939. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3940. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  3941. {
  3942. int ret;
  3943. #ifdef HAVE_PK_CALLBACKS
  3944. const byte* keyBuf = NULL;
  3945. word32 keySz = 0;
  3946. if (keyBufInfo) {
  3947. keyBuf = keyBufInfo->buffer;
  3948. keySz = keyBufInfo->length;
  3949. }
  3950. #endif
  3951. (void)ssl;
  3952. (void)keyBufInfo;
  3953. WOLFSSL_ENTER("Ed25519Sign");
  3954. #ifdef WOLFSSL_ASYNC_CRYPT
  3955. /* initialize event */
  3956. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3957. if (ret != 0)
  3958. return ret;
  3959. #endif
  3960. #if defined(HAVE_PK_CALLBACKS)
  3961. if (ssl->ctx->Ed25519SignCb) {
  3962. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  3963. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  3964. keySz, ctx);
  3965. }
  3966. else
  3967. #endif /* HAVE_PK_CALLBACKS */
  3968. {
  3969. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  3970. }
  3971. /* Handle async pending response */
  3972. #ifdef WOLFSSL_ASYNC_CRYPT
  3973. if (ret == WC_PENDING_E) {
  3974. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3975. }
  3976. #endif /* WOLFSSL_ASYNC_CRYPT */
  3977. WOLFSSL_LEAVE("Ed25519Sign", ret);
  3978. return ret;
  3979. }
  3980. /* Verify the data using EdDSA and key using Ed25519.
  3981. *
  3982. * ssl SSL object.
  3983. * in Signature data.
  3984. * inSz Length of the signature data in bytes.
  3985. * msg Message to verify.
  3986. * outSz Length of message in bytes.
  3987. * key The public Ed25519 key data.
  3988. * keySz The length of the private key data in bytes.
  3989. * ctx The callback context.
  3990. * returns 0 on success, otherwise the value is an error.
  3991. */
  3992. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  3993. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  3994. {
  3995. int ret;
  3996. #ifdef HAVE_PK_CALLBACKS
  3997. const byte* keyBuf = NULL;
  3998. word32 keySz = 0;
  3999. if (keyBufInfo) {
  4000. keyBuf = keyBufInfo->buffer;
  4001. keySz = keyBufInfo->length;
  4002. }
  4003. #endif
  4004. (void)ssl;
  4005. (void)keyBufInfo;
  4006. WOLFSSL_ENTER("Ed25519Verify");
  4007. #ifdef WOLFSSL_ASYNC_CRYPT
  4008. /* initialize event */
  4009. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4010. if (ret != 0)
  4011. return ret;
  4012. #endif
  4013. #ifdef HAVE_PK_CALLBACKS
  4014. if (ssl->ctx->Ed25519VerifyCb) {
  4015. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  4016. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  4017. keySz, &ssl->eccVerifyRes, ctx);
  4018. }
  4019. else
  4020. #endif /* HAVE_PK_CALLBACKS */
  4021. {
  4022. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  4023. &ssl->eccVerifyRes, key);
  4024. }
  4025. /* Handle async pending response */
  4026. #ifdef WOLFSSL_ASYNC_CRYPT
  4027. if (ret == WC_PENDING_E) {
  4028. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4029. }
  4030. else
  4031. #endif /* WOLFSSL_ASYNC_CRYPT */
  4032. {
  4033. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4034. }
  4035. WOLFSSL_LEAVE("Ed25519Verify", ret);
  4036. return ret;
  4037. }
  4038. #endif /* HAVE_ED25519 */
  4039. #ifndef WOLFSSL_NO_TLS12
  4040. #ifdef HAVE_CURVE25519
  4041. #ifdef HAVE_PK_CALLBACKS
  4042. /* Gets X25519 key for shared secret callback testing
  4043. * Client side: returns peer key
  4044. * Server side: returns private key
  4045. */
  4046. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  4047. {
  4048. int ret = NO_PEER_KEY;
  4049. struct curve25519_key* tmpKey = NULL;
  4050. if (ssl == NULL || otherKey == NULL) {
  4051. return BAD_FUNC_ARG;
  4052. }
  4053. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4054. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  4055. !ssl->peerX25519Key->dp) {
  4056. return NO_PEER_KEY;
  4057. }
  4058. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  4059. }
  4060. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4061. if (!ssl->eccTempKeyPresent) {
  4062. return NO_PRIVATE_KEY;
  4063. }
  4064. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  4065. }
  4066. if (tmpKey) {
  4067. *otherKey = (curve25519_key *)tmpKey;
  4068. ret = 0;
  4069. }
  4070. return ret;
  4071. }
  4072. #endif /* HAVE_PK_CALLBACKS */
  4073. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  4074. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  4075. byte* out, word32* outlen, int side)
  4076. {
  4077. int ret;
  4078. (void)ssl;
  4079. (void)pubKeyDer;
  4080. (void)pubKeySz;
  4081. (void)side;
  4082. WOLFSSL_ENTER("X25519SharedSecret");
  4083. #ifdef WOLFSSL_ASYNC_CRYPT
  4084. /* initialize event */
  4085. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4086. if (ret != 0)
  4087. return ret;
  4088. #endif
  4089. #ifdef HAVE_PK_CALLBACKS
  4090. if (ssl->ctx->X25519SharedSecretCb) {
  4091. curve25519_key* otherKey = NULL;
  4092. ret = X25519GetKey(ssl, &otherKey);
  4093. if (ret == 0) {
  4094. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  4095. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  4096. pubKeySz, out, outlen, side, ctx);
  4097. }
  4098. }
  4099. else
  4100. #endif
  4101. {
  4102. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  4103. EC25519_LITTLE_ENDIAN);
  4104. }
  4105. /* Handle async pending response */
  4106. #ifdef WOLFSSL_ASYNC_CRYPT
  4107. if (ret == WC_PENDING_E) {
  4108. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4109. }
  4110. #endif /* WOLFSSL_ASYNC_CRYPT */
  4111. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  4112. return ret;
  4113. }
  4114. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  4115. curve25519_key* peer)
  4116. {
  4117. int ret = 0;
  4118. (void)peer;
  4119. WOLFSSL_ENTER("X25519MakeKey");
  4120. #ifdef WOLFSSL_ASYNC_CRYPT
  4121. /* initialize event */
  4122. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4123. if (ret != 0)
  4124. return ret;
  4125. #endif
  4126. #ifdef HAVE_PK_CALLBACKS
  4127. if (ssl->ctx->X25519KeyGenCb) {
  4128. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  4129. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  4130. }
  4131. else
  4132. #endif
  4133. {
  4134. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  4135. }
  4136. if (ret == 0) {
  4137. ssl->ecdhCurveOID = ECC_X25519_OID;
  4138. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4139. ssl->namedGroup = 0;
  4140. #endif
  4141. }
  4142. /* Handle async pending response */
  4143. #ifdef WOLFSSL_ASYNC_CRYPT
  4144. if (ret == WC_PENDING_E) {
  4145. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4146. }
  4147. #endif /* WOLFSSL_ASYNC_CRYPT */
  4148. WOLFSSL_LEAVE("X25519MakeKey", ret);
  4149. return ret;
  4150. }
  4151. #endif /* HAVE_CURVE25519 */
  4152. #ifdef HAVE_ED448
  4153. /* Check whether the key contains a public key.
  4154. * If not then pull it out of the leaf certificate.
  4155. *
  4156. * ssl SSL/TLS object.
  4157. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4158. * 0 on success.
  4159. */
  4160. int Ed448CheckPubKey(WOLFSSL* ssl)
  4161. {
  4162. ed448_key* key = (ed448_key*)ssl->hsKey;
  4163. int ret = 0;
  4164. /* Public key required for signing. */
  4165. if (!key->pubKeySet) {
  4166. DerBuffer* leaf = ssl->buffers.certificate;
  4167. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert), ssl->heap,
  4168. DYNAMIC_TYPE_DCERT);
  4169. if (cert == NULL)
  4170. ret = MEMORY_E;
  4171. if (ret == 0) {
  4172. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4173. ret = DecodeToKey(cert, 0);
  4174. }
  4175. if (ret == 0) {
  4176. ret = wc_ed448_import_public(cert->publicKey, cert->pubKeySize,
  4177. key);
  4178. }
  4179. if (cert != NULL) {
  4180. FreeDecodedCert(cert);
  4181. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4182. }
  4183. }
  4184. return ret;
  4185. }
  4186. /* Sign the data using EdDSA and key using Ed448.
  4187. *
  4188. * ssl SSL object.
  4189. * in Data or message to sign.
  4190. * inSz Length of the data.
  4191. * out Buffer to hold signature.
  4192. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4193. * key The private Ed448 key data.
  4194. * keySz The length of the private key data in bytes.
  4195. * ctx The callback context.
  4196. * returns 0 on success, otherwise the value is an error.
  4197. */
  4198. int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4199. word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
  4200. {
  4201. int ret;
  4202. #ifdef HAVE_PK_CALLBACKS
  4203. const byte* keyBuf = NULL;
  4204. word32 keySz = 0;
  4205. if (keyBufInfo) {
  4206. keyBuf = keyBufInfo->buffer;
  4207. keySz = keyBufInfo->length;
  4208. }
  4209. #endif
  4210. (void)ssl;
  4211. (void)keyBufInfo;
  4212. WOLFSSL_ENTER("Ed448Sign");
  4213. #ifdef WOLFSSL_ASYNC_CRYPT
  4214. /* initialize event */
  4215. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4216. if (ret != 0)
  4217. return ret;
  4218. #endif
  4219. #if defined(HAVE_PK_CALLBACKS)
  4220. if (ssl->ctx->Ed448SignCb) {
  4221. void* ctx = wolfSSL_GetEd448SignCtx(ssl);
  4222. ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4223. ctx);
  4224. }
  4225. else
  4226. #endif /* HAVE_PK_CALLBACKS */
  4227. {
  4228. ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
  4229. }
  4230. /* Handle async pending response */
  4231. #ifdef WOLFSSL_ASYNC_CRYPT
  4232. if (ret == WC_PENDING_E) {
  4233. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4234. }
  4235. #endif /* WOLFSSL_ASYNC_CRYPT */
  4236. WOLFSSL_LEAVE("Ed448Sign", ret);
  4237. return ret;
  4238. }
  4239. /* Verify the data using EdDSA and key using Ed448.
  4240. *
  4241. * ssl SSL object.
  4242. * in Signature data.
  4243. * inSz Length of the signature data in bytes.
  4244. * msg Message to verify.
  4245. * outSz Length of message in bytes.
  4246. * key The public Ed448 key data.
  4247. * keySz The length of the private key data in bytes.
  4248. * ctx The callback context.
  4249. * returns 0 on success, otherwise the value is an error.
  4250. */
  4251. int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4252. word32 msgSz, ed448_key* key, buffer* keyBufInfo)
  4253. {
  4254. int ret;
  4255. #ifdef HAVE_PK_CALLBACKS
  4256. const byte* keyBuf = NULL;
  4257. word32 keySz = 0;
  4258. if (keyBufInfo) {
  4259. keyBuf = keyBufInfo->buffer;
  4260. keySz = keyBufInfo->length;
  4261. }
  4262. #endif
  4263. (void)ssl;
  4264. (void)keyBufInfo;
  4265. WOLFSSL_ENTER("Ed448Verify");
  4266. #ifdef WOLFSSL_ASYNC_CRYPT
  4267. /* initialize event */
  4268. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4269. if (ret != 0)
  4270. return ret;
  4271. #endif
  4272. #ifdef HAVE_PK_CALLBACKS
  4273. if (ssl->ctx->Ed448VerifyCb) {
  4274. void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
  4275. ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
  4276. &ssl->eccVerifyRes, ctx);
  4277. }
  4278. else
  4279. #endif /* HAVE_PK_CALLBACKS */
  4280. {
  4281. ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
  4282. NULL, 0);
  4283. }
  4284. /* Handle async pending response */
  4285. #ifdef WOLFSSL_ASYNC_CRYPT
  4286. if (ret == WC_PENDING_E) {
  4287. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4288. }
  4289. else
  4290. #endif /* WOLFSSL_ASYNC_CRYPT */
  4291. {
  4292. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4293. }
  4294. WOLFSSL_LEAVE("Ed448Verify", ret);
  4295. return ret;
  4296. }
  4297. #endif /* HAVE_ED448 */
  4298. #ifdef HAVE_CURVE448
  4299. #ifdef HAVE_PK_CALLBACKS
  4300. /* Gets X448 key for shared secret callback testing
  4301. * Client side: returns peer key
  4302. * Server side: returns private key
  4303. */
  4304. static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
  4305. {
  4306. int ret = NO_PEER_KEY;
  4307. struct curve448_key* tmpKey = NULL;
  4308. if (ssl == NULL || otherKey == NULL) {
  4309. return BAD_FUNC_ARG;
  4310. }
  4311. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4312. if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
  4313. return NO_PEER_KEY;
  4314. }
  4315. tmpKey = (struct curve448_key*)ssl->peerX448Key;
  4316. }
  4317. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4318. if (!ssl->eccTempKeyPresent) {
  4319. return NO_PRIVATE_KEY;
  4320. }
  4321. tmpKey = (struct curve448_key*)ssl->eccTempKey;
  4322. }
  4323. if (tmpKey) {
  4324. *otherKey = (curve448_key *)tmpKey;
  4325. ret = 0;
  4326. }
  4327. return ret;
  4328. }
  4329. #endif /* HAVE_PK_CALLBACKS */
  4330. static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
  4331. curve448_key* pub_key, byte* pubKeyDer,
  4332. word32* pubKeySz, byte* out, word32* outlen,
  4333. int side)
  4334. {
  4335. int ret;
  4336. (void)ssl;
  4337. (void)pubKeyDer;
  4338. (void)pubKeySz;
  4339. (void)side;
  4340. WOLFSSL_ENTER("X448SharedSecret");
  4341. #ifdef WOLFSSL_ASYNC_CRYPT
  4342. /* initialize event */
  4343. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4344. if (ret != 0)
  4345. return ret;
  4346. #endif
  4347. #ifdef HAVE_PK_CALLBACKS
  4348. if (ssl->ctx->X448SharedSecretCb) {
  4349. curve448_key* otherKey = NULL;
  4350. ret = X448GetKey(ssl, &otherKey);
  4351. if (ret == 0) {
  4352. void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
  4353. ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
  4354. pubKeySz, out, outlen, side, ctx);
  4355. }
  4356. }
  4357. else
  4358. #endif
  4359. {
  4360. ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
  4361. EC448_LITTLE_ENDIAN);
  4362. }
  4363. /* Handle async pending response */
  4364. #ifdef WOLFSSL_ASYNC_CRYPT
  4365. if (ret == WC_PENDING_E) {
  4366. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4367. }
  4368. #endif /* WOLFSSL_ASYNC_CRYPT */
  4369. WOLFSSL_LEAVE("X448SharedSecret", ret);
  4370. return ret;
  4371. }
  4372. static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
  4373. {
  4374. int ret = 0;
  4375. (void)peer;
  4376. WOLFSSL_ENTER("X448MakeKey");
  4377. #ifdef WOLFSSL_ASYNC_CRYPT
  4378. /* initialize event */
  4379. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4380. if (ret != 0)
  4381. return ret;
  4382. #endif
  4383. #ifdef HAVE_PK_CALLBACKS
  4384. if (ssl->ctx->X448KeyGenCb) {
  4385. void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
  4386. ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
  4387. }
  4388. else
  4389. #endif
  4390. {
  4391. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  4392. }
  4393. if (ret == 0) {
  4394. ssl->ecdhCurveOID = ECC_X448_OID;
  4395. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4396. ssl->namedGroup = 0;
  4397. #endif
  4398. }
  4399. /* Handle async pending response */
  4400. #ifdef WOLFSSL_ASYNC_CRYPT
  4401. if (ret == WC_PENDING_E) {
  4402. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4403. }
  4404. #endif /* WOLFSSL_ASYNC_CRYPT */
  4405. WOLFSSL_LEAVE("X448MakeKey", ret);
  4406. return ret;
  4407. }
  4408. #endif /* HAVE_CURVE448 */
  4409. #if !defined(NO_CERTS) || !defined(NO_PSK)
  4410. #if !defined(NO_DH)
  4411. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  4412. byte* priv, word32* privSz,
  4413. byte* pub, word32* pubSz)
  4414. {
  4415. int ret;
  4416. WOLFSSL_ENTER("DhGenKeyPair");
  4417. #ifdef WOLFSSL_ASYNC_CRYPT
  4418. /* initialize event */
  4419. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4420. if (ret != 0)
  4421. return ret;
  4422. #endif
  4423. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  4424. /* Handle async pending response */
  4425. #ifdef WOLFSSL_ASYNC_CRYPT
  4426. if (ret == WC_PENDING_E) {
  4427. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  4428. }
  4429. #endif /* WOLFSSL_ASYNC_CRYPT */
  4430. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  4431. return ret;
  4432. }
  4433. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  4434. const byte* priv, word32 privSz,
  4435. const byte* otherPub, word32 otherPubSz,
  4436. byte* agree, word32* agreeSz)
  4437. {
  4438. int ret;
  4439. (void)ssl;
  4440. WOLFSSL_ENTER("DhAgree");
  4441. #ifdef WOLFSSL_ASYNC_CRYPT
  4442. /* initialize event */
  4443. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4444. if (ret != 0)
  4445. return ret;
  4446. #endif
  4447. #ifdef HAVE_PK_CALLBACKS
  4448. if (ssl->ctx->DhAgreeCb) {
  4449. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  4450. WOLFSSL_MSG("Calling DhAgree Callback Function");
  4451. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  4452. otherPub, otherPubSz, agree, agreeSz, ctx);
  4453. }
  4454. else
  4455. #endif
  4456. {
  4457. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  4458. ret = wc_DhCheckPubValue(ssl->buffers.serverDH_P.buffer,
  4459. ssl->buffers.serverDH_P.length, otherPub, otherPubSz);
  4460. if (ret != 0) {
  4461. #ifdef OPENSSL_EXTRA
  4462. SendAlert(ssl, alert_fatal, illegal_parameter);
  4463. #endif
  4464. }
  4465. else
  4466. #endif
  4467. {
  4468. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  4469. otherPubSz);
  4470. }
  4471. }
  4472. /* Handle async pending response */
  4473. #ifdef WOLFSSL_ASYNC_CRYPT
  4474. if (ret == WC_PENDING_E) {
  4475. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  4476. }
  4477. #endif /* WOLFSSL_ASYNC_CRYPT */
  4478. WOLFSSL_LEAVE("DhAgree", ret);
  4479. return ret;
  4480. }
  4481. #endif /* !NO_DH */
  4482. #endif /* !NO_CERTS || !NO_PSK */
  4483. #endif /* !WOLFSSL_NO_TLS12 */
  4484. #ifdef HAVE_PK_CALLBACKS
  4485. int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
  4486. {
  4487. int pkcbset = 0;
  4488. (void)ssl;
  4489. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  4490. !defined(NO_RSA)
  4491. if (0
  4492. #ifdef HAVE_ECC
  4493. || (ssl->ctx->EccSignCb != NULL &&
  4494. ssl->buffers.keyType == ecc_dsa_sa_algo)
  4495. #endif
  4496. #ifdef HAVE_ED25519
  4497. || (ssl->ctx->Ed25519SignCb != NULL &&
  4498. ssl->buffers.keyType == ed25519_sa_algo)
  4499. #endif
  4500. #ifdef HAVE_ED448
  4501. || (ssl->ctx->Ed448SignCb != NULL &&
  4502. ssl->buffers.keyType == ed448_sa_algo)
  4503. #endif
  4504. #ifndef NO_RSA
  4505. || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
  4506. || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
  4507. #ifdef WC_RSA_PSS
  4508. || (ssl->ctx->RsaPssSignCb != NULL &&
  4509. ssl->buffers.keyType == rsa_pss_sa_algo)
  4510. #endif
  4511. #endif
  4512. ) {
  4513. pkcbset = 1;
  4514. }
  4515. #endif
  4516. return pkcbset;
  4517. }
  4518. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  4519. {
  4520. int pkcbset = 0;
  4521. (void)ctx;
  4522. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  4523. !defined(NO_RSA)
  4524. if (0
  4525. #ifdef HAVE_ECC
  4526. || ctx->EccSignCb != NULL
  4527. #endif
  4528. #ifdef HAVE_ED25519
  4529. || ctx->Ed25519SignCb != NULL
  4530. #endif
  4531. #ifdef HAVE_ED448
  4532. || ctx->Ed448SignCb != NULL
  4533. #endif
  4534. #ifndef NO_RSA
  4535. || ctx->RsaSignCb != NULL
  4536. || ctx->RsaDecCb != NULL
  4537. #ifdef WC_RSA_PSS
  4538. || ctx->RsaPssSignCb != NULL
  4539. #endif
  4540. #endif
  4541. ) {
  4542. pkcbset = 1;
  4543. }
  4544. #endif
  4545. return pkcbset;
  4546. }
  4547. #endif /* HAVE_PK_CALLBACKS */
  4548. int InitSSL_Suites(WOLFSSL* ssl)
  4549. {
  4550. int keySz = 0;
  4551. byte havePSK = 0;
  4552. byte haveAnon = 0;
  4553. byte haveRSA = 0;
  4554. byte haveMcast = 0;
  4555. (void)haveAnon; /* Squash unused var warnings */
  4556. (void)haveMcast;
  4557. if (!ssl)
  4558. return BAD_FUNC_ARG;
  4559. #ifndef NO_RSA
  4560. haveRSA = 1;
  4561. #endif
  4562. #ifndef NO_PSK
  4563. havePSK = (byte)ssl->options.havePSK;
  4564. #endif /* NO_PSK */
  4565. #ifdef HAVE_ANON
  4566. haveAnon = (byte)ssl->options.haveAnon;
  4567. #endif /* HAVE_ANON*/
  4568. #ifdef WOLFSSL_MULTICAST
  4569. haveMcast = (byte)ssl->options.haveMcast;
  4570. #endif /* WOLFSSL_MULTICAST */
  4571. #ifdef WOLFSSL_EARLY_DATA
  4572. if (ssl->options.side == WOLFSSL_SERVER_END)
  4573. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  4574. #endif
  4575. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  4576. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  4577. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  4578. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  4579. ssl->buffers.keyType == ed25519_sa_algo ||
  4580. ssl->buffers.keyType == ed448_sa_algo;
  4581. #endif
  4582. #ifndef NO_CERTS
  4583. keySz = ssl->buffers.keySz;
  4584. #endif
  4585. /* make sure server has DH parms, and add PSK if there, add NTRU too */
  4586. if (ssl->options.side == WOLFSSL_SERVER_END) {
  4587. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  4588. ssl->options.haveDH, ssl->options.haveNTRU,
  4589. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4590. ssl->options.haveStaticECC, ssl->options.haveAnon,
  4591. ssl->options.side);
  4592. }
  4593. else {
  4594. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  4595. TRUE, ssl->options.haveNTRU,
  4596. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4597. ssl->options.haveStaticECC, ssl->options.haveAnon,
  4598. ssl->options.side);
  4599. }
  4600. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  4601. /* make sure server has cert and key unless using PSK, Anon, or
  4602. * Multicast. This should be true even if just switching ssl ctx */
  4603. if (ssl->options.side == WOLFSSL_SERVER_END &&
  4604. !havePSK && !haveAnon && !haveMcast) {
  4605. /* server certificate must be loaded */
  4606. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  4607. WOLFSSL_MSG("Server missing certificate");
  4608. return NO_PRIVATE_KEY;
  4609. }
  4610. /* allow no private key if using PK callbacks and CB is set */
  4611. #ifdef HAVE_PK_CALLBACKS
  4612. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  4613. WOLFSSL_MSG("Using PK for server private key");
  4614. }
  4615. else
  4616. #endif
  4617. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  4618. WOLFSSL_MSG("Server missing private key");
  4619. return NO_PRIVATE_KEY;
  4620. }
  4621. }
  4622. #endif
  4623. return WOLFSSL_SUCCESS;
  4624. }
  4625. /* returns new reference count. Arg incr positive=up or negative=down */
  4626. int SSL_CTX_RefCount(WOLFSSL_CTX* ctx, int incr)
  4627. {
  4628. int refCount;
  4629. if (ctx == NULL) {
  4630. return BAD_FUNC_ARG;
  4631. }
  4632. if (wc_LockMutex(&ctx->countMutex) != 0) {
  4633. WOLFSSL_MSG("Couldn't lock CTX count mutex");
  4634. return BAD_MUTEX_E;
  4635. }
  4636. ctx->refCount += incr;
  4637. /* make sure refCount is never negative */
  4638. if (ctx->refCount < 0) {
  4639. ctx->refCount = 0;
  4640. }
  4641. refCount = ctx->refCount;
  4642. wc_UnLockMutex(&ctx->countMutex);
  4643. return refCount;
  4644. }
  4645. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  4646. It is used during initialization and to switch an ssl's CTX with
  4647. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  4648. unless writeDup is on.
  4649. ssl object to initialize
  4650. ctx parent factory
  4651. writeDup flag indicating this is a write dup only
  4652. WOLFSSL_SUCCESS return value on success */
  4653. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  4654. {
  4655. int ret;
  4656. byte newSSL;
  4657. if (!ssl || !ctx)
  4658. return BAD_FUNC_ARG;
  4659. #ifndef SINGLE_THREADED
  4660. if (ssl->suites == NULL && !writeDup)
  4661. return BAD_FUNC_ARG;
  4662. #endif
  4663. newSSL = ssl->ctx == NULL; /* Assign after null check */
  4664. #ifndef NO_PSK
  4665. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  4666. return BAD_FUNC_ARG; /* needed for copy below */
  4667. }
  4668. #endif
  4669. /* decrement previous CTX reference count if exists.
  4670. * This should only happen if switching ctxs!*/
  4671. if (!newSSL) {
  4672. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  4673. wolfSSL_CTX_free(ssl->ctx);
  4674. }
  4675. /* increment CTX reference count */
  4676. if ((ret = SSL_CTX_RefCount(ctx, 1)) < 0) {
  4677. return ret;
  4678. }
  4679. ret = WOLFSSL_SUCCESS; /* set default ret */
  4680. ssl->ctx = ctx; /* only for passing to calls, options could change */
  4681. ssl->version = ctx->method->version;
  4682. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  4683. ssl->options.mask = ctx->mask;
  4684. #endif
  4685. #ifdef OPENSSL_EXTRA
  4686. #ifdef WOLFSSL_TLS13
  4687. if (ssl->version.minor == TLSv1_3_MINOR &&
  4688. (ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  4689. if (!ctx->method->downgrade) {
  4690. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
  4691. "allowed and downgrading disabled.");
  4692. return VERSION_ERROR;
  4693. }
  4694. WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
  4695. ssl->version.minor = TLSv1_2_MINOR;
  4696. }
  4697. #endif
  4698. if (ssl->version.minor == TLSv1_2_MINOR &&
  4699. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  4700. if (!ctx->method->downgrade) {
  4701. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
  4702. "allowed and downgrading disabled.");
  4703. return VERSION_ERROR;
  4704. }
  4705. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  4706. ssl->version.minor = TLSv1_1_MINOR;
  4707. }
  4708. if (ssl->version.minor == TLSv1_1_MINOR &&
  4709. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  4710. if (!ctx->method->downgrade) {
  4711. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
  4712. "allowed and downgrading disabled.");
  4713. return VERSION_ERROR;
  4714. }
  4715. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  4716. ssl->options.tls1_1 = 0;
  4717. ssl->version.minor = TLSv1_MINOR;
  4718. }
  4719. if (ssl->version.minor == TLSv1_MINOR &&
  4720. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  4721. if (!ctx->method->downgrade) {
  4722. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
  4723. "allowed and downgrading disabled.");
  4724. return VERSION_ERROR;
  4725. }
  4726. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  4727. ssl->options.tls = 0;
  4728. ssl->options.tls1_1 = 0;
  4729. ssl->version.minor = SSLv3_MINOR;
  4730. }
  4731. if (ssl->version.minor == SSLv3_MINOR &&
  4732. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  4733. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  4734. return VERSION_ERROR;
  4735. }
  4736. if (ssl->version.minor < ssl->options.minDowngrade) {
  4737. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  4738. return VERSION_ERROR;
  4739. }
  4740. #endif
  4741. #ifdef HAVE_ECC
  4742. ssl->eccTempKeySz = ctx->eccTempKeySz;
  4743. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  4744. #endif
  4745. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  4746. ssl->pkCurveOID = ctx->pkCurveOID;
  4747. #endif
  4748. #ifdef OPENSSL_EXTRA
  4749. ssl->CBIS = ctx->CBIS;
  4750. #endif
  4751. ssl->timeout = ctx->timeout;
  4752. ssl->verifyCallback = ctx->verifyCallback;
  4753. ssl->options.side = ctx->method->side;
  4754. ssl->options.downgrade = ctx->method->downgrade;
  4755. ssl->options.minDowngrade = ctx->minDowngrade;
  4756. ssl->options.haveDH = ctx->haveDH;
  4757. ssl->options.haveNTRU = ctx->haveNTRU;
  4758. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  4759. ssl->options.haveECC = ctx->haveECC;
  4760. ssl->options.haveStaticECC = ctx->haveStaticECC;
  4761. #ifndef NO_PSK
  4762. ssl->options.havePSK = ctx->havePSK;
  4763. ssl->options.client_psk_cb = ctx->client_psk_cb;
  4764. ssl->options.server_psk_cb = ctx->server_psk_cb;
  4765. ssl->options.psk_ctx = ctx->psk_ctx;
  4766. #ifdef WOLFSSL_TLS13
  4767. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  4768. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  4769. #endif
  4770. #endif /* NO_PSK */
  4771. #ifdef WOLFSSL_EARLY_DATA
  4772. if (ssl->options.side == WOLFSSL_SERVER_END)
  4773. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  4774. #endif
  4775. #ifdef HAVE_ANON
  4776. ssl->options.haveAnon = ctx->haveAnon;
  4777. #endif
  4778. #ifndef NO_DH
  4779. ssl->options.minDhKeySz = ctx->minDhKeySz;
  4780. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  4781. #endif
  4782. #ifndef NO_RSA
  4783. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  4784. #endif
  4785. #ifdef HAVE_ECC
  4786. ssl->options.minEccKeySz = ctx->minEccKeySz;
  4787. #endif
  4788. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  4789. ssl->options.verifyDepth = ctx->verifyDepth;
  4790. #endif
  4791. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  4792. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  4793. #ifdef HAVE_EXT_CACHE
  4794. ssl->options.internalCacheOff = ctx->internalCacheOff;
  4795. #endif
  4796. ssl->options.verifyPeer = ctx->verifyPeer;
  4797. ssl->options.verifyNone = ctx->verifyNone;
  4798. ssl->options.failNoCert = ctx->failNoCert;
  4799. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  4800. ssl->options.sendVerify = ctx->sendVerify;
  4801. ssl->options.partialWrite = ctx->partialWrite;
  4802. ssl->options.quietShutdown = ctx->quietShutdown;
  4803. ssl->options.groupMessages = ctx->groupMessages;
  4804. #ifndef NO_DH
  4805. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  4806. !defined(HAVE_SELFTEST)
  4807. ssl->options.dhKeyTested = ctx->dhKeyTested;
  4808. #endif
  4809. ssl->buffers.serverDH_P = ctx->serverDH_P;
  4810. ssl->buffers.serverDH_G = ctx->serverDH_G;
  4811. #endif
  4812. #ifndef NO_CERTS
  4813. /* ctx still owns certificate, certChain, key, dh, and cm */
  4814. ssl->buffers.certificate = ctx->certificate;
  4815. ssl->buffers.certChain = ctx->certChain;
  4816. #ifdef WOLFSSL_TLS13
  4817. ssl->buffers.certChainCnt = ctx->certChainCnt;
  4818. #endif
  4819. ssl->buffers.key = ctx->privateKey;
  4820. ssl->buffers.keyType = ctx->privateKeyType;
  4821. ssl->buffers.keyId = ctx->privateKeyId;
  4822. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  4823. ssl->buffers.keySz = ctx->privateKeySz;
  4824. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  4825. #endif
  4826. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  4827. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  4828. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  4829. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  4830. ssl->buffers.keyType == ed25519_sa_algo ||
  4831. ssl->buffers.keyType == ed448_sa_algo;
  4832. #endif
  4833. #ifdef WOLFSSL_ASYNC_CRYPT
  4834. ssl->devId = ctx->devId;
  4835. #endif
  4836. if (writeDup == 0) {
  4837. #ifndef NO_PSK
  4838. if (ctx->server_hint[0]) { /* set in CTX */
  4839. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  4840. sizeof(ssl->arrays->server_hint));
  4841. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  4842. }
  4843. #endif /* NO_PSK */
  4844. if (ctx->suites) {
  4845. #ifndef SINGLE_THREADED
  4846. *ssl->suites = *ctx->suites;
  4847. #else
  4848. ssl->suites = ctx->suites;
  4849. #endif
  4850. }
  4851. else {
  4852. XMEMSET(ssl->suites, 0, sizeof(Suites));
  4853. }
  4854. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  4855. /* Defer initializing suites until accept or connect */
  4856. ret = InitSSL_Suites(ssl);
  4857. }
  4858. } /* writeDup check */
  4859. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  4860. if (ctx->mask != 0 && wolfSSL_set_options(ssl, ctx->mask) == 0) {
  4861. WOLFSSL_MSG("wolfSSL_set_options error");
  4862. return BAD_FUNC_ARG;
  4863. }
  4864. #endif
  4865. #ifdef WOLFSSL_SESSION_EXPORT
  4866. #ifdef WOLFSSL_DTLS
  4867. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  4868. #endif
  4869. #endif
  4870. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  4871. ssl->AcceptFilter = ctx->AcceptFilter;
  4872. ssl->AcceptFilter_arg = ctx->AcceptFilter_arg;
  4873. #endif
  4874. ssl->CBIORecv = ctx->CBIORecv;
  4875. ssl->CBIOSend = ctx->CBIOSend;
  4876. #ifdef OPENSSL_EXTRA
  4877. ssl->readAhead = ctx->readAhead;
  4878. #endif
  4879. ssl->verifyDepth = ctx->verifyDepth;
  4880. return ret;
  4881. }
  4882. int InitHandshakeHashes(WOLFSSL* ssl)
  4883. {
  4884. int ret;
  4885. /* make sure existing handshake hashes are free'd */
  4886. if (ssl->hsHashes != NULL) {
  4887. FreeHandshakeHashes(ssl);
  4888. }
  4889. /* allocate handshake hashes */
  4890. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  4891. DYNAMIC_TYPE_HASHES);
  4892. if (ssl->hsHashes == NULL) {
  4893. WOLFSSL_MSG("HS_Hashes Memory error");
  4894. return MEMORY_E;
  4895. }
  4896. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  4897. #ifndef NO_OLD_TLS
  4898. #ifndef NO_MD5
  4899. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  4900. if (ret != 0)
  4901. return ret;
  4902. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4903. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  4904. #endif
  4905. #endif
  4906. #ifndef NO_SHA
  4907. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  4908. if (ret != 0)
  4909. return ret;
  4910. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4911. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  4912. #endif
  4913. #endif
  4914. #endif /* !NO_OLD_TLS */
  4915. #ifndef NO_SHA256
  4916. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  4917. if (ret != 0)
  4918. return ret;
  4919. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4920. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  4921. #endif
  4922. #endif
  4923. #ifdef WOLFSSL_SHA384
  4924. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  4925. if (ret != 0)
  4926. return ret;
  4927. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4928. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  4929. #endif
  4930. #endif
  4931. #ifdef WOLFSSL_SHA512
  4932. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  4933. if (ret != 0)
  4934. return ret;
  4935. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4936. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  4937. #endif
  4938. #endif
  4939. return ret;
  4940. }
  4941. void FreeHandshakeHashes(WOLFSSL* ssl)
  4942. {
  4943. if (ssl->hsHashes) {
  4944. #ifndef NO_OLD_TLS
  4945. #ifndef NO_MD5
  4946. wc_Md5Free(&ssl->hsHashes->hashMd5);
  4947. #endif
  4948. #ifndef NO_SHA
  4949. wc_ShaFree(&ssl->hsHashes->hashSha);
  4950. #endif
  4951. #endif /* !NO_OLD_TLS */
  4952. #ifndef NO_SHA256
  4953. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  4954. #endif
  4955. #ifdef WOLFSSL_SHA384
  4956. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  4957. #endif
  4958. #ifdef WOLFSSL_SHA512
  4959. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  4960. #endif
  4961. #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \
  4962. !defined(WOLFSSL_NO_CLIENT_AUTH)
  4963. if (ssl->hsHashes->messages != NULL) {
  4964. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  4965. ssl->hsHashes->messages = NULL;
  4966. }
  4967. #endif
  4968. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  4969. ssl->hsHashes = NULL;
  4970. }
  4971. }
  4972. /* init everything to 0, NULL, default values before calling anything that may
  4973. fail so that destructor has a "good" state to cleanup
  4974. ssl object to initialize
  4975. ctx parent factory
  4976. writeDup flag indicating this is a write dup only
  4977. 0 on success */
  4978. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  4979. {
  4980. int ret;
  4981. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  4982. #if defined(WOLFSSL_STATIC_MEMORY)
  4983. if (ctx->heap != NULL) {
  4984. WOLFSSL_HEAP_HINT* ssl_hint;
  4985. WOLFSSL_HEAP_HINT* ctx_hint;
  4986. /* avoid dereferencing a test value */
  4987. #ifdef WOLFSSL_HEAP_TEST
  4988. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  4989. ssl->heap = ctx->heap;
  4990. }
  4991. else {
  4992. #endif
  4993. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  4994. ctx->heap, DYNAMIC_TYPE_SSL);
  4995. if (ssl->heap == NULL) {
  4996. return MEMORY_E;
  4997. }
  4998. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  4999. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  5000. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  5001. /* lock and check IO count / handshake count */
  5002. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5003. WOLFSSL_MSG("Bad memory_mutex lock");
  5004. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5005. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5006. return BAD_MUTEX_E;
  5007. }
  5008. if (ctx_hint->memory->maxHa > 0 &&
  5009. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  5010. WOLFSSL_MSG("At max number of handshakes for static memory");
  5011. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5012. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5013. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5014. return MEMORY_E;
  5015. }
  5016. if (ctx_hint->memory->maxIO > 0 &&
  5017. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  5018. WOLFSSL_MSG("At max number of IO allowed for static memory");
  5019. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5020. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5021. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5022. return MEMORY_E;
  5023. }
  5024. ctx_hint->memory->curIO++;
  5025. ctx_hint->memory->curHa++;
  5026. ssl_hint->memory = ctx_hint->memory;
  5027. ssl_hint->haFlag = 1;
  5028. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5029. /* check if tracking stats */
  5030. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  5031. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  5032. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  5033. if (ssl_hint->stats == NULL) {
  5034. return MEMORY_E;
  5035. }
  5036. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  5037. }
  5038. /* check if using fixed IO buffers */
  5039. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  5040. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5041. WOLFSSL_MSG("Bad memory_mutex lock");
  5042. return BAD_MUTEX_E;
  5043. }
  5044. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  5045. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5046. return MEMORY_E;
  5047. }
  5048. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  5049. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5050. return MEMORY_E;
  5051. }
  5052. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  5053. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  5054. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5055. return MEMORY_E;
  5056. }
  5057. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5058. }
  5059. #ifdef WOLFSSL_HEAP_TEST
  5060. }
  5061. #endif
  5062. }
  5063. else {
  5064. ssl->heap = ctx->heap;
  5065. }
  5066. #else
  5067. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  5068. #endif /* WOLFSSL_STATIC_MEMORY */
  5069. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  5070. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5071. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  5072. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5073. #ifdef KEEP_PEER_CERT
  5074. InitX509(&ssl->peerCert, 0, ssl->heap);
  5075. #endif
  5076. ssl->rfd = -1; /* set to invalid descriptor */
  5077. ssl->wfd = -1;
  5078. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  5079. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  5080. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  5081. #ifdef HAVE_NETX
  5082. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  5083. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  5084. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  5085. ssl->mnCtx = mynewt_ctx_new();
  5086. if(!ssl->mnCtx) {
  5087. return MEMORY_E;
  5088. }
  5089. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  5090. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  5091. #elif defined (WOLFSSL_GNRC)
  5092. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  5093. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  5094. #endif
  5095. /* initialize states */
  5096. ssl->options.serverState = NULL_STATE;
  5097. ssl->options.clientState = NULL_STATE;
  5098. ssl->options.connectState = CONNECT_BEGIN;
  5099. ssl->options.acceptState = ACCEPT_BEGIN;
  5100. ssl->options.handShakeState = NULL_STATE;
  5101. ssl->options.processReply = doProcessInit;
  5102. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  5103. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  5104. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  5105. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  5106. #ifndef NO_DH
  5107. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5108. !defined(HAVE_SELFTEST)
  5109. ssl->options.dhDoKeyTest = 1;
  5110. #endif
  5111. #endif
  5112. #ifdef WOLFSSL_DTLS
  5113. #ifdef WOLFSSL_SCTP
  5114. ssl->options.dtlsSctp = ctx->dtlsSctp;
  5115. #endif
  5116. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  5117. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  5118. /* Add 100 bytes so that we can operate with slight difference
  5119. * in set MTU size on each peer */
  5120. ssl->dtls_expected_rx = ssl->dtlsMtuSz + 100;
  5121. #else
  5122. ssl->dtls_expected_rx = MAX_MTU;
  5123. #endif
  5124. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  5125. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  5126. ssl->dtls_timeout = ssl->dtls_timeout_init;
  5127. ssl->buffers.dtlsCtx.rfd = -1;
  5128. ssl->buffers.dtlsCtx.wfd = -1;
  5129. #endif
  5130. #ifndef WOLFSSL_AEAD_ONLY
  5131. #ifndef NO_OLD_TLS
  5132. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  5133. #elif !defined(WOLFSSL_NO_TLS12)
  5134. ssl->hmac = TLS_hmac;
  5135. #endif
  5136. #endif
  5137. #if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
  5138. /* Save arrays by default for OpenVPN */
  5139. ssl->options.saveArrays = 1;
  5140. #endif
  5141. ssl->cipher.ssl = ssl;
  5142. #ifdef HAVE_EXTENDED_MASTER
  5143. ssl->options.haveEMS = ctx->haveEMS;
  5144. #endif
  5145. ssl->options.useClientOrder = ctx->useClientOrder;
  5146. ssl->options.mutualAuth = ctx->mutualAuth;
  5147. #ifdef WOLFSSL_STATIC_EPHEMERAL
  5148. ssl->staticKE = ctx->staticKE;
  5149. #endif
  5150. #ifdef WOLFSSL_TLS13
  5151. #ifdef HAVE_SESSION_TICKET
  5152. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  5153. #endif
  5154. ssl->options.noPskDheKe = ctx->noPskDheKe;
  5155. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5156. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  5157. #endif
  5158. if (ctx->numGroups > 0) {
  5159. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  5160. ssl->numGroups = ctx->numGroups;
  5161. }
  5162. #endif
  5163. #ifdef HAVE_TLS_EXTENSIONS
  5164. #ifdef HAVE_MAX_FRAGMENT
  5165. ssl->max_fragment = MAX_RECORD_SIZE;
  5166. #endif
  5167. #ifdef HAVE_ALPN
  5168. ssl->alpn_client_list = NULL;
  5169. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  5170. ssl->alpnSelect = ctx->alpnSelect;
  5171. ssl->alpnSelectArg = ctx->alpnSelectArg;
  5172. #endif
  5173. #endif
  5174. #ifdef HAVE_SUPPORTED_CURVES
  5175. ssl->options.userCurves = ctx->userCurves;
  5176. #endif
  5177. #endif /* HAVE_TLS_EXTENSIONS */
  5178. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  5179. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  5180. #endif
  5181. /* default alert state (none) */
  5182. ssl->alert_history.last_rx.code = -1;
  5183. ssl->alert_history.last_rx.level = -1;
  5184. ssl->alert_history.last_tx.code = -1;
  5185. ssl->alert_history.last_tx.level = -1;
  5186. #ifdef OPENSSL_EXTRA
  5187. /* copy over application session context ID */
  5188. ssl->sessionCtxSz = ctx->sessionCtxSz;
  5189. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  5190. ssl->cbioFlag = ctx->cbioFlag;
  5191. #endif
  5192. InitCiphers(ssl);
  5193. InitCipherSpecs(&ssl->specs);
  5194. /* all done with init, now can return errors, call other stuff */
  5195. if (!writeDup) {
  5196. /* arrays */
  5197. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  5198. DYNAMIC_TYPE_ARRAYS);
  5199. if (ssl->arrays == NULL) {
  5200. WOLFSSL_MSG("Arrays Memory error");
  5201. return MEMORY_E;
  5202. }
  5203. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  5204. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  5205. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  5206. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  5207. DYNAMIC_TYPE_SECRET);
  5208. if (ssl->arrays->preMasterSecret == NULL) {
  5209. return MEMORY_E;
  5210. }
  5211. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  5212. #endif
  5213. #ifdef OPENSSL_EXTRA
  5214. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  5215. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  5216. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  5217. WOLFSSL_MSG("ssl->param memory error");
  5218. return MEMORY_E;
  5219. }
  5220. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  5221. #endif
  5222. #ifdef SINGLE_THREADED
  5223. if (ctx->suites == NULL)
  5224. #endif
  5225. {
  5226. /* suites */
  5227. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  5228. DYNAMIC_TYPE_SUITES);
  5229. if (ssl->suites == NULL) {
  5230. WOLFSSL_MSG("Suites Memory error");
  5231. return MEMORY_E;
  5232. }
  5233. #ifdef OPENSSL_ALL
  5234. ssl->suites->stack = NULL;
  5235. #endif
  5236. #ifdef SINGLE_THREADED
  5237. ssl->options.ownSuites = 1;
  5238. #endif
  5239. }
  5240. #ifdef SINGLE_THREADED
  5241. else {
  5242. ssl->options.ownSuites = 0;
  5243. }
  5244. #endif
  5245. }
  5246. /* Initialize SSL with the appropriate fields from it's ctx */
  5247. /* requires valid arrays and suites unless writeDup ing */
  5248. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS)
  5249. return ret;
  5250. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  5251. #ifdef SINGLE_THREADED
  5252. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  5253. #endif
  5254. if (ssl->rng == NULL) {
  5255. /* RNG */
  5256. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  5257. if (ssl->rng == NULL) {
  5258. WOLFSSL_MSG("RNG Memory error");
  5259. return MEMORY_E;
  5260. }
  5261. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  5262. ssl->options.weOwnRng = 1;
  5263. /* FIPS RNG API does not accept a heap hint */
  5264. #ifndef HAVE_FIPS
  5265. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  5266. WOLFSSL_MSG("RNG Init error");
  5267. return ret;
  5268. }
  5269. #else
  5270. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  5271. WOLFSSL_MSG("RNG Init error");
  5272. return ret;
  5273. }
  5274. #endif
  5275. }
  5276. #ifdef HAVE_WRITE_DUP
  5277. if (writeDup) {
  5278. /* all done */
  5279. return 0;
  5280. }
  5281. #endif
  5282. /* hsHashes */
  5283. ret = InitHandshakeHashes(ssl);
  5284. if (ret != 0)
  5285. return ret;
  5286. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  5287. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  5288. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  5289. if (ret != 0) {
  5290. WOLFSSL_MSG("DTLS Cookie Secret error");
  5291. return ret;
  5292. }
  5293. }
  5294. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  5295. #ifdef HAVE_SECRET_CALLBACK
  5296. ssl->sessionSecretCb = NULL;
  5297. ssl->sessionSecretCtx = NULL;
  5298. #ifdef WOLFSSL_TLS13
  5299. ssl->tls13SecretCb = NULL;
  5300. ssl->tls13SecretCtx = NULL;
  5301. #endif
  5302. #endif
  5303. #ifdef HAVE_SESSION_TICKET
  5304. ssl->options.noTicketTls12 = ctx->noTicketTls12;
  5305. ssl->session.ticket = ssl->session.staticTicket;
  5306. #endif
  5307. #ifdef WOLFSSL_MULTICAST
  5308. if (ctx->haveMcast) {
  5309. int i;
  5310. ssl->options.haveMcast = 1;
  5311. ssl->options.mcastID = ctx->mcastID;
  5312. /* Force the state to look like handshake has completed. */
  5313. /* Keying material is supplied externally. */
  5314. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  5315. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  5316. ssl->options.connectState = SECOND_REPLY_DONE;
  5317. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  5318. ssl->options.handShakeState = HANDSHAKE_DONE;
  5319. ssl->options.handShakeDone = 1;
  5320. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  5321. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  5322. }
  5323. #endif
  5324. #ifdef HAVE_SECURE_RENEGOTIATION
  5325. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5326. int useSecureReneg = ssl->ctx->useSecureReneg;
  5327. /* use secure renegotiation by default (not recommend) */
  5328. #ifdef WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT
  5329. useSecureReneg = 1;
  5330. #endif
  5331. if (useSecureReneg) {
  5332. ret = wolfSSL_UseSecureRenegotiation(ssl);
  5333. if (ret != WOLFSSL_SUCCESS)
  5334. return ret;
  5335. }
  5336. }
  5337. #endif /* HAVE_SECURE_RENEGOTIATION */
  5338. return 0;
  5339. }
  5340. /* free use of temporary arrays */
  5341. void FreeArrays(WOLFSSL* ssl, int keep)
  5342. {
  5343. if (ssl->arrays) {
  5344. if (keep) {
  5345. /* keeps session id for user retrieval */
  5346. XMEMCPY(ssl->session.sessionID, ssl->arrays->sessionID, ID_LEN);
  5347. ssl->session.sessionIDSz = ssl->arrays->sessionIDSz;
  5348. }
  5349. if (ssl->arrays->preMasterSecret) {
  5350. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  5351. ssl->arrays->preMasterSecret = NULL;
  5352. }
  5353. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  5354. ssl->arrays->pendingMsg = NULL;
  5355. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  5356. }
  5357. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  5358. ssl->arrays = NULL;
  5359. }
  5360. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  5361. {
  5362. if (ssl && pKey && *pKey) {
  5363. switch (type) {
  5364. #ifndef NO_RSA
  5365. case DYNAMIC_TYPE_RSA:
  5366. wc_FreeRsaKey((RsaKey*)*pKey);
  5367. break;
  5368. #endif /* ! NO_RSA */
  5369. #ifdef HAVE_ECC
  5370. case DYNAMIC_TYPE_ECC:
  5371. wc_ecc_free((ecc_key*)*pKey);
  5372. break;
  5373. #endif /* HAVE_ECC */
  5374. #ifdef HAVE_ED25519
  5375. case DYNAMIC_TYPE_ED25519:
  5376. wc_ed25519_free((ed25519_key*)*pKey);
  5377. break;
  5378. #endif /* HAVE_ED25519 */
  5379. #ifdef HAVE_CURVE25519
  5380. case DYNAMIC_TYPE_CURVE25519:
  5381. wc_curve25519_free((curve25519_key*)*pKey);
  5382. break;
  5383. #endif /* HAVE_CURVE25519 */
  5384. #ifdef HAVE_ED448
  5385. case DYNAMIC_TYPE_ED448:
  5386. wc_ed448_free((ed448_key*)*pKey);
  5387. break;
  5388. #endif /* HAVE_ED448 */
  5389. #ifdef HAVE_CURVE448
  5390. case DYNAMIC_TYPE_CURVE448:
  5391. wc_curve448_free((curve448_key*)*pKey);
  5392. break;
  5393. #endif /* HAVE_CURVE448 */
  5394. #ifndef NO_DH
  5395. case DYNAMIC_TYPE_DH:
  5396. wc_FreeDhKey((DhKey*)*pKey);
  5397. break;
  5398. #endif /* !NO_DH */
  5399. default:
  5400. break;
  5401. }
  5402. XFREE(*pKey, ssl->heap, type);
  5403. /* Reset pointer */
  5404. *pKey = NULL;
  5405. }
  5406. }
  5407. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  5408. {
  5409. int ret = BAD_FUNC_ARG;
  5410. int sz = 0;
  5411. if (ssl == NULL || pKey == NULL) {
  5412. return BAD_FUNC_ARG;
  5413. }
  5414. /* Sanity check key destination */
  5415. if (*pKey != NULL) {
  5416. WOLFSSL_MSG("Key already present!");
  5417. return BAD_STATE_E;
  5418. }
  5419. /* Determine size */
  5420. switch (type) {
  5421. #ifndef NO_RSA
  5422. case DYNAMIC_TYPE_RSA:
  5423. sz = sizeof(RsaKey);
  5424. break;
  5425. #endif /* ! NO_RSA */
  5426. #ifdef HAVE_ECC
  5427. case DYNAMIC_TYPE_ECC:
  5428. sz = sizeof(ecc_key);
  5429. break;
  5430. #endif /* HAVE_ECC */
  5431. #ifdef HAVE_ED25519
  5432. case DYNAMIC_TYPE_ED25519:
  5433. sz = sizeof(ed25519_key);
  5434. break;
  5435. #endif /* HAVE_ED25519 */
  5436. #ifdef HAVE_CURVE25519
  5437. case DYNAMIC_TYPE_CURVE25519:
  5438. sz = sizeof(curve25519_key);
  5439. break;
  5440. #endif /* HAVE_CURVE25519 */
  5441. #ifdef HAVE_ED448
  5442. case DYNAMIC_TYPE_ED448:
  5443. sz = sizeof(ed448_key);
  5444. break;
  5445. #endif /* HAVE_ED448 */
  5446. #ifdef HAVE_CURVE448
  5447. case DYNAMIC_TYPE_CURVE448:
  5448. sz = sizeof(curve448_key);
  5449. break;
  5450. #endif /* HAVE_CURVE448 */
  5451. #ifndef NO_DH
  5452. case DYNAMIC_TYPE_DH:
  5453. sz = sizeof(DhKey);
  5454. break;
  5455. #endif /* !NO_DH */
  5456. default:
  5457. return BAD_FUNC_ARG;
  5458. }
  5459. if (sz == 0) {
  5460. return NOT_COMPILED_IN;
  5461. }
  5462. /* Allocate memory for key */
  5463. *pKey = (void *)XMALLOC(sz, ssl->heap, type);
  5464. if (*pKey == NULL) {
  5465. return MEMORY_E;
  5466. }
  5467. /* Initialize key */
  5468. switch (type) {
  5469. #ifndef NO_RSA
  5470. case DYNAMIC_TYPE_RSA:
  5471. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  5472. break;
  5473. #endif /* ! NO_RSA */
  5474. #ifdef HAVE_ECC
  5475. case DYNAMIC_TYPE_ECC:
  5476. ret = wc_ecc_init_ex((ecc_key*)*pKey, ssl->heap, ssl->devId);
  5477. break;
  5478. #endif /* HAVE_ECC */
  5479. #ifdef HAVE_ED25519
  5480. case DYNAMIC_TYPE_ED25519:
  5481. wc_ed25519_init((ed25519_key*)*pKey);
  5482. ret = 0;
  5483. break;
  5484. #endif /* HAVE_CURVE25519 */
  5485. #ifdef HAVE_CURVE25519
  5486. case DYNAMIC_TYPE_CURVE25519:
  5487. wc_curve25519_init((curve25519_key*)*pKey);
  5488. ret = 0;
  5489. break;
  5490. #endif /* HAVE_CURVE25519 */
  5491. #ifdef HAVE_ED448
  5492. case DYNAMIC_TYPE_ED448:
  5493. wc_ed448_init((ed448_key*)*pKey);
  5494. ret = 0;
  5495. break;
  5496. #endif /* HAVE_CURVE448 */
  5497. #ifdef HAVE_CURVE448
  5498. case DYNAMIC_TYPE_CURVE448:
  5499. wc_curve448_init((curve448_key*)*pKey);
  5500. ret = 0;
  5501. break;
  5502. #endif /* HAVE_CURVE448 */
  5503. #ifndef NO_DH
  5504. case DYNAMIC_TYPE_DH:
  5505. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  5506. break;
  5507. #endif /* !NO_DH */
  5508. default:
  5509. return BAD_FUNC_ARG;
  5510. }
  5511. /* On error free handshake key */
  5512. if (ret != 0) {
  5513. FreeKey(ssl, type, pKey);
  5514. }
  5515. return ret;
  5516. }
  5517. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  5518. defined(HAVE_CURVE25519) || defined(HHAVE_ED448) || defined(HAVE_CURVE448)
  5519. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  5520. {
  5521. int ret = 0;
  5522. (void)ssl;
  5523. switch (type) {
  5524. #ifndef NO_RSA
  5525. case DYNAMIC_TYPE_RSA:
  5526. wc_FreeRsaKey((RsaKey*)pKey);
  5527. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  5528. break;
  5529. #endif /* ! NO_RSA */
  5530. #ifdef HAVE_ECC
  5531. case DYNAMIC_TYPE_ECC:
  5532. wc_ecc_free((ecc_key*)pKey);
  5533. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  5534. break;
  5535. #endif /* HAVE_ECC */
  5536. #ifdef HAVE_ED25519
  5537. case DYNAMIC_TYPE_ED25519:
  5538. wc_ed25519_free((ed25519_key*)pKey);
  5539. ret = wc_ed25519_init((ed25519_key*)pKey);
  5540. break;
  5541. #endif /* HAVE_CURVE25519 */
  5542. #ifdef HAVE_CURVE25519
  5543. case DYNAMIC_TYPE_CURVE25519:
  5544. wc_curve25519_free((curve25519_key*)pKey);
  5545. ret = wc_curve25519_init((curve25519_key*)pKey);
  5546. break;
  5547. #endif /* HAVE_CURVE25519 */
  5548. #ifdef HAVE_ED448
  5549. case DYNAMIC_TYPE_ED448:
  5550. wc_ed448_free((ed448_key*)pKey);
  5551. ret = wc_ed448_init((ed448_key*)pKey);
  5552. break;
  5553. #endif /* HAVE_CURVE448 */
  5554. #ifdef HAVE_CURVE448
  5555. case DYNAMIC_TYPE_CURVE448:
  5556. wc_curve448_free((curve448_key*)pKey);
  5557. ret = wc_curve448_init((curve448_key*)pKey);
  5558. break;
  5559. #endif /* HAVE_CURVE448 */
  5560. #ifndef NO_DH
  5561. case DYNAMIC_TYPE_DH:
  5562. wc_FreeDhKey((DhKey*)pKey);
  5563. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  5564. break;
  5565. #endif /* !NO_DH */
  5566. default:
  5567. return BAD_FUNC_ARG;
  5568. }
  5569. return ret;
  5570. }
  5571. #endif
  5572. void FreeKeyExchange(WOLFSSL* ssl)
  5573. {
  5574. /* Cleanup signature buffer */
  5575. if (ssl->buffers.sig.buffer) {
  5576. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  5577. ssl->buffers.sig.buffer = NULL;
  5578. ssl->buffers.sig.length = 0;
  5579. }
  5580. /* Cleanup digest buffer */
  5581. if (ssl->buffers.digest.buffer) {
  5582. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  5583. ssl->buffers.digest.buffer = NULL;
  5584. ssl->buffers.digest.length = 0;
  5585. }
  5586. /* Free handshake key */
  5587. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  5588. #ifndef NO_DH
  5589. /* Free temp DH key */
  5590. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  5591. #endif
  5592. /* Cleanup async */
  5593. #ifdef WOLFSSL_ASYNC_CRYPT
  5594. if (ssl->async.freeArgs) {
  5595. ssl->async.freeArgs(ssl, ssl->async.args);
  5596. ssl->async.freeArgs = NULL;
  5597. }
  5598. FreeBuildMsgArgs(ssl, &ssl->async.buildArgs);
  5599. #endif
  5600. }
  5601. /* Free up all memory used by Suites structure from WOLFSSL */
  5602. void FreeSuites(WOLFSSL* ssl)
  5603. {
  5604. #ifdef SINGLE_THREADED
  5605. if (ssl->options.ownSuites)
  5606. #endif
  5607. {
  5608. #ifdef OPENSSL_ALL
  5609. if (ssl->suites != NULL) {
  5610. wolfSSL_sk_SSL_CIPHER_free(ssl->suites->stack);
  5611. }
  5612. #endif
  5613. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  5614. }
  5615. ssl->suites = NULL;
  5616. }
  5617. /* In case holding SSL object in array and don't want to free actual ssl */
  5618. void SSL_ResourceFree(WOLFSSL* ssl)
  5619. {
  5620. /* Note: any resources used during the handshake should be released in the
  5621. * function FreeHandshakeResources(). Be careful with the special cases
  5622. * like the RNG which may optionally be kept for the whole session. (For
  5623. * example with the RNG, it isn't used beyond the handshake except when
  5624. * using stream ciphers where it is retained. */
  5625. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  5626. wolfSSL_CRYPTO_cleanup_ex_data(&ssl->ex_data);
  5627. #endif
  5628. FreeCiphers(ssl);
  5629. FreeArrays(ssl, 0);
  5630. FreeKeyExchange(ssl);
  5631. if (ssl->options.weOwnRng) {
  5632. wc_FreeRng(ssl->rng);
  5633. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  5634. }
  5635. FreeSuites(ssl);
  5636. FreeHandshakeHashes(ssl);
  5637. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  5638. /* clear keys struct after session */
  5639. ForceZero(&ssl->keys, sizeof(Keys));
  5640. #ifdef WOLFSSL_TLS13
  5641. if (ssl->options.tls1_3) {
  5642. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  5643. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  5644. }
  5645. #endif
  5646. #ifndef NO_DH
  5647. if (ssl->buffers.serverDH_Priv.buffer) {
  5648. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  5649. ssl->buffers.serverDH_Priv.length);
  5650. }
  5651. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5652. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5653. /* parameters (p,g) may be owned by ctx */
  5654. if (ssl->buffers.weOwnDH) {
  5655. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5656. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5657. }
  5658. #endif /* !NO_DH */
  5659. #ifndef NO_CERTS
  5660. ssl->keepCert = 0; /* make sure certificate is free'd */
  5661. wolfSSL_UnloadCertsKeys(ssl);
  5662. #endif
  5663. #ifndef NO_RSA
  5664. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  5665. ssl->peerRsaKeyPresent = 0;
  5666. #endif
  5667. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  5668. XFREE(ssl->peerTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
  5669. #endif
  5670. if (ssl->buffers.inputBuffer.dynamicFlag)
  5671. ShrinkInputBuffer(ssl, FORCED_FREE);
  5672. if (ssl->buffers.outputBuffer.dynamicFlag)
  5673. ShrinkOutputBuffer(ssl);
  5674. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  5675. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  5676. DYNAMIC_TYPE_COOKIE_PWD);
  5677. #endif
  5678. #ifdef WOLFSSL_DTLS
  5679. DtlsMsgPoolReset(ssl);
  5680. if (ssl->dtls_rx_msg_list != NULL) {
  5681. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  5682. ssl->dtls_rx_msg_list = NULL;
  5683. ssl->dtls_rx_msg_list_sz = 0;
  5684. }
  5685. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  5686. ssl->buffers.dtlsCtx.peer.sa = NULL;
  5687. #ifndef NO_WOLFSSL_SERVER
  5688. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  5689. DYNAMIC_TYPE_COOKIE_PWD);
  5690. #endif
  5691. #endif /* WOLFSSL_DTLS */
  5692. #ifdef OPENSSL_EXTRA
  5693. #ifndef NO_BIO
  5694. /* Don't free if there was/is a previous element in the chain.
  5695. * This means that this BIO was part of a chain that will be
  5696. * free'd separately. */
  5697. if (ssl->biord != ssl->biowr) /* only free write if different */
  5698. if (ssl->biowr != NULL && ssl->biowr->prev == NULL)
  5699. wolfSSL_BIO_free(ssl->biowr);
  5700. if (ssl->biord != NULL && ssl->biord->prev == NULL)
  5701. wolfSSL_BIO_free(ssl->biord);
  5702. ssl->biowr = NULL;
  5703. ssl->biord = NULL;
  5704. #endif
  5705. #endif
  5706. #ifdef HAVE_LIBZ
  5707. FreeStreams(ssl);
  5708. #endif
  5709. #ifdef HAVE_ECC
  5710. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  5711. ssl->peerEccKeyPresent = 0;
  5712. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  5713. ssl->peerEccDsaKeyPresent = 0;
  5714. #endif
  5715. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
  5716. {
  5717. int dtype = 0;
  5718. #ifdef HAVE_ECC
  5719. dtype = DYNAMIC_TYPE_ECC;
  5720. #endif
  5721. #ifdef HAVE_CURVE25519
  5722. if (ssl->peerX25519KeyPresent
  5723. #ifdef HAVE_ECC
  5724. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
  5725. #endif /* HAVE_ECC */
  5726. )
  5727. {
  5728. dtype = DYNAMIC_TYPE_CURVE25519;
  5729. }
  5730. #endif /* HAVE_CURVE25519 */
  5731. #ifdef HAVE_CURVE448
  5732. if (ssl->peerX448KeyPresent
  5733. #ifdef HAVE_ECC
  5734. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
  5735. #endif /* HAVE_ECC */
  5736. )
  5737. {
  5738. dtype = DYNAMIC_TYPE_CURVE448;
  5739. }
  5740. #endif /* HAVE_CURVE448 */
  5741. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  5742. ssl->eccTempKeyPresent = 0;
  5743. }
  5744. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  5745. #ifdef HAVE_CURVE25519
  5746. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  5747. ssl->peerX25519KeyPresent = 0;
  5748. #endif
  5749. #ifdef HAVE_ED25519
  5750. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  5751. ssl->peerEd25519KeyPresent = 0;
  5752. #ifdef HAVE_PK_CALLBACKS
  5753. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  5754. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  5755. DYNAMIC_TYPE_ED25519);
  5756. ssl->buffers.peerEd25519Key.buffer = NULL;
  5757. }
  5758. #endif
  5759. #endif
  5760. #ifdef HAVE_CURVE448
  5761. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  5762. ssl->peerX448KeyPresent = 0;
  5763. #endif
  5764. #ifdef HAVE_ED448
  5765. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  5766. ssl->peerEd448KeyPresent = 0;
  5767. #ifdef HAVE_PK_CALLBACKS
  5768. if (ssl->buffers.peerEd448Key.buffer != NULL) {
  5769. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
  5770. DYNAMIC_TYPE_ED448);
  5771. ssl->buffers.peerEd448Key.buffer = NULL;
  5772. }
  5773. #endif
  5774. #endif
  5775. #ifdef HAVE_PK_CALLBACKS
  5776. #ifdef HAVE_ECC
  5777. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  5778. #endif /* HAVE_ECC */
  5779. #ifndef NO_RSA
  5780. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  5781. #endif /* NO_RSA */
  5782. #endif /* HAVE_PK_CALLBACKS */
  5783. #ifdef HAVE_TLS_EXTENSIONS
  5784. TLSX_FreeAll(ssl->extensions, ssl->heap);
  5785. #ifdef HAVE_ALPN
  5786. if (ssl->alpn_client_list != NULL) {
  5787. XFREE(ssl->alpn_client_list, ssl->heap, DYNAMIC_TYPE_ALPN);
  5788. ssl->alpn_client_list = NULL;
  5789. }
  5790. #endif
  5791. #endif /* HAVE_TLS_EXTENSIONS */
  5792. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  5793. if (ssl->mnCtx) {
  5794. mynewt_ctx_clear(ssl->mnCtx);
  5795. ssl->mnCtx = NULL;
  5796. }
  5797. #endif
  5798. #ifdef HAVE_NETX
  5799. if (ssl->nxCtx.nxPacket)
  5800. nx_packet_release(ssl->nxCtx.nxPacket);
  5801. #endif
  5802. #ifdef KEEP_PEER_CERT
  5803. FreeX509(&ssl->peerCert);
  5804. #endif
  5805. #ifdef HAVE_SESSION_TICKET
  5806. if (ssl->session.isDynamic) {
  5807. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  5808. ssl->session.ticket = ssl->session.staticTicket;
  5809. ssl->session.isDynamic = 0;
  5810. ssl->session.ticketLen = 0;
  5811. }
  5812. #endif
  5813. #ifdef HAVE_EXT_CACHE
  5814. wolfSSL_SESSION_free(ssl->extSession);
  5815. #endif
  5816. #ifdef HAVE_WRITE_DUP
  5817. if (ssl->dupWrite) {
  5818. FreeWriteDup(ssl);
  5819. }
  5820. #endif
  5821. #ifdef OPENSSL_EXTRA
  5822. if (ssl->param) {
  5823. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  5824. }
  5825. #endif
  5826. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5827. while (ssl->certReqCtx != NULL) {
  5828. CertReqCtx* curr = ssl->certReqCtx;
  5829. ssl->certReqCtx = curr->next;
  5830. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5831. }
  5832. #endif
  5833. #ifdef WOLFSSL_STATIC_EPHEMERAL
  5834. #ifndef NO_DH
  5835. if (ssl->staticKE.dhKey && ssl->staticKE.dhKey != ssl->ctx->staticKE.dhKey)
  5836. FreeDer(&ssl->staticKE.dhKey);
  5837. #endif
  5838. #ifdef HAVE_ECC
  5839. if (ssl->staticKE.ecKey && ssl->staticKE.ecKey != ssl->ctx->staticKE.ecKey)
  5840. FreeDer(&ssl->staticKE.ecKey);
  5841. #endif
  5842. #endif
  5843. #ifdef WOLFSSL_STATIC_MEMORY
  5844. /* check if using fixed io buffers and free them */
  5845. if (ssl->heap != NULL) {
  5846. #ifdef WOLFSSL_HEAP_TEST
  5847. /* avoid dereferencing a test value */
  5848. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  5849. #endif
  5850. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  5851. WOLFSSL_HEAP* ctx_heap;
  5852. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  5853. ctx_heap = ssl_hint->memory;
  5854. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  5855. WOLFSSL_MSG("Bad memory_mutex lock");
  5856. }
  5857. ctx_heap->curIO--;
  5858. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  5859. WOLFSSL_MSG("Error freeing fixed output buffer");
  5860. }
  5861. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  5862. WOLFSSL_MSG("Error freeing fixed output buffer");
  5863. }
  5864. if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/
  5865. ctx_heap->curHa--;
  5866. }
  5867. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  5868. /* check if tracking stats */
  5869. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  5870. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  5871. }
  5872. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  5873. #ifdef WOLFSSL_HEAP_TEST
  5874. }
  5875. #endif
  5876. }
  5877. #endif /* WOLFSSL_STATIC_MEMORY */
  5878. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  5879. wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
  5880. wolfSSL_sk_X509_free(ssl->peerCertChain);
  5881. #endif
  5882. }
  5883. /* Free any handshake resources no longer needed */
  5884. void FreeHandshakeResources(WOLFSSL* ssl)
  5885. {
  5886. WOLFSSL_ENTER("FreeHandshakeResources");
  5887. #ifdef WOLFSSL_DTLS
  5888. /* DTLS_POOL */
  5889. if (ssl->options.dtls) {
  5890. DtlsMsgPoolReset(ssl);
  5891. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  5892. ssl->dtls_rx_msg_list = NULL;
  5893. ssl->dtls_rx_msg_list_sz = 0;
  5894. }
  5895. #endif
  5896. #ifdef HAVE_SECURE_RENEGOTIATION
  5897. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  5898. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  5899. return;
  5900. }
  5901. #endif
  5902. /* input buffer */
  5903. if (ssl->buffers.inputBuffer.dynamicFlag)
  5904. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  5905. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5906. if (!ssl->options.tls1_3)
  5907. #endif
  5908. {
  5909. #ifndef OPENSSL_ALL
  5910. /* free suites unless using compatibility layer */
  5911. FreeSuites(ssl);
  5912. #endif
  5913. /* hsHashes */
  5914. FreeHandshakeHashes(ssl);
  5915. }
  5916. /* RNG */
  5917. if (ssl->options.tls1_1 == 0
  5918. #ifndef WOLFSSL_AEAD_ONLY
  5919. || ssl->specs.cipher_type == stream
  5920. #endif
  5921. #if defined(WOLFSSL_TLS13)
  5922. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5923. || ssl->options.tls1_3
  5924. #elif !defined(HAVE_SESSION_TICKET)
  5925. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  5926. #endif
  5927. #endif
  5928. ) {
  5929. if (ssl->options.weOwnRng) {
  5930. wc_FreeRng(ssl->rng);
  5931. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  5932. ssl->rng = NULL;
  5933. ssl->options.weOwnRng = 0;
  5934. }
  5935. }
  5936. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  5937. defined(HAVE_SESSION_TICKET)
  5938. if (!ssl->options.tls1_3)
  5939. #endif
  5940. /* arrays */
  5941. if (ssl->options.saveArrays == 0)
  5942. FreeArrays(ssl, 1);
  5943. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5944. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  5945. #endif
  5946. {
  5947. #ifndef NO_RSA
  5948. /* peerRsaKey */
  5949. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  5950. ssl->peerRsaKeyPresent = 0;
  5951. #endif
  5952. #ifdef HAVE_ECC
  5953. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  5954. ssl->peerEccDsaKeyPresent = 0;
  5955. #endif /* HAVE_ECC */
  5956. #ifdef HAVE_ED25519
  5957. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  5958. ssl->peerEd25519KeyPresent = 0;
  5959. #endif /* HAVE_ED25519 */
  5960. #ifdef HAVE_ED448
  5961. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  5962. ssl->peerEd448KeyPresent = 0;
  5963. #endif /* HAVE_ED448 */
  5964. }
  5965. #ifdef HAVE_ECC
  5966. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  5967. ssl->peerEccKeyPresent = 0;
  5968. #endif
  5969. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  5970. {
  5971. int dtype;
  5972. #ifdef HAVE_ECC
  5973. dtype = DYNAMIC_TYPE_ECC;
  5974. #elif defined(HAVE_CURVE25519)
  5975. dtype = DYNAMIC_TYPE_CURVE25519;
  5976. #else
  5977. dtype = DYNAMIC_TYPE_CURVE448;
  5978. #endif
  5979. #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
  5980. if (ssl->peerX25519KeyPresent ||
  5981. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  5982. {
  5983. dtype = DYNAMIC_TYPE_CURVE25519;
  5984. }
  5985. #endif
  5986. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  5987. defined(HAVE_CURVE448)
  5988. if (ssl->peerX448KeyPresent ||
  5989. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
  5990. {
  5991. dtype = DYNAMIC_TYPE_CURVE448;
  5992. }
  5993. #endif
  5994. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  5995. ssl->eccTempKeyPresent = 0;
  5996. }
  5997. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  5998. #ifdef HAVE_CURVE25519
  5999. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  6000. ssl->peerX25519KeyPresent = 0;
  6001. #endif
  6002. #ifdef HAVE_CURVE448
  6003. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  6004. ssl->peerX448KeyPresent = 0;
  6005. #endif
  6006. #ifndef NO_DH
  6007. if (ssl->buffers.serverDH_Priv.buffer) {
  6008. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  6009. ssl->buffers.serverDH_Priv.length);
  6010. }
  6011. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6012. ssl->buffers.serverDH_Priv.buffer = NULL;
  6013. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6014. ssl->buffers.serverDH_Pub.buffer = NULL;
  6015. /* parameters (p,g) may be owned by ctx */
  6016. if (ssl->buffers.weOwnDH) {
  6017. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6018. ssl->buffers.serverDH_G.buffer = NULL;
  6019. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6020. ssl->buffers.serverDH_P.buffer = NULL;
  6021. }
  6022. #endif /* !NO_DH */
  6023. #ifndef NO_CERTS
  6024. wolfSSL_UnloadCertsKeys(ssl);
  6025. #endif
  6026. #ifdef HAVE_PK_CALLBACKS
  6027. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6028. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  6029. #endif
  6030. {
  6031. #ifdef HAVE_ECC
  6032. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  6033. ssl->buffers.peerEccDsaKey.buffer = NULL;
  6034. #endif /* HAVE_ECC */
  6035. #ifndef NO_RSA
  6036. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  6037. ssl->buffers.peerRsaKey.buffer = NULL;
  6038. #endif /* NO_RSA */
  6039. #ifdef HAVE_ED25519
  6040. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  6041. DYNAMIC_TYPE_ED25519);
  6042. ssl->buffers.peerEd25519Key.buffer = NULL;
  6043. #endif
  6044. #ifdef HAVE_ED448
  6045. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
  6046. ssl->buffers.peerEd448Key.buffer = NULL;
  6047. #endif
  6048. }
  6049. #endif /* HAVE_PK_CALLBACKS */
  6050. #ifdef HAVE_QSH
  6051. QSH_FreeAll(ssl);
  6052. #endif
  6053. #ifdef HAVE_SESSION_TICKET
  6054. if (ssl->session.isDynamic) {
  6055. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  6056. ssl->session.ticket = ssl->session.staticTicket;
  6057. ssl->session.isDynamic = 0;
  6058. ssl->session.ticketLen = 0;
  6059. }
  6060. #endif
  6061. #if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \
  6062. !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6063. /* Some extensions need to be kept for post-handshake querying. */
  6064. TLSX_FreeAll(ssl->extensions, ssl->heap);
  6065. ssl->extensions = NULL;
  6066. #endif
  6067. #ifdef WOLFSSL_STATIC_MEMORY
  6068. /* when done with handshake decrement current handshake count */
  6069. if (ssl->heap != NULL) {
  6070. #ifdef WOLFSSL_HEAP_TEST
  6071. /* avoid dereferencing a test value */
  6072. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  6073. #endif
  6074. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  6075. WOLFSSL_HEAP* ctx_heap;
  6076. ctx_heap = ssl_hint->memory;
  6077. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  6078. WOLFSSL_MSG("Bad memory_mutex lock");
  6079. }
  6080. ctx_heap->curHa--;
  6081. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  6082. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  6083. #ifdef WOLFSSL_HEAP_TEST
  6084. }
  6085. #endif
  6086. }
  6087. #endif /* WOLFSSL_STATIC_MEMORY */
  6088. }
  6089. /* heap argument is the heap hint used when creating SSL */
  6090. void FreeSSL(WOLFSSL* ssl, void* heap)
  6091. {
  6092. if (ssl->ctx) {
  6093. FreeSSL_Ctx(ssl->ctx); /* will decrement and free underlying CTX if 0 */
  6094. }
  6095. SSL_ResourceFree(ssl);
  6096. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  6097. (void)heap;
  6098. }
  6099. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  6100. !defined(WOLFSSL_NO_TLS12) || \
  6101. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \
  6102. && defined(HAVE_AEAD))
  6103. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  6104. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  6105. {
  6106. if (verify) {
  6107. seq[0] = ssl->keys.peer_sequence_number_hi;
  6108. seq[1] = ssl->keys.peer_sequence_number_lo++;
  6109. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  6110. /* handle rollover */
  6111. ssl->keys.peer_sequence_number_hi++;
  6112. }
  6113. }
  6114. else {
  6115. seq[0] = ssl->keys.sequence_number_hi;
  6116. seq[1] = ssl->keys.sequence_number_lo++;
  6117. if (seq[1] > ssl->keys.sequence_number_lo) {
  6118. /* handle rollover */
  6119. ssl->keys.sequence_number_hi++;
  6120. }
  6121. }
  6122. }
  6123. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  6124. #ifdef WOLFSSL_DTLS
  6125. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  6126. {
  6127. #ifdef HAVE_SECURE_RENEGOTIATION
  6128. order = DtlsCheckOrder(ssl, order);
  6129. #endif
  6130. if (order == PREV_ORDER) {
  6131. /* Previous epoch case */
  6132. if (ssl->options.haveMcast) {
  6133. #ifdef WOLFSSL_MULTICAST
  6134. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  6135. (ssl->options.mcastID << 8) |
  6136. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  6137. #endif
  6138. }
  6139. else
  6140. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  6141. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  6142. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  6143. }
  6144. else if (order == PEER_ORDER) {
  6145. if (ssl->options.haveMcast) {
  6146. #ifdef WOLFSSL_MULTICAST
  6147. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  6148. (ssl->keys.curPeerId << 8) |
  6149. (ssl->keys.curSeq_hi & 0xFF);
  6150. #endif
  6151. }
  6152. else
  6153. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  6154. (ssl->keys.curSeq_hi & 0xFFFF);
  6155. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  6156. }
  6157. else {
  6158. if (ssl->options.haveMcast) {
  6159. #ifdef WOLFSSL_MULTICAST
  6160. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  6161. (ssl->options.mcastID << 8) |
  6162. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  6163. #endif
  6164. }
  6165. else
  6166. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  6167. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  6168. seq[1] = ssl->keys.dtls_sequence_number_lo;
  6169. }
  6170. }
  6171. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  6172. {
  6173. word32 seq;
  6174. #ifdef HAVE_SECURE_RENEGOTIATION
  6175. order = DtlsCheckOrder(ssl, order);
  6176. #endif
  6177. if (order == PREV_ORDER) {
  6178. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  6179. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  6180. /* handle rollover */
  6181. ssl->keys.dtls_prev_sequence_number_hi++;
  6182. }
  6183. }
  6184. else if (order == PEER_ORDER) {
  6185. seq = ssl->keys.peer_sequence_number_lo++;
  6186. if (seq > ssl->keys.peer_sequence_number_lo) {
  6187. /* handle rollover */
  6188. ssl->keys.peer_sequence_number_hi++;
  6189. }
  6190. }
  6191. else {
  6192. seq = ssl->keys.dtls_sequence_number_lo++;
  6193. if (seq > ssl->keys.dtls_sequence_number_lo) {
  6194. /* handle rollover */
  6195. ssl->keys.dtls_sequence_number_hi++;
  6196. }
  6197. }
  6198. }
  6199. #endif /* WOLFSSL_DTLS */
  6200. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  6201. void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  6202. {
  6203. word32 seq[2] = {0, 0};
  6204. if (!ssl->options.dtls) {
  6205. GetSEQIncrement(ssl, verifyOrder, seq);
  6206. }
  6207. else {
  6208. #ifdef WOLFSSL_DTLS
  6209. DtlsGetSEQ(ssl, verifyOrder, seq);
  6210. #endif
  6211. }
  6212. c32toa(seq[0], out);
  6213. c32toa(seq[1], out + OPAQUE32_LEN);
  6214. }
  6215. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  6216. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
  6217. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */
  6218. #ifdef WOLFSSL_DTLS
  6219. /* functions for managing DTLS datagram reordering */
  6220. /* Need to allocate space for the handshake message header. The hashing
  6221. * routines assume the message pointer is still within the buffer that
  6222. * has the headers, and will include those headers in the hash. The store
  6223. * routines need to take that into account as well. New will allocate
  6224. * extra space for the headers. */
  6225. DtlsMsg* DtlsMsgNew(word32 sz, void* heap)
  6226. {
  6227. DtlsMsg* msg;
  6228. WOLFSSL_ENTER("DtlsMsgNew()");
  6229. (void)heap;
  6230. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  6231. if (msg != NULL) {
  6232. XMEMSET(msg, 0, sizeof(DtlsMsg));
  6233. msg->buf = (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ,
  6234. heap, DYNAMIC_TYPE_DTLS_BUFFER);
  6235. if (msg->buf != NULL) {
  6236. msg->sz = sz;
  6237. msg->type = no_shake;
  6238. msg->msg = msg->buf + DTLS_HANDSHAKE_HEADER_SZ;
  6239. }
  6240. else {
  6241. XFREE(msg, heap, DYNAMIC_TYPE_DTLS_MSG);
  6242. msg = NULL;
  6243. }
  6244. }
  6245. return msg;
  6246. }
  6247. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  6248. {
  6249. (void)heap;
  6250. WOLFSSL_ENTER("DtlsMsgDelete()");
  6251. if (item != NULL) {
  6252. DtlsFrag* cur = item->fragList;
  6253. while (cur != NULL) {
  6254. DtlsFrag* next = cur->next;
  6255. XFREE(cur, heap, DYNAMIC_TYPE_DTLS_FRAG);
  6256. cur = next;
  6257. }
  6258. if (item->buf != NULL)
  6259. XFREE(item->buf, heap, DYNAMIC_TYPE_DTLS_BUFFER);
  6260. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  6261. }
  6262. }
  6263. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  6264. {
  6265. DtlsMsg* next;
  6266. WOLFSSL_ENTER("DtlsMsgListDelete()");
  6267. while (head) {
  6268. next = head->next;
  6269. DtlsMsgDelete(head, heap);
  6270. head = next;
  6271. }
  6272. }
  6273. /**
  6274. * Drop messages when they are no longer going to be retransmitted
  6275. */
  6276. void DtlsTxMsgListClean(WOLFSSL* ssl)
  6277. {
  6278. DtlsMsg* head = ssl->dtls_tx_msg_list;
  6279. DtlsMsg* next;
  6280. WOLFSSL_ENTER("DtlsTxMsgListClean()");
  6281. while (head) {
  6282. next = head->next;
  6283. if (VerifyForTxDtlsMsgDelete(ssl, head))
  6284. DtlsMsgDelete(head, ssl->heap);
  6285. else
  6286. /* Stored packets should be in order so break on first failed
  6287. * verify */
  6288. break;
  6289. ssl->dtls_tx_msg_list_sz--;
  6290. /* Reset timer as deleting a node means that state has progressed */
  6291. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6292. head = next;
  6293. }
  6294. ssl->dtls_tx_msg_list = head;
  6295. }
  6296. /* Create a DTLS Fragment from *begin - end, adjust new *begin and bytesLeft */
  6297. static DtlsFrag* CreateFragment(word32* begin, word32 end, const byte* data,
  6298. byte* buf, word32* bytesLeft, void* heap)
  6299. {
  6300. DtlsFrag* newFrag;
  6301. word32 added = end - *begin + 1;
  6302. WOLFSSL_ENTER("CreateFragment()");
  6303. (void)heap;
  6304. newFrag = (DtlsFrag*)XMALLOC(sizeof(DtlsFrag), heap,
  6305. DYNAMIC_TYPE_DTLS_FRAG);
  6306. if (newFrag != NULL) {
  6307. newFrag->next = NULL;
  6308. newFrag->begin = *begin;
  6309. newFrag->end = end;
  6310. XMEMCPY(buf + *begin, data, added);
  6311. *bytesLeft -= added;
  6312. *begin = newFrag->end + 1;
  6313. }
  6314. return newFrag;
  6315. }
  6316. int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
  6317. word32 fragOffset, word32 fragSz, void* heap)
  6318. {
  6319. WOLFSSL_ENTER("DtlsMsgSet()");
  6320. if (msg != NULL && data != NULL && msg->fragSz <= msg->sz &&
  6321. fragSz <= msg->sz && fragOffset <= msg->sz &&
  6322. (fragOffset + fragSz) <= msg->sz) {
  6323. DtlsFrag* cur = msg->fragList;
  6324. DtlsFrag* prev = cur;
  6325. DtlsFrag* newFrag;
  6326. word32 bytesLeft = fragSz; /* could be overlapping fragment */
  6327. word32 startOffset = fragOffset;
  6328. word32 added;
  6329. msg->seq = seq;
  6330. msg->epoch = epoch;
  6331. msg->type = type;
  6332. if (fragOffset == 0) {
  6333. XMEMCPY(msg->buf, data - DTLS_HANDSHAKE_HEADER_SZ,
  6334. DTLS_HANDSHAKE_HEADER_SZ);
  6335. c32to24(msg->sz, msg->msg - DTLS_HANDSHAKE_FRAG_SZ);
  6336. }
  6337. /* if no message data, just return */
  6338. if (fragSz == 0)
  6339. return 0;
  6340. /* if list is empty add full fragment to front */
  6341. if (cur == NULL) {
  6342. newFrag = CreateFragment(&fragOffset, fragOffset + fragSz - 1, data,
  6343. msg->msg, &bytesLeft, heap);
  6344. if (newFrag == NULL)
  6345. return MEMORY_E;
  6346. msg->fragSz = fragSz;
  6347. msg->fragList = newFrag;
  6348. return 0;
  6349. }
  6350. /* add to front if before current front, up to next->begin */
  6351. if (fragOffset < cur->begin) {
  6352. word32 end = fragOffset + fragSz - 1;
  6353. if (end >= cur->begin)
  6354. end = cur->begin - 1;
  6355. added = end - fragOffset + 1;
  6356. newFrag = CreateFragment(&fragOffset, end, data, msg->msg,
  6357. &bytesLeft, heap);
  6358. if (newFrag == NULL)
  6359. return MEMORY_E;
  6360. msg->fragSz += added;
  6361. newFrag->next = cur;
  6362. msg->fragList = newFrag;
  6363. }
  6364. /* while we have bytes left, try to find a gap to fill */
  6365. while (bytesLeft > 0) {
  6366. /* get previous packet in list */
  6367. while (cur && (fragOffset >= cur->begin)) {
  6368. prev = cur;
  6369. cur = cur->next;
  6370. }
  6371. /* don't add duplicate data */
  6372. if (prev->end >= fragOffset) {
  6373. if ( (fragOffset + bytesLeft - 1) <= prev->end)
  6374. return 0;
  6375. fragOffset = prev->end + 1;
  6376. bytesLeft = startOffset + fragSz - fragOffset;
  6377. }
  6378. if (cur == NULL)
  6379. /* we're at the end */
  6380. added = bytesLeft;
  6381. else
  6382. /* we're in between two frames */
  6383. added = min(bytesLeft, cur->begin - fragOffset);
  6384. /* data already there */
  6385. if (added == 0)
  6386. continue;
  6387. newFrag = CreateFragment(&fragOffset, fragOffset + added - 1,
  6388. data + fragOffset - startOffset,
  6389. msg->msg, &bytesLeft, heap);
  6390. if (newFrag == NULL)
  6391. return MEMORY_E;
  6392. msg->fragSz += added;
  6393. newFrag->next = prev->next;
  6394. prev->next = newFrag;
  6395. }
  6396. }
  6397. return 0;
  6398. }
  6399. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word32 epoch, word32 seq)
  6400. {
  6401. WOLFSSL_ENTER("DtlsMsgFind()");
  6402. while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
  6403. head = head->next;
  6404. }
  6405. return head;
  6406. }
  6407. void DtlsMsgStore(WOLFSSL* ssl, word32 epoch, word32 seq, const byte* data,
  6408. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  6409. {
  6410. /* See if seq exists in the list. If it isn't in the list, make
  6411. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  6412. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  6413. * the seq is in the list and it isn't full, copy fragSz bytes from
  6414. * data to msg->msg starting at offset fragOffset, and add fragSz to
  6415. * msg->fragSz. Insertions take into account data already in the list
  6416. * in case there are overlaps in the handshake message due to retransmit
  6417. * messages. The new item should be inserted into the list in its
  6418. * proper position.
  6419. *
  6420. * 1. Find seq in list, or where seq should go in list. If seq not in
  6421. * list, create new item and insert into list. Either case, keep
  6422. * pointer to item.
  6423. * 2. Copy the data from the message to the stored message where it
  6424. * belongs without overlaps.
  6425. */
  6426. DtlsMsg* head = ssl->dtls_rx_msg_list;
  6427. WOLFSSL_ENTER("DtlsMsgStore()");
  6428. if (head != NULL) {
  6429. DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
  6430. if (cur == NULL) {
  6431. cur = DtlsMsgNew(dataSz, heap);
  6432. if (cur != NULL) {
  6433. if (DtlsMsgSet(cur, seq, epoch, data, type,
  6434. fragOffset, fragSz, heap) < 0) {
  6435. DtlsMsgDelete(cur, heap);
  6436. }
  6437. else {
  6438. ssl->dtls_rx_msg_list_sz++;
  6439. head = DtlsMsgInsert(head, cur);
  6440. }
  6441. }
  6442. }
  6443. else {
  6444. /* If this fails, the data is just dropped. */
  6445. DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
  6446. fragSz, heap);
  6447. }
  6448. }
  6449. else {
  6450. head = DtlsMsgNew(dataSz, heap);
  6451. if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
  6452. fragSz, heap) < 0) {
  6453. DtlsMsgDelete(head, heap);
  6454. head = NULL;
  6455. }
  6456. else {
  6457. ssl->dtls_rx_msg_list_sz++;
  6458. }
  6459. }
  6460. ssl->dtls_rx_msg_list = head;
  6461. }
  6462. /* DtlsMsgInsert() is an in-order insert. */
  6463. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  6464. {
  6465. WOLFSSL_ENTER("DtlsMsgInsert()");
  6466. if (head == NULL || (item->epoch <= head->epoch &&
  6467. item->seq < head->seq)) {
  6468. item->next = head;
  6469. head = item;
  6470. }
  6471. else if (head->next == NULL) {
  6472. head->next = item;
  6473. }
  6474. else {
  6475. DtlsMsg* cur = head->next;
  6476. DtlsMsg* prev = head;
  6477. while (cur) {
  6478. if (item->epoch <= cur->epoch &&
  6479. item->seq < cur->seq) {
  6480. item->next = cur;
  6481. prev->next = item;
  6482. break;
  6483. }
  6484. prev = cur;
  6485. cur = cur->next;
  6486. }
  6487. if (cur == NULL) {
  6488. prev->next = item;
  6489. }
  6490. }
  6491. return head;
  6492. }
  6493. /**
  6494. * DtlsMsgPoolSave() adds the message to the end of the stored transmit
  6495. * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
  6496. * anything else that increments ssl->keys.dtls_handshake_number.
  6497. */
  6498. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
  6499. enum HandShakeType type)
  6500. {
  6501. DtlsMsg* item;
  6502. int ret = 0;
  6503. WOLFSSL_ENTER("DtlsMsgPoolSave()");
  6504. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  6505. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  6506. return DTLS_POOL_SZ_E;
  6507. }
  6508. item = DtlsMsgNew(dataSz, ssl->heap);
  6509. if (item != NULL) {
  6510. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  6511. XMEMCPY(item->buf, data, dataSz);
  6512. item->sz = dataSz;
  6513. item->epoch = ssl->keys.dtls_epoch;
  6514. item->seq = ssl->keys.dtls_handshake_number;
  6515. item->type = type;
  6516. if (cur == NULL)
  6517. ssl->dtls_tx_msg_list = item;
  6518. else {
  6519. while (cur->next)
  6520. cur = cur->next;
  6521. cur->next = item;
  6522. }
  6523. ssl->dtls_tx_msg_list_sz++;
  6524. }
  6525. else
  6526. ret = MEMORY_E;
  6527. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  6528. return ret;
  6529. }
  6530. /* DtlsMsgPoolTimeout() updates the timeout time. */
  6531. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  6532. {
  6533. int result = -1;
  6534. WOLFSSL_ENTER("DtlsMsgPoolTimeout()");
  6535. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  6536. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  6537. result = 0;
  6538. }
  6539. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  6540. return result;
  6541. }
  6542. /* DtlsMsgPoolReset() deletes the stored transmit list and resets the timeout
  6543. * value. */
  6544. void DtlsMsgPoolReset(WOLFSSL* ssl)
  6545. {
  6546. WOLFSSL_ENTER("DtlsMsgPoolReset()");
  6547. if (ssl->dtls_tx_msg_list) {
  6548. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  6549. ssl->dtls_tx_msg_list = NULL;
  6550. ssl->dtls_tx_msg = NULL;
  6551. ssl->dtls_tx_msg_list_sz = 0;
  6552. }
  6553. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6554. }
  6555. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  6556. {
  6557. /**
  6558. * only the first message from previous flight should be valid
  6559. * to be used for triggering retransmission of whole DtlsMsgPool.
  6560. * change cipher suite type is not verified here
  6561. */
  6562. return ((fragOffset == 0) &&
  6563. (((ssl->options.side == WOLFSSL_SERVER_END) &&
  6564. ((type == client_hello) ||
  6565. ((ssl->options.verifyPeer) && (type == certificate)) ||
  6566. ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
  6567. ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  6568. (type == hello_request || type == server_hello))));
  6569. }
  6570. /**
  6571. * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
  6572. * depending on the current state of the handshake negotiation.
  6573. */
  6574. int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
  6575. {
  6576. WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete()");
  6577. if (item->epoch < ssl->keys.dtls_epoch - 1)
  6578. /* Messages not from current or previous epoch can be deleted */
  6579. return 1;
  6580. switch (ssl->options.side) {
  6581. case WOLFSSL_CLIENT_END:
  6582. if (item->type == client_hello &&
  6583. ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
  6584. return 1; /* client can forget first client_hello if received full
  6585. * flight of packets from server */
  6586. else
  6587. return 0;
  6588. case WOLFSSL_SERVER_END:
  6589. if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
  6590. item->type == hello_request)
  6591. return 1; /* Server can forget HelloRequest if client sent a valid
  6592. * ClientHello */
  6593. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
  6594. item->type <= server_hello_done)
  6595. return 1; /* server can forget everything up to ServerHelloDone if
  6596. * a client finished message has been received and
  6597. * successfully processed */
  6598. else
  6599. return 0;
  6600. default:
  6601. return 0;
  6602. }
  6603. }
  6604. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  6605. * updated with new sequence numbers, and will be re-encrypted if needed. */
  6606. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  6607. {
  6608. int ret = 0;
  6609. DtlsMsg* pool;
  6610. int epochOrder;
  6611. WOLFSSL_ENTER("DtlsMsgPoolSend()");
  6612. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  6613. if (pool != NULL) {
  6614. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  6615. !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
  6616. ssl->options.acceptState == SERVER_HELLO_DONE ||
  6617. ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
  6618. ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
  6619. (ssl->options.side == WOLFSSL_CLIENT_END &&
  6620. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  6621. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  6622. ssl->options.connectState == FINISHED_DONE ||
  6623. ssl->options.connectState == SECOND_REPLY_DONE))) {
  6624. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  6625. ssl->error = DTLS_RETX_OVER_TX;
  6626. return WOLFSSL_FATAL_ERROR;
  6627. }
  6628. while (pool != NULL) {
  6629. if (pool->epoch == 0) {
  6630. DtlsRecordLayerHeader* dtls;
  6631. dtls = (DtlsRecordLayerHeader*)pool->buf;
  6632. /* If the stored record's epoch is 0, and the currently set
  6633. * epoch is 0, use the "current order" sequence number.
  6634. * If the stored record's epoch is 0 and the currently set
  6635. * epoch is not 0, the stored record is considered a "previous
  6636. * order" sequence number. */
  6637. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  6638. CUR_ORDER : PREV_ORDER;
  6639. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  6640. DtlsSEQIncrement(ssl, epochOrder);
  6641. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  6642. WOLFSSL_ERROR(ret);
  6643. return ret;
  6644. }
  6645. XMEMCPY(ssl->buffers.outputBuffer.buffer +
  6646. ssl->buffers.outputBuffer.idx +
  6647. ssl->buffers.outputBuffer.length,
  6648. pool->buf, pool->sz);
  6649. ssl->buffers.outputBuffer.length += pool->sz;
  6650. }
  6651. else {
  6652. /* Handle sending packets from previous epoch */
  6653. byte* input;
  6654. byte* output;
  6655. int inputSz, sendSz;
  6656. input = pool->buf;
  6657. inputSz = pool->sz;
  6658. sendSz = inputSz + cipherExtraData(ssl);
  6659. #ifdef HAVE_SECURE_RENEGOTIATION
  6660. /*
  6661. * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
  6662. * ssl->keys otherwise
  6663. * PREV_ORDER will always use ssl->keys
  6664. */
  6665. if (DtlsSCRKeysSet(ssl)) {
  6666. if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  6667. epochOrder = CUR_ORDER;
  6668. else
  6669. epochOrder = PREV_ORDER;
  6670. }
  6671. else {
  6672. epochOrder = CUR_ORDER;
  6673. }
  6674. #else
  6675. epochOrder = CUR_ORDER;
  6676. #endif
  6677. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  6678. WOLFSSL_ERROR(ret);
  6679. return ret;
  6680. }
  6681. output = ssl->buffers.outputBuffer.buffer +
  6682. ssl->buffers.outputBuffer.length;
  6683. if (inputSz != ENUM_LEN)
  6684. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  6685. handshake, 0, 0, 0, epochOrder);
  6686. else
  6687. /* inputSz == ENUM_LEN must mean that this is a change cipher
  6688. * spec message */
  6689. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  6690. change_cipher_spec, 0, 0, 0, epochOrder);
  6691. if (sendSz < 0) {
  6692. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  6693. return BUILD_MSG_ERROR;
  6694. }
  6695. ssl->buffers.outputBuffer.length += sendSz;
  6696. }
  6697. if (!ssl->options.groupMessages)
  6698. ret = SendBuffered(ssl);
  6699. /**
  6700. * on server side, retransmission is being triggered only by sending
  6701. * first message of given flight, in order to trigger client
  6702. * to retransmit its whole flight. Sending the whole previous flight
  6703. * could lead to retransmission of previous client flight for each
  6704. * server message from previous flight. Therefore one message should
  6705. * be enough to do the trick.
  6706. */
  6707. if (sendOnlyFirstPacket &&
  6708. ssl->options.side == WOLFSSL_SERVER_END)
  6709. pool = NULL;
  6710. else
  6711. pool = pool->next;
  6712. ssl->dtls_tx_msg = pool;
  6713. }
  6714. if (ret == 0 && ssl->options.groupMessages)
  6715. ret = SendBuffered(ssl);
  6716. }
  6717. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  6718. return ret;
  6719. }
  6720. #endif /* WOLFSSL_DTLS */
  6721. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  6722. ProtocolVersion MakeSSLv3(void)
  6723. {
  6724. ProtocolVersion pv;
  6725. pv.major = SSLv3_MAJOR;
  6726. pv.minor = SSLv3_MINOR;
  6727. return pv;
  6728. }
  6729. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  6730. #ifdef WOLFSSL_DTLS
  6731. ProtocolVersion MakeDTLSv1(void)
  6732. {
  6733. ProtocolVersion pv;
  6734. pv.major = DTLS_MAJOR;
  6735. pv.minor = DTLS_MINOR;
  6736. return pv;
  6737. }
  6738. #ifndef WOLFSSL_NO_TLS12
  6739. ProtocolVersion MakeDTLSv1_2(void)
  6740. {
  6741. ProtocolVersion pv;
  6742. pv.major = DTLS_MAJOR;
  6743. pv.minor = DTLSv1_2_MINOR;
  6744. return pv;
  6745. }
  6746. #endif /* !WOLFSSL_NO_TLS12 */
  6747. #endif /* WOLFSSL_DTLS */
  6748. #ifndef NO_ASN_TIME
  6749. #if defined(USER_TICKS)
  6750. #if 0
  6751. word32 LowResTimer(void)
  6752. {
  6753. /*
  6754. write your own clock tick function if don't want time(0)
  6755. needs second accuracy but doesn't have to correlated to EPOCH
  6756. */
  6757. }
  6758. #endif
  6759. #elif defined(TIME_OVERRIDES)
  6760. /* use same asn time overrides unless user wants tick override above */
  6761. #ifndef HAVE_TIME_T_TYPE
  6762. typedef long time_t;
  6763. #endif
  6764. extern time_t XTIME(time_t * timer);
  6765. word32 LowResTimer(void)
  6766. {
  6767. return (word32) XTIME(0);
  6768. }
  6769. #elif defined(USE_WINDOWS_API)
  6770. word32 LowResTimer(void)
  6771. {
  6772. static int init = 0;
  6773. static LARGE_INTEGER freq;
  6774. LARGE_INTEGER count;
  6775. if (!init) {
  6776. QueryPerformanceFrequency(&freq);
  6777. init = 1;
  6778. }
  6779. QueryPerformanceCounter(&count);
  6780. return (word32)(count.QuadPart / freq.QuadPart);
  6781. }
  6782. #elif defined(HAVE_RTP_SYS)
  6783. #include "rtptime.h"
  6784. word32 LowResTimer(void)
  6785. {
  6786. return (word32)rtp_get_system_sec();
  6787. }
  6788. #elif defined(WOLFSSL_DEOS)
  6789. word32 LowResTimer(void)
  6790. {
  6791. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  6792. const volatile word32 *systemTickPtr = systemTickPointer();
  6793. return (word32) *systemTickPtr/systemTickTimeInHz;
  6794. }
  6795. #elif defined(MICRIUM)
  6796. word32 LowResTimer(void)
  6797. {
  6798. OS_TICK ticks = 0;
  6799. OS_ERR err;
  6800. ticks = OSTimeGet(&err);
  6801. return (word32) (ticks / OSCfg_TickRate_Hz);
  6802. }
  6803. #elif defined(MICROCHIP_TCPIP_V5)
  6804. word32 LowResTimer(void)
  6805. {
  6806. return (word32) (TickGet() / TICKS_PER_SECOND);
  6807. }
  6808. #elif defined(MICROCHIP_TCPIP)
  6809. #if defined(MICROCHIP_MPLAB_HARMONY)
  6810. #include <system/tmr/sys_tmr.h>
  6811. word32 LowResTimer(void)
  6812. {
  6813. return (word32) (SYS_TMR_TickCountGet() /
  6814. SYS_TMR_TickCounterFrequencyGet());
  6815. }
  6816. #else
  6817. word32 LowResTimer(void)
  6818. {
  6819. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  6820. }
  6821. #endif
  6822. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  6823. word32 LowResTimer(void)
  6824. {
  6825. TIME_STRUCT mqxTime;
  6826. _time_get_elapsed(&mqxTime);
  6827. return (word32) mqxTime.SECONDS;
  6828. }
  6829. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  6830. #include "include/task.h"
  6831. unsigned int LowResTimer(void)
  6832. {
  6833. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  6834. }
  6835. #elif defined(FREERTOS)
  6836. #include "task.h"
  6837. unsigned int LowResTimer(void)
  6838. {
  6839. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  6840. }
  6841. #elif defined(FREESCALE_KSDK_BM)
  6842. #include "lwip/sys.h" /* lwIP */
  6843. word32 LowResTimer(void)
  6844. {
  6845. return sys_now()/1000;
  6846. }
  6847. #elif defined(WOLFSSL_TIRTOS)
  6848. word32 LowResTimer(void)
  6849. {
  6850. return (word32) Seconds_get();
  6851. }
  6852. #elif defined(WOLFSSL_XILINX)
  6853. #include "xrtcpsu.h"
  6854. word32 LowResTimer(void)
  6855. {
  6856. XRtcPsu_Config* con;
  6857. XRtcPsu rtc;
  6858. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  6859. if (con != NULL) {
  6860. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  6861. == XST_SUCCESS) {
  6862. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  6863. }
  6864. else {
  6865. WOLFSSL_MSG("Unable to initialize RTC");
  6866. }
  6867. }
  6868. return 0;
  6869. }
  6870. #elif defined(WOLFSSL_UTASKER)
  6871. word32 LowResTimer(void)
  6872. {
  6873. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  6874. }
  6875. #elif defined(WOLFSSL_NUCLEUS_1_2)
  6876. #define NU_TICKS_PER_SECOND 100
  6877. word32 LowResTimer(void)
  6878. {
  6879. /* returns number of 10ms ticks, so 100 ticks/sec */
  6880. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  6881. }
  6882. #elif defined(WOLFSSL_APACHE_MYNEWT)
  6883. #include "os/os_time.h"
  6884. word32 LowResTimer(void)
  6885. {
  6886. word32 now;
  6887. struct os_timeval tv;
  6888. os_gettimeofday(&tv, NULL);
  6889. now = (word32)tv.tv_sec;
  6890. return now;
  6891. }
  6892. #elif defined(WOLFSSL_ZEPHYR)
  6893. word32 LowResTimer(void)
  6894. {
  6895. return k_uptime_get() / 1000;
  6896. }
  6897. #elif defined(WOLFSSL_LINUXKM)
  6898. #include <linux/time.h>
  6899. #include <linux/ktime.h>
  6900. word32 LowResTimer(void)
  6901. {
  6902. return (word32)ktime_get_real_ns();
  6903. }
  6904. #else
  6905. /* Posix style time */
  6906. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  6907. #include <time.h>
  6908. #endif
  6909. word32 LowResTimer(void)
  6910. {
  6911. return (word32)XTIME(0);
  6912. }
  6913. #endif
  6914. #endif /* !NO_ASN_TIME */
  6915. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  6916. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  6917. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  6918. /* Store the message for use with CertificateVerify using EdDSA.
  6919. *
  6920. * ssl SSL/TLS object.
  6921. * data Message to store.
  6922. * sz Size of message to store.
  6923. * returns MEMORY_E if not able to reallocate, otherwise 0.
  6924. */
  6925. static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
  6926. {
  6927. int ret = 0;
  6928. byte* msgs;
  6929. if (ssl->options.cacheMessages) {
  6930. msgs = (byte*)XREALLOC(ssl->hsHashes->messages,
  6931. ssl->hsHashes->length + sz,
  6932. ssl->heap, DYNAMIC_TYPE_HASHES);
  6933. if (msgs == NULL)
  6934. ret = MEMORY_E;
  6935. if (ret == 0) {
  6936. ssl->hsHashes->messages = msgs;
  6937. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  6938. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  6939. ssl->hsHashes->length += sz;
  6940. }
  6941. }
  6942. return ret;
  6943. }
  6944. #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  6945. int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
  6946. {
  6947. int ret = 0;
  6948. (void)data;
  6949. (void)sz;
  6950. if (ssl->hsHashes == NULL) {
  6951. return BAD_FUNC_ARG;
  6952. }
  6953. #ifndef NO_OLD_TLS
  6954. #ifndef NO_SHA
  6955. wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
  6956. #endif
  6957. #ifndef NO_MD5
  6958. wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
  6959. #endif
  6960. #endif /* NO_OLD_TLS */
  6961. if (IsAtLeastTLSv1_2(ssl)) {
  6962. #ifndef NO_SHA256
  6963. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
  6964. if (ret != 0)
  6965. return ret;
  6966. #endif
  6967. #ifdef WOLFSSL_SHA384
  6968. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
  6969. if (ret != 0)
  6970. return ret;
  6971. #endif
  6972. #ifdef WOLFSSL_SHA512
  6973. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
  6974. if (ret != 0)
  6975. return ret;
  6976. #endif
  6977. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  6978. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  6979. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  6980. ret = EdDSA_Update(ssl, data, sz);
  6981. if (ret != 0)
  6982. return ret;
  6983. #endif
  6984. }
  6985. return ret;
  6986. }
  6987. /* add output to md5 and sha handshake hashes, exclude record header */
  6988. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  6989. {
  6990. const byte* adj;
  6991. if (ssl->hsHashes == NULL)
  6992. return BAD_FUNC_ARG;
  6993. adj = output + RECORD_HEADER_SZ + ivSz;
  6994. sz -= RECORD_HEADER_SZ;
  6995. #ifdef HAVE_FUZZER
  6996. if (ssl->fuzzerCb)
  6997. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  6998. #endif
  6999. #ifdef WOLFSSL_DTLS
  7000. if (ssl->options.dtls) {
  7001. adj += DTLS_RECORD_EXTRA;
  7002. sz -= DTLS_RECORD_EXTRA;
  7003. }
  7004. #endif
  7005. return HashRaw(ssl, adj, sz);
  7006. }
  7007. /* add input to md5 and sha handshake hashes, include handshake header */
  7008. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  7009. {
  7010. const byte* adj;
  7011. if (ssl->hsHashes == NULL) {
  7012. return BAD_FUNC_ARG;
  7013. }
  7014. adj = input - HANDSHAKE_HEADER_SZ;
  7015. sz += HANDSHAKE_HEADER_SZ;
  7016. #ifdef WOLFSSL_DTLS
  7017. if (ssl->options.dtls) {
  7018. adj -= DTLS_HANDSHAKE_EXTRA;
  7019. sz += DTLS_HANDSHAKE_EXTRA;
  7020. }
  7021. #endif
  7022. return HashRaw(ssl, adj, sz);
  7023. }
  7024. /* add record layer header for message */
  7025. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
  7026. {
  7027. RecordLayerHeader* rl;
  7028. (void)epochOrder;
  7029. /* record layer header */
  7030. rl = (RecordLayerHeader*)output;
  7031. if (rl == NULL) {
  7032. return;
  7033. }
  7034. rl->type = type;
  7035. rl->pvMajor = ssl->version.major; /* type and version same in each */
  7036. #ifdef WOLFSSL_TLS13
  7037. if (IsAtLeastTLSv1_3(ssl->version)) {
  7038. rl->pvMinor = TLSv1_2_MINOR;
  7039. }
  7040. else
  7041. #endif
  7042. rl->pvMinor = ssl->version.minor;
  7043. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  7044. if (ssl->options.side == WOLFSSL_CLIENT_END
  7045. && ssl->options.connectState == CONNECT_BEGIN
  7046. && !ssl->options.resuming) {
  7047. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  7048. : ssl->version.minor;
  7049. }
  7050. #endif
  7051. if (!ssl->options.dtls) {
  7052. c16toa((word16)length, rl->length);
  7053. }
  7054. else {
  7055. #ifdef WOLFSSL_DTLS
  7056. DtlsRecordLayerHeader* dtls;
  7057. /* dtls record layer header extensions */
  7058. dtls = (DtlsRecordLayerHeader*)output;
  7059. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  7060. c16toa((word16)length, dtls->length);
  7061. #endif
  7062. }
  7063. }
  7064. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  7065. !defined(NO_WOLFSSL_SERVER))
  7066. /* add handshake header for message */
  7067. static void AddHandShakeHeader(byte* output, word32 length,
  7068. word32 fragOffset, word32 fragLength,
  7069. byte type, WOLFSSL* ssl)
  7070. {
  7071. HandShakeHeader* hs;
  7072. (void)fragOffset;
  7073. (void)fragLength;
  7074. (void)ssl;
  7075. /* handshake header */
  7076. hs = (HandShakeHeader*)output;
  7077. if (hs == NULL)
  7078. return;
  7079. hs->type = type;
  7080. c32to24(length, hs->length); /* type and length same for each */
  7081. #ifdef WOLFSSL_DTLS
  7082. if (ssl->options.dtls) {
  7083. DtlsHandShakeHeader* dtls;
  7084. /* dtls handshake header extensions */
  7085. dtls = (DtlsHandShakeHeader*)output;
  7086. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  7087. c32to24(fragOffset, dtls->fragment_offset);
  7088. c32to24(fragLength, dtls->fragment_length);
  7089. }
  7090. #endif
  7091. }
  7092. /* add both headers for handshake message */
  7093. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  7094. {
  7095. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  7096. word32 outputAdj = RECORD_HEADER_SZ;
  7097. #ifdef WOLFSSL_DTLS
  7098. if (ssl->options.dtls) {
  7099. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  7100. outputAdj += DTLS_RECORD_EXTRA;
  7101. }
  7102. #endif
  7103. AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
  7104. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  7105. }
  7106. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  7107. #ifndef WOLFSSL_NO_TLS12
  7108. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
  7109. !defined(WOLFSSL_NO_CLIENT_AUTH)) || \
  7110. defined(WOLFSSL_DTLS)
  7111. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  7112. word32 length, byte type, WOLFSSL* ssl)
  7113. {
  7114. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  7115. word32 outputAdj = RECORD_HEADER_SZ;
  7116. (void)fragSz;
  7117. #ifdef WOLFSSL_DTLS
  7118. if (ssl->options.dtls) {
  7119. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  7120. outputAdj += DTLS_RECORD_EXTRA;
  7121. }
  7122. #endif
  7123. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
  7124. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  7125. }
  7126. #endif /* NO_CERTS */
  7127. /**
  7128. * Send the handshake message. This funcion handles fragmenting the message
  7129. * so that it will fit into the desired MTU or the max fragment size.
  7130. * @param ssl Connection object
  7131. * @param input Input starting at the record layer header. This function
  7132. * assumes that the appropriate record and handshake headers
  7133. * are present. These headers must assume no fragmentation.
  7134. * That is handled here.
  7135. * @param inputSz Length of message excluding headers (this is the total
  7136. * length of all fragments)
  7137. * @param type Type of message being sent
  7138. * @return 0 on success and negative otherwise
  7139. */
  7140. static int SendHandshakeMsg(WOLFSSL* ssl, byte* input, word32 inputSz,
  7141. enum HandShakeType type, const char* packetName)
  7142. {
  7143. int maxFrag;
  7144. int ret = 0;
  7145. int headerSz;
  7146. WOLFSSL_ENTER("SendHandshakeMsg");
  7147. (void)type;
  7148. (void)packetName;
  7149. if (ssl == NULL || input == NULL)
  7150. return BAD_FUNC_ARG;
  7151. #ifdef WOLFSSL_DTLS
  7152. if (ssl->options.dtls)
  7153. headerSz = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  7154. else
  7155. #endif
  7156. {
  7157. /* In TLS we send one handshake header in total, not one
  7158. * per fragment like in DTLS. The handshake header should
  7159. * already be in the input buffer. */
  7160. inputSz += HANDSHAKE_HEADER_SZ;
  7161. headerSz = RECORD_HEADER_SZ;
  7162. }
  7163. maxFrag = wolfSSL_GetMaxRecordSize(ssl, (int)inputSz);
  7164. /* Make sure input is not the ssl output buffer as this
  7165. * function doesn't handle that */
  7166. if (input >= ssl->buffers.outputBuffer.buffer &&
  7167. input <= ssl->buffers.outputBuffer.buffer +
  7168. ssl->buffers.outputBuffer.bufferSize) {
  7169. WOLFSSL_MSG("Can't use output buffer for input in SendHandshakeMsg");
  7170. return BAD_FUNC_ARG;
  7171. }
  7172. if (ssl->fragOffset == 0) {
  7173. /* Hash it before the loop as we modify the input with
  7174. * encryption on */
  7175. ret = HashOutput(ssl, input, headerSz + (int)inputSz, 0);
  7176. if (ret != 0)
  7177. return ret;
  7178. #ifdef WOLFSSL_DTLS
  7179. /* Decrement msg number so that we continue to use the
  7180. * same msg number for this msg */
  7181. if (ssl->options.dtls)
  7182. ssl->keys.dtls_handshake_number--;
  7183. #endif
  7184. }
  7185. while (ssl->fragOffset < inputSz) {
  7186. byte* output;
  7187. int outputSz;
  7188. byte* data = input + ssl->fragOffset + headerSz;
  7189. word32 fragSz = (word32)maxFrag;
  7190. if (inputSz - ssl->fragOffset < fragSz)
  7191. fragSz = inputSz - ssl->fragOffset;
  7192. /* check for available size */
  7193. outputSz = headerSz + fragSz;
  7194. if (IsEncryptionOn(ssl, 1))
  7195. outputSz += cipherExtraData(ssl);
  7196. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  7197. return ret;
  7198. output = ssl->buffers.outputBuffer.buffer +
  7199. ssl->buffers.outputBuffer.length;
  7200. /* scan-build complains that this may be null */
  7201. if (output == NULL)
  7202. return MEMORY_E;
  7203. if (IsEncryptionOn(ssl, 1)) {
  7204. /* First we need to add the fragment header ourselves.
  7205. * We do this in the input to minimize allocations */
  7206. int dataSz = (int)fragSz;
  7207. #ifdef WOLFSSL_DTLS
  7208. if (ssl->options.dtls) {
  7209. data -= DTLS_HANDSHAKE_HEADER_SZ;
  7210. dataSz += DTLS_HANDSHAKE_HEADER_SZ;
  7211. AddHandShakeHeader(data,
  7212. inputSz, ssl->fragOffset, fragSz, type, ssl);
  7213. }
  7214. if (ssl->options.dtls)
  7215. ssl->keys.dtls_handshake_number--;
  7216. if (IsDtlsNotSctpMode(ssl) &&
  7217. (ret = DtlsMsgPoolSave(ssl, data,
  7218. fragSz + DTLS_HANDSHAKE_HEADER_SZ, type))
  7219. != 0)
  7220. return ret;
  7221. #endif
  7222. ret = BuildMessage(ssl, output, outputSz,
  7223. data, dataSz, handshake, 0, 0, 0, CUR_ORDER);
  7224. if (ret >= 0)
  7225. outputSz = ret;
  7226. else
  7227. return ret;
  7228. ret = 0;
  7229. }
  7230. else {
  7231. #ifdef WOLFSSL_DTLS
  7232. if (ssl->options.dtls)
  7233. AddFragHeaders(output, fragSz, ssl->fragOffset,
  7234. inputSz, type, ssl);
  7235. else
  7236. #endif
  7237. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  7238. XMEMCPY(output + headerSz, data, fragSz);
  7239. #ifdef WOLFSSL_DTLS
  7240. if (ssl->options.dtls) {
  7241. ssl->keys.dtls_handshake_number--;
  7242. DtlsSEQIncrement(ssl, CUR_ORDER);
  7243. }
  7244. if (IsDtlsNotSctpMode(ssl)) {
  7245. if ((ret = DtlsMsgPoolSave(ssl, output, headerSz + fragSz,
  7246. type)) != 0) {
  7247. return ret;
  7248. }
  7249. }
  7250. #endif
  7251. }
  7252. ssl->buffers.outputBuffer.length += outputSz;
  7253. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  7254. if (ssl->hsInfoOn) {
  7255. AddPacketName(ssl, packetName);
  7256. }
  7257. if (ssl->toInfoOn) {
  7258. AddPacketInfo(ssl, packetName, handshake,
  7259. output, outputSz, WRITE_PROTO, ssl->heap);
  7260. }
  7261. #endif
  7262. ssl->fragOffset += fragSz;
  7263. if (!ssl->options.groupMessages)
  7264. ret = SendBuffered(ssl);
  7265. if (ret != 0)
  7266. return ret;
  7267. }
  7268. #ifdef WOLFSSL_DTLS
  7269. /* Increment msg number once we sent all fragments */
  7270. if (ssl->options.dtls)
  7271. ssl->keys.dtls_handshake_number++;
  7272. #endif
  7273. ssl->fragOffset = 0;
  7274. return ret;
  7275. }
  7276. #endif /* !WOLFSSL_NO_TLS12 */
  7277. /* return bytes received, -1 on error */
  7278. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  7279. {
  7280. int recvd;
  7281. if (ssl->CBIORecv == NULL) {
  7282. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  7283. return -1;
  7284. }
  7285. retry:
  7286. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  7287. if (recvd < 0) {
  7288. switch (recvd) {
  7289. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  7290. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)
  7291. #ifndef NO_BIO
  7292. if (ssl->biord) {
  7293. /* If retry and read flags are set, return WANT_READ */
  7294. if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
  7295. (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
  7296. return WANT_READ;
  7297. }
  7298. }
  7299. #endif
  7300. #endif
  7301. return -1;
  7302. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  7303. return WANT_READ;
  7304. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  7305. #ifdef USE_WINDOWS_API
  7306. if (ssl->options.dtls) {
  7307. goto retry;
  7308. }
  7309. #endif
  7310. ssl->options.connReset = 1;
  7311. return -1;
  7312. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  7313. /* see if we got our timeout */
  7314. #ifdef WOLFSSL_CALLBACKS
  7315. if (ssl->toInfoOn) {
  7316. struct itimerval timeout;
  7317. getitimer(ITIMER_REAL, &timeout);
  7318. if (timeout.it_value.tv_sec == 0 &&
  7319. timeout.it_value.tv_usec == 0) {
  7320. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  7321. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  7322. ssl->timeoutInfo.timeoutName[
  7323. MAX_TIMEOUT_NAME_SZ] = '\0';
  7324. WOLFSSL_MSG("Got our timeout");
  7325. return WANT_READ;
  7326. }
  7327. }
  7328. #endif
  7329. goto retry;
  7330. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  7331. ssl->options.isClosed = 1;
  7332. return -1;
  7333. case WOLFSSL_CBIO_ERR_TIMEOUT:
  7334. #ifdef WOLFSSL_DTLS
  7335. if (IsDtlsNotSctpMode(ssl) &&
  7336. ssl->options.handShakeState != HANDSHAKE_DONE &&
  7337. DtlsMsgPoolTimeout(ssl) == 0 &&
  7338. DtlsMsgPoolSend(ssl, 0) == 0) {
  7339. /* retry read for DTLS during handshake only */
  7340. goto retry;
  7341. }
  7342. #endif
  7343. return -1;
  7344. default:
  7345. WOLFSSL_MSG("Unexpected recv return code");
  7346. return recvd;
  7347. }
  7348. }
  7349. return recvd;
  7350. }
  7351. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  7352. void ShrinkOutputBuffer(WOLFSSL* ssl)
  7353. {
  7354. WOLFSSL_MSG("Shrinking output buffer\n");
  7355. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  7356. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  7357. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  7358. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  7359. ssl->buffers.outputBuffer.dynamicFlag = 0;
  7360. ssl->buffers.outputBuffer.offset = 0;
  7361. }
  7362. /* Switch dynamic input buffer back to static, keep any remaining input */
  7363. /* forced free means cleaning up */
  7364. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  7365. {
  7366. int usedLength = ssl->buffers.inputBuffer.length -
  7367. ssl->buffers.inputBuffer.idx;
  7368. if (!forcedFree && usedLength > STATIC_BUFFER_LEN)
  7369. return;
  7370. WOLFSSL_MSG("Shrinking input buffer\n");
  7371. if (!forcedFree && usedLength > 0)
  7372. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  7373. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  7374. usedLength);
  7375. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  7376. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  7377. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  7378. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  7379. ssl->buffers.inputBuffer.dynamicFlag = 0;
  7380. ssl->buffers.inputBuffer.offset = 0;
  7381. ssl->buffers.inputBuffer.idx = 0;
  7382. ssl->buffers.inputBuffer.length = usedLength;
  7383. }
  7384. int SendBuffered(WOLFSSL* ssl)
  7385. {
  7386. if (ssl->CBIOSend == NULL) {
  7387. WOLFSSL_MSG("Your IO Send callback is null, please set");
  7388. return SOCKET_ERROR_E;
  7389. }
  7390. #ifdef WOLFSSL_DEBUG_TLS
  7391. if (ssl->buffers.outputBuffer.idx == 0) {
  7392. WOLFSSL_MSG("Data to send");
  7393. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  7394. ssl->buffers.outputBuffer.length);
  7395. }
  7396. #endif
  7397. while (ssl->buffers.outputBuffer.length > 0) {
  7398. int sent = ssl->CBIOSend(ssl,
  7399. (char*)ssl->buffers.outputBuffer.buffer +
  7400. ssl->buffers.outputBuffer.idx,
  7401. (int)ssl->buffers.outputBuffer.length,
  7402. ssl->IOCB_WriteCtx);
  7403. if (sent < 0) {
  7404. switch (sent) {
  7405. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  7406. return WANT_WRITE;
  7407. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  7408. ssl->options.connReset = 1;
  7409. break;
  7410. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  7411. /* see if we got our timeout */
  7412. #ifdef WOLFSSL_CALLBACKS
  7413. if (ssl->toInfoOn) {
  7414. struct itimerval timeout;
  7415. getitimer(ITIMER_REAL, &timeout);
  7416. if (timeout.it_value.tv_sec == 0 &&
  7417. timeout.it_value.tv_usec == 0) {
  7418. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  7419. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  7420. ssl->timeoutInfo.timeoutName[
  7421. MAX_TIMEOUT_NAME_SZ] = '\0';
  7422. WOLFSSL_MSG("Got our timeout");
  7423. return WANT_WRITE;
  7424. }
  7425. }
  7426. #endif
  7427. continue;
  7428. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  7429. ssl->options.connReset = 1; /* treat same as reset */
  7430. break;
  7431. default:
  7432. return SOCKET_ERROR_E;
  7433. }
  7434. return SOCKET_ERROR_E;
  7435. }
  7436. if (sent > (int)ssl->buffers.outputBuffer.length) {
  7437. WOLFSSL_MSG("SendBuffered() out of bounds read");
  7438. return SEND_OOB_READ_E;
  7439. }
  7440. ssl->buffers.outputBuffer.idx += sent;
  7441. ssl->buffers.outputBuffer.length -= sent;
  7442. }
  7443. ssl->buffers.outputBuffer.idx = 0;
  7444. if (ssl->buffers.outputBuffer.dynamicFlag)
  7445. ShrinkOutputBuffer(ssl);
  7446. return 0;
  7447. }
  7448. /* Grow the output buffer */
  7449. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  7450. {
  7451. byte* tmp;
  7452. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7453. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  7454. RECORD_HEADER_SZ;
  7455. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7456. #else
  7457. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7458. #endif
  7459. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7460. /* the encrypted data will be offset from the front of the buffer by
  7461. the header, if the user wants encrypted alignment they need
  7462. to define their alignment requirement */
  7463. if (align) {
  7464. while (align < hdrSz)
  7465. align *= 2;
  7466. }
  7467. #endif
  7468. tmp = (byte*)XMALLOC(size + ssl->buffers.outputBuffer.length + align,
  7469. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  7470. WOLFSSL_MSG("growing output buffer\n");
  7471. if (tmp == NULL)
  7472. return MEMORY_E;
  7473. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7474. if (align)
  7475. tmp += align - hdrSz;
  7476. #endif
  7477. #ifdef WOLFSSL_STATIC_MEMORY
  7478. /* can be from IO memory pool which does not need copy if same buffer */
  7479. if (ssl->buffers.outputBuffer.length &&
  7480. tmp == ssl->buffers.outputBuffer.buffer) {
  7481. ssl->buffers.outputBuffer.bufferSize =
  7482. size + ssl->buffers.outputBuffer.length;
  7483. return 0;
  7484. }
  7485. #endif
  7486. if (ssl->buffers.outputBuffer.length)
  7487. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  7488. ssl->buffers.outputBuffer.length);
  7489. if (ssl->buffers.outputBuffer.dynamicFlag)
  7490. XFREE(ssl->buffers.outputBuffer.buffer -
  7491. ssl->buffers.outputBuffer.offset, ssl->heap,
  7492. DYNAMIC_TYPE_OUT_BUFFER);
  7493. ssl->buffers.outputBuffer.dynamicFlag = 1;
  7494. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7495. if (align)
  7496. ssl->buffers.outputBuffer.offset = align - hdrSz;
  7497. else
  7498. #endif
  7499. ssl->buffers.outputBuffer.offset = 0;
  7500. ssl->buffers.outputBuffer.buffer = tmp;
  7501. ssl->buffers.outputBuffer.bufferSize = size +
  7502. ssl->buffers.outputBuffer.length;
  7503. return 0;
  7504. }
  7505. /* Grow the input buffer, should only be to read cert or big app data */
  7506. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  7507. {
  7508. byte* tmp;
  7509. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7510. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  7511. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  7512. #else
  7513. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7514. #endif
  7515. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7516. /* the encrypted data will be offset from the front of the buffer by
  7517. the dtls record header, if the user wants encrypted alignment they need
  7518. to define their alignment requirement. in tls we read record header
  7519. to get size of record and put actual data back at front, so don't need */
  7520. if (align) {
  7521. while (align < hdrSz)
  7522. align *= 2;
  7523. }
  7524. #endif
  7525. if (usedLength < 0 || size < 0) {
  7526. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  7527. return BAD_FUNC_ARG;
  7528. }
  7529. tmp = (byte*)XMALLOC(size + usedLength + align,
  7530. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  7531. WOLFSSL_MSG("growing input buffer\n");
  7532. if (tmp == NULL)
  7533. return MEMORY_E;
  7534. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7535. if (align)
  7536. tmp += align - hdrSz;
  7537. #endif
  7538. #ifdef WOLFSSL_STATIC_MEMORY
  7539. /* can be from IO memory pool which does not need copy if same buffer */
  7540. if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
  7541. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  7542. ssl->buffers.inputBuffer.idx = 0;
  7543. ssl->buffers.inputBuffer.length = usedLength;
  7544. return 0;
  7545. }
  7546. #endif
  7547. if (usedLength)
  7548. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  7549. ssl->buffers.inputBuffer.idx, usedLength);
  7550. if (ssl->buffers.inputBuffer.dynamicFlag)
  7551. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  7552. ssl->heap,DYNAMIC_TYPE_IN_BUFFER);
  7553. ssl->buffers.inputBuffer.dynamicFlag = 1;
  7554. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7555. if (align)
  7556. ssl->buffers.inputBuffer.offset = align - hdrSz;
  7557. else
  7558. #endif
  7559. ssl->buffers.inputBuffer.offset = 0;
  7560. ssl->buffers.inputBuffer.buffer = tmp;
  7561. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  7562. ssl->buffers.inputBuffer.idx = 0;
  7563. ssl->buffers.inputBuffer.length = usedLength;
  7564. return 0;
  7565. }
  7566. /* Check available size into output buffer, make room if needed.
  7567. * This function needs to be called before anything gets put
  7568. * into the output buffers since it flushes pending data if it
  7569. * predicts that the msg will exceed MTU. */
  7570. int CheckAvailableSize(WOLFSSL *ssl, int size)
  7571. {
  7572. if (size < 0) {
  7573. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  7574. return BAD_FUNC_ARG;
  7575. }
  7576. #ifdef WOLFSSL_DTLS
  7577. if (ssl->options.dtls) {
  7578. if (size + ssl->buffers.outputBuffer.length -
  7579. ssl->buffers.outputBuffer.idx >
  7580. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  7581. ssl->dtlsMtuSz
  7582. #else
  7583. ssl->dtls_expected_rx
  7584. #endif
  7585. ) {
  7586. int ret;
  7587. WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
  7588. "to make room for new message");
  7589. if ((ret = SendBuffered(ssl)) != 0) {
  7590. return ret;
  7591. }
  7592. }
  7593. if (size > (int)
  7594. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  7595. ssl->dtlsMtuSz
  7596. #else
  7597. ssl->dtls_expected_rx
  7598. #endif
  7599. ) {
  7600. WOLFSSL_MSG("CheckAvailableSize() called with size greater than MTU.");
  7601. return DTLS_SIZE_ERROR;
  7602. }
  7603. }
  7604. #endif
  7605. if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
  7606. < (word32)size) {
  7607. if (GrowOutputBuffer(ssl, size) < 0)
  7608. return MEMORY_E;
  7609. }
  7610. return 0;
  7611. }
  7612. /* do all verify and sanity checks on record header */
  7613. static int GetRecordHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  7614. RecordLayerHeader* rh, word16 *size)
  7615. {
  7616. if (!ssl->options.dtls) {
  7617. #ifdef HAVE_FUZZER
  7618. if (ssl->fuzzerCb)
  7619. ssl->fuzzerCb(ssl, input + *inOutIdx, RECORD_HEADER_SZ, FUZZ_HEAD,
  7620. ssl->fuzzerCtx);
  7621. #endif
  7622. XMEMCPY(rh, input + *inOutIdx, RECORD_HEADER_SZ);
  7623. *inOutIdx += RECORD_HEADER_SZ;
  7624. ato16(rh->length, size);
  7625. }
  7626. else {
  7627. #ifdef WOLFSSL_DTLS
  7628. #ifdef HAVE_FUZZER
  7629. if (ssl->fuzzerCb)
  7630. ssl->fuzzerCb(ssl, input + *inOutIdx, DTLS_RECORD_HEADER_SZ,
  7631. FUZZ_HEAD, ssl->fuzzerCtx);
  7632. #endif
  7633. /* type and version in same sport */
  7634. XMEMCPY(rh, input + *inOutIdx, ENUM_LEN + VERSION_SZ);
  7635. *inOutIdx += ENUM_LEN + VERSION_SZ;
  7636. ato16(input + *inOutIdx, &ssl->keys.curEpoch);
  7637. *inOutIdx += OPAQUE16_LEN;
  7638. if (ssl->options.haveMcast) {
  7639. #ifdef WOLFSSL_MULTICAST
  7640. ssl->keys.curPeerId = input[*inOutIdx];
  7641. ssl->keys.curSeq_hi = input[*inOutIdx+1];
  7642. #endif
  7643. }
  7644. else
  7645. ato16(input + *inOutIdx, &ssl->keys.curSeq_hi);
  7646. *inOutIdx += OPAQUE16_LEN;
  7647. ato32(input + *inOutIdx, &ssl->keys.curSeq_lo);
  7648. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  7649. ato16(input + *inOutIdx, size);
  7650. *inOutIdx += LENGTH_SZ;
  7651. #endif
  7652. }
  7653. #ifdef WOLFSSL_DTLS
  7654. if (IsDtlsNotSctpMode(ssl)) {
  7655. if (!DtlsCheckWindow(ssl) ||
  7656. (rh->type == application_data && ssl->keys.curEpoch == 0) ||
  7657. (rh->type == alert && ssl->options.handShakeDone &&
  7658. ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
  7659. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  7660. return SEQUENCE_ERROR;
  7661. }
  7662. }
  7663. #endif
  7664. /* catch version mismatch */
  7665. #ifndef WOLFSSL_TLS13
  7666. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  7667. #else
  7668. if (rh->pvMajor != ssl->version.major ||
  7669. (rh->pvMinor != ssl->version.minor &&
  7670. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_2_MINOR)
  7671. ))
  7672. #endif
  7673. {
  7674. if (ssl->options.side == WOLFSSL_SERVER_END &&
  7675. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  7676. WOLFSSL_MSG("Client attempting to connect with different version");
  7677. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  7678. ssl->options.downgrade &&
  7679. ssl->options.connectState < FIRST_REPLY_DONE)
  7680. WOLFSSL_MSG("Server attempting to accept with different version");
  7681. else if (ssl->options.dtls && rh->type == handshake)
  7682. /* Check the DTLS handshake message RH version later. */
  7683. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  7684. else {
  7685. WOLFSSL_MSG("SSL version error");
  7686. /* send alert per RFC5246 Appendix E. Backward Compatibility */
  7687. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  7688. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  7689. SendAlert(ssl, alert_fatal, wc_protocol_version);
  7690. #else
  7691. SendAlert(ssl, alert_fatal, protocol_version);
  7692. #endif
  7693. }
  7694. return VERSION_ERROR; /* only use requested version */
  7695. }
  7696. }
  7697. /* record layer length check */
  7698. #ifdef HAVE_MAX_FRAGMENT
  7699. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  7700. SendAlert(ssl, alert_fatal, record_overflow);
  7701. return LENGTH_ERROR;
  7702. }
  7703. #else
  7704. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA))
  7705. return LENGTH_ERROR;
  7706. #endif
  7707. if (*size == 0 && rh->type != application_data) {
  7708. WOLFSSL_MSG("0 length, non-app data record.");
  7709. return LENGTH_ERROR;
  7710. }
  7711. /* verify record type here as well */
  7712. switch (rh->type) {
  7713. case handshake:
  7714. case change_cipher_spec:
  7715. case application_data:
  7716. case alert:
  7717. break;
  7718. case no_type:
  7719. default:
  7720. WOLFSSL_MSG("Unknown Record Type");
  7721. return UNKNOWN_RECORD_TYPE;
  7722. }
  7723. /* haven't decrypted this record yet */
  7724. ssl->keys.decryptedCur = 0;
  7725. return 0;
  7726. }
  7727. #ifndef WOLFSSL_NO_TLS12
  7728. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  7729. byte *type, word32 *size, word32 totalSz)
  7730. {
  7731. const byte *ptr = input + *inOutIdx;
  7732. (void)ssl;
  7733. *inOutIdx += HANDSHAKE_HEADER_SZ;
  7734. if (*inOutIdx > totalSz)
  7735. return BUFFER_E;
  7736. *type = ptr[0];
  7737. c24to32(&ptr[1], size);
  7738. return 0;
  7739. }
  7740. #endif
  7741. #ifdef WOLFSSL_DTLS
  7742. static int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  7743. word32* inOutIdx, byte *type, word32 *size,
  7744. word32 *fragOffset, word32 *fragSz,
  7745. word32 totalSz)
  7746. {
  7747. word32 idx = *inOutIdx;
  7748. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  7749. if (*inOutIdx > totalSz) {
  7750. WOLFSSL_ERROR(BUFFER_E);
  7751. return BUFFER_E;
  7752. }
  7753. *type = input[idx++];
  7754. c24to32(input + idx, size);
  7755. idx += OPAQUE24_LEN;
  7756. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  7757. idx += DTLS_HANDSHAKE_SEQ_SZ;
  7758. c24to32(input + idx, fragOffset);
  7759. idx += DTLS_HANDSHAKE_FRAG_SZ;
  7760. c24to32(input + idx, fragSz);
  7761. if (ssl->curRL.pvMajor != ssl->version.major ||
  7762. ssl->curRL.pvMinor != ssl->version.minor) {
  7763. if (*type != client_hello && *type != hello_verify_request) {
  7764. WOLFSSL_ERROR(VERSION_ERROR);
  7765. return VERSION_ERROR;
  7766. }
  7767. else {
  7768. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  7769. }
  7770. }
  7771. return 0;
  7772. }
  7773. #endif
  7774. #if !defined(NO_OLD_TLS) || \
  7775. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  7776. /* fill with MD5 pad size since biggest required */
  7777. static const byte PAD1[PAD_MD5] =
  7778. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7779. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7780. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7781. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7782. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7783. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  7784. };
  7785. static const byte PAD2[PAD_MD5] =
  7786. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7787. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7788. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7789. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7790. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7791. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  7792. };
  7793. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  7794. #ifndef NO_OLD_TLS
  7795. /* calculate MD5 hash for finished */
  7796. #ifdef WOLFSSL_TI_HASH
  7797. #include <wolfssl/wolfcrypt/hash.h>
  7798. #endif
  7799. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  7800. {
  7801. int ret;
  7802. byte md5_result[WC_MD5_DIGEST_SIZE];
  7803. #ifdef WOLFSSL_SMALL_STACK
  7804. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7805. if (md5 == NULL)
  7806. return MEMORY_E;
  7807. #else
  7808. wc_Md5 md5[1];
  7809. #endif
  7810. /* make md5 inner */
  7811. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  7812. if (ret == 0)
  7813. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  7814. if (ret == 0)
  7815. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  7816. if (ret == 0)
  7817. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  7818. if (ret == 0)
  7819. ret = wc_Md5Final(md5, md5_result);
  7820. /* make md5 outer */
  7821. if (ret == 0) {
  7822. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  7823. if (ret == 0) {
  7824. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  7825. if (ret == 0)
  7826. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  7827. if (ret == 0)
  7828. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  7829. if (ret == 0)
  7830. ret = wc_Md5Final(md5, hashes->md5);
  7831. wc_Md5Free(md5);
  7832. }
  7833. }
  7834. #ifdef WOLFSSL_SMALL_STACK
  7835. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7836. #endif
  7837. return ret;
  7838. }
  7839. /* calculate SHA hash for finished */
  7840. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  7841. {
  7842. int ret;
  7843. byte sha_result[WC_SHA_DIGEST_SIZE];
  7844. #ifdef WOLFSSL_SMALL_STACK
  7845. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7846. if (sha == NULL)
  7847. return MEMORY_E;
  7848. #else
  7849. wc_Sha sha[1];
  7850. #endif
  7851. /* make sha inner */
  7852. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  7853. if (ret == 0)
  7854. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  7855. if (ret == 0)
  7856. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  7857. if (ret == 0)
  7858. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  7859. if (ret == 0)
  7860. ret = wc_ShaFinal(sha, sha_result);
  7861. /* make sha outer */
  7862. if (ret == 0) {
  7863. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  7864. if (ret == 0) {
  7865. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  7866. if (ret == 0)
  7867. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  7868. if (ret == 0)
  7869. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  7870. if (ret == 0)
  7871. ret = wc_ShaFinal(sha, hashes->sha);
  7872. wc_ShaFree(sha);
  7873. }
  7874. }
  7875. #ifdef WOLFSSL_SMALL_STACK
  7876. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7877. #endif
  7878. return ret;
  7879. }
  7880. #endif
  7881. #ifndef WOLFSSL_NO_TLS12
  7882. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  7883. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  7884. {
  7885. int ret = 0;
  7886. if (ssl == NULL)
  7887. return BAD_FUNC_ARG;
  7888. #ifndef NO_TLS
  7889. if (ssl->options.tls) {
  7890. ret = BuildTlsFinished(ssl, hashes, sender);
  7891. }
  7892. #endif
  7893. #ifndef NO_OLD_TLS
  7894. if (!ssl->options.tls) {
  7895. ret = BuildMD5(ssl, hashes, sender);
  7896. if (ret == 0) {
  7897. ret = BuildSHA(ssl, hashes, sender);
  7898. }
  7899. }
  7900. #endif
  7901. return ret;
  7902. }
  7903. #endif /* WOLFSSL_NO_TLS12 */
  7904. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  7905. /* cipher requirements */
  7906. enum {
  7907. REQUIRES_RSA,
  7908. REQUIRES_DHE,
  7909. REQUIRES_ECC,
  7910. REQUIRES_ECC_STATIC,
  7911. REQUIRES_PSK,
  7912. REQUIRES_NTRU,
  7913. REQUIRES_RSA_SIG,
  7914. REQUIRES_AEAD
  7915. };
  7916. /* Does this cipher suite (first, second) have the requirement
  7917. an ephemeral key exchange will still require the key for signing
  7918. the key exchange so ECHDE_RSA requires an rsa key thus rsa_kea */
  7919. static int CipherRequires(byte first, byte second, int requirement)
  7920. {
  7921. (void)requirement;
  7922. #ifndef WOLFSSL_NO_TLS12
  7923. #ifdef HAVE_CHACHA
  7924. if (first == CHACHA_BYTE) {
  7925. switch (second) {
  7926. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  7927. if (requirement == REQUIRES_RSA)
  7928. return 1;
  7929. break;
  7930. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  7931. if (requirement == REQUIRES_ECC)
  7932. return 1;
  7933. break;
  7934. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  7935. if (requirement == REQUIRES_RSA)
  7936. return 1;
  7937. if (requirement == REQUIRES_DHE)
  7938. return 1;
  7939. break;
  7940. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  7941. if (requirement == REQUIRES_RSA)
  7942. return 1;
  7943. break;
  7944. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  7945. if (requirement == REQUIRES_ECC)
  7946. return 1;
  7947. break;
  7948. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  7949. if (requirement == REQUIRES_RSA)
  7950. return 1;
  7951. if (requirement == REQUIRES_DHE)
  7952. return 1;
  7953. break;
  7954. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  7955. if (requirement == REQUIRES_PSK)
  7956. return 1;
  7957. break;
  7958. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  7959. if (requirement == REQUIRES_PSK)
  7960. return 1;
  7961. break;
  7962. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  7963. if (requirement == REQUIRES_PSK)
  7964. return 1;
  7965. if (requirement == REQUIRES_DHE)
  7966. return 1;
  7967. break;
  7968. }
  7969. if (requirement == REQUIRES_AEAD)
  7970. return 1;
  7971. }
  7972. #endif /* HAVE_CHACHA */
  7973. /* ECC extensions */
  7974. if (first == ECC_BYTE) {
  7975. switch (second) {
  7976. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7977. #ifndef NO_RSA
  7978. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  7979. if (requirement == REQUIRES_RSA)
  7980. return 1;
  7981. break;
  7982. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  7983. if (requirement == REQUIRES_ECC_STATIC)
  7984. return 1;
  7985. if (requirement == REQUIRES_RSA_SIG)
  7986. return 1;
  7987. break;
  7988. #ifndef NO_DES3
  7989. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  7990. if (requirement == REQUIRES_RSA)
  7991. return 1;
  7992. break;
  7993. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  7994. if (requirement == REQUIRES_ECC_STATIC)
  7995. return 1;
  7996. if (requirement == REQUIRES_RSA_SIG)
  7997. return 1;
  7998. break;
  7999. #endif /* !NO_DES3 */
  8000. #ifndef NO_RC4
  8001. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  8002. if (requirement == REQUIRES_RSA)
  8003. return 1;
  8004. break;
  8005. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  8006. if (requirement == REQUIRES_ECC_STATIC)
  8007. return 1;
  8008. if (requirement == REQUIRES_RSA_SIG)
  8009. return 1;
  8010. break;
  8011. #endif /* !NO_RC4 */
  8012. #endif /* NO_RSA */
  8013. #ifndef NO_DES3
  8014. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  8015. if (requirement == REQUIRES_ECC)
  8016. return 1;
  8017. break;
  8018. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  8019. if (requirement == REQUIRES_ECC_STATIC)
  8020. return 1;
  8021. break;
  8022. #endif /* !NO_DES3 */
  8023. #ifndef NO_RC4
  8024. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  8025. if (requirement == REQUIRES_ECC)
  8026. return 1;
  8027. break;
  8028. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  8029. if (requirement == REQUIRES_ECC_STATIC)
  8030. return 1;
  8031. break;
  8032. #endif /* !NO_RC4 */
  8033. #ifndef NO_RSA
  8034. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  8035. if (requirement == REQUIRES_RSA)
  8036. return 1;
  8037. break;
  8038. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  8039. if (requirement == REQUIRES_ECC_STATIC)
  8040. return 1;
  8041. if (requirement == REQUIRES_RSA_SIG)
  8042. return 1;
  8043. break;
  8044. #endif /* !NO_RSA */
  8045. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  8046. if (requirement == REQUIRES_ECC)
  8047. return 1;
  8048. break;
  8049. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  8050. if (requirement == REQUIRES_ECC_STATIC)
  8051. return 1;
  8052. break;
  8053. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  8054. if (requirement == REQUIRES_ECC)
  8055. return 1;
  8056. break;
  8057. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  8058. if (requirement == REQUIRES_ECC_STATIC)
  8059. return 1;
  8060. break;
  8061. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  8062. if (requirement == REQUIRES_ECC)
  8063. return 1;
  8064. if (requirement == REQUIRES_AEAD)
  8065. return 1;
  8066. break;
  8067. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  8068. if (requirement == REQUIRES_ECC)
  8069. return 1;
  8070. if (requirement == REQUIRES_AEAD)
  8071. return 1;
  8072. break;
  8073. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  8074. if (requirement == REQUIRES_ECC_STATIC)
  8075. return 1;
  8076. if (requirement == REQUIRES_AEAD)
  8077. return 1;
  8078. break;
  8079. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  8080. if (requirement == REQUIRES_ECC_STATIC)
  8081. return 1;
  8082. if (requirement == REQUIRES_AEAD)
  8083. return 1;
  8084. break;
  8085. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8086. #ifndef NO_RSA
  8087. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8088. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  8089. if (requirement == REQUIRES_RSA)
  8090. return 1;
  8091. if (requirement == REQUIRES_AEAD)
  8092. return 1;
  8093. break;
  8094. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  8095. if (requirement == REQUIRES_RSA)
  8096. return 1;
  8097. if (requirement == REQUIRES_AEAD)
  8098. return 1;
  8099. break;
  8100. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  8101. if (requirement == REQUIRES_ECC_STATIC)
  8102. return 1;
  8103. if (requirement == REQUIRES_RSA_SIG)
  8104. return 1;
  8105. if (requirement == REQUIRES_AEAD)
  8106. return 1;
  8107. break;
  8108. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  8109. if (requirement == REQUIRES_ECC_STATIC)
  8110. return 1;
  8111. if (requirement == REQUIRES_RSA_SIG)
  8112. return 1;
  8113. if (requirement == REQUIRES_AEAD)
  8114. return 1;
  8115. break;
  8116. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8117. #ifdef HAVE_AESCCM
  8118. case TLS_RSA_WITH_AES_128_CCM_8 :
  8119. case TLS_RSA_WITH_AES_256_CCM_8 :
  8120. if (requirement == REQUIRES_RSA)
  8121. return 1;
  8122. if (requirement == REQUIRES_RSA_SIG)
  8123. return 1;
  8124. if (requirement == REQUIRES_AEAD)
  8125. return 1;
  8126. break;
  8127. #endif /* HAVE_AESCCM */
  8128. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8129. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  8130. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  8131. if (requirement == REQUIRES_RSA)
  8132. return 1;
  8133. break;
  8134. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  8135. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  8136. if (requirement == REQUIRES_RSA_SIG)
  8137. return 1;
  8138. if (requirement == REQUIRES_ECC_STATIC)
  8139. return 1;
  8140. break;
  8141. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8142. #endif /* !NO_RSA */
  8143. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8144. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  8145. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  8146. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  8147. if (requirement == REQUIRES_ECC)
  8148. return 1;
  8149. if (requirement == REQUIRES_AEAD)
  8150. return 1;
  8151. break;
  8152. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  8153. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  8154. if (requirement == REQUIRES_ECC)
  8155. return 1;
  8156. break;
  8157. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  8158. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  8159. if (requirement == REQUIRES_ECC)
  8160. return 1;
  8161. if (requirement == REQUIRES_ECC_STATIC)
  8162. return 1;
  8163. break;
  8164. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8165. #ifndef NO_PSK
  8166. case TLS_PSK_WITH_AES_128_CCM:
  8167. case TLS_PSK_WITH_AES_256_CCM:
  8168. case TLS_PSK_WITH_AES_128_CCM_8:
  8169. case TLS_PSK_WITH_AES_256_CCM_8:
  8170. if (requirement == REQUIRES_PSK)
  8171. return 1;
  8172. if (requirement == REQUIRES_AEAD)
  8173. return 1;
  8174. break;
  8175. case TLS_DHE_PSK_WITH_AES_128_CCM:
  8176. case TLS_DHE_PSK_WITH_AES_256_CCM:
  8177. if (requirement == REQUIRES_PSK)
  8178. return 1;
  8179. if (requirement == REQUIRES_DHE)
  8180. return 1;
  8181. if (requirement == REQUIRES_AEAD)
  8182. return 1;
  8183. break;
  8184. #endif /* !NO_PSK */
  8185. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8186. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  8187. if (requirement == REQUIRES_ECC)
  8188. return 1;
  8189. break;
  8190. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  8191. if (requirement == REQUIRES_PSK)
  8192. return 1;
  8193. break;
  8194. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  8195. if (requirement == REQUIRES_PSK)
  8196. return 1;
  8197. break;
  8198. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8199. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  8200. case TLS_SHA256_SHA256:
  8201. break;
  8202. case TLS_SHA384_SHA384:
  8203. break;
  8204. #endif
  8205. default:
  8206. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  8207. return 0;
  8208. } /* switch */
  8209. } /* if */
  8210. #endif /* !WOLFSSL_NO_TLS12 */
  8211. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  8212. if (first == TLS13_BYTE) {
  8213. switch (second) {
  8214. #ifdef WOLFSSL_TLS13
  8215. case TLS_AES_128_GCM_SHA256:
  8216. case TLS_AES_256_GCM_SHA384:
  8217. case TLS_CHACHA20_POLY1305_SHA256:
  8218. case TLS_AES_128_CCM_SHA256:
  8219. case TLS_AES_128_CCM_8_SHA256:
  8220. break;
  8221. #endif
  8222. default:
  8223. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  8224. "TLS v1.3");
  8225. return 0;
  8226. }
  8227. }
  8228. #ifndef WOLFSSL_NO_TLS12
  8229. if (first != ECC_BYTE && first != CHACHA_BYTE &&
  8230. first != TLS13_BYTE) { /* normal suites */
  8231. switch (second) {
  8232. #ifndef NO_RSA
  8233. #ifndef NO_RC4
  8234. case SSL_RSA_WITH_RC4_128_SHA :
  8235. if (requirement == REQUIRES_RSA)
  8236. return 1;
  8237. break;
  8238. case SSL_RSA_WITH_RC4_128_MD5 :
  8239. if (requirement == REQUIRES_RSA)
  8240. return 1;
  8241. break;
  8242. #endif /* NO_RC4 */
  8243. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  8244. if (requirement == REQUIRES_RSA)
  8245. return 1;
  8246. break;
  8247. #ifdef HAVE_NTRU
  8248. case TLS_NTRU_RSA_WITH_RC4_128_SHA :
  8249. if (requirement == REQUIRES_NTRU)
  8250. return 1;
  8251. break;
  8252. #endif /* HAVE_NTRU */
  8253. case TLS_RSA_WITH_AES_128_CBC_SHA :
  8254. if (requirement == REQUIRES_RSA)
  8255. return 1;
  8256. break;
  8257. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  8258. if (requirement == REQUIRES_RSA)
  8259. return 1;
  8260. break;
  8261. #ifdef HAVE_NTRU
  8262. case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA :
  8263. if (requirement == REQUIRES_NTRU)
  8264. return 1;
  8265. break;
  8266. #endif /* HAVE_NTRU */
  8267. case TLS_RSA_WITH_AES_256_CBC_SHA :
  8268. if (requirement == REQUIRES_RSA)
  8269. return 1;
  8270. break;
  8271. #ifdef HAVE_NTRU
  8272. case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA :
  8273. if (requirement == REQUIRES_NTRU)
  8274. return 1;
  8275. break;
  8276. #endif /* HAVE_NTRU */
  8277. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  8278. if (requirement == REQUIRES_RSA)
  8279. return 1;
  8280. break;
  8281. case TLS_RSA_WITH_NULL_MD5 :
  8282. case TLS_RSA_WITH_NULL_SHA :
  8283. case TLS_RSA_WITH_NULL_SHA256 :
  8284. if (requirement == REQUIRES_RSA)
  8285. return 1;
  8286. break;
  8287. #ifdef HAVE_NTRU
  8288. case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA :
  8289. if (requirement == REQUIRES_NTRU)
  8290. return 1;
  8291. break;
  8292. #endif /* HAVE_NTRU */
  8293. #ifdef HAVE_IDEA
  8294. case SSL_RSA_WITH_IDEA_CBC_SHA :
  8295. if (requirement == REQUIRES_RSA)
  8296. return 1;
  8297. break;
  8298. #endif /* HAVE_IDEA */
  8299. #endif /* !NO_RSA */
  8300. #ifndef NO_PSK
  8301. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  8302. if (requirement == REQUIRES_PSK)
  8303. return 1;
  8304. if (requirement == REQUIRES_AEAD)
  8305. return 1;
  8306. break;
  8307. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  8308. if (requirement == REQUIRES_PSK)
  8309. return 1;
  8310. if (requirement == REQUIRES_AEAD)
  8311. return 1;
  8312. break;
  8313. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  8314. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  8315. case TLS_PSK_WITH_AES_128_CBC_SHA :
  8316. case TLS_PSK_WITH_AES_256_CBC_SHA :
  8317. case TLS_PSK_WITH_NULL_SHA384 :
  8318. case TLS_PSK_WITH_NULL_SHA256 :
  8319. case TLS_PSK_WITH_NULL_SHA :
  8320. if (requirement == REQUIRES_PSK)
  8321. return 1;
  8322. break;
  8323. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  8324. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  8325. if (requirement == REQUIRES_DHE)
  8326. return 1;
  8327. if (requirement == REQUIRES_PSK)
  8328. return 1;
  8329. if (requirement == REQUIRES_AEAD)
  8330. return 1;
  8331. break;
  8332. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  8333. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  8334. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  8335. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  8336. if (requirement == REQUIRES_DHE)
  8337. return 1;
  8338. if (requirement == REQUIRES_PSK)
  8339. return 1;
  8340. break;
  8341. #endif /* NO_PSK */
  8342. #ifndef NO_RSA
  8343. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  8344. if (requirement == REQUIRES_RSA)
  8345. return 1;
  8346. if (requirement == REQUIRES_DHE)
  8347. return 1;
  8348. break;
  8349. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  8350. if (requirement == REQUIRES_RSA)
  8351. return 1;
  8352. if (requirement == REQUIRES_DHE)
  8353. return 1;
  8354. break;
  8355. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  8356. if (requirement == REQUIRES_RSA)
  8357. return 1;
  8358. if (requirement == REQUIRES_DHE)
  8359. return 1;
  8360. break;
  8361. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  8362. if (requirement == REQUIRES_RSA)
  8363. return 1;
  8364. if (requirement == REQUIRES_DHE)
  8365. return 1;
  8366. break;
  8367. #ifndef NO_HC128
  8368. case TLS_RSA_WITH_HC_128_MD5 :
  8369. if (requirement == REQUIRES_RSA)
  8370. return 1;
  8371. break;
  8372. case TLS_RSA_WITH_HC_128_SHA :
  8373. if (requirement == REQUIRES_RSA)
  8374. return 1;
  8375. break;
  8376. #endif /* NO_HC128 */
  8377. #ifndef NO_RABBIT
  8378. case TLS_RSA_WITH_RABBIT_SHA :
  8379. if (requirement == REQUIRES_RSA)
  8380. return 1;
  8381. break;
  8382. #endif /* !NO_RABBIT */
  8383. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  8384. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  8385. if (requirement == REQUIRES_RSA)
  8386. return 1;
  8387. if (requirement == REQUIRES_AEAD)
  8388. return 1;
  8389. break;
  8390. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  8391. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  8392. if (requirement == REQUIRES_RSA)
  8393. return 1;
  8394. if (requirement == REQUIRES_DHE)
  8395. return 1;
  8396. if (requirement == REQUIRES_AEAD)
  8397. return 1;
  8398. break;
  8399. #ifdef HAVE_CAMELLIA
  8400. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  8401. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  8402. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  8403. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  8404. if (requirement == REQUIRES_RSA)
  8405. return 1;
  8406. break;
  8407. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  8408. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  8409. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  8410. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  8411. if (requirement == REQUIRES_RSA)
  8412. return 1;
  8413. if (requirement == REQUIRES_RSA_SIG)
  8414. return 1;
  8415. if (requirement == REQUIRES_DHE)
  8416. return 1;
  8417. break;
  8418. #endif /* HAVE_CAMELLIA */
  8419. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  8420. if (requirement == REQUIRES_RSA)
  8421. return 1;
  8422. if (requirement == REQUIRES_RSA_SIG)
  8423. return 1;
  8424. if (requirement == REQUIRES_DHE)
  8425. return 1;
  8426. break;
  8427. #endif
  8428. #ifdef HAVE_ANON
  8429. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  8430. if (requirement == REQUIRES_DHE)
  8431. return 1;
  8432. break;
  8433. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  8434. if (requirement == REQUIRES_DHE)
  8435. return 1;
  8436. if (requirement == REQUIRES_AEAD)
  8437. return 1;
  8438. break;
  8439. #endif
  8440. #ifdef WOLFSSL_MULTICAST
  8441. case WDM_WITH_NULL_SHA256 :
  8442. break;
  8443. #endif
  8444. default:
  8445. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  8446. return 0;
  8447. } /* switch */
  8448. } /* if ECC / Normal suites else */
  8449. #endif /* !WOLFSSL_NO_TLS12 */
  8450. return 0;
  8451. }
  8452. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  8453. #ifndef NO_CERTS
  8454. /* Match names with wildcards, each wildcard can represent a single name
  8455. component or fragment but not multiple names, i.e.,
  8456. *.z.com matches y.z.com but not x.y.z.com
  8457. return 1 on success */
  8458. int MatchDomainName(const char* pattern, int len, const char* str)
  8459. {
  8460. int ret = 0;
  8461. char p, s;
  8462. if (pattern == NULL || str == NULL || len <= 0)
  8463. return 0;
  8464. while (len > 0) {
  8465. p = (char)XTOLOWER((unsigned char)*pattern++);
  8466. if (p == '\0')
  8467. break;
  8468. if (p == '*') {
  8469. while (--len > 0 &&
  8470. (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') {
  8471. }
  8472. if (len == 0)
  8473. p = '\0';
  8474. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  8475. if (s == p)
  8476. break;
  8477. if (s == '.')
  8478. return 0;
  8479. str++;
  8480. }
  8481. }
  8482. else {
  8483. if (p != (char)XTOLOWER((unsigned char) *str))
  8484. return 0;
  8485. }
  8486. if (len > 0) {
  8487. str++;
  8488. len--;
  8489. }
  8490. }
  8491. if (*str == '\0' && len == 0) {
  8492. ret = 1; /* success */
  8493. }
  8494. return ret;
  8495. }
  8496. /* Check that alternative names, if they exists, match the domain.
  8497. * Fail if there are wild patterns and they didn't match.
  8498. * Check the common name if no alternative names matched.
  8499. *
  8500. * dCert Decoded cert to get the alternative names from.
  8501. * domain Domain name to compare against.
  8502. * checkCN Whether to check the common name.
  8503. * returns 1 : match was found.
  8504. * 0 : no match found.
  8505. * -1 : No matches and wild pattern match failed.
  8506. */
  8507. int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
  8508. {
  8509. int match = 0;
  8510. DNS_entry* altName = NULL;
  8511. char *buf;
  8512. word32 len;
  8513. WOLFSSL_MSG("Checking AltNames");
  8514. if (dCert)
  8515. altName = dCert->altNames;
  8516. if (checkCN != NULL) {
  8517. *checkCN = (altName == NULL) ? 1 : 0;
  8518. }
  8519. while (altName) {
  8520. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  8521. char name[WOLFSSL_MAX_IPSTR] = {0};
  8522. #endif
  8523. WOLFSSL_MSG("\tindividual AltName check");
  8524. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  8525. /* check if alt name is stored as IP addr octet */
  8526. if (altName->type == ASN_IP_TYPE) {
  8527. char tmp[4];
  8528. int i;
  8529. word32 idx = 0;
  8530. for (i = 0; (idx < WOLFSSL_MAX_IPSTR) && (i < altName->len); i++) {
  8531. XMEMSET(tmp, 0, sizeof(tmp));
  8532. XSNPRINTF(tmp, sizeof(tmp), (altName->len <= 4) ? "%u" : "%02X",
  8533. altName->name[i]);
  8534. idx += (word32)XSTRLEN(tmp);
  8535. XSTRNCAT(name, tmp, (altName->len <= 4) ? 3 : 2);
  8536. if ((idx < WOLFSSL_MAX_IPSTR ) && ((i + 1) < altName->len)) {
  8537. name[idx++] = (altName->len <= 4) ? '.' : ':';
  8538. }
  8539. }
  8540. if (idx >= WOLFSSL_MAX_IPSTR) {
  8541. idx = WOLFSSL_MAX_IPSTR -1;
  8542. }
  8543. name[idx] = '\0';
  8544. buf = name;
  8545. len = (word32)XSTRLEN(name);
  8546. }
  8547. else
  8548. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  8549. {
  8550. buf = altName->name;
  8551. len = altName->len;
  8552. }
  8553. if (MatchDomainName(buf, len, domain)) {
  8554. match = 1;
  8555. if (checkCN != NULL) {
  8556. *checkCN = 0;
  8557. }
  8558. WOLFSSL_MSG("\tmatch found");
  8559. break;
  8560. }
  8561. /* No matches and wild pattern match failed. */
  8562. else if (buf && (len >=1) && (buf[0] == '*')) {
  8563. match = -1;
  8564. WOLFSSL_MSG("\twildcard match failed");
  8565. }
  8566. altName = altName->next;
  8567. }
  8568. return match;
  8569. }
  8570. /* Check the domain name matches the subject alternative name or the subject
  8571. * name.
  8572. *
  8573. * dcert Decoded certificate.
  8574. * domainName The domain name.
  8575. * domainNameLen The length of the domain name.
  8576. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  8577. */
  8578. int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
  8579. {
  8580. int checkCN;
  8581. int ret = DOMAIN_NAME_MISMATCH;
  8582. /* Assume name is NUL terminated. */
  8583. (void)domainNameLen;
  8584. if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
  8585. WOLFSSL_MSG("DomainName match on alt names failed");
  8586. }
  8587. else {
  8588. ret = 0;
  8589. }
  8590. if (checkCN == 1) {
  8591. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  8592. domainName) == 1) {
  8593. ret = 0;
  8594. }
  8595. else {
  8596. WOLFSSL_MSG("DomainName match on common name failed");
  8597. }
  8598. }
  8599. return ret;
  8600. }
  8601. int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
  8602. {
  8603. WOLFSSL_MSG("Checking IPAddr");
  8604. return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
  8605. }
  8606. #ifdef SESSION_CERTS
  8607. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  8608. byte* certBuf, word32 certSz)
  8609. {
  8610. if (chain->count < MAX_CHAIN_DEPTH &&
  8611. certSz < MAX_X509_SIZE) {
  8612. chain->certs[chain->count].length = certSz;
  8613. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  8614. chain->count++;
  8615. }
  8616. else {
  8617. WOLFSSL_MSG("Couldn't store chain cert for session");
  8618. }
  8619. }
  8620. #endif
  8621. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  8622. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8623. /* Copy parts X509 needs from Decoded cert, 0 on success */
  8624. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  8625. * altNames pointers could be free'd by second x509 still active by first */
  8626. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  8627. {
  8628. int ret = 0;
  8629. if (x509 == NULL || dCert == NULL ||
  8630. dCert->subjectCNLen < 0)
  8631. return BAD_FUNC_ARG;
  8632. if (x509->issuer.name == NULL || x509->subject.name == NULL) {
  8633. WOLFSSL_MSG("Either init was not called on X509 or programming error");
  8634. return BAD_FUNC_ARG;
  8635. }
  8636. x509->version = dCert->version + 1;
  8637. XSTRNCPY(x509->issuer.name, dCert->issuer, ASN_NAME_MAX);
  8638. x509->issuer.name[ASN_NAME_MAX - 1] = '\0';
  8639. x509->issuer.sz = (int)XSTRLEN(x509->issuer.name) + 1;
  8640. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8641. if (dCert->issuerName != NULL) {
  8642. wolfSSL_X509_set_issuer_name(x509,
  8643. (WOLFSSL_X509_NAME*)dCert->issuerName);
  8644. x509->issuer.x509 = x509;
  8645. }
  8646. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8647. XSTRNCPY(x509->subject.name, dCert->subject, ASN_NAME_MAX);
  8648. x509->subject.name[ASN_NAME_MAX - 1] = '\0';
  8649. x509->subject.sz = (int)XSTRLEN(x509->subject.name) + 1;
  8650. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8651. if (dCert->subjectName != NULL) {
  8652. wolfSSL_X509_set_subject_name(x509,
  8653. (WOLFSSL_X509_NAME*)dCert->subjectName);
  8654. x509->subject.x509 = x509;
  8655. }
  8656. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8657. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  8658. x509->subject.rawLen = min(dCert->subjectRawLen, sizeof(x509->subject.raw));
  8659. XMEMCPY(x509->subject.raw, dCert->subjectRaw, x509->subject.rawLen);
  8660. #ifdef WOLFSSL_CERT_EXT
  8661. x509->issuer.rawLen = min(dCert->issuerRawLen, sizeof(x509->issuer.raw));
  8662. XMEMCPY(x509->issuer.raw, dCert->issuerRaw, x509->issuer.rawLen);
  8663. #endif
  8664. #endif
  8665. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  8666. x509->serialSz = dCert->serialSz;
  8667. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  8668. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  8669. x509->subjectCN[dCert->subjectCNLen] = '\0';
  8670. }
  8671. else
  8672. x509->subjectCN[0] = '\0';
  8673. #ifdef WOLFSSL_CERT_REQ
  8674. x509->isCSR = dCert->isCSR;
  8675. /* CSR attributes */
  8676. if (dCert->cPwd) {
  8677. if (dCert->cPwdLen < CTC_NAME_SIZE) {
  8678. XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
  8679. x509->challengePw[dCert->cPwdLen] = '\0';
  8680. #ifdef OPENSSL_ALL
  8681. if (x509->challengePwAttr) {
  8682. wolfSSL_X509_ATTRIBUTE_free(x509->challengePwAttr);
  8683. }
  8684. x509->challengePwAttr = wolfSSL_X509_ATTRIBUTE_new();
  8685. if (x509->challengePwAttr) {
  8686. x509->challengePwAttr->value->value.asn1_string =
  8687. wolfSSL_ASN1_STRING_new();
  8688. if (wolfSSL_ASN1_STRING_set(
  8689. x509->challengePwAttr->value->value.asn1_string,
  8690. dCert->cPwd, dCert->cPwdLen) != WOLFSSL_SUCCESS) {
  8691. ret = MEMORY_E;
  8692. }
  8693. x509->challengePwAttr->value->type = V_ASN1_PRINTABLESTRING;
  8694. }
  8695. else {
  8696. ret = MEMORY_E;
  8697. }
  8698. #endif
  8699. }
  8700. else {
  8701. WOLFSSL_MSG("Challenge password too long");
  8702. ret = MEMORY_E;
  8703. }
  8704. }
  8705. #endif
  8706. #ifdef WOLFSSL_SEP
  8707. {
  8708. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  8709. if (minSz > 0) {
  8710. x509->deviceTypeSz = minSz;
  8711. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  8712. }
  8713. else
  8714. x509->deviceTypeSz = 0;
  8715. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  8716. if (minSz > 0) {
  8717. x509->hwTypeSz = minSz;
  8718. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  8719. }
  8720. else
  8721. x509->hwTypeSz = 0;
  8722. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  8723. if (minSz > 0) {
  8724. x509->hwSerialNumSz = minSz;
  8725. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  8726. }
  8727. else
  8728. x509->hwSerialNumSz = 0;
  8729. }
  8730. #endif /* WOLFSSL_SEP */
  8731. {
  8732. int minSz;
  8733. if (dCert->beforeDateLen > 0) {
  8734. minSz = min(dCert->beforeDate[1], MAX_DATE_SZ);
  8735. x509->notBefore.type = dCert->beforeDate[0];
  8736. x509->notBefore.length = minSz;
  8737. XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
  8738. }
  8739. else
  8740. x509->notBefore.length = 0;
  8741. if (dCert->afterDateLen > 0) {
  8742. minSz = min(dCert->afterDate[1], MAX_DATE_SZ);
  8743. x509->notAfter.type = dCert->afterDate[0];
  8744. x509->notAfter.length = minSz;
  8745. XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
  8746. }
  8747. else
  8748. x509->notAfter.length = 0;
  8749. }
  8750. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  8751. x509->pubKey.buffer = (byte*)XMALLOC(
  8752. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  8753. if (x509->pubKey.buffer != NULL) {
  8754. x509->pubKeyOID = dCert->keyOID;
  8755. x509->pubKey.length = dCert->pubKeySize;
  8756. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  8757. }
  8758. else
  8759. ret = MEMORY_E;
  8760. #if defined(OPENSSL_ALL)
  8761. if (ret == 0) {
  8762. x509->key.pubKeyOID = dCert->keyOID;
  8763. if (!x509->key.algor) {
  8764. x509->key.algor = wolfSSL_X509_ALGOR_new();
  8765. } else {
  8766. wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
  8767. }
  8768. if (!x509->key.algor) {
  8769. ret = MEMORY_E;
  8770. } else {
  8771. if (!(x509->key.algor->algorithm =
  8772. wolfSSL_OBJ_nid2obj(dCert->keyOID))) {
  8773. ret = PUBLIC_KEY_E;
  8774. }
  8775. }
  8776. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  8777. if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
  8778. &dCert->publicKey,
  8779. dCert->pubKeySize))) {
  8780. ret = PUBLIC_KEY_E;
  8781. }
  8782. }
  8783. #endif
  8784. }
  8785. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  8786. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  8787. x509->sig.buffer = (byte*)XMALLOC(
  8788. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  8789. if (x509->sig.buffer == NULL) {
  8790. ret = MEMORY_E;
  8791. }
  8792. else {
  8793. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  8794. x509->sig.length = dCert->sigLength;
  8795. x509->sigOID = dCert->signatureOID;
  8796. }
  8797. #if defined(OPENSSL_ALL)
  8798. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  8799. if (!(x509->algor.algorithm =
  8800. wolfSSL_OBJ_nid2obj(dCert->signatureOID))) {
  8801. ret = PUBLIC_KEY_E;
  8802. }
  8803. #endif
  8804. }
  8805. /* store cert for potential retrieval */
  8806. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap) == 0) {
  8807. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  8808. }
  8809. else {
  8810. ret = MEMORY_E;
  8811. }
  8812. x509->altNames = dCert->altNames;
  8813. dCert->weOwnAltNames = 0;
  8814. x509->altNamesNext = x509->altNames; /* index hint */
  8815. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  8816. !defined(IGNORE_NAME_CONSTRAINTS)
  8817. /* add copies of alternate emails from dCert to X509 */
  8818. if (dCert->altEmailNames != NULL) {
  8819. DNS_entry* cur = dCert->altEmailNames;
  8820. while (cur != NULL) {
  8821. if (cur->type == ASN_RFC822_TYPE) {
  8822. DNS_entry* dnsEntry;
  8823. int strLen = cur->len;
  8824. dnsEntry = (DNS_entry*)XMALLOC(sizeof(DNS_entry), x509->heap,
  8825. DYNAMIC_TYPE_ALTNAME);
  8826. if (dnsEntry == NULL) {
  8827. WOLFSSL_MSG("\tOut of Memory");
  8828. return MEMORY_E;
  8829. }
  8830. dnsEntry->type = ASN_RFC822_TYPE;
  8831. dnsEntry->name = (char*)XMALLOC(strLen + 1, x509->heap,
  8832. DYNAMIC_TYPE_ALTNAME);
  8833. if (dnsEntry->name == NULL) {
  8834. WOLFSSL_MSG("\tOut of Memory");
  8835. XFREE(dnsEntry, x509->heap, DYNAMIC_TYPE_ALTNAME);
  8836. return MEMORY_E;
  8837. }
  8838. dnsEntry->len = strLen;
  8839. XMEMCPY(dnsEntry->name, cur->name, strLen);
  8840. dnsEntry->name[strLen] = '\0';
  8841. dnsEntry->next = x509->altNames;
  8842. x509->altNames = dnsEntry;
  8843. }
  8844. cur = cur->next;
  8845. }
  8846. }
  8847. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8848. x509->isCa = dCert->isCA;
  8849. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8850. x509->pathLength = dCert->pathLength;
  8851. x509->keyUsage = dCert->extKeyUsage;
  8852. x509->CRLdistSet = dCert->extCRLdistSet;
  8853. x509->CRLdistCrit = dCert->extCRLdistCrit;
  8854. x509->CRLInfo = dCert->extCrlInfo;
  8855. x509->CRLInfoSz = dCert->extCrlInfoSz;
  8856. x509->authInfoSet = dCert->extAuthInfoSet;
  8857. x509->authInfoCrit = dCert->extAuthInfoCrit;
  8858. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  8859. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  8860. DYNAMIC_TYPE_X509_EXT);
  8861. if (x509->authInfo != NULL) {
  8862. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  8863. x509->authInfoSz = dCert->extAuthInfoSz;
  8864. }
  8865. else {
  8866. ret = MEMORY_E;
  8867. }
  8868. }
  8869. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  8870. if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
  8871. x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
  8872. DYNAMIC_TYPE_X509_EXT);
  8873. if (x509->authInfoCaIssuer != NULL) {
  8874. XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
  8875. x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
  8876. }
  8877. else {
  8878. ret = MEMORY_E;
  8879. }
  8880. }
  8881. #endif
  8882. x509->basicConstSet = dCert->extBasicConstSet;
  8883. x509->basicConstCrit = dCert->extBasicConstCrit;
  8884. x509->basicConstPlSet = dCert->pathLengthSet;
  8885. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  8886. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  8887. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  8888. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  8889. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  8890. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  8891. DYNAMIC_TYPE_X509_EXT);
  8892. if (x509->authKeyId != NULL) {
  8893. XMEMCPY(x509->authKeyId,
  8894. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  8895. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  8896. }
  8897. else
  8898. ret = MEMORY_E;
  8899. }
  8900. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  8901. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  8902. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  8903. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  8904. DYNAMIC_TYPE_X509_EXT);
  8905. if (x509->subjKeyId != NULL) {
  8906. XMEMCPY(x509->subjKeyId,
  8907. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  8908. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  8909. }
  8910. else
  8911. ret = MEMORY_E;
  8912. }
  8913. x509->keyUsageSet = dCert->extKeyUsageSet;
  8914. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  8915. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  8916. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  8917. x509->heap, DYNAMIC_TYPE_X509_EXT);
  8918. if (x509->extKeyUsageSrc != NULL) {
  8919. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  8920. dCert->extExtKeyUsageSz);
  8921. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  8922. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  8923. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  8924. }
  8925. else {
  8926. ret = MEMORY_E;
  8927. }
  8928. }
  8929. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  8930. x509->certPolicySet = dCert->extCertPolicySet;
  8931. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  8932. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  8933. #ifdef WOLFSSL_CERT_EXT
  8934. {
  8935. int i;
  8936. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  8937. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  8938. MAX_CERTPOL_SZ);
  8939. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  8940. }
  8941. #endif /* WOLFSSL_CERT_EXT */
  8942. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8943. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  8944. x509->pkCurveOID = dCert->pkCurveOID;
  8945. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8946. return ret;
  8947. }
  8948. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  8949. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  8950. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  8951. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  8952. word32 status_length)
  8953. {
  8954. int ret = 0;
  8955. OcspRequest* request;
  8956. WOLFSSL_ENTER("ProcessCSR");
  8957. #ifdef WOLFSSL_SMALL_STACK
  8958. CertStatus* status;
  8959. OcspEntry* single;
  8960. OcspResponse* response;
  8961. #else
  8962. CertStatus status[1];
  8963. OcspEntry single[1];
  8964. OcspResponse response[1];
  8965. #endif
  8966. do {
  8967. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  8968. if (ssl->status_request) {
  8969. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  8970. ssl->status_request = 0;
  8971. break;
  8972. }
  8973. #endif
  8974. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  8975. if (ssl->status_request_v2) {
  8976. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  8977. WOLFSSL_CSR2_OCSP, 0);
  8978. ssl->status_request_v2 = 0;
  8979. break;
  8980. }
  8981. #endif
  8982. return BUFFER_ERROR;
  8983. } while(0);
  8984. if (request == NULL)
  8985. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  8986. #ifdef WOLFSSL_SMALL_STACK
  8987. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  8988. DYNAMIC_TYPE_OCSP_STATUS);
  8989. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  8990. DYNAMIC_TYPE_OCSP_ENTRY);
  8991. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  8992. DYNAMIC_TYPE_OCSP_REQUEST);
  8993. if (status == NULL || single == NULL || response == NULL) {
  8994. if (status)
  8995. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  8996. if (single)
  8997. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  8998. if (response)
  8999. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  9000. return MEMORY_ERROR;
  9001. }
  9002. #endif
  9003. InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
  9004. if (OcspResponseDecode(response, ssl->ctx->cm, ssl->heap, 0) != 0)
  9005. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9006. else if (CompareOcspReqResp(request, response) != 0)
  9007. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9008. else if (response->responseStatus != OCSP_SUCCESSFUL)
  9009. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9010. else if (response->single->status->status == CERT_REVOKED)
  9011. ret = OCSP_CERT_REVOKED;
  9012. else if (response->single->status->status != CERT_GOOD)
  9013. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9014. else {
  9015. XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
  9016. ssl->ocspProducedDateFormat = response->producedDateFormat;
  9017. }
  9018. *inOutIdx += status_length;
  9019. #ifdef WOLFSSL_SMALL_STACK
  9020. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  9021. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  9022. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  9023. #endif
  9024. WOLFSSL_LEAVE("ProcessCSR", ret);
  9025. return ret;
  9026. }
  9027. #endif
  9028. #ifdef HAVE_PK_CALLBACKS
  9029. #ifdef HAVE_ECC
  9030. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  9031. const unsigned char* hash, unsigned int hashSz,
  9032. const unsigned char* keyDer, unsigned int keySz,
  9033. int* result, void* ctx)
  9034. {
  9035. int ret = NOT_COMPILED_IN;
  9036. WOLFSSL* ssl = (WOLFSSL*)ctx;
  9037. if (ssl && ssl->ctx->EccVerifyCb) {
  9038. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  9039. keyDer, keySz, result, ssl->EccVerifyCtx);
  9040. }
  9041. return ret;
  9042. }
  9043. #endif
  9044. #ifndef NO_RSA
  9045. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  9046. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  9047. void* ctx)
  9048. {
  9049. int ret = NOT_COMPILED_IN;
  9050. WOLFSSL* ssl = (WOLFSSL*)ctx;
  9051. if (ssl && ssl->ctx->RsaVerifyCb) {
  9052. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  9053. ssl->RsaVerifyCtx);
  9054. }
  9055. return ret;
  9056. }
  9057. #endif
  9058. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  9059. {
  9060. if (ssl == NULL || sigCtx == NULL)
  9061. return BAD_FUNC_ARG;
  9062. /* only setup the verify callback if a PK is set */
  9063. #ifdef HAVE_ECC
  9064. if (ssl->ctx->EccVerifyCb) {
  9065. sigCtx->pkCbEcc = SigPkCbEccVerify;
  9066. sigCtx->pkCtxEcc = ssl;
  9067. }
  9068. #endif
  9069. #ifndef NO_RSA
  9070. /* only setup the verify callback if a PK is set */
  9071. if (ssl->ctx->RsaVerifyCb) {
  9072. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  9073. sigCtx->pkCtxRsa = ssl;
  9074. }
  9075. #endif
  9076. return 0;
  9077. }
  9078. #endif /* HAVE_PK_CALLBACKS */
  9079. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  9080. static void DoCertFatalAlert(WOLFSSL* ssl, int ret)
  9081. {
  9082. int alertWhy;
  9083. if (ssl == NULL || ret == 0) {
  9084. return;
  9085. }
  9086. /* Determine alert reason */
  9087. alertWhy = bad_certificate;
  9088. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
  9089. alertWhy = certificate_expired;
  9090. } else if (ret == ASN_NO_SIGNER_E) {
  9091. alertWhy = unknown_ca;
  9092. }
  9093. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD))
  9094. else if (ret == CRL_CERT_REVOKED) {
  9095. alertWhy = certificate_revoked;
  9096. }
  9097. #endif
  9098. else if (ret == NO_PEER_CERT) {
  9099. #ifdef WOLFSSL_TLS13
  9100. if (ssl->options.tls1_3) {
  9101. alertWhy = certificate_required;
  9102. }
  9103. else
  9104. #endif
  9105. {
  9106. alertWhy = handshake_failure;
  9107. }
  9108. }
  9109. /* send fatal alert and mark connection closed */
  9110. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  9111. ssl->options.isClosed = 1;
  9112. }
  9113. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  9114. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  9115. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  9116. * The intermediates are done first then peer leaf cert last. Use the
  9117. * store->error_depth member to determine index (0=peer, >1 intermediates)
  9118. */
  9119. int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret,
  9120. ProcPeerCertArgs* args)
  9121. {
  9122. int verify_ok = 0, use_cb = 0;
  9123. void *heap;
  9124. if (cm == NULL) {
  9125. return BAD_FUNC_ARG;
  9126. }
  9127. heap = (ssl != NULL) ? ssl->heap : cm->heap;
  9128. /* Determine if verify was okay */
  9129. if (ret == 0) {
  9130. verify_ok = 1;
  9131. }
  9132. /* Determine if verify callback should be used */
  9133. if (ret != 0) {
  9134. if ((ssl != NULL) && (!ssl->options.verifyNone)) {
  9135. use_cb = 1; /* always report errors */
  9136. }
  9137. }
  9138. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  9139. /* always use verify callback on peer leaf cert */
  9140. if (args->certIdx == 0) {
  9141. use_cb = 1;
  9142. }
  9143. #endif
  9144. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  9145. /* perform verify callback on other intermediate certs (not just peer) */
  9146. if (args->certIdx > 0) {
  9147. use_cb = 1;
  9148. }
  9149. #endif
  9150. #if defined(OPENSSL_EXTRA)
  9151. /* perform domain name check on the peer certificate */
  9152. if (args->dCertInit && args->dCert && (ssl != NULL) &&
  9153. ssl->param && ssl->param->hostName[0]) {
  9154. /* If altNames names is present, then subject common name is ignored */
  9155. if (args->dCert->altNames != NULL) {
  9156. if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
  9157. if (ret == 0) {
  9158. ret = DOMAIN_NAME_MISMATCH;
  9159. }
  9160. }
  9161. }
  9162. else {
  9163. if (args->dCert->subjectCN) {
  9164. if (MatchDomainName(args->dCert->subjectCN,
  9165. args->dCert->subjectCNLen,
  9166. ssl->param->hostName) == 0) {
  9167. if (ret == 0) {
  9168. ret = DOMAIN_NAME_MISMATCH;
  9169. }
  9170. }
  9171. }
  9172. }
  9173. }
  9174. /* perform IP address check on the peer certificate */
  9175. if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
  9176. (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
  9177. if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
  9178. if (ret == 0) {
  9179. ret = IPADDR_MISMATCH;
  9180. }
  9181. }
  9182. }
  9183. #endif
  9184. /* if verify callback has been set */
  9185. if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
  9186. #ifdef OPENSSL_ALL
  9187. || (ssl->ctx->verifyCertCb != NULL)
  9188. #endif
  9189. ))
  9190. #ifndef NO_WOLFSSL_CM_VERIFY
  9191. || (cm->verifyCallback != NULL)
  9192. #endif
  9193. ) {
  9194. int verifyFail = 0;
  9195. #ifdef WOLFSSL_SMALL_STACK
  9196. WOLFSSL_X509_STORE_CTX* store;
  9197. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9198. WOLFSSL_X509* x509;
  9199. #endif
  9200. char* domain = NULL;
  9201. #else
  9202. WOLFSSL_X509_STORE_CTX store[1];
  9203. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9204. WOLFSSL_X509 x509[1];
  9205. #endif
  9206. char domain[ASN_NAME_MAX];
  9207. #endif
  9208. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9209. int x509Free = 0;
  9210. #endif
  9211. #ifdef WOLFSSL_SMALL_STACK
  9212. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  9213. sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE);
  9214. if (store == NULL) {
  9215. return MEMORY_E;
  9216. }
  9217. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9218. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  9219. DYNAMIC_TYPE_X509);
  9220. if (x509 == NULL) {
  9221. XFREE(store, heap, DYNAMIC_TYPE_X509);
  9222. return MEMORY_E;
  9223. }
  9224. #endif
  9225. domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
  9226. if (domain == NULL) {
  9227. XFREE(store, heap, DYNAMIC_TYPE_X509);
  9228. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9229. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  9230. #endif
  9231. return MEMORY_E;
  9232. }
  9233. #endif /* WOLFSSL_SMALL_STACK */
  9234. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  9235. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9236. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  9237. #endif
  9238. domain[0] = '\0';
  9239. /* build subject CN as string to return in store */
  9240. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  9241. int subjectCNLen = args->dCert->subjectCNLen;
  9242. if (subjectCNLen > ASN_NAME_MAX-1)
  9243. subjectCNLen = ASN_NAME_MAX-1;
  9244. if (subjectCNLen > 0) {
  9245. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  9246. domain[subjectCNLen] = '\0';
  9247. }
  9248. }
  9249. store->error = ret;
  9250. store->error_depth = args->certIdx;
  9251. store->discardSessionCerts = 0;
  9252. store->domain = domain;
  9253. store->userCtx = (ssl != NULL) ? ssl->verifyCbCtx : cm;
  9254. store->certs = args->certs;
  9255. store->totalCerts = args->totalCerts;
  9256. #if (defined(HAVE_EX_DATA) || defined(FORTRESS)) && \
  9257. (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  9258. if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
  9259. != WOLFSSL_SUCCESS) {
  9260. WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
  9261. }
  9262. #endif
  9263. if (ssl != NULL) {
  9264. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  9265. if (ssl->ctx->x509_store_pt != NULL) {
  9266. store->store = ssl->ctx->x509_store_pt;
  9267. }
  9268. else {
  9269. store->store = &ssl->ctx->x509_store;
  9270. }
  9271. #if defined(OPENSSL_EXTRA)
  9272. store->depth = args->count;
  9273. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  9274. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  9275. heap, DYNAMIC_TYPE_OPENSSL);
  9276. if (store->param == NULL) {
  9277. #ifdef WOLFSSL_SMALL_STACK
  9278. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  9279. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9280. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  9281. #endif
  9282. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  9283. #endif
  9284. return MEMORY_E;
  9285. }
  9286. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  9287. /* Overwrite with non-default param values in SSL */
  9288. if (ssl->param) {
  9289. if (ssl->param->check_time)
  9290. store->param->check_time = ssl->param->check_time;
  9291. if (ssl->param->flags)
  9292. store->param->flags = ssl->param->flags;
  9293. if (ssl->param->hostName[0])
  9294. XMEMCPY(store->param->hostName, ssl->param->hostName,
  9295. WOLFSSL_HOST_NAME_MAX);
  9296. }
  9297. #endif /* defined(OPENSSL_EXTRA) */
  9298. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  9299. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9300. #ifdef KEEP_PEER_CERT
  9301. if (args->certIdx == 0) {
  9302. store->current_cert = &ssl->peerCert; /* use existing X509 */
  9303. }
  9304. else
  9305. #endif
  9306. {
  9307. InitX509(x509, 0, heap);
  9308. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  9309. store->current_cert = x509;
  9310. x509Free = 1;
  9311. }
  9312. else {
  9313. FreeX509(x509);
  9314. }
  9315. }
  9316. #endif
  9317. #ifdef SESSION_CERTS
  9318. store->sesChain = &ssl->session.chain;
  9319. #endif
  9320. }
  9321. #ifndef NO_WOLFSSL_CM_VERIFY
  9322. /* non-zero return code indicates failure override */
  9323. if (cm->verifyCallback != NULL) {
  9324. store->userCtx = cm;
  9325. if (cm->verifyCallback(verify_ok, store)) {
  9326. if (ret != 0) {
  9327. WOLFSSL_MSG("Verify CM callback overriding error!");
  9328. ret = 0;
  9329. }
  9330. }
  9331. else {
  9332. verifyFail = 1;
  9333. }
  9334. }
  9335. #endif
  9336. if (ssl != NULL) {
  9337. #ifdef OPENSSL_ALL
  9338. /* non-zero return code indicates failure override */
  9339. if (ssl->ctx->verifyCertCb) {
  9340. if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
  9341. if (ret != 0) {
  9342. WOLFSSL_MSG("Verify Cert callback overriding error!");
  9343. ret = 0;
  9344. }
  9345. }
  9346. else {
  9347. verifyFail = 1;
  9348. }
  9349. }
  9350. #endif
  9351. /* non-zero return code indicates failure override */
  9352. if (ssl->verifyCallback) {
  9353. if (ssl->verifyCallback(verify_ok, store)) {
  9354. if (ret != 0) {
  9355. WOLFSSL_MSG("Verify callback overriding error!");
  9356. ret = 0;
  9357. }
  9358. }
  9359. else {
  9360. verifyFail = 1;
  9361. }
  9362. }
  9363. }
  9364. if (verifyFail) {
  9365. /* induce error if one not present */
  9366. if (ret == 0) {
  9367. ret = VERIFY_CERT_ERROR;
  9368. }
  9369. /* mark as verify error */
  9370. args->verifyErr = 1;
  9371. }
  9372. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9373. if (x509Free) {
  9374. FreeX509(x509);
  9375. }
  9376. #endif
  9377. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  9378. wolfSSL_sk_X509_free(store->chain);
  9379. store->chain = NULL;
  9380. #endif
  9381. #ifdef SESSION_CERTS
  9382. if ((ssl != NULL) && (store->discardSessionCerts)) {
  9383. WOLFSSL_MSG("Verify callback requested discard sess certs");
  9384. ssl->session.chain.count = 0;
  9385. #ifdef WOLFSSL_ALT_CERT_CHAINS
  9386. ssl->session.altChain.count = 0;
  9387. #endif
  9388. }
  9389. #endif /* SESSION_CERTS */
  9390. #ifdef OPENSSL_EXTRA
  9391. if ((ssl != NULL) && (store->param)) {
  9392. XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL);
  9393. }
  9394. #endif
  9395. #ifdef WOLFSSL_SMALL_STACK
  9396. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  9397. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9398. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  9399. #endif
  9400. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  9401. #endif
  9402. }
  9403. (void)heap;
  9404. return ret;
  9405. }
  9406. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  9407. {
  9408. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  9409. (void)ssl;
  9410. if (args->certs) {
  9411. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  9412. args->certs = NULL;
  9413. }
  9414. #ifdef WOLFSSL_TLS13
  9415. if (args->exts) {
  9416. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  9417. args->exts = NULL;
  9418. }
  9419. #endif
  9420. if (args->dCert) {
  9421. if (args->dCertInit) {
  9422. FreeDecodedCert(args->dCert);
  9423. args->dCertInit = 0;
  9424. }
  9425. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  9426. args->dCert = NULL;
  9427. }
  9428. }
  9429. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  9430. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  9431. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  9432. /* load certificate file which has the form <hash>.(r)N[0..N] */
  9433. /* in the folder. */
  9434. /* (r), in the case of CRL file */
  9435. /* @param store a pointer to X509_STORE structure */
  9436. /* @param issuer a pointer to X509_NAME that presents an issuer */
  9437. /* @param type X509_LU_X509 or X509_LU_CRL */
  9438. /* @return WOLFSSL_SUCCESS on successful, otherwise WOLFSSL_FAILURE */
  9439. int LoadCertByIssuer(WOLFSSL_X509_STORE* store, X509_NAME* issuer, int type)
  9440. {
  9441. const int MAX_SUFFIX = 10;/* The number comes from CA_TABLE_SIZE=10 */
  9442. int ret = WOLFSSL_SUCCESS;
  9443. WOLFSSL_X509_LOOKUP* lookup;
  9444. WOLFSSL_BY_DIR_entry* entry;
  9445. WOLFSSL_BY_DIR_HASH hash_tmp;
  9446. WOLFSSL_BY_DIR_HASH* ph = NULL;
  9447. WOLFSSL_X509* x509;
  9448. unsigned long hash = 0;
  9449. char* filename = NULL;
  9450. const char* post = "";
  9451. byte* pbuf = NULL;
  9452. int len, num, i, index;
  9453. byte suffix = 0;
  9454. int retHash = NOT_COMPILED_IN;
  9455. byte dgt[WC_MAX_DIGEST_SIZE];
  9456. WOLFSSL_ENTER("LoadCertByIssuer");
  9457. /* sanity check */
  9458. if (store == NULL || issuer == NULL || (type != X509_LU_X509 && type != X509_LU_CRL)) {
  9459. return WOLFSSL_FAILURE;
  9460. }
  9461. lookup = &store->lookup;
  9462. if (lookup->dirs == NULL || lookup->type != 1) {
  9463. return WOLFSSL_FAILURE;
  9464. }
  9465. len = wolfSSL_i2d_X509_NAME_canon(issuer, &pbuf);
  9466. if (len > 0) {
  9467. #ifndef NO_SHA
  9468. retHash = wc_ShaHash((const byte*)pbuf, len, dgt);
  9469. #endif
  9470. if (retHash == 0) {
  9471. /* 4 bytes in little endian as unsigned long */
  9472. hash = (((unsigned long)dgt[3] << 24) |
  9473. ((unsigned long)dgt[2] << 16) |
  9474. ((unsigned long)dgt[1] << 8) |
  9475. ((unsigned long)dgt[0]));
  9476. } else {
  9477. WOLFSSL_MSG("failed hash operation");
  9478. return WOLFSSL_FAILURE;
  9479. }
  9480. wolfSSL_OPENSSL_free(pbuf);
  9481. }
  9482. /* try to load each hashed name file in path */
  9483. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  9484. if (type == X509_LU_CRL) {
  9485. post = "r";
  9486. }
  9487. num = wolfSSL_sk_BY_DIR_entry_num(lookup->dirs->dir_entry);
  9488. for (i=0; i<num; i++) {
  9489. entry = wolfSSL_sk_BY_DIR_entry_value(lookup->dirs->dir_entry, i);
  9490. if (type == X509_LU_CRL && entry->hashes != NULL &&
  9491. wolfSSL_sk_BY_DIR_HASH_num(entry->hashes) > 0) {
  9492. /* lock the list */
  9493. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  9494. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  9495. return BAD_MUTEX_E;
  9496. }
  9497. hash_tmp.hash_value = hash;
  9498. index = wolfSSL_sk_BY_DIR_HASH_find(entry->hashes, &hash_tmp);
  9499. if (index >= 0) {
  9500. WOLFSSL_MSG("find hashed CRL in list");
  9501. ph = wolfSSL_sk_BY_DIR_HASH_value(entry->hashes, index);
  9502. suffix = ph->last_suffix;
  9503. } else {
  9504. ph = NULL;
  9505. suffix = 0;
  9506. }
  9507. wc_UnLockMutex(&lookup->dirs->lock);
  9508. }
  9509. /* Additional buffer length for file name memory allocation : */
  9510. /* / <hashvalue>.(r)N\0 */
  9511. /*|1| 8 |1|1|1|1| => 13 */
  9512. len = (int)XSTRLEN(entry->dir_name) + 13;
  9513. if (filename != NULL) {
  9514. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  9515. }
  9516. filename = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  9517. if (filename == NULL) {
  9518. WOLFSSL_MSG("memory allocation error");
  9519. return MEMORY_E;
  9520. }
  9521. /* set as FAILURE, if successfuly loading cert of CRL, this becomes */
  9522. /* WOLFSSL_SUCCESS */
  9523. ret = WOLFSSL_FAILURE;
  9524. for (; suffix < MAX_SUFFIX; suffix++) {
  9525. /* /folder-path/<hash>.(r)N[0..9] */
  9526. XSNPRINTF(filename, len, "%s/%08lx.%s%d", entry->dir_name,
  9527. hash, post, suffix);
  9528. if(wc_FileExists(filename) == 0/*0 file exists */) {
  9529. if (type == X509_LU_X509) {
  9530. x509 = wolfSSL_X509_load_certificate_file(filename,
  9531. WOLFSSL_FILETYPE_PEM);
  9532. if (x509 != NULL) {
  9533. ret = wolfSSL_X509_STORE_add_cert(store, x509);
  9534. wolfSSL_X509_free(x509);
  9535. } else {
  9536. WOLFSSL_MSG("failed to load certificate\n");
  9537. ret = WOLFSSL_FAILURE;
  9538. break;
  9539. }
  9540. }
  9541. #ifdef HAVE_CRL
  9542. else if (type == X509_LU_CRL) {
  9543. ret = wolfSSL_X509_load_crl_file(&store->lookup, filename,
  9544. WOLFSSL_FILETYPE_PEM);
  9545. if (ret != WOLFSSL_SUCCESS) {
  9546. WOLFSSL_MSG("failed to load CRL\n");
  9547. break;
  9548. }
  9549. }
  9550. #else
  9551. else if (type == X509_LU_CRL) {
  9552. WOLFSSL_MSG("CRL is not supported");
  9553. ret = WOLFSSL_FAILURE;
  9554. break;
  9555. }
  9556. #endif
  9557. } else
  9558. break;
  9559. }
  9560. if (ret != WOLFSSL_SUCCESS) {
  9561. WOLFSSL_MSG("not found file");
  9562. ret = WOLFSSL_FAILURE;
  9563. } else {
  9564. if (type == X509_LU_CRL) {
  9565. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  9566. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  9567. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  9568. return BAD_MUTEX_E;
  9569. }
  9570. if (ph == NULL) {
  9571. ph = wolfSSL_BY_DIR_HASH_new();
  9572. if (ph == NULL) {
  9573. WOLFSSL_MSG("failed to allocate hash stack");
  9574. ret = WOLFSSL_FAILURE;
  9575. } else {
  9576. ph->hash_value = hash;
  9577. ph->last_suffix = suffix;
  9578. ret = wolfSSL_sk_BY_DIR_HASH_push(entry->hashes, ph);
  9579. }
  9580. }
  9581. wc_UnLockMutex(&lookup->dirs->lock);
  9582. }
  9583. }
  9584. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  9585. }
  9586. #else
  9587. (void) type;
  9588. (void) ret;
  9589. (void) x509;
  9590. (void) filename;
  9591. (void) suffix;
  9592. (void) num;
  9593. (void) i;
  9594. ret = WOLFSSL_NOT_IMPLEMENTED;
  9595. #endif
  9596. WOLFSSL_LEAVE("LoadCertByIssuer", ret);
  9597. return ret;
  9598. }
  9599. #endif
  9600. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  9601. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  9602. {
  9603. int ret = 0;
  9604. buffer* cert;
  9605. byte* subjectHash = NULL;
  9606. int alreadySigner = 0;
  9607. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9608. int sigRet = 0;
  9609. #endif
  9610. if (ssl == NULL || args == NULL)
  9611. return BAD_FUNC_ARG;
  9612. /* check to make sure certificate index is valid */
  9613. if (args->certIdx > args->count)
  9614. return BUFFER_E;
  9615. /* check if returning from non-blocking OCSP */
  9616. /* skip this section because cert is already initialized and parsed */
  9617. #ifdef WOLFSSL_NONBLOCK_OCSP
  9618. if (args->lastErr == OCSP_WANT_READ) {
  9619. args->lastErr = 0; /* clear error */
  9620. return 0;
  9621. }
  9622. #endif
  9623. #ifdef WOLFSSL_TRUST_PEER_CERT
  9624. /* we have trusted peer */
  9625. if (args->haveTrustPeer) {
  9626. return 0;
  9627. }
  9628. #endif
  9629. /* get certificate buffer */
  9630. cert = &args->certs[args->certIdx];
  9631. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9632. if (verify == VERIFY) {
  9633. /* for small cert verify, release decoded cert during signature check to
  9634. reduce peak memory usage */
  9635. if (args->dCert != NULL) {
  9636. if (args->dCertInit) {
  9637. FreeDecodedCert(args->dCert);
  9638. args->dCertInit = 0;
  9639. }
  9640. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  9641. args->dCert = NULL;
  9642. }
  9643. /* perform cert parsing and signature check */
  9644. sigRet = CheckCertSignature(cert->buffer, cert->length,
  9645. ssl->heap, ssl->ctx->cm);
  9646. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  9647. /* verify name only in ParseCertRelative below, signature check done */
  9648. verify = VERIFY_NAME;
  9649. }
  9650. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  9651. /* make sure the decoded cert structure is allocated and initialized */
  9652. if (!args->dCertInit
  9653. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9654. || args->dCert == NULL
  9655. #endif
  9656. ) {
  9657. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9658. if (args->dCert == NULL) {
  9659. args->dCert = (DecodedCert*)XMALLOC(
  9660. sizeof(DecodedCert), ssl->heap,
  9661. DYNAMIC_TYPE_DCERT);
  9662. if (args->dCert == NULL) {
  9663. return MEMORY_E;
  9664. }
  9665. }
  9666. #endif
  9667. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  9668. args->dCertInit = 1;
  9669. args->dCert->sigCtx.devId = ssl->devId;
  9670. #ifdef WOLFSSL_ASYNC_CRYPT
  9671. args->dCert->sigCtx.asyncCtx = ssl;
  9672. #endif
  9673. #ifdef HAVE_PK_CALLBACKS
  9674. /* setup the PK callback context */
  9675. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  9676. if (ret != 0)
  9677. return ret;
  9678. #endif
  9679. }
  9680. /* Parse Certificate */
  9681. ret = ParseCertRelative(args->dCert, certType, verify, ssl->ctx->cm);
  9682. /* perform below checks for date failure cases */
  9683. if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) {
  9684. /* get subject and determine if already loaded */
  9685. #ifndef NO_SKID
  9686. if (args->dCert->extAuthKeyIdSet)
  9687. subjectHash = args->dCert->extSubjKeyId;
  9688. else
  9689. #endif
  9690. subjectHash = args->dCert->subjectHash;
  9691. alreadySigner = AlreadySigner(ssl->ctx->cm, subjectHash);
  9692. }
  9693. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9694. /* get signature check failures from above */
  9695. if (ret == 0)
  9696. ret = sigRet;
  9697. #endif
  9698. if (pSubjectHash)
  9699. *pSubjectHash = subjectHash;
  9700. if (pAlreadySigner)
  9701. *pAlreadySigner = alreadySigner;
  9702. #ifdef WOLFSSL_ASYNC_CRYPT
  9703. if (ret == WC_PENDING_E) {
  9704. ret = wolfSSL_AsyncPush(ssl,
  9705. args->dCert->sigCtx.asyncDev);
  9706. }
  9707. #endif
  9708. return ret;
  9709. }
  9710. /* Check key sizes for certs. Is redundant check since
  9711. ProcessBuffer also performs this check. */
  9712. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  9713. {
  9714. int ret = 0;
  9715. if (ssl->options.verifyNone) {
  9716. return ret;
  9717. }
  9718. switch (args->dCert->keyOID) {
  9719. #ifndef NO_RSA
  9720. case RSAk:
  9721. if (ssl->options.minRsaKeySz < 0 ||
  9722. args->dCert->pubKeySize <
  9723. (word16)ssl->options.minRsaKeySz) {
  9724. WOLFSSL_MSG(
  9725. "RSA key size in cert chain error");
  9726. ret = RSA_KEY_SIZE_E;
  9727. }
  9728. break;
  9729. #endif /* !NO_RSA */
  9730. #ifdef HAVE_ECC
  9731. case ECDSAk:
  9732. if (ssl->options.minEccKeySz < 0 ||
  9733. args->dCert->pubKeySize <
  9734. (word16)ssl->options.minEccKeySz) {
  9735. WOLFSSL_MSG(
  9736. "ECC key size in cert chain error");
  9737. ret = ECC_KEY_SIZE_E;
  9738. }
  9739. break;
  9740. #endif /* HAVE_ECC */
  9741. #ifdef HAVE_ED25519
  9742. case ED25519k:
  9743. if (ssl->options.minEccKeySz < 0 ||
  9744. ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  9745. WOLFSSL_MSG(
  9746. "ECC key size in cert chain error");
  9747. ret = ECC_KEY_SIZE_E;
  9748. }
  9749. break;
  9750. #endif /* HAVE_ED25519 */
  9751. #ifdef HAVE_ED448
  9752. case ED448k:
  9753. if (ssl->options.minEccKeySz < 0 ||
  9754. ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  9755. WOLFSSL_MSG(
  9756. "ECC key size in cert chain error");
  9757. ret = ECC_KEY_SIZE_E;
  9758. }
  9759. break;
  9760. #endif /* HAVE_ED448 */
  9761. default:
  9762. WOLFSSL_MSG("Key size not checked");
  9763. /* key not being checked for size if not in
  9764. switch */
  9765. break;
  9766. }
  9767. return ret;
  9768. }
  9769. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  9770. word32 totalSz)
  9771. {
  9772. int ret = 0;
  9773. #ifdef WOLFSSL_ASYNC_CRYPT
  9774. ProcPeerCertArgs* args = (ProcPeerCertArgs*)ssl->async.args;
  9775. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  9776. (void)sizeof(args_test);
  9777. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  9778. ProcPeerCertArgs* args = ssl->nonblockarg;
  9779. #elif defined(WOLFSSL_SMALL_STACK)
  9780. ProcPeerCertArgs* args = NULL;
  9781. #else
  9782. ProcPeerCertArgs args[1];
  9783. #endif
  9784. byte* subjectHash = NULL;
  9785. int alreadySigner = 0;
  9786. WOLFSSL_ENTER("ProcessPeerCerts");
  9787. #ifdef WOLFSSL_ASYNC_CRYPT
  9788. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  9789. if (ret != WC_NOT_PENDING_E) {
  9790. /* Check for error */
  9791. if (ret < 0)
  9792. goto exit_ppc;
  9793. }
  9794. else
  9795. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  9796. if (args == NULL) {
  9797. args = (ProcPeerCertArgs*)XMALLOC(
  9798. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9799. if (args == NULL) {
  9800. ERROR_OUT(MEMORY_E, exit_ppc);
  9801. }
  9802. }
  9803. if (ssl->nonblockarg == NULL) /* new args */
  9804. #elif defined(WOLFSSL_SMALL_STACK)
  9805. args = (ProcPeerCertArgs*)XMALLOC(
  9806. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9807. if (args == NULL) {
  9808. ERROR_OUT(MEMORY_E, exit_ppc);
  9809. }
  9810. #endif
  9811. {
  9812. /* Reset state */
  9813. ret = 0;
  9814. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  9815. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  9816. args->idx = *inOutIdx;
  9817. args->begin = *inOutIdx;
  9818. #ifdef WOLFSSL_ASYNC_CRYPT
  9819. ssl->async.freeArgs = FreeProcPeerCertArgs;
  9820. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  9821. ssl->nonblockarg = args;
  9822. #endif
  9823. }
  9824. switch (ssl->options.asyncState)
  9825. {
  9826. case TLS_ASYNC_BEGIN:
  9827. {
  9828. word32 listSz;
  9829. #ifdef WOLFSSL_CALLBACKS
  9830. if (ssl->hsInfoOn)
  9831. AddPacketName(ssl, "Certificate");
  9832. if (ssl->toInfoOn)
  9833. AddLateName("Certificate", &ssl->timeoutInfo);
  9834. #endif
  9835. #ifdef WOLFSSL_TLS13
  9836. if (ssl->options.tls1_3) {
  9837. byte ctxSz;
  9838. /* Certificate Request Context */
  9839. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  9840. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9841. ctxSz = *(input + args->idx);
  9842. args->idx++;
  9843. if ((args->idx - args->begin) + ctxSz > totalSz)
  9844. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9845. #ifndef NO_WOLFSSL_CLIENT
  9846. /* Must be empty when received from server. */
  9847. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9848. if (ctxSz != 0) {
  9849. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  9850. }
  9851. }
  9852. #endif
  9853. #ifndef NO_WOLFSSL_SERVER
  9854. /* Must contain value sent in request. */
  9855. if (ssl->options.side == WOLFSSL_SERVER_END) {
  9856. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  9857. ctxSz != 0) {
  9858. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  9859. }
  9860. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  9861. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  9862. CertReqCtx* curr = ssl->certReqCtx;
  9863. CertReqCtx* prev = NULL;
  9864. while (curr != NULL) {
  9865. if ((ctxSz == curr->len) &&
  9866. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  9867. == 0) {
  9868. if (prev != NULL)
  9869. prev->next = curr->next;
  9870. else
  9871. ssl->certReqCtx = curr->next;
  9872. XFREE(curr, ssl->heap,
  9873. DYNAMIC_TYPE_TMP_BUFFER);
  9874. break;
  9875. }
  9876. prev = curr;
  9877. curr = curr->next;
  9878. }
  9879. if (curr == NULL)
  9880. #endif
  9881. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  9882. }
  9883. }
  9884. #endif
  9885. args->idx += ctxSz;
  9886. #ifdef OPENSSL_EXTRA
  9887. /* allocate buffer for cert extensions */
  9888. args->exts = (buffer*)XMALLOC(sizeof(buffer) *
  9889. (ssl->verifyDepth + 1), ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  9890. if (args->exts == NULL) {
  9891. ERROR_OUT(MEMORY_E, exit_ppc);
  9892. }
  9893. #else
  9894. /* allocate buffer for cert extensions */
  9895. args->exts = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  9896. ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  9897. if (args->exts == NULL) {
  9898. ERROR_OUT(MEMORY_E, exit_ppc);
  9899. }
  9900. #endif
  9901. }
  9902. #endif
  9903. /* allocate buffer for certs */
  9904. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  9905. ssl->heap, DYNAMIC_TYPE_DER);
  9906. if (args->certs == NULL) {
  9907. ERROR_OUT(MEMORY_E, exit_ppc);
  9908. }
  9909. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  9910. /* Certificate List */
  9911. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  9912. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9913. }
  9914. c24to32(input + args->idx, &listSz);
  9915. args->idx += OPAQUE24_LEN;
  9916. if (listSz > MAX_CERTIFICATE_SZ) {
  9917. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9918. }
  9919. if ((args->idx - args->begin) + listSz != totalSz) {
  9920. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9921. }
  9922. WOLFSSL_MSG("Loading peer's cert chain");
  9923. /* first put cert chain into buffer so can verify top down
  9924. we're sent bottom up */
  9925. while (listSz) {
  9926. word32 certSz;
  9927. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9928. if (args->totalCerts >= MAX_CHAIN_DEPTH) {
  9929. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  9930. ret = MAX_CHAIN_ERROR;
  9931. WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
  9932. break; /* break out to avoid reading more certs then buffer
  9933. * can hold */
  9934. }
  9935. #else
  9936. if (args->totalCerts >= ssl->verifyDepth ||
  9937. args->totalCerts >= MAX_CHAIN_DEPTH) {
  9938. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  9939. }
  9940. #endif
  9941. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  9942. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9943. }
  9944. c24to32(input + args->idx, &certSz);
  9945. args->idx += OPAQUE24_LEN;
  9946. if ((args->idx - args->begin) + certSz > totalSz) {
  9947. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9948. }
  9949. args->certs[args->totalCerts].length = certSz;
  9950. args->certs[args->totalCerts].buffer = input + args->idx;
  9951. #ifdef SESSION_CERTS
  9952. AddSessionCertToChain(&ssl->session.chain,
  9953. input + args->idx, certSz);
  9954. #endif /* SESSION_CERTS */
  9955. args->idx += certSz;
  9956. listSz -= certSz + CERT_HEADER_SZ;
  9957. #ifdef WOLFSSL_TLS13
  9958. /* Extensions */
  9959. if (ssl->options.tls1_3) {
  9960. word16 extSz;
  9961. if (args->exts == NULL) {
  9962. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9963. }
  9964. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  9965. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9966. }
  9967. ato16(input + args->idx, &extSz);
  9968. args->idx += OPAQUE16_LEN;
  9969. if ((args->idx - args->begin) + extSz > totalSz) {
  9970. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9971. }
  9972. /* Store extension data info for later processing. */
  9973. args->exts[args->totalCerts].length = extSz;
  9974. args->exts[args->totalCerts].buffer = input + args->idx;
  9975. args->idx += extSz;
  9976. listSz -= extSz + OPAQUE16_LEN;
  9977. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  9978. (word16)args->exts[args->totalCerts].length,
  9979. certificate, NULL);
  9980. if (ret < 0) {
  9981. ERROR_OUT(ret, exit_ppc);
  9982. }
  9983. }
  9984. #endif
  9985. args->totalCerts++;
  9986. WOLFSSL_MSG("\tPut another cert into chain");
  9987. } /* while (listSz) */
  9988. args->count = args->totalCerts;
  9989. args->certIdx = 0; /* select peer cert (first one) */
  9990. if (args->count == 0 && (ssl->options.mutualAuth ||
  9991. (ssl->options.failNoCert && IsAtLeastTLSv1_3(ssl->version))) &&
  9992. ssl->options.side == WOLFSSL_SERVER_END) {
  9993. ret = NO_PEER_CERT;
  9994. DoCertFatalAlert(ssl, ret);
  9995. }
  9996. args->dCertInit = 0;
  9997. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  9998. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  9999. DYNAMIC_TYPE_DCERT);
  10000. if (args->dCert == NULL) {
  10001. ERROR_OUT(MEMORY_E, exit_ppc);
  10002. }
  10003. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  10004. #endif
  10005. /* Advance state and proceed */
  10006. ssl->options.asyncState = TLS_ASYNC_BUILD;
  10007. } /* case TLS_ASYNC_BEGIN */
  10008. FALL_THROUGH;
  10009. case TLS_ASYNC_BUILD:
  10010. {
  10011. if (args->count > 0) {
  10012. /* check for trusted peer and get untrustedDepth */
  10013. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  10014. if (args->certIdx == 0) {
  10015. #ifdef WOLFSSL_TRUST_PEER_CERT
  10016. TrustedPeerCert* tp;
  10017. int matchType = WC_MATCH_NAME;
  10018. #endif
  10019. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  10020. &subjectHash, &alreadySigner);
  10021. if (ret != 0)
  10022. goto exit_ppc;
  10023. #ifdef OPENSSL_EXTRA
  10024. /* Determine untrusted depth */
  10025. if (!alreadySigner && (!args->dCert ||
  10026. !args->dCertInit || !args->dCert->selfSigned)) {
  10027. args->untrustedDepth = 1;
  10028. }
  10029. #endif
  10030. #ifdef WOLFSSL_TRUST_PEER_CERT
  10031. #ifndef NO_SKID
  10032. if (args->dCert->extAuthKeyIdSet)
  10033. matchType = WC_MATCH_SKID;
  10034. #endif
  10035. tp = GetTrustedPeer(ssl->ctx->cm, subjectHash, matchType);
  10036. WOLFSSL_MSG("Checking for trusted peer cert");
  10037. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  10038. WOLFSSL_MSG("Found matching trusted peer cert");
  10039. args->haveTrustPeer = 1;
  10040. }
  10041. else if (tp == NULL) {
  10042. /* no trusted peer cert */
  10043. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  10044. }
  10045. else {
  10046. WOLFSSL_MSG("Trusted peer cert did not match!");
  10047. }
  10048. if (!args->haveTrustPeer)
  10049. #endif
  10050. {
  10051. /* free cert if not trusted peer */
  10052. FreeDecodedCert(args->dCert);
  10053. args->dCertInit = 0;
  10054. }
  10055. }
  10056. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  10057. /* check certificate up to peer's first */
  10058. /* do not verify chain if trusted peer cert found */
  10059. while (args->count > 1
  10060. #ifdef WOLFSSL_TRUST_PEER_CERT
  10061. && !args->haveTrustPeer
  10062. #endif /* WOLFSSL_TRUST_PEER_CERT */
  10063. ) {
  10064. int skipAddCA = 0;
  10065. /* select last certificate */
  10066. args->certIdx = args->count - 1;
  10067. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  10068. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  10069. &subjectHash, &alreadySigner);
  10070. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  10071. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  10072. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  10073. if (ret == ASN_NO_SIGNER_E) {
  10074. WOLFSSL_MSG("try to load certificate if hash dir is set");
  10075. if (ssl->ctx->x509_store_pt != NULL) {
  10076. ret = LoadCertByIssuer(ssl->ctx->x509_store_pt,
  10077. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  10078. X509_LU_X509);
  10079. } else {
  10080. ret = LoadCertByIssuer(&ssl->ctx->x509_store,
  10081. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  10082. X509_LU_X509);
  10083. }
  10084. if (ret == WOLFSSL_SUCCESS) {
  10085. FreeDecodedCert(args->dCert);
  10086. args->dCertInit = 0;
  10087. /* once again */
  10088. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  10089. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  10090. &subjectHash, &alreadySigner);
  10091. } else
  10092. ret = ASN_NO_SIGNER_E;
  10093. }
  10094. #endif
  10095. #ifdef WOLFSSL_ASYNC_CRYPT
  10096. if (ret == WC_PENDING_E)
  10097. goto exit_ppc;
  10098. #endif
  10099. if (ret == 0) {
  10100. ret = ProcessPeerCertCheckKey(ssl, args);
  10101. }
  10102. if (ret == 0 && args->dCert->isCA == 0) {
  10103. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  10104. }
  10105. else if (ret == 0 && ssl->options.verifyNone) {
  10106. WOLFSSL_MSG("Chain cert not verified by option, "
  10107. "not adding as CA");
  10108. }
  10109. else if (ret == 0) {
  10110. #ifdef OPENSSL_EXTRA
  10111. if (args->certIdx > args->untrustedDepth) {
  10112. args->untrustedDepth = (char)args->certIdx + 1;
  10113. }
  10114. #endif
  10115. if (alreadySigner) {
  10116. WOLFSSL_MSG("Verified CA from chain and already had it");
  10117. }
  10118. }
  10119. else {
  10120. WOLFSSL_MSG("Failed to verify CA from chain");
  10121. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10122. ssl->peerVerifyRet = X509_V_ERR_INVALID_CA;
  10123. #endif
  10124. }
  10125. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  10126. if (ret == 0) {
  10127. int doCrlLookup = 1;
  10128. #ifdef HAVE_OCSP
  10129. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10130. if (ssl->status_request_v2) {
  10131. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  10132. args->dCert, 0, ssl->heap);
  10133. }
  10134. else /* skips OCSP and force CRL check */
  10135. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  10136. if (ssl->ctx->cm->ocspEnabled &&
  10137. ssl->ctx->cm->ocspCheckAll) {
  10138. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  10139. ret = CheckCertOCSP_ex(ssl->ctx->cm->ocsp,
  10140. args->dCert, NULL, ssl);
  10141. #ifdef WOLFSSL_NONBLOCK_OCSP
  10142. if (ret == OCSP_WANT_READ) {
  10143. args->lastErr = ret;
  10144. goto exit_ppc;
  10145. }
  10146. #endif
  10147. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  10148. if (ret != 0) {
  10149. doCrlLookup = 0;
  10150. WOLFSSL_MSG("\tOCSP Lookup not ok");
  10151. }
  10152. }
  10153. #endif /* HAVE_OCSP */
  10154. #ifdef HAVE_CRL
  10155. if (ret == 0 && doCrlLookup &&
  10156. ssl->ctx->cm->crlEnabled &&
  10157. ssl->ctx->cm->crlCheckAll) {
  10158. WOLFSSL_MSG("Doing Non Leaf CRL check");
  10159. ret = CheckCertCRL(ssl->ctx->cm->crl, args->dCert);
  10160. #ifdef WOLFSSL_NONBLOCK_OCSP
  10161. if (ret == OCSP_WANT_READ) {
  10162. args->lastErr = ret;
  10163. goto exit_ppc;
  10164. }
  10165. #endif
  10166. if (ret != 0) {
  10167. WOLFSSL_MSG("\tCRL check not ok");
  10168. }
  10169. }
  10170. #endif /* HAVE_CRL */
  10171. (void)doCrlLookup;
  10172. }
  10173. #endif /* HAVE_OCSP || HAVE_CRL */
  10174. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10175. if (ret == 0 &&
  10176. /* extend the limit "+1" until reaching
  10177. * an ultimately trusted issuer.*/
  10178. args->count > (ssl->verifyDepth + 1)) {
  10179. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  10180. ret = MAX_CHAIN_ERROR;
  10181. }
  10182. #endif
  10183. /* Do verify callback */
  10184. ret = DoVerifyCallback(ssl->ctx->cm, ssl, ret, args);
  10185. if (ssl->options.verifyNone &&
  10186. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED)) {
  10187. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  10188. ret = ssl->error = 0;
  10189. }
  10190. #ifdef WOLFSSL_ALT_CERT_CHAINS
  10191. /* For alternate cert chain, its okay for a CA cert to fail
  10192. with ASN_NO_SIGNER_E here. The "alternate" certificate
  10193. chain mode only requires that the peer certificate
  10194. validate to a trusted CA */
  10195. if (ret != 0 && args->dCert->isCA) {
  10196. if (ret == ASN_NO_SIGNER_E) {
  10197. if (!ssl->options.usingAltCertChain) {
  10198. WOLFSSL_MSG("Trying alternate cert chain");
  10199. ssl->options.usingAltCertChain = 1;
  10200. }
  10201. ret = 0; /* clear errors and continue */
  10202. args->verifyErr = 0;
  10203. }
  10204. /* do not add to certificate manager */
  10205. skipAddCA = 1;
  10206. }
  10207. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  10208. /* If valid CA then add to Certificate Manager */
  10209. if (ret == 0 && args->dCert->isCA &&
  10210. !ssl->options.verifyNone && !skipAddCA) {
  10211. buffer* cert = &args->certs[args->certIdx];
  10212. /* Is valid CA */
  10213. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  10214. /* if using alternate chain, store the cert used */
  10215. if (ssl->options.usingAltCertChain) {
  10216. AddSessionCertToChain(&ssl->session.altChain,
  10217. cert->buffer, cert->length);
  10218. }
  10219. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  10220. if (!alreadySigner) {
  10221. DerBuffer* add = NULL;
  10222. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  10223. if (ret < 0)
  10224. goto exit_ppc;
  10225. XMEMCPY(add->buffer, cert->buffer, cert->length);
  10226. /* CA already verified above in ParseCertRelative */
  10227. WOLFSSL_MSG("Adding CA from chain");
  10228. ret = AddCA(ssl->ctx->cm, &add, WOLFSSL_CHAIN_CA,
  10229. NO_VERIFY);
  10230. if (ret == WOLFSSL_SUCCESS) {
  10231. ret = 0;
  10232. }
  10233. }
  10234. }
  10235. /* Handle error codes */
  10236. if (ret != 0) {
  10237. if (!ssl->options.verifyNone) {
  10238. DoCertFatalAlert(ssl, ret);
  10239. }
  10240. ssl->error = ret; /* Report SSL error */
  10241. if (args->lastErr == 0) {
  10242. args->lastErr = ret; /* save error from last time */
  10243. ret = 0; /* reset error */
  10244. }
  10245. }
  10246. FreeDecodedCert(args->dCert);
  10247. args->dCertInit = 0;
  10248. args->count--;
  10249. } /* while (count > 0 && !args->haveTrustPeer) */
  10250. } /* if (count > 0) */
  10251. /* Check for error */
  10252. if (ret != 0) {
  10253. goto exit_ppc;
  10254. }
  10255. /* Advance state and proceed */
  10256. ssl->options.asyncState = TLS_ASYNC_DO;
  10257. } /* case TLS_ASYNC_BUILD */
  10258. FALL_THROUGH;
  10259. case TLS_ASYNC_DO:
  10260. {
  10261. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  10262. if (args->count > 0) {
  10263. WOLFSSL_MSG("Verifying Peer's cert");
  10264. /* select peer cert (first one) */
  10265. args->certIdx = 0;
  10266. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  10267. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  10268. &subjectHash, &alreadySigner);
  10269. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  10270. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  10271. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  10272. if (ret == ASN_NO_SIGNER_E) {
  10273. WOLFSSL_MSG("try to load certificate if hash dir is set");
  10274. if (ssl->ctx->x509_store_pt != NULL) {
  10275. ret = LoadCertByIssuer(ssl->ctx->x509_store_pt,
  10276. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  10277. X509_LU_X509);
  10278. } else {
  10279. ret = LoadCertByIssuer(&ssl->ctx->x509_store,
  10280. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  10281. X509_LU_X509);
  10282. }
  10283. if (ret == WOLFSSL_SUCCESS) {
  10284. FreeDecodedCert(args->dCert);
  10285. args->dCertInit = 0;
  10286. /* once again */
  10287. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  10288. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  10289. &subjectHash, &alreadySigner);
  10290. } else
  10291. ret = ASN_NO_SIGNER_E;
  10292. }
  10293. #endif
  10294. #ifdef WOLFSSL_ASYNC_CRYPT
  10295. if (ret == WC_PENDING_E)
  10296. goto exit_ppc;
  10297. #endif
  10298. if (ret == 0) {
  10299. WOLFSSL_MSG("Verified Peer's cert");
  10300. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10301. ssl->peerVerifyRet = X509_V_OK;
  10302. #endif
  10303. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  10304. /* if using alternate chain, store the cert used */
  10305. if (ssl->options.usingAltCertChain) {
  10306. buffer* cert = &args->certs[args->certIdx];
  10307. AddSessionCertToChain(&ssl->session.altChain,
  10308. cert->buffer, cert->length);
  10309. }
  10310. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  10311. /* Check peer's certificate version number. TLS 1.2 / 1.3
  10312. * requires the clients certificate be version 3 unless a
  10313. * different version has been negotiated using RFC 7250 */
  10314. if ((ret == 0) &&
  10315. (ssl->options.side == WOLFSSL_SERVER_END)) {
  10316. if (args->dCert->version != WOLFSSL_X509_V3) {
  10317. WOLFSSL_MSG("Peers certificate was not version 3!");
  10318. args->lastErr = ASN_VERSION_E;
  10319. /* setting last error but not considering it fatal
  10320. * giving the user a chance to override */
  10321. }
  10322. }
  10323. /* check if fatal error */
  10324. if (args->verifyErr) {
  10325. args->fatal = 1;
  10326. ret = args->lastErr;
  10327. }
  10328. else {
  10329. args->fatal = 0;
  10330. }
  10331. }
  10332. else if (ret == ASN_PARSE_E || ret == BUFFER_E) {
  10333. WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR");
  10334. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
  10335. defined(OPENSSL_EXTRA_X509_SMALL)
  10336. DoCertFatalAlert(ssl, ret);
  10337. #endif
  10338. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10339. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  10340. #endif
  10341. args->fatal = 1;
  10342. }
  10343. else {
  10344. WOLFSSL_MSG("Failed to verify Peer's cert");
  10345. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10346. ssl->peerVerifyRet = X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  10347. #endif
  10348. if (ssl->verifyCallback) {
  10349. WOLFSSL_MSG(
  10350. "\tCallback override available, will continue");
  10351. /* check if fatal error */
  10352. args->fatal = (args->verifyErr) ? 1 : 0;
  10353. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  10354. defined(OPENSSL_EXTRA) || \
  10355. defined(OPENSSL_EXTRA_X509_SMALL)
  10356. if (args->fatal)
  10357. DoCertFatalAlert(ssl, ret);
  10358. #endif
  10359. }
  10360. else {
  10361. WOLFSSL_MSG("\tNo callback override available, fatal");
  10362. args->fatal = 1;
  10363. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  10364. defined(OPENSSL_EXTRA) || \
  10365. defined(OPENSSL_EXTRA_X509_SMALL)
  10366. DoCertFatalAlert(ssl, ret);
  10367. #endif
  10368. }
  10369. }
  10370. #ifdef HAVE_SECURE_RENEGOTIATION
  10371. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  10372. && ssl->secure_renegotiation
  10373. && ssl->secure_renegotiation->enabled) {
  10374. if (IsEncryptionOn(ssl, 0)) {
  10375. /* compare against previous time */
  10376. if (ssl->secure_renegotiation->subject_hash_set) {
  10377. if (XMEMCMP(args->dCert->subjectHash,
  10378. ssl->secure_renegotiation->subject_hash,
  10379. KEYID_SIZE) != 0) {
  10380. WOLFSSL_MSG(
  10381. "Peer sent different cert during scr, fatal");
  10382. args->fatal = 1;
  10383. ret = SCR_DIFFERENT_CERT_E;
  10384. }
  10385. }
  10386. }
  10387. /* cache peer's hash */
  10388. if (args->fatal == 0) {
  10389. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  10390. args->dCert->subjectHash, KEYID_SIZE);
  10391. ssl->secure_renegotiation->subject_hash_set = 1;
  10392. }
  10393. }
  10394. #endif /* HAVE_SECURE_RENEGOTIATION */
  10395. } /* if (count > 0) */
  10396. /* Check for error */
  10397. if (args->fatal && ret != 0) {
  10398. goto exit_ppc;
  10399. }
  10400. /* Advance state and proceed */
  10401. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  10402. } /* case TLS_ASYNC_DO */
  10403. FALL_THROUGH;
  10404. case TLS_ASYNC_VERIFY:
  10405. {
  10406. if (args->count > 0) {
  10407. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  10408. if (args->fatal == 0) {
  10409. int doLookup = 1;
  10410. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10411. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  10412. if (ssl->status_request) {
  10413. args->fatal = (TLSX_CSR_InitRequest(ssl->extensions,
  10414. args->dCert, ssl->heap) != 0);
  10415. doLookup = 0;
  10416. #if defined(WOLFSSL_TLS13)
  10417. if (ssl->options.tls1_3) {
  10418. TLSX* ext = TLSX_Find(ssl->extensions,
  10419. TLSX_STATUS_REQUEST);
  10420. if (ext != NULL) {
  10421. word32 idx = 0;
  10422. CertificateStatusRequest* csr =
  10423. (CertificateStatusRequest*)ext->data;
  10424. ret = ProcessCSR(ssl, csr->response.buffer,
  10425. &idx, csr->response.length);
  10426. if (ret < 0)
  10427. goto exit_ppc;
  10428. }
  10429. }
  10430. #endif
  10431. }
  10432. /* Ensure a stapling response was seen */
  10433. else if (ssl->options.tls1_3 &&
  10434. ssl->ctx->cm->ocspMustStaple) {
  10435. ret = OCSP_CERT_UNKNOWN;
  10436. goto exit_ppc;
  10437. }
  10438. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  10439. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10440. if (ssl->status_request_v2) {
  10441. args->fatal = (TLSX_CSR2_InitRequests(ssl->extensions,
  10442. args->dCert, 1, ssl->heap) != 0);
  10443. doLookup = 0;
  10444. }
  10445. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  10446. }
  10447. #ifdef HAVE_OCSP
  10448. if (doLookup && ssl->ctx->cm->ocspEnabled) {
  10449. WOLFSSL_MSG("Doing Leaf OCSP check");
  10450. ret = CheckCertOCSP_ex(ssl->ctx->cm->ocsp,
  10451. args->dCert, NULL, ssl);
  10452. #ifdef WOLFSSL_NONBLOCK_OCSP
  10453. if (ret == OCSP_WANT_READ) {
  10454. goto exit_ppc;
  10455. }
  10456. #endif
  10457. doLookup = (ret == OCSP_CERT_UNKNOWN);
  10458. if (ret != 0) {
  10459. WOLFSSL_MSG("\tOCSP Lookup not ok");
  10460. args->fatal = 0;
  10461. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10462. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  10463. #endif
  10464. }
  10465. }
  10466. #endif /* HAVE_OCSP */
  10467. #ifdef HAVE_CRL
  10468. if (doLookup && ssl->ctx->cm->crlEnabled) {
  10469. WOLFSSL_MSG("Doing Leaf CRL check");
  10470. ret = CheckCertCRL(ssl->ctx->cm->crl, args->dCert);
  10471. #ifdef WOLFSSL_NONBLOCK_OCSP
  10472. if (ret == OCSP_WANT_READ) {
  10473. goto exit_ppc;
  10474. }
  10475. #endif
  10476. if (ret != 0) {
  10477. WOLFSSL_MSG("\tCRL check not ok");
  10478. args->fatal = 0;
  10479. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10480. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  10481. #endif
  10482. }
  10483. }
  10484. #endif /* HAVE_CRL */
  10485. (void)doLookup;
  10486. }
  10487. #endif /* HAVE_OCSP || HAVE_CRL */
  10488. #ifdef KEEP_PEER_CERT
  10489. if (args->fatal == 0) {
  10490. int copyRet = 0;
  10491. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  10492. if (ssl->options.handShakeDone) {
  10493. FreeX509(&ssl->peerCert);
  10494. InitX509(&ssl->peerCert, 0, ssl->heap);
  10495. }
  10496. else
  10497. #endif
  10498. #ifdef HAVE_SECURE_RENEGOTIATION
  10499. if (ssl->secure_renegotiation &&
  10500. ssl->secure_renegotiation->enabled) {
  10501. /* free old peer cert */
  10502. FreeX509(&ssl->peerCert);
  10503. InitX509(&ssl->peerCert, 0, ssl->heap);
  10504. }
  10505. else
  10506. #endif
  10507. {
  10508. }
  10509. /* set X509 format for peer cert */
  10510. copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
  10511. if (copyRet == MEMORY_E) {
  10512. args->fatal = 1;
  10513. }
  10514. }
  10515. #endif /* KEEP_PEER_CERT */
  10516. #ifndef IGNORE_KEY_EXTENSIONS
  10517. #if defined(OPENSSL_EXTRA)
  10518. /* when compatibility layer is turned on and no verify is
  10519. * set then ignore the certificate key extension */
  10520. if (args->dCert->extKeyUsageSet &&
  10521. args->dCert->extKeyUsageCrit == 0 &&
  10522. ssl->options.verifyNone) {
  10523. WOLFSSL_MSG("Not verifying certificate key usage");
  10524. }
  10525. else
  10526. #endif
  10527. if (args->dCert->extKeyUsageSet) {
  10528. if ((ssl->specs.kea == rsa_kea) &&
  10529. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  10530. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  10531. ret = KEYUSE_ENCIPHER_E;
  10532. }
  10533. if ((ssl->specs.sig_algo == rsa_sa_algo ||
  10534. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  10535. !ssl->specs.static_ecdh)) &&
  10536. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  10537. WOLFSSL_MSG("KeyUse Digital Sig not set");
  10538. ret = KEYUSE_SIGNATURE_E;
  10539. }
  10540. }
  10541. #if defined(OPENSSL_EXTRA)
  10542. /* when compatibility layer is turned on and no verify is
  10543. * set then ignore the certificate key extension */
  10544. if (args->dCert->extExtKeyUsageSet &&
  10545. args->dCert->extExtKeyUsageCrit == 0 &&
  10546. ssl->options.verifyNone) {
  10547. WOLFSSL_MSG("Not verifying certificate ext key usage");
  10548. }
  10549. else
  10550. #endif
  10551. if (args->dCert->extExtKeyUsageSet) {
  10552. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10553. if ((args->dCert->extExtKeyUsage &
  10554. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  10555. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  10556. ret = EXTKEYUSE_AUTH_E;
  10557. }
  10558. }
  10559. else {
  10560. if ((args->dCert->extExtKeyUsage &
  10561. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  10562. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  10563. ret = EXTKEYUSE_AUTH_E;
  10564. }
  10565. }
  10566. }
  10567. #endif /* IGNORE_KEY_EXTENSIONS */
  10568. if (args->fatal) {
  10569. ssl->error = ret;
  10570. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10571. SendAlert(ssl, alert_fatal, bad_certificate);
  10572. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  10573. #endif
  10574. goto exit_ppc;
  10575. }
  10576. ssl->options.havePeerCert = 1;
  10577. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  10578. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  10579. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  10580. * are to be bound into a certificate, the subject
  10581. * alternative name extension MUST be used." */
  10582. if (args->dCert->altNames) {
  10583. if (CheckForAltNames(args->dCert,
  10584. (char*)ssl->buffers.domainName.buffer,
  10585. NULL) != 1) {
  10586. WOLFSSL_MSG("DomainName match on alt names failed");
  10587. /* try to get peer key still */
  10588. ret = DOMAIN_NAME_MISMATCH;
  10589. }
  10590. }
  10591. else {
  10592. if (MatchDomainName(
  10593. args->dCert->subjectCN,
  10594. args->dCert->subjectCNLen,
  10595. (char*)ssl->buffers.domainName.buffer) == 0) {
  10596. WOLFSSL_MSG("DomainName match on common name failed");
  10597. ret = DOMAIN_NAME_MISMATCH;
  10598. }
  10599. }
  10600. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  10601. /* Old behavior. */
  10602. if (MatchDomainName(args->dCert->subjectCN,
  10603. args->dCert->subjectCNLen,
  10604. (char*)ssl->buffers.domainName.buffer) == 0) {
  10605. WOLFSSL_MSG("DomainName match on common name failed");
  10606. if (CheckForAltNames(args->dCert,
  10607. (char*)ssl->buffers.domainName.buffer,
  10608. NULL) != 1) {
  10609. WOLFSSL_MSG(
  10610. "DomainName match on alt names failed too");
  10611. /* try to get peer key still */
  10612. ret = DOMAIN_NAME_MISMATCH;
  10613. }
  10614. }
  10615. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  10616. }
  10617. /* decode peer key */
  10618. switch (args->dCert->keyOID) {
  10619. #ifndef NO_RSA
  10620. case RSAk:
  10621. {
  10622. word32 keyIdx = 0;
  10623. int keyRet = 0;
  10624. if (ssl->peerRsaKey == NULL) {
  10625. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  10626. (void**)&ssl->peerRsaKey);
  10627. } else if (ssl->peerRsaKeyPresent) {
  10628. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  10629. ssl->peerRsaKey);
  10630. ssl->peerRsaKeyPresent = 0;
  10631. }
  10632. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  10633. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  10634. args->dCert->pubKeySize) != 0) {
  10635. ret = PEER_KEY_ERROR;
  10636. }
  10637. else {
  10638. ssl->peerRsaKeyPresent = 1;
  10639. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  10640. /* copy encrypted tsip key index into ssl object */
  10641. if (args->dCert->tsip_encRsaKeyIdx) {
  10642. if (!ssl->peerTsipEncRsaKeyIndex) {
  10643. ssl->peerTsipEncRsaKeyIndex = (byte*)XMALLOC(
  10644. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  10645. ssl->heap, DYNAMIC_TYPE_RSA);
  10646. if (!ssl->peerTsipEncRsaKeyIndex) {
  10647. args->lastErr = MEMORY_E;
  10648. goto exit_ppc;
  10649. }
  10650. }
  10651. XMEMCPY(ssl->peerTsipEncRsaKeyIndex,
  10652. args->dCert->tsip_encRsaKeyIdx,
  10653. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  10654. }
  10655. #endif
  10656. #ifdef HAVE_PK_CALLBACKS
  10657. #ifndef NO_RSA
  10658. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  10659. defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  10660. if (ssl->buffers.peerRsaKey.buffer) {
  10661. XFREE(ssl->buffers.peerRsaKey.buffer,
  10662. ssl->heap, DYNAMIC_TYPE_RSA);
  10663. ssl->buffers.peerRsaKey.buffer = NULL;
  10664. }
  10665. #endif
  10666. ssl->buffers.peerRsaKey.buffer =
  10667. (byte*)XMALLOC(args->dCert->pubKeySize,
  10668. ssl->heap, DYNAMIC_TYPE_RSA);
  10669. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  10670. ret = MEMORY_ERROR;
  10671. }
  10672. else {
  10673. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  10674. args->dCert->publicKey,
  10675. args->dCert->pubKeySize);
  10676. ssl->buffers.peerRsaKey.length =
  10677. args->dCert->pubKeySize;
  10678. }
  10679. #endif /* NO_RSA */
  10680. #endif /* HAVE_PK_CALLBACKS */
  10681. }
  10682. /* check size of peer RSA key */
  10683. if (ret == 0 && ssl->peerRsaKeyPresent &&
  10684. !ssl->options.verifyNone &&
  10685. wc_RsaEncryptSize(ssl->peerRsaKey)
  10686. < ssl->options.minRsaKeySz) {
  10687. ret = RSA_KEY_SIZE_E;
  10688. WOLFSSL_MSG("Peer RSA key is too small");
  10689. }
  10690. break;
  10691. }
  10692. #endif /* NO_RSA */
  10693. #ifdef HAVE_NTRU
  10694. case NTRUk:
  10695. {
  10696. if (args->dCert->pubKeySize > sizeof(ssl->peerNtruKey)) {
  10697. ret = PEER_KEY_ERROR;
  10698. }
  10699. else {
  10700. XMEMCPY(ssl->peerNtruKey, args->dCert->publicKey,
  10701. args->dCert->pubKeySize);
  10702. ssl->peerNtruKeyLen =
  10703. (word16)args->dCert->pubKeySize;
  10704. ssl->peerNtruKeyPresent = 1;
  10705. }
  10706. break;
  10707. }
  10708. #endif /* HAVE_NTRU */
  10709. #ifdef HAVE_ECC
  10710. case ECDSAk:
  10711. {
  10712. int keyRet = 0;
  10713. word32 idx = 0;
  10714. if (ssl->peerEccDsaKey == NULL) {
  10715. /* alloc/init on demand */
  10716. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  10717. (void**)&ssl->peerEccDsaKey);
  10718. } else if (ssl->peerEccDsaKeyPresent) {
  10719. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  10720. ssl->peerEccDsaKey);
  10721. ssl->peerEccDsaKeyPresent = 0;
  10722. }
  10723. if (keyRet != 0 ||
  10724. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  10725. ssl->peerEccDsaKey,
  10726. args->dCert->pubKeySize) != 0) {
  10727. ret = PEER_KEY_ERROR;
  10728. }
  10729. else {
  10730. ssl->peerEccDsaKeyPresent = 1;
  10731. #ifdef HAVE_PK_CALLBACKS
  10732. if (ssl->buffers.peerEccDsaKey.buffer)
  10733. XFREE(ssl->buffers.peerEccDsaKey.buffer,
  10734. ssl->heap, DYNAMIC_TYPE_ECC);
  10735. ssl->buffers.peerEccDsaKey.buffer =
  10736. (byte*)XMALLOC(args->dCert->pubKeySize,
  10737. ssl->heap, DYNAMIC_TYPE_ECC);
  10738. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  10739. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  10740. }
  10741. else {
  10742. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  10743. args->dCert->publicKey,
  10744. args->dCert->pubKeySize);
  10745. ssl->buffers.peerEccDsaKey.length =
  10746. args->dCert->pubKeySize;
  10747. }
  10748. #endif /* HAVE_PK_CALLBACKS */
  10749. }
  10750. /* check size of peer ECC key */
  10751. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  10752. !ssl->options.verifyNone &&
  10753. wc_ecc_size(ssl->peerEccDsaKey)
  10754. < ssl->options.minEccKeySz) {
  10755. ret = ECC_KEY_SIZE_E;
  10756. WOLFSSL_MSG("Peer ECC key is too small");
  10757. }
  10758. /* populate curve oid - if missing */
  10759. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  10760. ssl->ecdhCurveOID = args->dCert->pkCurveOID;
  10761. break;
  10762. }
  10763. #endif /* HAVE_ECC */
  10764. #ifdef HAVE_ED25519
  10765. case ED25519k:
  10766. {
  10767. int keyRet = 0;
  10768. if (ssl->peerEd25519Key == NULL) {
  10769. /* alloc/init on demand */
  10770. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  10771. (void**)&ssl->peerEd25519Key);
  10772. } else if (ssl->peerEd25519KeyPresent) {
  10773. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  10774. ssl->peerEd25519Key);
  10775. ssl->peerEd25519KeyPresent = 0;
  10776. }
  10777. if (keyRet != 0 ||
  10778. wc_ed25519_import_public(args->dCert->publicKey,
  10779. args->dCert->pubKeySize,
  10780. ssl->peerEd25519Key)
  10781. != 0) {
  10782. ret = PEER_KEY_ERROR;
  10783. }
  10784. else {
  10785. ssl->peerEd25519KeyPresent = 1;
  10786. #ifdef HAVE_PK_CALLBACKS
  10787. ssl->buffers.peerEd25519Key.buffer =
  10788. (byte*)XMALLOC(args->dCert->pubKeySize,
  10789. ssl->heap, DYNAMIC_TYPE_ED25519);
  10790. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  10791. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  10792. }
  10793. else {
  10794. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  10795. args->dCert->publicKey,
  10796. args->dCert->pubKeySize);
  10797. ssl->buffers.peerEd25519Key.length =
  10798. args->dCert->pubKeySize;
  10799. }
  10800. #endif /*HAVE_PK_CALLBACKS */
  10801. }
  10802. /* check size of peer ECC key */
  10803. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  10804. !ssl->options.verifyNone &&
  10805. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  10806. ret = ECC_KEY_SIZE_E;
  10807. WOLFSSL_MSG("Peer ECC key is too small");
  10808. }
  10809. /* populate curve oid - if missing */
  10810. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  10811. ssl->ecdhCurveOID = ECC_X25519_OID;
  10812. break;
  10813. }
  10814. #endif /* HAVE_ED25519 */
  10815. #ifdef HAVE_ED448
  10816. case ED448k:
  10817. {
  10818. int keyRet = 0;
  10819. if (ssl->peerEd448Key == NULL) {
  10820. /* alloc/init on demand */
  10821. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
  10822. (void**)&ssl->peerEd448Key);
  10823. } else if (ssl->peerEd448KeyPresent) {
  10824. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
  10825. ssl->peerEd448Key);
  10826. ssl->peerEd448KeyPresent = 0;
  10827. }
  10828. if (keyRet != 0 ||
  10829. wc_ed448_import_public(args->dCert->publicKey,
  10830. args->dCert->pubKeySize,
  10831. ssl->peerEd448Key) != 0) {
  10832. ret = PEER_KEY_ERROR;
  10833. }
  10834. else {
  10835. ssl->peerEd448KeyPresent = 1;
  10836. #ifdef HAVE_PK_CALLBACKS
  10837. ssl->buffers.peerEd448Key.buffer =
  10838. (byte*)XMALLOC(args->dCert->pubKeySize,
  10839. ssl->heap, DYNAMIC_TYPE_ED448);
  10840. if (ssl->buffers.peerEd448Key.buffer == NULL) {
  10841. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  10842. }
  10843. else {
  10844. XMEMCPY(ssl->buffers.peerEd448Key.buffer,
  10845. args->dCert->publicKey,
  10846. args->dCert->pubKeySize);
  10847. ssl->buffers.peerEd448Key.length =
  10848. args->dCert->pubKeySize;
  10849. }
  10850. #endif /*HAVE_PK_CALLBACKS */
  10851. }
  10852. /* check size of peer ECC key */
  10853. if (ret == 0 && ssl->peerEd448KeyPresent &&
  10854. !ssl->options.verifyNone &&
  10855. ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  10856. ret = ECC_KEY_SIZE_E;
  10857. WOLFSSL_MSG("Peer ECC key is too small");
  10858. }
  10859. /* populate curve oid - if missing */
  10860. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  10861. ssl->ecdhCurveOID = ECC_X448_OID;
  10862. break;
  10863. }
  10864. #endif /* HAVE_ED448 */
  10865. default:
  10866. break;
  10867. }
  10868. /* args->dCert free'd in function cleanup after callback */
  10869. } /* if (count > 0) */
  10870. /* Check for error */
  10871. if (args->fatal && ret != 0) {
  10872. goto exit_ppc;
  10873. }
  10874. /* Advance state and proceed */
  10875. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  10876. } /* case TLS_ASYNC_VERIFY */
  10877. FALL_THROUGH;
  10878. case TLS_ASYNC_FINALIZE:
  10879. {
  10880. /* load last error */
  10881. if (args->lastErr != 0 && ret == 0) {
  10882. ret = args->lastErr;
  10883. }
  10884. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10885. if (args->untrustedDepth > ssl->options.verifyDepth) {
  10886. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  10887. ret = MAX_CHAIN_ERROR;
  10888. }
  10889. #endif
  10890. /* Do verify callback */
  10891. ret = DoVerifyCallback(ssl->ctx->cm, ssl, ret, args);
  10892. if (ssl->options.verifyNone &&
  10893. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED)) {
  10894. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  10895. ret = ssl->error = 0;
  10896. }
  10897. if (ret != 0) {
  10898. if (!ssl->options.verifyNone) {
  10899. DoCertFatalAlert(ssl, ret);
  10900. }
  10901. ssl->error = ret; /* Report SSL error */
  10902. }
  10903. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  10904. ssl->options.serverState = SERVER_CERT_COMPLETE;
  10905. }
  10906. if (IsEncryptionOn(ssl, 0)) {
  10907. args->idx += ssl->keys.padSz;
  10908. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10909. if (ssl->options.startedETMRead)
  10910. args->idx += MacSize(ssl);
  10911. #endif
  10912. }
  10913. /* Advance state and proceed */
  10914. ssl->options.asyncState = TLS_ASYNC_END;
  10915. } /* case TLS_ASYNC_FINALIZE */
  10916. FALL_THROUGH;
  10917. case TLS_ASYNC_END:
  10918. {
  10919. /* Set final index */
  10920. *inOutIdx = args->idx;
  10921. break;
  10922. }
  10923. default:
  10924. ret = INPUT_CASE_ERROR;
  10925. break;
  10926. } /* switch(ssl->options.asyncState) */
  10927. exit_ppc:
  10928. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  10929. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  10930. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  10931. /* Mark message as not received so it can process again */
  10932. ssl->msgsReceived.got_certificate = 0;
  10933. return ret;
  10934. }
  10935. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  10936. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) || \
  10937. defined(WOLFSSL_SMALL_STACK)
  10938. if (args)
  10939. {
  10940. FreeProcPeerCertArgs(ssl, args);
  10941. }
  10942. #else
  10943. FreeProcPeerCertArgs(ssl, args);
  10944. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
  10945. #if defined(WOLFSSL_ASYNC_CRYPT)
  10946. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  10947. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  10948. ssl->nonblockarg = NULL;
  10949. #elif defined(WOLFSSL_SMALL_STACK)
  10950. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  10951. #endif
  10952. FreeKeyExchange(ssl);
  10953. return ret;
  10954. }
  10955. #endif
  10956. #ifndef WOLFSSL_NO_TLS12
  10957. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  10958. /* handle processing of certificate (11) */
  10959. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10960. word32 size)
  10961. {
  10962. int ret;
  10963. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  10964. WOLFSSL_ENTER("DoCertificate");
  10965. #ifdef SESSION_CERTS
  10966. /* Reset the session cert chain count in case the session resume failed. */
  10967. ssl->session.chain.count = 0;
  10968. #ifdef WOLFSSL_ALT_CERT_CHAINS
  10969. ssl->session.altChain.count = 0;
  10970. #endif
  10971. #endif /* SESSION_CERTS */
  10972. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  10973. #ifdef WOLFSSL_EXTRA_ALERTS
  10974. if (ret == BUFFER_ERROR || ret == ASN_PARSE_E)
  10975. SendAlert(ssl, alert_fatal, decode_error);
  10976. #endif
  10977. #ifdef OPENSSL_EXTRA
  10978. ssl->options.serverState = SERVER_CERT_COMPLETE;
  10979. #endif
  10980. WOLFSSL_LEAVE("DoCertificate", ret);
  10981. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  10982. return ret;
  10983. }
  10984. /* handle processing of certificate_status (22) */
  10985. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10986. word32 size)
  10987. {
  10988. int ret = 0;
  10989. byte status_type;
  10990. word32 status_length;
  10991. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  10992. WOLFSSL_ENTER("DoCertificateStatus");
  10993. if (size < ENUM_LEN + OPAQUE24_LEN)
  10994. return BUFFER_ERROR;
  10995. status_type = input[(*inOutIdx)++];
  10996. c24to32(input + *inOutIdx, &status_length);
  10997. *inOutIdx += OPAQUE24_LEN;
  10998. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  10999. return BUFFER_ERROR;
  11000. switch (status_type) {
  11001. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  11002. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  11003. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  11004. case WOLFSSL_CSR2_OCSP:
  11005. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  11006. break;
  11007. #endif
  11008. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  11009. case WOLFSSL_CSR2_OCSP_MULTI: {
  11010. OcspRequest* request;
  11011. word32 list_length = status_length;
  11012. byte idx = 0;
  11013. #ifdef WOLFSSL_SMALL_STACK
  11014. CertStatus* status;
  11015. OcspEntry* single;
  11016. OcspResponse* response;
  11017. #else
  11018. CertStatus status[1];
  11019. OcspEntry single[1];
  11020. OcspResponse response[1];
  11021. #endif
  11022. do {
  11023. if (ssl->status_request_v2) {
  11024. ssl->status_request_v2 = 0;
  11025. break;
  11026. }
  11027. return BUFFER_ERROR;
  11028. } while(0);
  11029. #ifdef WOLFSSL_SMALL_STACK
  11030. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  11031. DYNAMIC_TYPE_OCSP_STATUS);
  11032. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  11033. DYNAMIC_TYPE_OCSP_ENTRY);
  11034. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  11035. DYNAMIC_TYPE_OCSP_REQUEST);
  11036. if (status == NULL || single == NULL || response == NULL) {
  11037. if (status)
  11038. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  11039. if (single)
  11040. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  11041. if (response)
  11042. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  11043. return MEMORY_ERROR;
  11044. }
  11045. #endif
  11046. while (list_length && ret == 0) {
  11047. if (OPAQUE24_LEN > list_length) {
  11048. ret = BUFFER_ERROR;
  11049. break;
  11050. }
  11051. c24to32(input + *inOutIdx, &status_length);
  11052. *inOutIdx += OPAQUE24_LEN;
  11053. list_length -= OPAQUE24_LEN;
  11054. if (status_length > list_length) {
  11055. ret = BUFFER_ERROR;
  11056. break;
  11057. }
  11058. if (status_length) {
  11059. InitOcspResponse(response, single, status, input +*inOutIdx,
  11060. status_length, ssl->heap);
  11061. if ((OcspResponseDecode(response, ssl->ctx->cm, ssl->heap,
  11062. 0) != 0)
  11063. || (response->responseStatus != OCSP_SUCCESSFUL)
  11064. || (response->single->status->status != CERT_GOOD))
  11065. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11066. while (ret == 0) {
  11067. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  11068. ssl->extensions, status_type, idx++);
  11069. if (request == NULL)
  11070. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11071. else if (CompareOcspReqResp(request, response) == 0)
  11072. break;
  11073. else if (idx == 1) /* server cert must be OK */
  11074. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11075. }
  11076. FreeOcspResponse(response);
  11077. *inOutIdx += status_length;
  11078. list_length -= status_length;
  11079. }
  11080. }
  11081. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  11082. ssl->status_request_v2 = 0;
  11083. #endif
  11084. #ifdef WOLFSSL_SMALL_STACK
  11085. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  11086. XFREE(single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
  11087. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  11088. #endif
  11089. }
  11090. break;
  11091. #endif
  11092. default:
  11093. ret = BUFFER_ERROR;
  11094. }
  11095. if (ret != 0)
  11096. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  11097. if (IsEncryptionOn(ssl, 0)) {
  11098. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11099. if (ssl->options.startedETMRead) {
  11100. word32 digestSz = MacSize(ssl);
  11101. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  11102. return BUFFER_E;
  11103. *inOutIdx += ssl->keys.padSz + digestSz;
  11104. }
  11105. else
  11106. #endif
  11107. {
  11108. if (*inOutIdx + ssl->keys.padSz > size)
  11109. return BUFFER_E;
  11110. *inOutIdx += ssl->keys.padSz;
  11111. }
  11112. }
  11113. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  11114. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  11115. return ret;
  11116. }
  11117. #endif
  11118. #endif /* !WOLFSSL_NO_TLS12 */
  11119. #endif /* !NO_CERTS */
  11120. #ifndef WOLFSSL_NO_TLS12
  11121. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  11122. word32 size, word32 totalSz)
  11123. {
  11124. (void)input;
  11125. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  11126. WOLFSSL_ENTER("DoHelloRequest");
  11127. if (size) /* must be 0 */
  11128. return BUFFER_ERROR;
  11129. if (IsEncryptionOn(ssl, 0)) {
  11130. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  11131. * about padding */
  11132. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11133. if (ssl->options.startedETMRead) {
  11134. word32 digestSz = MacSize(ssl);
  11135. if (size != totalSz &&
  11136. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11137. return BUFFER_E;
  11138. *inOutIdx += ssl->keys.padSz + digestSz;
  11139. }
  11140. else
  11141. #endif
  11142. {
  11143. /* access beyond input + size should be checked against totalSz */
  11144. if (size != totalSz &&
  11145. *inOutIdx + ssl->keys.padSz > totalSz)
  11146. return BUFFER_E;
  11147. *inOutIdx += ssl->keys.padSz;
  11148. }
  11149. }
  11150. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11151. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  11152. return FATAL_ERROR;
  11153. }
  11154. #ifdef HAVE_SECURE_RENEGOTIATION
  11155. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  11156. ssl->secure_renegotiation->startScr = 1;
  11157. WOLFSSL_LEAVE("DoHelloRequest", 0);
  11158. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  11159. return 0;
  11160. }
  11161. #endif
  11162. else {
  11163. return SendAlert(ssl, alert_warning, no_renegotiation);
  11164. }
  11165. }
  11166. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  11167. word32 totalSz, int sniff)
  11168. {
  11169. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  11170. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  11171. WOLFSSL_ENTER("DoFinished");
  11172. if (finishedSz != size)
  11173. return BUFFER_ERROR;
  11174. /* check against totalSz
  11175. * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
  11176. * padding */
  11177. if (size != totalSz) {
  11178. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11179. if (ssl->options.startedETMRead) {
  11180. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  11181. return BUFFER_E;
  11182. }
  11183. else
  11184. #endif
  11185. {
  11186. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  11187. return BUFFER_E;
  11188. }
  11189. }
  11190. #ifdef WOLFSSL_CALLBACKS
  11191. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  11192. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  11193. #endif
  11194. if (sniff == NO_SNIFF) {
  11195. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  11196. WOLFSSL_MSG("Verify finished error on hashes");
  11197. #ifdef WOLFSSL_EXTRA_ALERTS
  11198. SendAlert(ssl, alert_fatal, decrypt_error);
  11199. #endif
  11200. return VERIFY_FINISHED_ERROR;
  11201. }
  11202. }
  11203. #ifdef HAVE_SECURE_RENEGOTIATION
  11204. if (ssl->secure_renegotiation) {
  11205. /* save peer's state */
  11206. if (ssl->options.side == WOLFSSL_CLIENT_END)
  11207. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  11208. input + *inOutIdx, TLS_FINISHED_SZ);
  11209. else
  11210. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  11211. input + *inOutIdx, TLS_FINISHED_SZ);
  11212. ssl->secure_renegotiation->verifySet = 1;
  11213. }
  11214. #endif
  11215. #ifdef OPENSSL_ALL
  11216. if (ssl->options.side == WOLFSSL_CLIENT_END)
  11217. XMEMCPY(ssl->serverFinished,
  11218. input + *inOutIdx, TLS_FINISHED_SZ);
  11219. else
  11220. XMEMCPY(ssl->clientFinished,
  11221. input + *inOutIdx, TLS_FINISHED_SZ);
  11222. #endif
  11223. /* force input exhaustion at ProcessReply consuming padSz */
  11224. *inOutIdx += size + ssl->keys.padSz;
  11225. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11226. if (ssl->options.startedETMRead)
  11227. *inOutIdx += MacSize(ssl);
  11228. #endif
  11229. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11230. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  11231. #ifdef OPENSSL_EXTRA
  11232. ssl->cbmode = SSL_CB_MODE_WRITE;
  11233. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  11234. #endif
  11235. if (!ssl->options.resuming) {
  11236. #ifdef OPENSSL_EXTRA
  11237. if (ssl->CBIS != NULL) {
  11238. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  11239. }
  11240. #endif
  11241. ssl->options.handShakeState = HANDSHAKE_DONE;
  11242. ssl->options.handShakeDone = 1;
  11243. }
  11244. }
  11245. else {
  11246. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  11247. #ifdef OPENSSL_EXTRA
  11248. ssl->cbmode = SSL_CB_MODE_READ;
  11249. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  11250. #endif
  11251. if (ssl->options.resuming) {
  11252. #ifdef OPENSSL_EXTRA
  11253. if (ssl->CBIS != NULL) {
  11254. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  11255. }
  11256. #endif
  11257. ssl->options.handShakeState = HANDSHAKE_DONE;
  11258. ssl->options.handShakeDone = 1;
  11259. }
  11260. }
  11261. #ifdef WOLFSSL_DTLS
  11262. if (ssl->options.dtls) {
  11263. if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
  11264. (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
  11265. DtlsMsgPoolReset(ssl);
  11266. ssl->keys.dtls_handshake_number = 0;
  11267. ssl->keys.dtls_expected_peer_handshake_number = 0;
  11268. }
  11269. }
  11270. #endif
  11271. WOLFSSL_LEAVE("DoFinished", 0);
  11272. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  11273. return 0;
  11274. }
  11275. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  11276. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  11277. {
  11278. /* verify not a duplicate, mark received, check state */
  11279. switch (type) {
  11280. #ifndef NO_WOLFSSL_CLIENT
  11281. case hello_request:
  11282. if (ssl->msgsReceived.got_hello_request) {
  11283. WOLFSSL_MSG("Duplicate HelloRequest received");
  11284. return DUPLICATE_MSG_E;
  11285. }
  11286. ssl->msgsReceived.got_hello_request = 1;
  11287. break;
  11288. #endif
  11289. #ifndef NO_WOLFSSL_SERVER
  11290. case client_hello:
  11291. if (ssl->msgsReceived.got_client_hello) {
  11292. WOLFSSL_MSG("Duplicate ClientHello received");
  11293. #ifdef WOLFSSL_EXTRA_ALERTS
  11294. SendAlert(ssl, alert_fatal, unexpected_message);
  11295. #endif
  11296. return DUPLICATE_MSG_E;
  11297. }
  11298. ssl->msgsReceived.got_client_hello = 1;
  11299. break;
  11300. #endif
  11301. #ifndef NO_WOLFSSL_CLIENT
  11302. case server_hello:
  11303. if (ssl->msgsReceived.got_server_hello) {
  11304. WOLFSSL_MSG("Duplicate ServerHello received");
  11305. return DUPLICATE_MSG_E;
  11306. }
  11307. ssl->msgsReceived.got_server_hello = 1;
  11308. break;
  11309. #endif
  11310. #ifndef NO_WOLFSSL_CLIENT
  11311. case hello_verify_request:
  11312. if (ssl->msgsReceived.got_hello_verify_request) {
  11313. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  11314. return DUPLICATE_MSG_E;
  11315. }
  11316. ssl->msgsReceived.got_hello_verify_request = 1;
  11317. break;
  11318. #endif
  11319. #ifndef NO_WOLFSSL_CLIENT
  11320. case session_ticket:
  11321. if (ssl->msgsReceived.got_session_ticket) {
  11322. WOLFSSL_MSG("Duplicate SessionTicket received");
  11323. return DUPLICATE_MSG_E;
  11324. }
  11325. ssl->msgsReceived.got_session_ticket = 1;
  11326. break;
  11327. #endif
  11328. case certificate:
  11329. if (ssl->msgsReceived.got_certificate) {
  11330. WOLFSSL_MSG("Duplicate Certificate received");
  11331. return DUPLICATE_MSG_E;
  11332. }
  11333. ssl->msgsReceived.got_certificate = 1;
  11334. #ifndef NO_WOLFSSL_CLIENT
  11335. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11336. if ( ssl->msgsReceived.got_server_hello == 0) {
  11337. WOLFSSL_MSG("No ServerHello before Cert");
  11338. return OUT_OF_ORDER_E;
  11339. }
  11340. }
  11341. #endif
  11342. #ifndef NO_WOLFSSL_SERVER
  11343. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11344. if ( ssl->msgsReceived.got_client_hello == 0) {
  11345. WOLFSSL_MSG("No ClientHello before Cert");
  11346. return OUT_OF_ORDER_E;
  11347. }
  11348. }
  11349. #endif
  11350. break;
  11351. #ifndef NO_WOLFSSL_CLIENT
  11352. case certificate_status:
  11353. if (ssl->msgsReceived.got_certificate_status) {
  11354. WOLFSSL_MSG("Duplicate CertificateSatatus received");
  11355. return DUPLICATE_MSG_E;
  11356. }
  11357. ssl->msgsReceived.got_certificate_status = 1;
  11358. if (ssl->msgsReceived.got_certificate == 0) {
  11359. WOLFSSL_MSG("No Certificate before CertificateStatus");
  11360. return OUT_OF_ORDER_E;
  11361. }
  11362. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  11363. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  11364. return OUT_OF_ORDER_E;
  11365. }
  11366. break;
  11367. #endif
  11368. #ifndef NO_WOLFSSL_CLIENT
  11369. case server_key_exchange:
  11370. if (ssl->msgsReceived.got_server_key_exchange) {
  11371. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  11372. return DUPLICATE_MSG_E;
  11373. }
  11374. ssl->msgsReceived.got_server_key_exchange = 1;
  11375. if (ssl->msgsReceived.got_server_hello == 0) {
  11376. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  11377. return OUT_OF_ORDER_E;
  11378. }
  11379. if (ssl->msgsReceived.got_certificate_status == 0) {
  11380. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  11381. if (ssl->status_request) {
  11382. int ret;
  11383. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  11384. if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0)
  11385. return ret;
  11386. }
  11387. #endif
  11388. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  11389. if (ssl->status_request_v2) {
  11390. int ret;
  11391. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  11392. if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0)
  11393. return ret;
  11394. }
  11395. #endif
  11396. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  11397. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  11398. /* Check that a status request extension was seen as the
  11399. * CertificateStatus wasn't when an OCSP staple is required.
  11400. */
  11401. if (
  11402. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  11403. !ssl->status_request &&
  11404. #endif
  11405. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  11406. !ssl->status_request_v2 &&
  11407. #endif
  11408. ssl->ctx->cm->ocspMustStaple) {
  11409. return OCSP_CERT_UNKNOWN;
  11410. }
  11411. #endif
  11412. }
  11413. break;
  11414. #endif
  11415. #ifndef NO_WOLFSSL_CLIENT
  11416. case certificate_request:
  11417. if (ssl->msgsReceived.got_certificate_request) {
  11418. WOLFSSL_MSG("Duplicate CertificateRequest received");
  11419. return DUPLICATE_MSG_E;
  11420. }
  11421. ssl->msgsReceived.got_certificate_request = 1;
  11422. break;
  11423. #endif
  11424. #ifndef NO_WOLFSSL_CLIENT
  11425. case server_hello_done:
  11426. if (ssl->msgsReceived.got_server_hello_done) {
  11427. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  11428. return DUPLICATE_MSG_E;
  11429. }
  11430. ssl->msgsReceived.got_server_hello_done = 1;
  11431. if (ssl->msgsReceived.got_certificate == 0) {
  11432. if (ssl->specs.kea == psk_kea ||
  11433. ssl->specs.kea == dhe_psk_kea ||
  11434. ssl->specs.kea == ecdhe_psk_kea ||
  11435. ssl->options.usingAnon_cipher) {
  11436. WOLFSSL_MSG("No Cert required");
  11437. } else {
  11438. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  11439. return OUT_OF_ORDER_E;
  11440. }
  11441. }
  11442. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  11443. int pskNoServerHint = 0; /* not required in this case */
  11444. #ifndef NO_PSK
  11445. if (ssl->specs.kea == psk_kea &&
  11446. ssl->arrays != NULL &&
  11447. ssl->arrays->server_hint[0] == 0)
  11448. pskNoServerHint = 1;
  11449. #endif
  11450. if (ssl->specs.static_ecdh == 1 ||
  11451. ssl->specs.kea == rsa_kea ||
  11452. ssl->specs.kea == ntru_kea ||
  11453. pskNoServerHint) {
  11454. WOLFSSL_MSG("No KeyExchange required");
  11455. } else {
  11456. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  11457. return OUT_OF_ORDER_E;
  11458. }
  11459. }
  11460. break;
  11461. #endif
  11462. #ifndef NO_WOLFSSL_SERVER
  11463. case certificate_verify:
  11464. if (ssl->msgsReceived.got_certificate_verify) {
  11465. WOLFSSL_MSG("Duplicate CertificateVerify received");
  11466. return DUPLICATE_MSG_E;
  11467. }
  11468. ssl->msgsReceived.got_certificate_verify = 1;
  11469. if ( ssl->msgsReceived.got_certificate == 0) {
  11470. WOLFSSL_MSG("No Cert before CertVerify");
  11471. return OUT_OF_ORDER_E;
  11472. }
  11473. break;
  11474. #endif
  11475. #ifndef NO_WOLFSSL_SERVER
  11476. case client_key_exchange:
  11477. if (ssl->msgsReceived.got_client_key_exchange) {
  11478. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  11479. #ifdef WOLFSSL_EXTRA_ALERTS
  11480. SendAlert(ssl, alert_fatal, unexpected_message);
  11481. #endif
  11482. return DUPLICATE_MSG_E;
  11483. }
  11484. ssl->msgsReceived.got_client_key_exchange = 1;
  11485. if (ssl->msgsReceived.got_client_hello == 0) {
  11486. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  11487. return OUT_OF_ORDER_E;
  11488. }
  11489. break;
  11490. #endif
  11491. case finished:
  11492. if (ssl->msgsReceived.got_finished) {
  11493. WOLFSSL_MSG("Duplicate Finished received");
  11494. return DUPLICATE_MSG_E;
  11495. }
  11496. #ifdef WOLFSSL_DTLS
  11497. if (ssl->options.dtls) {
  11498. if (ssl->keys.curEpoch == 0) {
  11499. WOLFSSL_MSG("Finished received with epoch 0");
  11500. return SEQUENCE_ERROR;
  11501. }
  11502. }
  11503. #endif
  11504. ssl->msgsReceived.got_finished = 1;
  11505. if (ssl->msgsReceived.got_change_cipher == 0) {
  11506. WOLFSSL_MSG("Finished received before ChangeCipher");
  11507. #ifdef WOLFSSL_EXTRA_ALERTS
  11508. SendAlert(ssl, alert_fatal, unexpected_message);
  11509. #endif
  11510. return NO_CHANGE_CIPHER_E;
  11511. }
  11512. break;
  11513. case change_cipher_hs:
  11514. if (ssl->msgsReceived.got_change_cipher) {
  11515. WOLFSSL_MSG("Duplicate ChangeCipher received");
  11516. return DUPLICATE_MSG_E;
  11517. }
  11518. /* DTLS is going to ignore the CCS message if the client key
  11519. * exchange message wasn't received yet. */
  11520. if (!ssl->options.dtls)
  11521. ssl->msgsReceived.got_change_cipher = 1;
  11522. #ifndef NO_WOLFSSL_CLIENT
  11523. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11524. if (!ssl->options.resuming) {
  11525. if (ssl->msgsReceived.got_server_hello_done == 0) {
  11526. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  11527. return OUT_OF_ORDER_E;
  11528. }
  11529. }
  11530. else {
  11531. if (ssl->msgsReceived.got_server_hello == 0) {
  11532. WOLFSSL_MSG("No ServerHello before ChangeCipher on Resume");
  11533. return OUT_OF_ORDER_E;
  11534. }
  11535. }
  11536. #ifdef HAVE_SESSION_TICKET
  11537. if (ssl->expect_session_ticket) {
  11538. WOLFSSL_MSG("Expected session ticket missing");
  11539. #ifdef WOLFSSL_DTLS
  11540. if (ssl->options.dtls)
  11541. return OUT_OF_ORDER_E;
  11542. #endif
  11543. return SESSION_TICKET_EXPECT_E;
  11544. }
  11545. #endif
  11546. }
  11547. #endif
  11548. #ifndef NO_WOLFSSL_SERVER
  11549. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11550. if (!ssl->options.resuming &&
  11551. ssl->msgsReceived.got_client_key_exchange == 0) {
  11552. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  11553. #ifdef WOLFSSL_EXTRA_ALERTS
  11554. SendAlert(ssl, alert_fatal, unexpected_message);
  11555. #endif
  11556. return OUT_OF_ORDER_E;
  11557. }
  11558. #ifndef NO_CERTS
  11559. if (ssl->options.verifyPeer &&
  11560. ssl->options.havePeerCert) {
  11561. if (!ssl->options.havePeerVerify ||
  11562. !ssl->msgsReceived.got_certificate_verify) {
  11563. WOLFSSL_MSG("client didn't send cert verify");
  11564. #ifdef WOLFSSL_DTLS
  11565. if (ssl->options.dtls)
  11566. return OUT_OF_ORDER_E;
  11567. #endif
  11568. return NO_PEER_VERIFY;
  11569. }
  11570. }
  11571. #endif
  11572. }
  11573. #endif
  11574. if (ssl->options.dtls)
  11575. ssl->msgsReceived.got_change_cipher = 1;
  11576. break;
  11577. default:
  11578. WOLFSSL_MSG("Unknown message type");
  11579. return SANITY_MSG_E;
  11580. }
  11581. return 0;
  11582. }
  11583. static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11584. byte type, word32 size, word32 totalSz)
  11585. {
  11586. int ret = 0;
  11587. word32 expectedIdx;
  11588. WOLFSSL_ENTER("DoHandShakeMsgType");
  11589. #ifdef WOLFSSL_TLS13
  11590. if (type == hello_retry_request) {
  11591. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  11592. totalSz);
  11593. }
  11594. #endif
  11595. /* make sure can read the message */
  11596. if (*inOutIdx + size > totalSz) {
  11597. WOLFSSL_MSG("Incomplete Data");
  11598. return INCOMPLETE_DATA;
  11599. }
  11600. expectedIdx = *inOutIdx + size +
  11601. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  11602. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11603. if (ssl->options.startedETMRead && ssl->keys.encryptionOn)
  11604. expectedIdx += MacSize(ssl);
  11605. #endif
  11606. #if !defined(NO_WOLFSSL_SERVER) && \
  11607. defined(HAVE_SECURE_RENEGOTIATION) && \
  11608. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  11609. if (ssl->options.handShakeDone && type == client_hello &&
  11610. ssl->secure_renegotiation &&
  11611. ssl->secure_renegotiation->enabled)
  11612. {
  11613. WOLFSSL_MSG("Reset handshake state");
  11614. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  11615. ssl->options.serverState = NULL_STATE;
  11616. ssl->options.clientState = NULL_STATE;
  11617. ssl->options.connectState = CONNECT_BEGIN;
  11618. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  11619. ssl->options.handShakeState = NULL_STATE;
  11620. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  11621. ret = InitHandshakeHashes(ssl);
  11622. if (ret != 0)
  11623. return ret;
  11624. }
  11625. #endif
  11626. /* sanity check msg received */
  11627. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  11628. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  11629. return ret;
  11630. }
  11631. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  11632. /* add name later, add on record and handshake header part back on */
  11633. if (ssl->toInfoOn) {
  11634. int add = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  11635. AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - add,
  11636. size + add, READ_PROTO, ssl->heap);
  11637. #ifdef WOLFSSL_CALLBACKS
  11638. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  11639. #endif
  11640. }
  11641. #endif
  11642. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  11643. WOLFSSL_MSG("HandShake message after handshake complete");
  11644. SendAlert(ssl, alert_fatal, unexpected_message);
  11645. return OUT_OF_ORDER_E;
  11646. }
  11647. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  11648. ssl->options.serverState == NULL_STATE && type != server_hello) {
  11649. WOLFSSL_MSG("First server message not server hello");
  11650. SendAlert(ssl, alert_fatal, unexpected_message);
  11651. return OUT_OF_ORDER_E;
  11652. }
  11653. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  11654. type == server_hello_done &&
  11655. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  11656. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  11657. SendAlert(ssl, alert_fatal, unexpected_message);
  11658. return OUT_OF_ORDER_E;
  11659. }
  11660. if (ssl->options.side == WOLFSSL_SERVER_END &&
  11661. ssl->options.clientState == NULL_STATE && type != client_hello) {
  11662. WOLFSSL_MSG("First client message not client hello");
  11663. SendAlert(ssl, alert_fatal, unexpected_message);
  11664. return OUT_OF_ORDER_E;
  11665. }
  11666. /* above checks handshake state */
  11667. /* hello_request not hashed */
  11668. /* Also, skip hashing the client_hello message here for DTLS. It will be
  11669. * hashed later if the DTLS cookie is correct. */
  11670. if (type != hello_request &&
  11671. !(IsDtlsNotSctpMode(ssl) && type == client_hello)
  11672. #ifdef WOLFSSL_ASYNC_CRYPT
  11673. && ssl->error != WC_PENDING_E
  11674. #endif
  11675. #ifdef WOLFSSL_NONBLOCK_OCSP
  11676. && ssl->error != OCSP_WANT_READ
  11677. #endif
  11678. ) {
  11679. ret = HashInput(ssl, input + *inOutIdx, size);
  11680. if (ret != 0) {
  11681. WOLFSSL_MSG("Incomplete handshake hashes");
  11682. return ret;
  11683. }
  11684. }
  11685. #ifdef OPENSSL_EXTRA
  11686. if (ssl->CBIS != NULL){
  11687. ssl->cbmode = SSL_CB_MODE_READ;
  11688. ssl->cbtype = type;
  11689. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  11690. }
  11691. #endif
  11692. switch (type) {
  11693. case hello_request:
  11694. WOLFSSL_MSG("processing hello request");
  11695. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  11696. break;
  11697. #ifndef NO_WOLFSSL_CLIENT
  11698. case hello_verify_request:
  11699. WOLFSSL_MSG("processing hello verify request");
  11700. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  11701. if (IsEncryptionOn(ssl, 0)) {
  11702. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11703. if (ssl->options.startedETMRead) {
  11704. word32 digestSz = MacSize(ssl);
  11705. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11706. return BUFFER_E;
  11707. *inOutIdx += ssl->keys.padSz + digestSz;
  11708. }
  11709. else
  11710. #endif
  11711. {
  11712. /* access beyond input + size should be checked against totalSz
  11713. */
  11714. if (*inOutIdx + ssl->keys.padSz > totalSz)
  11715. return BUFFER_E;
  11716. *inOutIdx += ssl->keys.padSz;
  11717. }
  11718. }
  11719. break;
  11720. case server_hello:
  11721. WOLFSSL_MSG("processing server hello");
  11722. ret = DoServerHello(ssl, input, inOutIdx, size);
  11723. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  11724. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  11725. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  11726. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  11727. IsAtLeastTLSv1_3(ssl->version)) {
  11728. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11729. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  11730. #endif
  11731. {
  11732. ssl->options.cacheMessages = 0;
  11733. if (ssl->hsHashes->messages != NULL) {
  11734. XFREE(ssl->hsHashes->messages, ssl->heap,
  11735. DYNAMIC_TYPE_HASHES);
  11736. ssl->hsHashes->messages = NULL;
  11737. }
  11738. }
  11739. }
  11740. #endif
  11741. break;
  11742. #ifndef NO_CERTS
  11743. case certificate_request:
  11744. WOLFSSL_MSG("processing certificate request");
  11745. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  11746. break;
  11747. #endif
  11748. case server_key_exchange:
  11749. WOLFSSL_MSG("processing server key exchange");
  11750. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  11751. break;
  11752. #ifdef HAVE_SESSION_TICKET
  11753. case session_ticket:
  11754. WOLFSSL_MSG("processing session ticket");
  11755. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  11756. break;
  11757. #endif /* HAVE_SESSION_TICKET */
  11758. #endif
  11759. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  11760. !defined(WOLFSSL_NO_CLIENT_AUTH))
  11761. case certificate:
  11762. WOLFSSL_MSG("processing certificate");
  11763. ret = DoCertificate(ssl, input, inOutIdx, size);
  11764. break;
  11765. case certificate_status:
  11766. WOLFSSL_MSG("processing certificate status");
  11767. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  11768. break;
  11769. #endif
  11770. case server_hello_done:
  11771. WOLFSSL_MSG("processing server hello done");
  11772. #ifdef WOLFSSL_CALLBACKS
  11773. if (ssl->hsInfoOn)
  11774. AddPacketName(ssl, "ServerHelloDone");
  11775. if (ssl->toInfoOn)
  11776. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  11777. #endif
  11778. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  11779. if (IsEncryptionOn(ssl, 0)) {
  11780. *inOutIdx += ssl->keys.padSz;
  11781. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11782. if (ssl->options.startedETMRead)
  11783. *inOutIdx += MacSize(ssl);
  11784. #endif
  11785. }
  11786. if (ssl->options.resuming) {
  11787. WOLFSSL_MSG("Not resuming as thought");
  11788. ssl->options.resuming = 0;
  11789. }
  11790. break;
  11791. case finished:
  11792. WOLFSSL_MSG("processing finished");
  11793. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  11794. break;
  11795. #ifndef NO_WOLFSSL_SERVER
  11796. case client_hello:
  11797. WOLFSSL_MSG("processing client hello");
  11798. ret = DoClientHello(ssl, input, inOutIdx, size);
  11799. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  11800. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  11801. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  11802. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  11803. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  11804. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11805. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  11806. #endif
  11807. {
  11808. ssl->options.cacheMessages = 0;
  11809. if (ssl->hsHashes->messages != NULL) {
  11810. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  11811. ssl->hsHashes->messages = NULL;
  11812. }
  11813. }
  11814. }
  11815. #endif
  11816. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  11817. * about padding */
  11818. if (IsEncryptionOn(ssl, 0)) {
  11819. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11820. if (ssl->options.startedETMRead) {
  11821. word32 digestSz = MacSize(ssl);
  11822. if (size != totalSz &&
  11823. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11824. return BUFFER_E;
  11825. *inOutIdx += ssl->keys.padSz + digestSz;
  11826. }
  11827. else
  11828. #endif
  11829. {
  11830. /* access beyond input + size should be checked against totalSz
  11831. */
  11832. if (size != totalSz &&
  11833. *inOutIdx + ssl->keys.padSz > totalSz)
  11834. return BUFFER_E;
  11835. *inOutIdx += ssl->keys.padSz;
  11836. }
  11837. }
  11838. break;
  11839. case client_key_exchange:
  11840. WOLFSSL_MSG("processing client key exchange");
  11841. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  11842. break;
  11843. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  11844. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  11845. case certificate_verify:
  11846. WOLFSSL_MSG("processing certificate verify");
  11847. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  11848. break;
  11849. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  11850. #endif /* !NO_WOLFSSL_SERVER */
  11851. default:
  11852. WOLFSSL_MSG("Unknown handshake message type");
  11853. ret = UNKNOWN_HANDSHAKE_TYPE;
  11854. break;
  11855. }
  11856. if (ret == 0 && expectedIdx != *inOutIdx) {
  11857. WOLFSSL_MSG("Extra data in handshake message");
  11858. if (!ssl->options.dtls)
  11859. SendAlert(ssl, alert_fatal, decode_error);
  11860. ret = DECODE_E;
  11861. }
  11862. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag
  11863. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11864. /* do not shrink input for async or non-block */
  11865. && ssl->error != WC_PENDING_E && ssl->error != OCSP_WANT_READ
  11866. #endif
  11867. ) {
  11868. if (IsEncryptionOn(ssl, 0)) {
  11869. word32 extra = ssl->keys.padSz;
  11870. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11871. if (ssl->options.startedETMRead)
  11872. extra += MacSize(ssl);
  11873. #endif
  11874. if (extra > ssl->buffers.inputBuffer.idx)
  11875. return BUFFER_E;
  11876. ssl->buffers.inputBuffer.idx -= extra;
  11877. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  11878. ssl->buffers.inputBuffer.idx += extra;
  11879. }
  11880. else {
  11881. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  11882. }
  11883. }
  11884. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11885. /* if async, offset index so this msg will be processed again */
  11886. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  11887. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  11888. #ifdef WOLFSSL_DTLS
  11889. if (ssl->options.dtls) {
  11890. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  11891. }
  11892. #endif
  11893. }
  11894. /* make sure async error is cleared */
  11895. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  11896. ssl->error = 0;
  11897. }
  11898. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  11899. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  11900. return ret;
  11901. }
  11902. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11903. word32 totalSz)
  11904. {
  11905. int ret = 0;
  11906. word32 inputLength;
  11907. WOLFSSL_ENTER("DoHandShakeMsg()");
  11908. if (ssl->arrays == NULL) {
  11909. byte type;
  11910. word32 size;
  11911. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0)
  11912. return PARSE_ERROR;
  11913. ssl->options.handShakeState = type;
  11914. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  11915. }
  11916. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  11917. /* If there is a pending fragmented handshake message,
  11918. * pending message size will be non-zero. */
  11919. if (ssl->arrays->pendingMsgSz == 0) {
  11920. byte type;
  11921. word32 size;
  11922. if (GetHandShakeHeader(ssl,input, inOutIdx, &type, &size, totalSz) != 0)
  11923. return PARSE_ERROR;
  11924. /* Cap the maximum size of a handshake message to something reasonable.
  11925. * By default is the maximum size of a certificate message assuming
  11926. * nine 2048-bit RSA certificates in the chain. */
  11927. if (size > MAX_HANDSHAKE_SZ) {
  11928. WOLFSSL_MSG("Handshake message too large");
  11929. return HANDSHAKE_SIZE_ERROR;
  11930. }
  11931. /* size is the size of the certificate message payload */
  11932. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  11933. ssl->arrays->pendingMsgType = type;
  11934. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  11935. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  11936. ssl->heap,
  11937. DYNAMIC_TYPE_ARRAYS);
  11938. if (ssl->arrays->pendingMsg == NULL)
  11939. return MEMORY_E;
  11940. XMEMCPY(ssl->arrays->pendingMsg,
  11941. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  11942. inputLength);
  11943. ssl->arrays->pendingMsgOffset = inputLength;
  11944. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  11945. return 0;
  11946. }
  11947. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  11948. }
  11949. else {
  11950. word32 pendSz =
  11951. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  11952. /* Catch the case where there may be the remainder of a fragmented
  11953. * handshake message and the next handshake message in the same
  11954. * record. */
  11955. if (inputLength > pendSz)
  11956. inputLength = pendSz;
  11957. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  11958. input + *inOutIdx, inputLength);
  11959. ssl->arrays->pendingMsgOffset += inputLength;
  11960. *inOutIdx += inputLength;
  11961. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  11962. {
  11963. word32 idx = HANDSHAKE_HEADER_SZ;
  11964. ret = DoHandShakeMsgType(ssl,
  11965. ssl->arrays->pendingMsg,
  11966. &idx, ssl->arrays->pendingMsgType,
  11967. ssl->arrays->pendingMsgSz - idx,
  11968. ssl->arrays->pendingMsgSz);
  11969. #ifdef WOLFSSL_ASYNC_CRYPT
  11970. if (ret == WC_PENDING_E) {
  11971. /* setup to process fragment again */
  11972. ssl->arrays->pendingMsgOffset -= inputLength;
  11973. *inOutIdx -= inputLength;
  11974. }
  11975. else
  11976. #endif
  11977. {
  11978. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  11979. ssl->arrays->pendingMsg = NULL;
  11980. ssl->arrays->pendingMsgSz = 0;
  11981. }
  11982. }
  11983. }
  11984. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  11985. return ret;
  11986. }
  11987. #endif /* !WOLFSSL_NO_TLS12 */
  11988. #ifdef WOLFSSL_DTLS
  11989. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl)
  11990. {
  11991. word32* window;
  11992. word16 cur_hi, next_hi;
  11993. word32 cur_lo, next_lo, diff;
  11994. int curLT;
  11995. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  11996. if (!ssl->options.haveMcast)
  11997. peerSeq = ssl->keys.peerSeq;
  11998. else {
  11999. #ifdef WOLFSSL_MULTICAST
  12000. WOLFSSL_DTLS_PEERSEQ* p;
  12001. int i;
  12002. for (i = 0, p = ssl->keys.peerSeq;
  12003. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  12004. i++, p++) {
  12005. if (p->peerId == ssl->keys.curPeerId) {
  12006. peerSeq = p;
  12007. break;
  12008. }
  12009. }
  12010. #endif
  12011. }
  12012. if (peerSeq == NULL) {
  12013. WOLFSSL_MSG("Could not find peer sequence");
  12014. return 0;
  12015. }
  12016. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  12017. next_hi = peerSeq->nextSeq_hi;
  12018. next_lo = peerSeq->nextSeq_lo;
  12019. window = peerSeq->window;
  12020. }
  12021. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  12022. next_hi = peerSeq->prevSeq_hi;
  12023. next_lo = peerSeq->prevSeq_lo;
  12024. window = peerSeq->prevWindow;
  12025. }
  12026. else {
  12027. return 0;
  12028. }
  12029. cur_hi = ssl->keys.curSeq_hi;
  12030. cur_lo = ssl->keys.curSeq_lo;
  12031. /* If the difference between next and cur is > 2^32, way outside window. */
  12032. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  12033. WOLFSSL_MSG("Current record from way too far in the future.");
  12034. return 0;
  12035. }
  12036. if (cur_hi == next_hi) {
  12037. curLT = cur_lo < next_lo;
  12038. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  12039. }
  12040. else {
  12041. curLT = cur_hi < next_hi;
  12042. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  12043. }
  12044. /* Check to see that the next value is greater than the number of messages
  12045. * trackable in the window, and that the difference between the next
  12046. * expected sequence number and the received sequence number is inside the
  12047. * window. */
  12048. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  12049. curLT && (diff > DTLS_SEQ_BITS)) {
  12050. WOLFSSL_MSG("Current record sequence number from the past.");
  12051. return 0;
  12052. }
  12053. #ifdef WOLFSSL_DTLS_DISALLOW_FUTURE
  12054. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  12055. WOLFSSL_MSG("Rejecting message too far into the future.");
  12056. return 0;
  12057. }
  12058. #endif
  12059. else if (curLT) {
  12060. word32 idx;
  12061. word32 newDiff;
  12062. if (diff == 0) {
  12063. WOLFSSL_MSG("DTLS sanity check failed");
  12064. return 0;
  12065. }
  12066. diff--;
  12067. idx = diff / DTLS_WORD_BITS;
  12068. newDiff = diff % DTLS_WORD_BITS;
  12069. /* verify idx is valid for window array */
  12070. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  12071. WOLFSSL_MSG("Invalid DTLS windows index");
  12072. return 0;
  12073. }
  12074. if (window[idx] & (1 << newDiff)) {
  12075. WOLFSSL_MSG("Current record sequence number already received.");
  12076. return 0;
  12077. }
  12078. }
  12079. return 1;
  12080. }
  12081. #ifdef WOLFSSL_MULTICAST
  12082. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  12083. word32 second, word32 high)
  12084. {
  12085. word32 newCur = 0;
  12086. if (cur < first)
  12087. newCur = first;
  12088. else if (cur < second)
  12089. newCur = second;
  12090. else if (cur < high)
  12091. newCur = high;
  12092. return newCur;
  12093. }
  12094. #endif /* WOLFSSL_MULTICAST */
  12095. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl)
  12096. {
  12097. word32* window;
  12098. word32* next_lo;
  12099. word16* next_hi;
  12100. int curLT;
  12101. word32 cur_lo, diff;
  12102. word16 cur_hi;
  12103. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  12104. cur_hi = ssl->keys.curSeq_hi;
  12105. cur_lo = ssl->keys.curSeq_lo;
  12106. #ifdef WOLFSSL_MULTICAST
  12107. if (ssl->options.haveMcast) {
  12108. WOLFSSL_DTLS_PEERSEQ* p;
  12109. int i;
  12110. peerSeq = NULL;
  12111. for (i = 0, p = ssl->keys.peerSeq;
  12112. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  12113. i++, p++) {
  12114. if (p->peerId == ssl->keys.curPeerId) {
  12115. peerSeq = p;
  12116. break;
  12117. }
  12118. }
  12119. if (peerSeq == NULL) {
  12120. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  12121. return 0;
  12122. }
  12123. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  12124. int cbError = 0;
  12125. if (ssl->ctx->mcastHwCb)
  12126. cbError = ssl->ctx->mcastHwCb(p->peerId,
  12127. ssl->ctx->mcastMaxSeq,
  12128. cur_lo, ssl->mcastHwCbCtx);
  12129. if (cbError) {
  12130. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  12131. return MCAST_HIGHWATER_CB_E;
  12132. }
  12133. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  12134. ssl->ctx->mcastFirstSeq,
  12135. ssl->ctx->mcastSecondSeq,
  12136. ssl->ctx->mcastMaxSeq);
  12137. }
  12138. }
  12139. #endif
  12140. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  12141. next_hi = &peerSeq->nextSeq_hi;
  12142. next_lo = &peerSeq->nextSeq_lo;
  12143. window = peerSeq->window;
  12144. }
  12145. else {
  12146. next_hi = &peerSeq->prevSeq_hi;
  12147. next_lo = &peerSeq->prevSeq_lo;
  12148. window = peerSeq->prevWindow;
  12149. }
  12150. if (cur_hi == *next_hi) {
  12151. curLT = cur_lo < *next_lo;
  12152. diff = curLT ? *next_lo - cur_lo - 1 : cur_lo - *next_lo + 1;
  12153. }
  12154. else {
  12155. curLT = cur_hi < *next_hi;
  12156. diff = curLT ? cur_lo - *next_lo - 1 : *next_lo - cur_lo + 1;
  12157. }
  12158. if (curLT) {
  12159. word32 idx = diff / DTLS_WORD_BITS;
  12160. word32 newDiff = diff % DTLS_WORD_BITS;
  12161. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  12162. window[idx] |= (1 << newDiff);
  12163. }
  12164. else {
  12165. if (diff >= DTLS_SEQ_BITS)
  12166. XMEMSET(window, 0, DTLS_SEQ_SZ);
  12167. else {
  12168. word32 idx, newDiff, temp, i;
  12169. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  12170. temp = 0;
  12171. idx = diff / DTLS_WORD_BITS;
  12172. newDiff = diff % DTLS_WORD_BITS;
  12173. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  12174. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  12175. if (i < idx)
  12176. window[i] = 0;
  12177. else {
  12178. temp |= (oldWindow[i-idx] << newDiff);
  12179. window[i] = temp;
  12180. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - newDiff - 1);
  12181. }
  12182. }
  12183. }
  12184. window[0] |= 1;
  12185. *next_lo = cur_lo + 1;
  12186. if (*next_lo < cur_lo)
  12187. (*next_hi)++;
  12188. }
  12189. return 1;
  12190. }
  12191. static int DtlsMsgDrain(WOLFSSL* ssl)
  12192. {
  12193. DtlsMsg* item = ssl->dtls_rx_msg_list;
  12194. int ret = 0;
  12195. WOLFSSL_ENTER("DtlsMsgDrain()");
  12196. /* While there is an item in the store list, and it is the expected
  12197. * message, and it is complete, and there hasn't been an error in the
  12198. * last message... */
  12199. while (item != NULL &&
  12200. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  12201. item->fragSz == item->sz &&
  12202. ret == 0) {
  12203. word32 idx = 0;
  12204. if ((ret = DoHandShakeMsgType(ssl, item->msg, &idx, item->type,
  12205. item->sz, item->sz)) == 0) {
  12206. if (item->type != finished)
  12207. ssl->keys.dtls_expected_peer_handshake_number++;
  12208. DtlsTxMsgListClean(ssl);
  12209. }
  12210. #ifdef WOLFSSL_ASYNC_CRYPT
  12211. if (ret == WC_PENDING_E) {
  12212. break;
  12213. }
  12214. #endif
  12215. ssl->dtls_rx_msg_list = item->next;
  12216. DtlsMsgDelete(item, ssl->heap);
  12217. item = ssl->dtls_rx_msg_list;
  12218. ssl->dtls_rx_msg_list_sz--;
  12219. }
  12220. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  12221. return ret;
  12222. }
  12223. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12224. word32 totalSz)
  12225. {
  12226. byte type;
  12227. word32 size;
  12228. word32 fragOffset, fragSz;
  12229. int ret = 0;
  12230. int ignoreFinished = 0;
  12231. WOLFSSL_ENTER("DoDtlsHandShakeMsg()");
  12232. /* parse header */
  12233. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  12234. &size, &fragOffset, &fragSz, totalSz) != 0) {
  12235. WOLFSSL_ERROR(PARSE_ERROR);
  12236. return PARSE_ERROR;
  12237. }
  12238. /* Cap the maximum size of a handshake message to something reasonable.
  12239. * By default is the maximum size of a certificate message assuming
  12240. * nine 2048-bit RSA certificates in the chain. */
  12241. if (size > MAX_HANDSHAKE_SZ) {
  12242. WOLFSSL_MSG("Handshake message too large");
  12243. return HANDSHAKE_SIZE_ERROR;
  12244. }
  12245. /* check that we have complete fragment */
  12246. if (*inOutIdx + fragSz > totalSz) {
  12247. WOLFSSL_ERROR(INCOMPLETE_DATA);
  12248. return INCOMPLETE_DATA;
  12249. }
  12250. if (type == finished && ssl->keys.dtls_peer_handshake_number >=
  12251. ssl->keys.dtls_expected_peer_handshake_number &&
  12252. ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
  12253. /* finished msg should be ignore from the current epoch
  12254. * if it comes from a previous handshake */
  12255. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12256. ignoreFinished = ssl->options.connectState < FINISHED_DONE;
  12257. }
  12258. else {
  12259. ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
  12260. }
  12261. }
  12262. /* Check the handshake sequence number first. If out of order,
  12263. * add the current message to the list. If the message is in order,
  12264. * but it is a fragment, add the current message to the list, then
  12265. * check the head of the list to see if it is complete, if so, pop
  12266. * it out as the current message. If the message is complete and in
  12267. * order, process it. Check the head of the list to see if it is in
  12268. * order, if so, process it. (Repeat until list exhausted.) If the
  12269. * head is out of order, return for more processing.
  12270. */
  12271. if (ssl->keys.dtls_peer_handshake_number >
  12272. ssl->keys.dtls_expected_peer_handshake_number &&
  12273. /* Only client_hello shouldn't be ignored if the handshake
  12274. * num is greater */
  12275. (type == client_hello ||
  12276. ssl->options.handShakeState != HANDSHAKE_DONE) &&
  12277. !ignoreFinished) {
  12278. /* Current message is out of order. It will get stored in the list.
  12279. * Storing also takes care of defragmentation. If the messages is a
  12280. * client hello, we need to process this out of order; the server
  12281. * is not supposed to keep state, but the second client hello will
  12282. * have a different handshake sequence number than is expected, and
  12283. * the server shouldn't be expecting any particular handshake sequence
  12284. * number. (If the cookie changes multiple times in quick succession,
  12285. * the client could be sending multiple new client hello messages
  12286. * with newer and newer cookies.) */
  12287. WOLFSSL_MSG("Current message is out of order");
  12288. if (type != client_hello) {
  12289. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  12290. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  12291. ssl->keys.dtls_peer_handshake_number,
  12292. input + *inOutIdx, size, type,
  12293. fragOffset, fragSz, ssl->heap);
  12294. }
  12295. *inOutIdx += fragSz;
  12296. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12297. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  12298. word32 digestSz = MacSize(ssl);
  12299. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  12300. return BUFFER_E;
  12301. *inOutIdx += digestSz;
  12302. }
  12303. else
  12304. #endif
  12305. {
  12306. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  12307. WOLFSSL_ERROR(BUFFER_E);
  12308. return BUFFER_E;
  12309. }
  12310. }
  12311. *inOutIdx += ssl->keys.padSz;
  12312. ret = 0;
  12313. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  12314. /* If we receive an out of order last flight msg then retransmit */
  12315. if (type == server_hello_done || type == finished) {
  12316. ret = DtlsMsgPoolSend(ssl, 0);
  12317. }
  12318. #endif
  12319. }
  12320. else {
  12321. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  12322. if (ret == 0) {
  12323. ssl->keys.dtls_expected_peer_handshake_number =
  12324. ssl->keys.dtls_peer_handshake_number + 1;
  12325. }
  12326. }
  12327. }
  12328. else if (ssl->keys.dtls_peer_handshake_number <
  12329. ssl->keys.dtls_expected_peer_handshake_number ||
  12330. /* ignore all handshake messages if we are done with the
  12331. * handshake */
  12332. (ssl->keys.dtls_peer_handshake_number >
  12333. ssl->keys.dtls_expected_peer_handshake_number &&
  12334. ssl->options.handShakeState == HANDSHAKE_DONE) ||
  12335. ignoreFinished) {
  12336. /* Already saw this message and processed it. It can be ignored. */
  12337. WOLFSSL_MSG("Already saw this message and processed it");
  12338. *inOutIdx += fragSz;
  12339. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12340. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  12341. word32 digestSz = MacSize(ssl);
  12342. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  12343. return BUFFER_E;
  12344. *inOutIdx += digestSz;
  12345. }
  12346. else
  12347. #endif
  12348. {
  12349. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  12350. WOLFSSL_ERROR(BUFFER_E);
  12351. return BUFFER_E;
  12352. }
  12353. }
  12354. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  12355. if (IsDtlsNotSctpMode(ssl) &&
  12356. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  12357. ret = DtlsMsgPoolSend(ssl, 0);
  12358. }
  12359. #endif
  12360. *inOutIdx += ssl->keys.padSz;
  12361. }
  12362. else if (fragSz < size) {
  12363. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  12364. * be pointing to the message with this fragment in it. Check it to see
  12365. * if it is completed. */
  12366. WOLFSSL_MSG("Branch is in order, but fragmented");
  12367. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  12368. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  12369. ssl->keys.dtls_peer_handshake_number,
  12370. input + *inOutIdx, size, type,
  12371. fragOffset, fragSz, ssl->heap);
  12372. }
  12373. *inOutIdx += fragSz;
  12374. *inOutIdx += ssl->keys.padSz;
  12375. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12376. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  12377. word32 digestSz = MacSize(ssl);
  12378. if (*inOutIdx + digestSz > totalSz)
  12379. return BUFFER_E;
  12380. *inOutIdx += digestSz;
  12381. }
  12382. #endif
  12383. ret = 0;
  12384. if (ssl->dtls_rx_msg_list != NULL &&
  12385. ssl->dtls_rx_msg_list->fragSz >= ssl->dtls_rx_msg_list->sz)
  12386. ret = DtlsMsgDrain(ssl);
  12387. }
  12388. else {
  12389. /* This branch is in order next, and a complete message. On success
  12390. * clean the tx list. */
  12391. #ifdef WOLFSSL_ASYNC_CRYPT
  12392. word32 idx = *inOutIdx;
  12393. #endif
  12394. WOLFSSL_MSG("Branch is in order and a complete message");
  12395. #ifdef WOLFSSL_ASYNC_CRYPT
  12396. /* In async mode always store the message and process it with
  12397. * DtlsMsgDrain because in case of a WC_PENDING_E it will be
  12398. * easier this way. */
  12399. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  12400. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  12401. ssl->keys.dtls_peer_handshake_number,
  12402. input + idx, size, type,
  12403. fragOffset, fragSz, ssl->heap);
  12404. }
  12405. if (idx + fragSz + ssl->keys.padSz > totalSz)
  12406. return BUFFER_E;
  12407. *inOutIdx = idx + fragSz + ssl->keys.padSz;
  12408. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12409. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  12410. word32 digestSz = MacSize(ssl);
  12411. if (*inOutIdx + digestSz > totalSz)
  12412. return BUFFER_E;
  12413. *inOutIdx += digestSz;
  12414. }
  12415. #endif
  12416. ret = DtlsMsgDrain(ssl);
  12417. #else
  12418. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  12419. if (ret == 0) {
  12420. DtlsTxMsgListClean(ssl);
  12421. if (type != finished)
  12422. ssl->keys.dtls_expected_peer_handshake_number++;
  12423. if (ssl->dtls_rx_msg_list != NULL) {
  12424. ret = DtlsMsgDrain(ssl);
  12425. }
  12426. }
  12427. #endif
  12428. }
  12429. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  12430. return ret;
  12431. }
  12432. #endif
  12433. #ifndef WOLFSSL_NO_TLS12
  12434. #ifdef HAVE_AEAD
  12435. #if (!defined(NO_PUBLIC_GCM_SET_IV) && \
  12436. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  12437. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
  12438. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
  12439. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  12440. {
  12441. int i;
  12442. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  12443. if (++ssl->keys.aead_exp_IV[i]) return;
  12444. }
  12445. }
  12446. #endif
  12447. #if defined(HAVE_POLY1305) && defined(HAVE_CHACHA)
  12448. /* Used for the older version of creating AEAD tags with Poly1305 */
  12449. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  12450. byte* cipher, word16 sz, byte* tag)
  12451. {
  12452. int ret = 0;
  12453. int msglen = (sz - ssl->specs.aead_mac_size);
  12454. word32 keySz = 32;
  12455. byte padding[8]; /* used to temporarily store lengths */
  12456. #ifdef CHACHA_AEAD_TEST
  12457. printf("Using old version of poly1305 input.\n");
  12458. #endif
  12459. if (msglen < 0)
  12460. return INPUT_CASE_ERROR;
  12461. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  12462. return ret;
  12463. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  12464. AEAD_AUTH_DATA_SZ)) != 0)
  12465. return ret;
  12466. /* length of additional input plus padding */
  12467. XMEMSET(padding, 0, sizeof(padding));
  12468. padding[0] = AEAD_AUTH_DATA_SZ;
  12469. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  12470. sizeof(padding))) != 0)
  12471. return ret;
  12472. /* add cipher info and then its length */
  12473. XMEMSET(padding, 0, sizeof(padding));
  12474. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  12475. return ret;
  12476. /* 32 bit size of cipher to 64 bit endian */
  12477. padding[0] = msglen & 0xff;
  12478. padding[1] = (msglen >> 8) & 0xff;
  12479. padding[2] = ((word32)msglen >> 16) & 0xff;
  12480. padding[3] = ((word32)msglen >> 24) & 0xff;
  12481. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  12482. != 0)
  12483. return ret;
  12484. /* generate tag */
  12485. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  12486. return ret;
  12487. return ret;
  12488. }
  12489. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  12490. * the implementation follows an older draft for creating the nonce and MAC.
  12491. * The flag oldPoly gets set automatically depending on what cipher suite was
  12492. * negotiated in the handshake. This is able to be done because the IDs for the
  12493. * cipher suites was updated in RFC7905 giving unique values for the older
  12494. * draft in comparison to the more recent RFC.
  12495. *
  12496. * ssl WOLFSSL structure to get cipher and TLS state from
  12497. * out output buffer to hold encrypted data
  12498. * input data to encrypt
  12499. * sz size of input
  12500. *
  12501. * Return 0 on success negative values in error case
  12502. */
  12503. static int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  12504. word16 sz)
  12505. {
  12506. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  12507. int ret = 0;
  12508. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  12509. byte tag[POLY1305_AUTH_SZ];
  12510. byte add[AEAD_AUTH_DATA_SZ];
  12511. byte nonce[CHACHA20_NONCE_SZ];
  12512. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  12513. #ifdef CHACHA_AEAD_TEST
  12514. int i;
  12515. #endif
  12516. Keys* keys = &ssl->keys;
  12517. XMEMSET(tag, 0, sizeof(tag));
  12518. XMEMSET(nonce, 0, sizeof(nonce));
  12519. XMEMSET(poly, 0, sizeof(poly));
  12520. XMEMSET(add, 0, sizeof(add));
  12521. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  12522. /*
  12523. * For epochs 2+:
  12524. * * use ssl->secure_renegotiation when encrypting the current epoch as it
  12525. * has the current epoch cipher material
  12526. * * use PREV_ORDER if encrypting the epoch not in
  12527. * ssl->secure_renegotiation
  12528. */
  12529. /* opaque SEQ number stored for AD */
  12530. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  12531. if (ssl->keys.dtls_epoch ==
  12532. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  12533. keys = &ssl->secure_renegotiation->tmp_keys;
  12534. WriteSEQ(ssl, CUR_ORDER, add);
  12535. }
  12536. else
  12537. WriteSEQ(ssl, PREV_ORDER, add);
  12538. }
  12539. else
  12540. #endif
  12541. WriteSEQ(ssl, CUR_ORDER, add);
  12542. if (ssl->options.oldPoly != 0) {
  12543. /* get nonce. SEQ should not be incremented again here */
  12544. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  12545. }
  12546. /* Store the type, version. Unfortunately, they are in
  12547. * the input buffer ahead of the plaintext. */
  12548. #ifdef WOLFSSL_DTLS
  12549. if (ssl->options.dtls) {
  12550. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  12551. }
  12552. #endif
  12553. /* add TLS message size to additional data */
  12554. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  12555. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  12556. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  12557. #ifdef CHACHA_AEAD_TEST
  12558. printf("Encrypt Additional : ");
  12559. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  12560. printf("%02x", add[i]);
  12561. }
  12562. printf("\n\n");
  12563. printf("input before encryption :\n");
  12564. for (i = 0; i < sz; i++) {
  12565. printf("%02x", input[i]);
  12566. if ((i + 1) % 16 == 0)
  12567. printf("\n");
  12568. }
  12569. printf("\n");
  12570. #endif
  12571. if (ssl->options.oldPoly == 0) {
  12572. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  12573. * record sequence number XORed with client_write_IV/server_write_IV */
  12574. XMEMCPY(nonce, keys->aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  12575. nonce[4] ^= add[0];
  12576. nonce[5] ^= add[1];
  12577. nonce[6] ^= add[2];
  12578. nonce[7] ^= add[3];
  12579. nonce[8] ^= add[4];
  12580. nonce[9] ^= add[5];
  12581. nonce[10] ^= add[6];
  12582. nonce[11] ^= add[7];
  12583. }
  12584. /* set the nonce for chacha and get poly1305 key */
  12585. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  12586. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12587. return ret;
  12588. }
  12589. /* create Poly1305 key using chacha20 keystream */
  12590. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  12591. poly, sizeof(poly))) != 0) {
  12592. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12593. return ret;
  12594. }
  12595. /* set the counter after getting poly1305 key */
  12596. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
  12597. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12598. return ret;
  12599. }
  12600. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  12601. /* encrypt the plain text */
  12602. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  12603. input, msgLen)) != 0) {
  12604. ForceZero(poly, sizeof(poly));
  12605. return ret;
  12606. }
  12607. /* get the poly1305 tag using either old padding scheme or more recent */
  12608. if (ssl->options.oldPoly != 0) {
  12609. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  12610. poly, sz, tag)) != 0) {
  12611. ForceZero(poly, sizeof(poly));
  12612. return ret;
  12613. }
  12614. }
  12615. else {
  12616. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  12617. sizeof(poly))) != 0) {
  12618. ForceZero(poly, sizeof(poly));
  12619. return ret;
  12620. }
  12621. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  12622. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  12623. ForceZero(poly, sizeof(poly));
  12624. return ret;
  12625. }
  12626. }
  12627. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  12628. /* append tag to ciphertext */
  12629. XMEMCPY(out + msgLen, tag, sizeof(tag));
  12630. AeadIncrementExpIV(ssl);
  12631. #ifdef CHACHA_AEAD_TEST
  12632. printf("mac tag :\n");
  12633. for (i = 0; i < 16; i++) {
  12634. printf("%02x", tag[i]);
  12635. if ((i + 1) % 16 == 0)
  12636. printf("\n");
  12637. }
  12638. printf("\n\noutput after encrypt :\n");
  12639. for (i = 0; i < sz; i++) {
  12640. printf("%02x", out[i]);
  12641. if ((i + 1) % 16 == 0)
  12642. printf("\n");
  12643. }
  12644. printf("\n");
  12645. #endif
  12646. return ret;
  12647. }
  12648. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  12649. * the implementation follows an older draft for creating the nonce and MAC.
  12650. * The flag oldPoly gets set automatically depending on what cipher suite was
  12651. * negotiated in the handshake. This is able to be done because the IDs for the
  12652. * cipher suites was updated in RFC7905 giving unique values for the older
  12653. * draft in comparison to the more recent RFC.
  12654. *
  12655. * ssl WOLFSSL structure to get cipher and TLS state from
  12656. * plain output buffer to hold decrypted data
  12657. * input data to decrypt
  12658. * sz size of input
  12659. *
  12660. * Return 0 on success negative values in error case
  12661. */
  12662. static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  12663. word16 sz)
  12664. {
  12665. byte add[AEAD_AUTH_DATA_SZ];
  12666. byte nonce[CHACHA20_NONCE_SZ];
  12667. byte tag[POLY1305_AUTH_SZ];
  12668. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  12669. int ret = 0;
  12670. int msgLen = (sz - ssl->specs.aead_mac_size);
  12671. Keys* keys = &ssl->keys;
  12672. #ifdef CHACHA_AEAD_TEST
  12673. int i;
  12674. printf("input before decrypt :\n");
  12675. for (i = 0; i < sz; i++) {
  12676. printf("%02x", input[i]);
  12677. if ((i + 1) % 16 == 0)
  12678. printf("\n");
  12679. }
  12680. printf("\n");
  12681. #endif
  12682. XMEMSET(tag, 0, sizeof(tag));
  12683. XMEMSET(poly, 0, sizeof(poly));
  12684. XMEMSET(nonce, 0, sizeof(nonce));
  12685. XMEMSET(add, 0, sizeof(add));
  12686. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  12687. /*
  12688. * For epochs 2+:
  12689. * * use ssl->secure_renegotiation when decrypting the latest epoch as it
  12690. * has the latest epoch cipher material
  12691. */
  12692. if (ssl->options.dtls && DtlsSCRKeysSet(ssl) &&
  12693. ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  12694. keys = &ssl->secure_renegotiation->tmp_keys;
  12695. #endif
  12696. /* sequence number field is 64-bits */
  12697. WriteSEQ(ssl, PEER_ORDER, add);
  12698. if (ssl->options.oldPoly != 0) {
  12699. /* get nonce, SEQ should not be incremented again here */
  12700. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  12701. }
  12702. /* get AD info */
  12703. /* Store the type, version. */
  12704. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  12705. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  12706. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  12707. /* add TLS message size to additional data */
  12708. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  12709. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  12710. #ifdef CHACHA_AEAD_TEST
  12711. printf("Decrypt Additional : ");
  12712. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  12713. printf("%02x", add[i]);
  12714. }
  12715. printf("\n\n");
  12716. #endif
  12717. if (ssl->options.oldPoly == 0) {
  12718. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  12719. * record sequence number XORed with client_write_IV/server_write_IV */
  12720. XMEMCPY(nonce, keys->aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  12721. nonce[4] ^= add[0];
  12722. nonce[5] ^= add[1];
  12723. nonce[6] ^= add[2];
  12724. nonce[7] ^= add[3];
  12725. nonce[8] ^= add[4];
  12726. nonce[9] ^= add[5];
  12727. nonce[10] ^= add[6];
  12728. nonce[11] ^= add[7];
  12729. }
  12730. /* set nonce and get poly1305 key */
  12731. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  12732. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12733. return ret;
  12734. }
  12735. /* use chacha20 keystream to get poly1305 key for tag */
  12736. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  12737. poly, sizeof(poly))) != 0) {
  12738. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12739. return ret;
  12740. }
  12741. /* set counter after getting poly1305 key */
  12742. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
  12743. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12744. return ret;
  12745. }
  12746. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  12747. /* get the tag using Poly1305 */
  12748. if (ssl->options.oldPoly != 0) {
  12749. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  12750. ForceZero(poly, sizeof(poly));
  12751. return ret;
  12752. }
  12753. }
  12754. else {
  12755. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  12756. sizeof(poly))) != 0) {
  12757. ForceZero(poly, sizeof(poly));
  12758. return ret;
  12759. }
  12760. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  12761. sizeof(add), input, msgLen, tag, sizeof(tag))) != 0) {
  12762. ForceZero(poly, sizeof(poly));
  12763. return ret;
  12764. }
  12765. }
  12766. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  12767. /* check tag sent along with packet */
  12768. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  12769. WOLFSSL_MSG("MAC did not match");
  12770. if (!ssl->options.dtls)
  12771. SendAlert(ssl, alert_fatal, bad_record_mac);
  12772. return VERIFY_MAC_ERROR;
  12773. }
  12774. /* if the tag was good decrypt message */
  12775. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  12776. input, msgLen)) != 0)
  12777. return ret;
  12778. #ifdef CHACHA_AEAD_TEST
  12779. printf("plain after decrypt :\n");
  12780. for (i = 0; i < sz; i++) {
  12781. printf("%02x", plain[i]);
  12782. if ((i + 1) % 16 == 0)
  12783. printf("\n");
  12784. }
  12785. printf("\n");
  12786. #endif
  12787. return ret;
  12788. }
  12789. #endif /* HAVE_CHACHA && HAVE_POLY1305 */
  12790. #endif /* HAVE_AEAD */
  12791. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12792. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  12793. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  12794. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  12795. /* The following type is used to share code between AES-GCM and AES-CCM. */
  12796. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  12797. const byte* in, word32 sz,
  12798. byte* iv, word32 ivSz,
  12799. byte* authTag, word32 authTagSz,
  12800. const byte* authIn, word32 authInSz);
  12801. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  12802. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  12803. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  12804. #else
  12805. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  12806. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  12807. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  12808. #endif
  12809. #endif
  12810. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  12811. word16 sz, int asyncOkay)
  12812. {
  12813. int ret = 0;
  12814. #ifdef WOLFSSL_ASYNC_CRYPT
  12815. WC_ASYNC_DEV* asyncDev = NULL;
  12816. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  12817. #else
  12818. (void)asyncOkay;
  12819. #endif
  12820. (void)out;
  12821. (void)input;
  12822. (void)sz;
  12823. switch (ssl->specs.bulk_cipher_algorithm) {
  12824. #ifdef BUILD_ARC4
  12825. case wolfssl_rc4:
  12826. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  12827. break;
  12828. #endif
  12829. #ifdef BUILD_DES3
  12830. case wolfssl_triple_des:
  12831. #ifdef WOLFSSL_ASYNC_CRYPT
  12832. /* initialize event */
  12833. asyncDev = &ssl->encrypt.des3->asyncDev;
  12834. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  12835. if (ret != 0)
  12836. break;
  12837. #endif
  12838. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  12839. #ifdef WOLFSSL_ASYNC_CRYPT
  12840. if (ret == WC_PENDING_E && asyncOkay) {
  12841. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  12842. }
  12843. #endif
  12844. break;
  12845. #endif
  12846. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  12847. case wolfssl_aes:
  12848. #ifdef WOLFSSL_ASYNC_CRYPT
  12849. /* initialize event */
  12850. asyncDev = &ssl->encrypt.aes->asyncDev;
  12851. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  12852. if (ret != 0)
  12853. break;
  12854. #endif
  12855. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  12856. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  12857. if (tsip_useable(ssl)) {
  12858. ret = wc_tsip_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  12859. } else
  12860. #endif
  12861. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  12862. #ifdef WOLFSSL_ASYNC_CRYPT
  12863. if (ret == WC_PENDING_E && asyncOkay) {
  12864. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  12865. }
  12866. #endif
  12867. break;
  12868. #endif
  12869. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12870. case wolfssl_aes_gcm:
  12871. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  12872. {
  12873. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  12874. const byte* additionalSrc;
  12875. #ifdef WOLFSSL_ASYNC_CRYPT
  12876. /* initialize event */
  12877. asyncDev = &ssl->encrypt.aes->asyncDev;
  12878. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  12879. if (ret != 0)
  12880. break;
  12881. #endif
  12882. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  12883. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  12884. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  12885. #elif defined(BUILD_AESGCM)
  12886. aes_auth_fn = AES_GCM_ENCRYPT;
  12887. #else
  12888. aes_auth_fn = AES_CCM_ENCRYPT;
  12889. #endif
  12890. additionalSrc = input - 5;
  12891. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  12892. /* sequence number field is 64-bits */
  12893. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  12894. /* Store the type, version. Unfortunately, they are in
  12895. * the input buffer ahead of the plaintext. */
  12896. #ifdef WOLFSSL_DTLS
  12897. if (ssl->options.dtls) {
  12898. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  12899. }
  12900. #endif
  12901. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  12902. additionalSrc, 3);
  12903. /* Store the length of the plain text minus the explicit
  12904. * IV length minus the authentication tag size. */
  12905. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  12906. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  12907. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  12908. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  12909. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  12910. XMEMCPY(ssl->encrypt.nonce,
  12911. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  12912. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  12913. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  12914. #endif
  12915. ret = aes_auth_fn(ssl->encrypt.aes,
  12916. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  12917. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  12918. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  12919. out + sz - ssl->specs.aead_mac_size,
  12920. ssl->specs.aead_mac_size,
  12921. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  12922. #ifdef WOLFSSL_ASYNC_CRYPT
  12923. if (ret == WC_PENDING_E && asyncOkay) {
  12924. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  12925. }
  12926. #endif
  12927. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  12928. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  12929. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  12930. XMEMCPY(out,
  12931. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  12932. #endif
  12933. }
  12934. break;
  12935. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12936. #ifdef HAVE_CAMELLIA
  12937. case wolfssl_camellia:
  12938. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  12939. break;
  12940. #endif
  12941. #ifdef HAVE_HC128
  12942. case wolfssl_hc128:
  12943. ret = wc_Hc128_Process(ssl->encrypt.hc128, out, input, sz);
  12944. break;
  12945. #endif
  12946. #ifdef BUILD_RABBIT
  12947. case wolfssl_rabbit:
  12948. ret = wc_RabbitProcess(ssl->encrypt.rabbit, out, input, sz);
  12949. break;
  12950. #endif
  12951. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  12952. case wolfssl_chacha:
  12953. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  12954. break;
  12955. #endif
  12956. #ifdef HAVE_NULL_CIPHER
  12957. case wolfssl_cipher_null:
  12958. if (input != out) {
  12959. XMEMMOVE(out, input, sz);
  12960. }
  12961. break;
  12962. #endif
  12963. #ifdef HAVE_IDEA
  12964. case wolfssl_idea:
  12965. ret = wc_IdeaCbcEncrypt(ssl->encrypt.idea, out, input, sz);
  12966. break;
  12967. #endif
  12968. default:
  12969. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  12970. ret = ENCRYPT_ERROR;
  12971. }
  12972. #ifdef WOLFSSL_ASYNC_CRYPT
  12973. /* if async is not okay, then block */
  12974. if (ret == WC_PENDING_E && !asyncOkay) {
  12975. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  12976. }
  12977. #endif
  12978. return ret;
  12979. }
  12980. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz,
  12981. int asyncOkay)
  12982. {
  12983. int ret = 0;
  12984. #ifdef WOLFSSL_ASYNC_CRYPT
  12985. if (ssl->error == WC_PENDING_E) {
  12986. ssl->error = 0; /* clear async */
  12987. }
  12988. #endif
  12989. switch (ssl->encrypt.state) {
  12990. case CIPHER_STATE_BEGIN:
  12991. {
  12992. if (ssl->encrypt.setup == 0) {
  12993. WOLFSSL_MSG("Encrypt ciphers not setup");
  12994. return ENCRYPT_ERROR;
  12995. }
  12996. #ifdef HAVE_FUZZER
  12997. if (ssl->fuzzerCb)
  12998. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  12999. #endif
  13000. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13001. /* make sure AES GCM/CCM memory is allocated */
  13002. /* free for these happens in FreeCiphers */
  13003. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  13004. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  13005. /* make sure auth iv and auth are allocated */
  13006. if (ssl->encrypt.additional == NULL)
  13007. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  13008. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  13009. if (ssl->encrypt.nonce == NULL)
  13010. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  13011. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  13012. if (ssl->encrypt.additional == NULL ||
  13013. ssl->encrypt.nonce == NULL) {
  13014. return MEMORY_E;
  13015. }
  13016. }
  13017. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13018. /* Advance state and proceed */
  13019. ssl->encrypt.state = CIPHER_STATE_DO;
  13020. }
  13021. FALL_THROUGH;
  13022. case CIPHER_STATE_DO:
  13023. {
  13024. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  13025. /* Advance state */
  13026. ssl->encrypt.state = CIPHER_STATE_END;
  13027. #ifdef WOLFSSL_ASYNC_CRYPT
  13028. /* If pending, then leave and return will resume below */
  13029. if (ret == WC_PENDING_E) {
  13030. return ret;
  13031. }
  13032. #endif
  13033. }
  13034. FALL_THROUGH;
  13035. case CIPHER_STATE_END:
  13036. {
  13037. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13038. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  13039. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  13040. {
  13041. /* finalize authentication cipher */
  13042. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  13043. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  13044. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  13045. AeadIncrementExpIV(ssl);
  13046. #endif
  13047. if (ssl->encrypt.nonce)
  13048. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  13049. }
  13050. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13051. break;
  13052. }
  13053. default:
  13054. break;
  13055. }
  13056. /* Reset state */
  13057. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  13058. return ret;
  13059. }
  13060. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  13061. word16 sz)
  13062. {
  13063. int ret = 0;
  13064. (void)plain;
  13065. (void)input;
  13066. (void)sz;
  13067. switch (ssl->specs.bulk_cipher_algorithm)
  13068. {
  13069. #ifdef BUILD_ARC4
  13070. case wolfssl_rc4:
  13071. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  13072. break;
  13073. #endif
  13074. #ifdef BUILD_DES3
  13075. case wolfssl_triple_des:
  13076. #ifdef WOLFSSL_ASYNC_CRYPT
  13077. /* initialize event */
  13078. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  13079. WC_ASYNC_FLAG_CALL_AGAIN);
  13080. if (ret != 0)
  13081. break;
  13082. #endif
  13083. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  13084. #ifdef WOLFSSL_ASYNC_CRYPT
  13085. if (ret == WC_PENDING_E) {
  13086. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  13087. }
  13088. #endif
  13089. break;
  13090. #endif
  13091. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  13092. case wolfssl_aes:
  13093. #ifdef WOLFSSL_ASYNC_CRYPT
  13094. /* initialize event */
  13095. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  13096. WC_ASYNC_FLAG_CALL_AGAIN);
  13097. if (ret != 0)
  13098. break;
  13099. #endif
  13100. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  13101. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  13102. if (tsip_useable(ssl)) {
  13103. ret = wc_tsip_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  13104. } else
  13105. #endif
  13106. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  13107. #ifdef WOLFSSL_ASYNC_CRYPT
  13108. if (ret == WC_PENDING_E) {
  13109. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  13110. }
  13111. #endif
  13112. break;
  13113. #endif
  13114. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13115. case wolfssl_aes_gcm:
  13116. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  13117. {
  13118. wc_AesAuthDecryptFunc aes_auth_fn;
  13119. #ifdef WOLFSSL_ASYNC_CRYPT
  13120. /* initialize event */
  13121. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  13122. WC_ASYNC_FLAG_CALL_AGAIN);
  13123. if (ret != 0)
  13124. break;
  13125. #endif
  13126. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  13127. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  13128. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  13129. #elif defined(BUILD_AESGCM)
  13130. aes_auth_fn = wc_AesGcmDecrypt;
  13131. #else
  13132. aes_auth_fn = wc_AesCcmDecrypt;
  13133. #endif
  13134. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  13135. /* sequence number field is 64-bits */
  13136. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  13137. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  13138. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  13139. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  13140. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  13141. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  13142. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  13143. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  13144. XMEMCPY(ssl->decrypt.nonce,
  13145. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  13146. AESGCM_IMP_IV_SZ);
  13147. else
  13148. #endif
  13149. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  13150. AESGCM_IMP_IV_SZ);
  13151. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  13152. AESGCM_EXP_IV_SZ);
  13153. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  13154. plain + AESGCM_EXP_IV_SZ,
  13155. input + AESGCM_EXP_IV_SZ,
  13156. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  13157. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  13158. input + sz - ssl->specs.aead_mac_size,
  13159. ssl->specs.aead_mac_size,
  13160. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  13161. #ifdef WOLFSSL_ASYNC_CRYPT
  13162. if (ret == WC_PENDING_E) {
  13163. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  13164. }
  13165. #endif
  13166. }
  13167. }
  13168. break;
  13169. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13170. #ifdef HAVE_CAMELLIA
  13171. case wolfssl_camellia:
  13172. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  13173. break;
  13174. #endif
  13175. #ifdef HAVE_HC128
  13176. case wolfssl_hc128:
  13177. ret = wc_Hc128_Process(ssl->decrypt.hc128, plain, input, sz);
  13178. break;
  13179. #endif
  13180. #ifdef BUILD_RABBIT
  13181. case wolfssl_rabbit:
  13182. ret = wc_RabbitProcess(ssl->decrypt.rabbit, plain, input, sz);
  13183. break;
  13184. #endif
  13185. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  13186. case wolfssl_chacha:
  13187. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  13188. break;
  13189. #endif
  13190. #ifdef HAVE_NULL_CIPHER
  13191. case wolfssl_cipher_null:
  13192. if (input != plain) {
  13193. XMEMMOVE(plain, input, sz);
  13194. }
  13195. break;
  13196. #endif
  13197. #ifdef HAVE_IDEA
  13198. case wolfssl_idea:
  13199. ret = wc_IdeaCbcDecrypt(ssl->decrypt.idea, plain, input, sz);
  13200. break;
  13201. #endif
  13202. default:
  13203. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  13204. ret = DECRYPT_ERROR;
  13205. }
  13206. return ret;
  13207. }
  13208. static WC_INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  13209. word16 sz)
  13210. {
  13211. int ret = 0;
  13212. #ifdef WOLFSSL_ASYNC_CRYPT
  13213. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  13214. if (ret != WC_NOT_PENDING_E) {
  13215. /* check for still pending */
  13216. if (ret == WC_PENDING_E)
  13217. return ret;
  13218. ssl->error = 0; /* clear async */
  13219. /* let failures through so CIPHER_STATE_END logic is run */
  13220. }
  13221. else
  13222. #endif
  13223. {
  13224. /* Reset state */
  13225. ret = 0;
  13226. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  13227. }
  13228. switch (ssl->decrypt.state) {
  13229. case CIPHER_STATE_BEGIN:
  13230. {
  13231. if (ssl->decrypt.setup == 0) {
  13232. WOLFSSL_MSG("Decrypt ciphers not setup");
  13233. return DECRYPT_ERROR;
  13234. }
  13235. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13236. /* make sure AES GCM/CCM memory is allocated */
  13237. /* free for these happens in FreeCiphers */
  13238. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  13239. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  13240. /* make sure auth iv and auth are allocated */
  13241. if (ssl->decrypt.additional == NULL)
  13242. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  13243. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  13244. if (ssl->decrypt.nonce == NULL)
  13245. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  13246. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  13247. if (ssl->decrypt.additional == NULL ||
  13248. ssl->decrypt.nonce == NULL) {
  13249. return MEMORY_E;
  13250. }
  13251. }
  13252. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13253. /* Advance state and proceed */
  13254. ssl->decrypt.state = CIPHER_STATE_DO;
  13255. }
  13256. FALL_THROUGH;
  13257. case CIPHER_STATE_DO:
  13258. {
  13259. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  13260. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  13261. /* For epochs >1 the current cipher parameters are located in
  13262. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  13263. * parameters and for epoch 1 use ssl->keys */
  13264. if (ssl->keys.curEpoch ==
  13265. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  13266. if (ssl->decrypt.src != SCR) {
  13267. ssl->secure_renegotiation->cache_status =
  13268. SCR_CACHE_NEEDED;
  13269. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  13270. break;
  13271. }
  13272. }
  13273. else {
  13274. if (ssl->decrypt.src != KEYS) {
  13275. ssl->secure_renegotiation->cache_status =
  13276. SCR_CACHE_NULL;
  13277. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  13278. break;
  13279. }
  13280. }
  13281. }
  13282. #endif
  13283. ret = DecryptDo(ssl, plain, input, sz);
  13284. /* Advance state */
  13285. ssl->decrypt.state = CIPHER_STATE_END;
  13286. #ifdef WOLFSSL_ASYNC_CRYPT
  13287. /* If pending, leave and return below */
  13288. if (ret == WC_PENDING_E) {
  13289. return ret;
  13290. }
  13291. #endif
  13292. }
  13293. FALL_THROUGH;
  13294. case CIPHER_STATE_END:
  13295. {
  13296. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13297. /* make sure AES GCM/CCM nonce is cleared */
  13298. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  13299. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  13300. if (ssl->decrypt.nonce)
  13301. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  13302. if (ret < 0)
  13303. ret = VERIFY_MAC_ERROR;
  13304. }
  13305. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13306. break;
  13307. }
  13308. default:
  13309. break;
  13310. }
  13311. /* Reset state */
  13312. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  13313. /* handle mac error case */
  13314. if (ret == VERIFY_MAC_ERROR) {
  13315. if (!ssl->options.dtls)
  13316. SendAlert(ssl, alert_fatal, bad_record_mac);
  13317. #ifdef WOLFSSL_DTLS_DROP_STATS
  13318. ssl->macDropCount++;
  13319. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13320. }
  13321. return ret;
  13322. }
  13323. #endif /* !WOLFSSL_NO_TLS12 */
  13324. /* Check conditions for a cipher to have an explicit IV.
  13325. *
  13326. * ssl The SSL/TLS object.
  13327. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  13328. */
  13329. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  13330. {
  13331. #ifdef WOLFSSL_TLS13
  13332. if (ssl->options.tls1_3)
  13333. return 0;
  13334. #endif
  13335. return (ssl->specs.cipher_type == aead) &&
  13336. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  13337. }
  13338. /* check cipher text size for sanity */
  13339. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  13340. {
  13341. #ifdef HAVE_TRUNCATED_HMAC
  13342. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  13343. : ssl->specs.hash_size;
  13344. #else
  13345. word32 minLength = ssl->specs.hash_size; /* covers stream */
  13346. #endif
  13347. #ifndef WOLFSSL_AEAD_ONLY
  13348. if (ssl->specs.cipher_type == block) {
  13349. #ifdef HAVE_ENCRYPT_THEN_MAC
  13350. if (ssl->options.startedETMRead) {
  13351. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  13352. WOLFSSL_MSG("Block ciphertext not block size");
  13353. return SANITY_CIPHER_E;
  13354. }
  13355. }
  13356. else
  13357. #endif
  13358. if (encryptSz % ssl->specs.block_size) {
  13359. WOLFSSL_MSG("Block ciphertext not block size");
  13360. return SANITY_CIPHER_E;
  13361. }
  13362. minLength++; /* pad byte */
  13363. if (ssl->specs.block_size > minLength)
  13364. minLength = ssl->specs.block_size;
  13365. if (ssl->options.tls1_1)
  13366. minLength += ssl->specs.block_size; /* explicit IV */
  13367. }
  13368. else
  13369. #endif
  13370. if (ssl->specs.cipher_type == aead) {
  13371. minLength = ssl->specs.aead_mac_size; /* authTag size */
  13372. if (CipherHasExpIV(ssl))
  13373. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  13374. }
  13375. if (encryptSz < minLength) {
  13376. WOLFSSL_MSG("Ciphertext not minimum size");
  13377. return SANITY_CIPHER_E;
  13378. }
  13379. return 0;
  13380. }
  13381. #ifndef WOLFSSL_AEAD_ONLY
  13382. /* check all length bytes for the pad value, return 0 on success */
  13383. static int PadCheck(const byte* a, byte pad, int length)
  13384. {
  13385. int i;
  13386. int compareSum = 0;
  13387. for (i = 0; i < length; i++) {
  13388. compareSum |= a[i] ^ pad;
  13389. }
  13390. return compareSum;
  13391. }
  13392. /* Mask the padding bytes with the expected values.
  13393. * Constant time implementation - does maximum pad size possible.
  13394. *
  13395. * data Message data.
  13396. * sz Size of the message including MAC and padding and padding length.
  13397. * macSz Size of the MAC.
  13398. * returns 0 on success, otherwise failure.
  13399. */
  13400. static byte MaskPadding(const byte* data, int sz, int macSz)
  13401. {
  13402. int i;
  13403. int checkSz = sz - 1;
  13404. byte paddingSz = data[sz - 1];
  13405. byte mask;
  13406. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  13407. if (checkSz > TLS_MAX_PAD_SZ)
  13408. checkSz = TLS_MAX_PAD_SZ;
  13409. for (i = 0; i < checkSz; i++) {
  13410. mask = ctMaskLTE(i, paddingSz);
  13411. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  13412. }
  13413. return good;
  13414. }
  13415. /* Mask the MAC in the message with the MAC calculated.
  13416. * Constant time implementation - starts looking for MAC where maximum padding
  13417. * size has it.
  13418. *
  13419. * data Message data.
  13420. * sz Size of the message including MAC and padding and padding length.
  13421. * macSz Size of the MAC data.
  13422. * expMac Expected MAC value.
  13423. * returns 0 on success, otherwise failure.
  13424. */
  13425. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  13426. {
  13427. int i, j;
  13428. unsigned char mac[WC_MAX_DIGEST_SIZE];
  13429. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  13430. int macEnd = sz - 1 - data[sz - 1];
  13431. int macStart = macEnd - macSz;
  13432. int r = 0;
  13433. unsigned char started, notEnded;
  13434. unsigned char good = 0;
  13435. scanStart &= ctMaskIntGTE(scanStart, 0);
  13436. macStart &= ctMaskIntGTE(macStart, 0);
  13437. /* Div on Intel has different speeds depending on value.
  13438. * Use a bitwise AND or mod a specific value (converted to mul). */
  13439. if ((macSz & (macSz - 1)) == 0)
  13440. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  13441. #ifndef NO_SHA
  13442. else if (macSz == WC_SHA_DIGEST_SIZE)
  13443. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  13444. #endif
  13445. #ifdef WOLFSSL_SHA384
  13446. else if (macSz == WC_SHA384_DIGEST_SIZE)
  13447. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  13448. #endif
  13449. XMEMSET(mac, 0, macSz);
  13450. for (i = scanStart; i < sz; i += macSz) {
  13451. for (j = 0; j < macSz && j + i < sz; j++) {
  13452. started = ctMaskGTE(i + j, macStart);
  13453. notEnded = ctMaskLT(i + j, macEnd);
  13454. mac[j] |= started & notEnded & data[i + j];
  13455. }
  13456. }
  13457. if ((macSz & (macSz - 1)) == 0) {
  13458. for (i = 0; i < macSz; i++)
  13459. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  13460. }
  13461. #ifndef NO_SHA
  13462. else if (macSz == WC_SHA_DIGEST_SIZE) {
  13463. for (i = 0; i < macSz; i++)
  13464. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  13465. }
  13466. #endif
  13467. #ifdef WOLFSSL_SHA384
  13468. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  13469. for (i = 0; i < macSz; i++)
  13470. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  13471. }
  13472. #endif
  13473. return good;
  13474. }
  13475. /* timing resistant pad/verify check, return 0 on success */
  13476. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  13477. int pLen, int content)
  13478. {
  13479. byte verify[WC_MAX_DIGEST_SIZE];
  13480. byte good;
  13481. int ret = 0;
  13482. good = MaskPadding(input, pLen, macSz);
  13483. /* 4th argument has potential to underflow, ssl->hmac function should
  13484. * either increment the size by (macSz + padLen + 1) before use or check on
  13485. * the size to make sure is valid. */
  13486. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  13487. content, 1, PEER_ORDER);
  13488. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  13489. /* Non-zero on failure. */
  13490. good = (byte)~(word32)good;
  13491. good &= good >> 4;
  13492. good &= good >> 2;
  13493. good &= good >> 1;
  13494. /* Make ret negative on masking failure. */
  13495. ret -= 1 - good;
  13496. /* Treat any failure as verify MAC error. */
  13497. if (ret != 0)
  13498. ret = VERIFY_MAC_ERROR;
  13499. return ret;
  13500. }
  13501. #endif
  13502. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx)
  13503. {
  13504. word32 msgSz = ssl->keys.encryptSz;
  13505. word32 idx = *inOutIdx;
  13506. int dataSz;
  13507. int ivExtra = 0;
  13508. byte* rawData = input + idx; /* keep current for hmac */
  13509. #ifdef HAVE_LIBZ
  13510. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  13511. #endif
  13512. #ifdef WOLFSSL_EARLY_DATA
  13513. if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
  13514. int process = 0;
  13515. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13516. ssl->earlyDataSz += ssl->curSize;
  13517. if ((ssl->earlyData != no_early_data) &&
  13518. (ssl->options.clientState == CLIENT_HELLO_COMPLETE)) {
  13519. process = 1;
  13520. }
  13521. if (!process && (ssl->earlyDataSz <= ssl->options.maxEarlyDataSz)) {
  13522. WOLFSSL_MSG("Ignoring EarlyData!");
  13523. *inOutIdx = ssl->buffers.inputBuffer.length;
  13524. return 0;
  13525. }
  13526. if (ssl->earlyDataSz > ssl->options.maxEarlyDataSz) {
  13527. WOLFSSL_MSG("Too much EarlyData!");
  13528. process = 0;
  13529. }
  13530. }
  13531. if (!process) {
  13532. WOLFSSL_MSG("Received App data before a handshake completed");
  13533. SendAlert(ssl, alert_fatal, unexpected_message);
  13534. return OUT_OF_ORDER_E;
  13535. }
  13536. }
  13537. else
  13538. #endif
  13539. if (ssl->options.handShakeDone == 0) {
  13540. WOLFSSL_MSG("Received App data before a handshake completed");
  13541. SendAlert(ssl, alert_fatal, unexpected_message);
  13542. return OUT_OF_ORDER_E;
  13543. }
  13544. #ifndef WOLFSSL_AEAD_ONLY
  13545. if (ssl->specs.cipher_type == block) {
  13546. if (ssl->options.tls1_1)
  13547. ivExtra = ssl->specs.block_size;
  13548. }
  13549. else
  13550. #endif
  13551. if (ssl->specs.cipher_type == aead) {
  13552. if (CipherHasExpIV(ssl))
  13553. ivExtra = AESGCM_EXP_IV_SZ;
  13554. }
  13555. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  13556. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13557. if (ssl->options.startedETMRead)
  13558. dataSz -= MacSize(ssl);
  13559. #endif
  13560. if (dataSz < 0) {
  13561. WOLFSSL_MSG("App data buffer error, malicious input?");
  13562. SendAlert(ssl, alert_fatal, unexpected_message);
  13563. return BUFFER_ERROR;
  13564. }
  13565. #ifdef WOLFSSL_EARLY_DATA
  13566. if (ssl->earlyData > early_data_ext) {
  13567. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  13568. SendAlert(ssl, alert_fatal, unexpected_message);
  13569. return WOLFSSL_FATAL_ERROR;
  13570. }
  13571. ssl->earlyDataSz += dataSz;
  13572. }
  13573. #endif
  13574. /* read data */
  13575. if (dataSz) {
  13576. int rawSz = dataSz; /* keep raw size for idx adjustment */
  13577. #ifdef HAVE_LIBZ
  13578. if (ssl->options.usingCompression) {
  13579. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  13580. if (dataSz < 0) return dataSz;
  13581. }
  13582. #endif
  13583. idx += rawSz;
  13584. ssl->buffers.clearOutputBuffer.buffer = rawData;
  13585. ssl->buffers.clearOutputBuffer.length = dataSz;
  13586. }
  13587. idx += ssl->keys.padSz;
  13588. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13589. if (ssl->options.startedETMRead)
  13590. idx += MacSize(ssl);
  13591. #endif
  13592. #ifdef HAVE_LIBZ
  13593. /* decompress could be bigger, overwrite after verify */
  13594. if (ssl->options.usingCompression)
  13595. XMEMMOVE(rawData, decomp, dataSz);
  13596. #endif
  13597. *inOutIdx = idx;
  13598. #ifdef HAVE_SECURE_RENEGOTIATION
  13599. if (IsSCR(ssl)) {
  13600. /* Reset the processReply state since
  13601. * we finished processing this message. */
  13602. ssl->options.processReply = doProcessInit;
  13603. /* If we are in a secure renegotiation then APP DATA is treated
  13604. * differently */
  13605. return APP_DATA_READY;
  13606. }
  13607. #endif
  13608. return 0;
  13609. }
  13610. /* process alert, return level */
  13611. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type,
  13612. word32 totalSz)
  13613. {
  13614. byte level;
  13615. byte code;
  13616. word32 dataSz = totalSz - *inOutIdx;
  13617. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13618. if (ssl->hsInfoOn)
  13619. AddPacketName(ssl, "Alert");
  13620. if (ssl->toInfoOn)
  13621. /* add record header back on to info + alert bytes level/code */
  13622. AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx -
  13623. RECORD_HEADER_SZ, RECORD_HEADER_SZ + ALERT_SIZE,
  13624. READ_PROTO, ssl->heap);
  13625. #endif
  13626. if (IsEncryptionOn(ssl, 0)) {
  13627. dataSz -= ssl->keys.padSz;
  13628. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13629. if (ssl->options.startedETMRead)
  13630. dataSz -= MacSize(ssl);
  13631. #endif
  13632. }
  13633. /* make sure can read the message */
  13634. if (dataSz != ALERT_SIZE) {
  13635. #ifdef WOLFSSL_EXTRA_ALERTS
  13636. SendAlert(ssl, alert_fatal, unexpected_message);
  13637. #endif
  13638. return BUFFER_E;
  13639. }
  13640. level = input[(*inOutIdx)++];
  13641. code = input[(*inOutIdx)++];
  13642. ssl->alert_history.last_rx.code = code;
  13643. ssl->alert_history.last_rx.level = level;
  13644. *type = code;
  13645. if (level == alert_fatal) {
  13646. ssl->options.isClosed = 1; /* Don't send close_notify */
  13647. }
  13648. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  13649. WOLFSSL_MSG("Alert count exceeded");
  13650. #ifdef WOLFSSL_EXTRA_ALERTS
  13651. if (level != alert_warning || code != close_notify)
  13652. SendAlert(ssl, alert_fatal, unexpected_message);
  13653. #endif
  13654. return ALERT_COUNT_E;
  13655. }
  13656. WOLFSSL_MSG("Got alert");
  13657. if (*type == close_notify) {
  13658. WOLFSSL_MSG("\tclose notify");
  13659. ssl->options.closeNotify = 1;
  13660. }
  13661. #ifdef WOLFSSL_TLS13
  13662. if (*type == decode_error) {
  13663. WOLFSSL_MSG("\tdecode error");
  13664. }
  13665. if (*type == illegal_parameter) {
  13666. WOLFSSL_MSG("\tillegal parameter");
  13667. }
  13668. #endif
  13669. WOLFSSL_ERROR(*type);
  13670. if (IsEncryptionOn(ssl, 0)) {
  13671. *inOutIdx += ssl->keys.padSz;
  13672. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13673. if (ssl->options.startedETMRead)
  13674. *inOutIdx += MacSize(ssl);
  13675. #endif
  13676. }
  13677. return level;
  13678. }
  13679. static int GetInputData(WOLFSSL *ssl, word32 size)
  13680. {
  13681. int in;
  13682. int inSz;
  13683. int maxLength;
  13684. int usedLength;
  13685. int dtlsExtra = 0;
  13686. /* check max input length */
  13687. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  13688. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  13689. inSz = (int)(size - usedLength); /* from last partial read */
  13690. #ifdef WOLFSSL_DTLS
  13691. if (ssl->options.dtls) {
  13692. if (size < ssl->dtls_expected_rx)
  13693. dtlsExtra = (int)(ssl->dtls_expected_rx - size);
  13694. inSz = ssl->dtls_expected_rx;
  13695. }
  13696. #endif
  13697. /* check that no lengths or size values are negative */
  13698. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  13699. return BUFFER_ERROR;
  13700. }
  13701. if (inSz > maxLength) {
  13702. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  13703. return MEMORY_E;
  13704. }
  13705. /* Put buffer data at start if not there */
  13706. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  13707. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  13708. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  13709. usedLength);
  13710. /* remove processed data */
  13711. ssl->buffers.inputBuffer.idx = 0;
  13712. ssl->buffers.inputBuffer.length = usedLength;
  13713. /* read data from network */
  13714. do {
  13715. in = wolfSSLReceive(ssl,
  13716. ssl->buffers.inputBuffer.buffer +
  13717. ssl->buffers.inputBuffer.length,
  13718. inSz);
  13719. if (in == WANT_READ)
  13720. return WANT_READ;
  13721. if (in < 0)
  13722. return SOCKET_ERROR_E;
  13723. if (in > inSz)
  13724. return RECV_OVERFLOW_E;
  13725. ssl->buffers.inputBuffer.length += in;
  13726. inSz -= in;
  13727. } while (ssl->buffers.inputBuffer.length < size);
  13728. #ifdef WOLFSSL_DEBUG_TLS
  13729. if (ssl->buffers.inputBuffer.idx == 0) {
  13730. WOLFSSL_MSG("Data received");
  13731. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  13732. ssl->buffers.inputBuffer.length);
  13733. }
  13734. #endif
  13735. return 0;
  13736. }
  13737. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13738. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  13739. int content)
  13740. {
  13741. int ret;
  13742. #ifdef HAVE_TRUNCATED_HMAC
  13743. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  13744. : ssl->specs.hash_size;
  13745. #else
  13746. word32 digestSz = ssl->specs.hash_size;
  13747. #endif
  13748. byte verify[WC_MAX_DIGEST_SIZE];
  13749. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  13750. if (msgSz < digestSz) {
  13751. return VERIFY_MAC_ERROR;
  13752. }
  13753. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
  13754. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  13755. if (ret != 0) {
  13756. return VERIFY_MAC_ERROR;
  13757. }
  13758. return 0;
  13759. }
  13760. #endif
  13761. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  13762. int content, word32* padSz)
  13763. {
  13764. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  13765. int ivExtra = 0;
  13766. int ret;
  13767. word32 pad = 0;
  13768. word32 padByte = 0;
  13769. #ifdef HAVE_TRUNCATED_HMAC
  13770. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  13771. : ssl->specs.hash_size;
  13772. #else
  13773. word32 digestSz = ssl->specs.hash_size;
  13774. #endif
  13775. byte verify[WC_MAX_DIGEST_SIZE];
  13776. if (ssl->specs.cipher_type == block) {
  13777. if (ssl->options.tls1_1)
  13778. ivExtra = ssl->specs.block_size;
  13779. pad = *(input + msgSz - ivExtra - 1);
  13780. padByte = 1;
  13781. if (ssl->options.tls) {
  13782. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  13783. content);
  13784. if (ret != 0)
  13785. return ret;
  13786. }
  13787. else { /* sslv3, some implementations have bad padding, but don't
  13788. * allow bad read */
  13789. int badPadLen = 0;
  13790. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  13791. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  13792. (void)dmy;
  13793. if (pad > (msgSz - digestSz - 1)) {
  13794. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  13795. pad = 0; /* no bad read */
  13796. badPadLen = 1;
  13797. }
  13798. PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  13799. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
  13800. pad, content, 1, PEER_ORDER);
  13801. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  13802. digestSz) != 0)
  13803. return VERIFY_MAC_ERROR;
  13804. if (ret != 0 || badPadLen)
  13805. return VERIFY_MAC_ERROR;
  13806. }
  13807. }
  13808. else if (ssl->specs.cipher_type == stream) {
  13809. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
  13810. PEER_ORDER);
  13811. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0){
  13812. return VERIFY_MAC_ERROR;
  13813. }
  13814. if (ret != 0)
  13815. return VERIFY_MAC_ERROR;
  13816. }
  13817. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  13818. if (ssl->specs.cipher_type == aead) {
  13819. *padSz = ssl->specs.aead_mac_size;
  13820. }
  13821. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  13822. else {
  13823. *padSz = digestSz + pad + padByte;
  13824. }
  13825. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  13826. (void)input;
  13827. (void)msgSz;
  13828. (void)content;
  13829. return 0;
  13830. }
  13831. /* process input requests, return 0 is done, 1 is call again to complete, and
  13832. negative number is error */
  13833. int ProcessReply(WOLFSSL* ssl)
  13834. {
  13835. int ret = 0, type, readSz;
  13836. int atomicUser = 0;
  13837. word32 startIdx = 0;
  13838. #if defined(WOLFSSL_DTLS)
  13839. int used;
  13840. #endif
  13841. #ifdef ATOMIC_USER
  13842. if (ssl->ctx->DecryptVerifyCb)
  13843. atomicUser = 1;
  13844. #endif
  13845. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  13846. #ifdef HAVE_SECURE_RENEGOTIATION
  13847. && ssl->error != APP_DATA_READY
  13848. #endif
  13849. #ifdef WOLFSSL_ASYNC_CRYPT
  13850. && ssl->error != WC_PENDING_E
  13851. #endif
  13852. #ifdef WOLFSSL_NONBLOCK_OCSP
  13853. && ssl->error != OCSP_WANT_READ
  13854. #endif
  13855. ) {
  13856. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  13857. return ssl->error;
  13858. }
  13859. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
  13860. /* process any pending DTLS messages - this flow can happen with async */
  13861. if (ssl->dtls_rx_msg_list != NULL) {
  13862. ret = DtlsMsgDrain(ssl);
  13863. if (ret != 0) {
  13864. WOLFSSL_ERROR(ret);
  13865. return ret;
  13866. }
  13867. }
  13868. #endif
  13869. for (;;) {
  13870. switch (ssl->options.processReply) {
  13871. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  13872. * old client hello */
  13873. case doProcessInit:
  13874. readSz = RECORD_HEADER_SZ;
  13875. #ifdef WOLFSSL_DTLS
  13876. if (ssl->options.dtls)
  13877. readSz = DTLS_RECORD_HEADER_SZ;
  13878. #endif
  13879. /* get header or return error */
  13880. if (!ssl->options.dtls) {
  13881. if ((ret = GetInputData(ssl, readSz)) < 0)
  13882. return ret;
  13883. } else {
  13884. #ifdef WOLFSSL_DTLS
  13885. /* read ahead may already have header */
  13886. used = ssl->buffers.inputBuffer.length -
  13887. ssl->buffers.inputBuffer.idx;
  13888. if (used < readSz) {
  13889. if ((ret = GetInputData(ssl, readSz)) < 0)
  13890. return ret;
  13891. }
  13892. #endif
  13893. }
  13894. #ifdef OLD_HELLO_ALLOWED
  13895. /* see if sending SSLv2 client hello */
  13896. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  13897. ssl->options.clientState == NULL_STATE &&
  13898. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  13899. != handshake) {
  13900. byte b0, b1;
  13901. ssl->options.processReply = runProcessOldClientHello;
  13902. /* sanity checks before getting size at front */
  13903. if (ssl->buffers.inputBuffer.buffer[
  13904. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  13905. WOLFSSL_MSG("Not a valid old client hello");
  13906. return PARSE_ERROR;
  13907. }
  13908. if (ssl->buffers.inputBuffer.buffer[
  13909. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  13910. ssl->buffers.inputBuffer.buffer[
  13911. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  13912. WOLFSSL_MSG("Not a valid version in old client hello");
  13913. return PARSE_ERROR;
  13914. }
  13915. /* how many bytes need ProcessOldClientHello */
  13916. b0 =
  13917. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  13918. b1 =
  13919. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  13920. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  13921. }
  13922. else {
  13923. ssl->options.processReply = getRecordLayerHeader;
  13924. continue;
  13925. }
  13926. FALL_THROUGH;
  13927. /* in the WOLFSSL_SERVER case, run the old client hello */
  13928. case runProcessOldClientHello:
  13929. /* get sz bytes or return error */
  13930. if (!ssl->options.dtls) {
  13931. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  13932. return ret;
  13933. } else {
  13934. #ifdef WOLFSSL_DTLS
  13935. /* read ahead may already have */
  13936. used = ssl->buffers.inputBuffer.length -
  13937. ssl->buffers.inputBuffer.idx;
  13938. if (used < ssl->curSize)
  13939. if ((ret = GetInputData(ssl, ssl->curSize - used)) < 0)
  13940. return ret;
  13941. #endif /* WOLFSSL_DTLS */
  13942. }
  13943. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  13944. &ssl->buffers.inputBuffer.idx,
  13945. ssl->buffers.inputBuffer.length -
  13946. ssl->buffers.inputBuffer.idx,
  13947. ssl->curSize);
  13948. if (ret < 0)
  13949. return ret;
  13950. else if (ssl->buffers.inputBuffer.idx ==
  13951. ssl->buffers.inputBuffer.length) {
  13952. ssl->options.processReply = doProcessInit;
  13953. return 0;
  13954. }
  13955. #endif /* OLD_HELLO_ALLOWED */
  13956. FALL_THROUGH;
  13957. /* get the record layer header */
  13958. case getRecordLayerHeader:
  13959. ret = GetRecordHeader(ssl, ssl->buffers.inputBuffer.buffer,
  13960. &ssl->buffers.inputBuffer.idx,
  13961. &ssl->curRL, &ssl->curSize);
  13962. #ifdef WOLFSSL_DTLS
  13963. if (ssl->options.dtls && ret == SEQUENCE_ERROR) {
  13964. WOLFSSL_MSG("Silently dropping out of order DTLS message");
  13965. ssl->options.processReply = doProcessInit;
  13966. ssl->buffers.inputBuffer.length = 0;
  13967. ssl->buffers.inputBuffer.idx = 0;
  13968. #ifdef WOLFSSL_DTLS_DROP_STATS
  13969. ssl->replayDropCount++;
  13970. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13971. continue;
  13972. }
  13973. #endif
  13974. if (ret != 0)
  13975. return ret;
  13976. #ifdef WOLFSSL_TLS13
  13977. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  13978. ssl->curRL.type != application_data &&
  13979. ssl->curRL.type != change_cipher_spec) {
  13980. SendAlert(ssl, alert_fatal, unexpected_message);
  13981. return PARSE_ERROR;
  13982. }
  13983. #endif
  13984. ssl->options.processReply = getData;
  13985. FALL_THROUGH;
  13986. /* retrieve record layer data */
  13987. case getData:
  13988. /* get sz bytes or return error */
  13989. if (!ssl->options.dtls) {
  13990. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  13991. #ifdef WOLFSSL_EXTRA_ALERTS
  13992. if (ret != WANT_READ)
  13993. SendAlert(ssl, alert_fatal, bad_record_mac);
  13994. #endif
  13995. return ret;
  13996. }
  13997. }
  13998. else {
  13999. #ifdef WOLFSSL_DTLS
  14000. /* read ahead may already have */
  14001. used = ssl->buffers.inputBuffer.length -
  14002. ssl->buffers.inputBuffer.idx;
  14003. if (used < ssl->curSize)
  14004. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  14005. return ret;
  14006. #endif
  14007. }
  14008. if (IsEncryptionOn(ssl, 0)) {
  14009. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  14010. int tooLong = 0;
  14011. #endif
  14012. #ifdef WOLFSSL_TLS13
  14013. if (IsAtLeastTLSv1_3(ssl->version)) {
  14014. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  14015. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  14016. MAX_TLS13_PLAIN_SZ;
  14017. }
  14018. #endif
  14019. #ifdef WOLFSSL_EXTRA_ALERTS
  14020. if (!IsAtLeastTLSv1_3(ssl->version))
  14021. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  14022. #endif
  14023. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  14024. if (tooLong) {
  14025. WOLFSSL_MSG("Encrypted data too long");
  14026. SendAlert(ssl, alert_fatal, record_overflow);
  14027. return BUFFER_ERROR;
  14028. }
  14029. #endif
  14030. }
  14031. ssl->keys.padSz = 0;
  14032. ssl->options.processReply = verifyEncryptedMessage;
  14033. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  14034. FALL_THROUGH;
  14035. /* verify digest of encrypted message */
  14036. case verifyEncryptedMessage:
  14037. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14038. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  14039. !atomicUser && ssl->options.startedETMRead) {
  14040. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  14041. ssl->buffers.inputBuffer.idx,
  14042. ssl->curSize, ssl->curRL.type);
  14043. #ifdef WOLFSSL_ASYNC_CRYPT
  14044. if (ret == WC_PENDING_E)
  14045. return ret;
  14046. #endif
  14047. if (ret < 0) {
  14048. WOLFSSL_MSG("VerifyMacEnc failed");
  14049. WOLFSSL_ERROR(ret);
  14050. #ifdef WOLFSSL_DTLS
  14051. /* If in DTLS mode, if the decrypt fails for any
  14052. * reason, pretend the datagram never happened. */
  14053. if (ssl->options.dtls) {
  14054. ssl->options.processReply = doProcessInit;
  14055. ssl->buffers.inputBuffer.idx =
  14056. ssl->buffers.inputBuffer.length;
  14057. #ifdef WOLFSSL_DTLS_DROP_STATS
  14058. ssl->macDropCount++;
  14059. #endif /* WOLFSSL_DTLS_DROP_STATS */
  14060. }
  14061. #endif /* WOLFSSL_DTLS */
  14062. #ifdef WOLFSSL_EXTRA_ALERTS
  14063. if (!ssl->options.dtls)
  14064. SendAlert(ssl, alert_fatal, bad_record_mac);
  14065. #endif
  14066. return DECRYPT_ERROR;
  14067. }
  14068. ssl->keys.encryptSz = ssl->curSize;
  14069. }
  14070. #endif
  14071. ssl->options.processReply = decryptMessage;
  14072. FALL_THROUGH;
  14073. /* decrypt message */
  14074. case decryptMessage:
  14075. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  14076. (!IsAtLeastTLSv1_3(ssl->version) ||
  14077. ssl->curRL.type != change_cipher_spec))
  14078. {
  14079. bufferStatic* in = &ssl->buffers.inputBuffer;
  14080. ret = SanityCheckCipherText(ssl, ssl->curSize);
  14081. if (ret < 0) {
  14082. #ifdef WOLFSSL_EXTRA_ALERTS
  14083. SendAlert(ssl, alert_fatal, bad_record_mac);
  14084. #endif
  14085. return ret;
  14086. }
  14087. if (atomicUser) {
  14088. #ifdef ATOMIC_USER
  14089. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14090. if (ssl->options.startedETMRead) {
  14091. ret = ssl->ctx->VerifyDecryptCb(ssl,
  14092. in->buffer + in->idx, in->buffer + in->idx,
  14093. ssl->curSize - MacSize(ssl),
  14094. ssl->curRL.type, 1, &ssl->keys.padSz,
  14095. ssl->DecryptVerifyCtx);
  14096. }
  14097. else
  14098. #endif
  14099. {
  14100. ret = ssl->ctx->DecryptVerifyCb(ssl,
  14101. in->buffer + in->idx,
  14102. in->buffer + in->idx,
  14103. ssl->curSize, ssl->curRL.type, 1,
  14104. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  14105. }
  14106. #endif /* ATOMIC_USER */
  14107. }
  14108. else {
  14109. if (!ssl->options.tls1_3) {
  14110. #ifndef WOLFSSL_NO_TLS12
  14111. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14112. if (ssl->options.startedETMRead) {
  14113. word32 digestSz = MacSize(ssl);
  14114. ret = Decrypt(ssl,
  14115. in->buffer + in->idx,
  14116. in->buffer + in->idx,
  14117. ssl->curSize - (word16)digestSz);
  14118. if (ret == 0) {
  14119. ssl->keys.padSz =
  14120. in->buffer[in->idx + ssl->curSize -
  14121. digestSz - 1];
  14122. ssl->keys.padSz += 1;
  14123. ssl->keys.decryptedCur = 1;
  14124. }
  14125. }
  14126. else
  14127. #endif
  14128. {
  14129. ret = Decrypt(ssl,
  14130. in->buffer + in->idx,
  14131. in->buffer + in->idx,
  14132. ssl->curSize);
  14133. }
  14134. #else
  14135. ret = DECRYPT_ERROR;
  14136. #endif
  14137. }
  14138. else
  14139. {
  14140. #ifdef WOLFSSL_TLS13
  14141. ret = DecryptTls13(ssl,
  14142. in->buffer + in->idx,
  14143. in->buffer + in->idx,
  14144. ssl->curSize,
  14145. (byte*)&ssl->curRL, RECORD_HEADER_SZ);
  14146. #else
  14147. ret = DECRYPT_ERROR;
  14148. #endif /* WOLFSSL_TLS13 */
  14149. }
  14150. }
  14151. #ifdef WOLFSSL_ASYNC_CRYPT
  14152. if (ret == WC_PENDING_E)
  14153. return ret;
  14154. #endif
  14155. if (ret >= 0) {
  14156. #ifndef WOLFSSL_NO_TLS12
  14157. /* handle success */
  14158. #ifndef WOLFSSL_AEAD_ONLY
  14159. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  14160. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  14161. #endif
  14162. /* go past TLSv1.1 IV */
  14163. if (CipherHasExpIV(ssl))
  14164. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  14165. #endif
  14166. }
  14167. else {
  14168. WOLFSSL_MSG("Decrypt failed");
  14169. WOLFSSL_ERROR(ret);
  14170. #ifdef WOLFSSL_EARLY_DATA
  14171. if (ssl->options.tls1_3) {
  14172. if (ssl->options.side == WOLFSSL_SERVER_END &&
  14173. ssl->earlyData != no_early_data &&
  14174. ssl->options.clientState <
  14175. CLIENT_FINISHED_COMPLETE) {
  14176. ssl->earlyDataSz += ssl->curSize;
  14177. if (ssl->earlyDataSz <=
  14178. ssl->options.maxEarlyDataSz) {
  14179. WOLFSSL_MSG("Ignoring EarlyData!");
  14180. if (ssl->keys.peer_sequence_number_lo-- == 0)
  14181. ssl->keys.peer_sequence_number_hi--;
  14182. ssl->options.processReply = doProcessInit;
  14183. ssl->buffers.inputBuffer.idx =
  14184. ssl->buffers.inputBuffer.length;
  14185. return 0;
  14186. }
  14187. WOLFSSL_MSG("Too much EarlyData!");
  14188. }
  14189. SendAlert(ssl, alert_fatal, bad_record_mac);
  14190. }
  14191. #endif
  14192. #ifdef WOLFSSL_DTLS
  14193. /* If in DTLS mode, if the decrypt fails for any
  14194. * reason, pretend the datagram never happened. */
  14195. if (ssl->options.dtls) {
  14196. ssl->options.processReply = doProcessInit;
  14197. ssl->buffers.inputBuffer.idx =
  14198. ssl->buffers.inputBuffer.length;
  14199. #ifdef WOLFSSL_DTLS_DROP_STATS
  14200. ssl->macDropCount++;
  14201. #endif /* WOLFSSL_DTLS_DROP_STATS */
  14202. }
  14203. #endif /* WOLFSSL_DTLS */
  14204. return DECRYPT_ERROR;
  14205. }
  14206. }
  14207. ssl->options.processReply = verifyMessage;
  14208. FALL_THROUGH;
  14209. /* verify digest of message */
  14210. case verifyMessage:
  14211. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  14212. (!IsAtLeastTLSv1_3(ssl->version) ||
  14213. ssl->curRL.type != change_cipher_spec))
  14214. {
  14215. if (!atomicUser
  14216. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14217. && !ssl->options.startedETMRead
  14218. #endif
  14219. ) {
  14220. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  14221. ssl->buffers.inputBuffer.idx,
  14222. ssl->curSize, ssl->curRL.type,
  14223. &ssl->keys.padSz);
  14224. #ifdef WOLFSSL_ASYNC_CRYPT
  14225. if (ret == WC_PENDING_E)
  14226. return ret;
  14227. #endif
  14228. if (ret < 0) {
  14229. WOLFSSL_MSG("VerifyMac failed");
  14230. WOLFSSL_ERROR(ret);
  14231. #ifdef WOLFSSL_DTLS
  14232. /* If in DTLS mode, if the decrypt fails for any
  14233. * reason, pretend the datagram never happened. */
  14234. if (ssl->options.dtls) {
  14235. ssl->options.processReply = doProcessInit;
  14236. ssl->buffers.inputBuffer.idx =
  14237. ssl->buffers.inputBuffer.length;
  14238. #ifdef WOLFSSL_DTLS_DROP_STATS
  14239. ssl->macDropCount++;
  14240. #endif /* WOLFSSL_DTLS_DROP_STATS */
  14241. }
  14242. #endif /* WOLFSSL_DTLS */
  14243. #ifdef WOLFSSL_EXTRA_ALERTS
  14244. if (!ssl->options.dtls)
  14245. SendAlert(ssl, alert_fatal, bad_record_mac);
  14246. #endif
  14247. return DECRYPT_ERROR;
  14248. }
  14249. }
  14250. ssl->keys.encryptSz = ssl->curSize;
  14251. ssl->keys.decryptedCur = 1;
  14252. #ifdef WOLFSSL_TLS13
  14253. if (ssl->options.tls1_3) {
  14254. word16 i = (word16)(ssl->buffers.inputBuffer.length -
  14255. ssl->keys.padSz);
  14256. /* sanity check on underflow */
  14257. if (ssl->keys.padSz >= ssl->buffers.inputBuffer.length) {
  14258. WOLFSSL_ERROR(DECRYPT_ERROR);
  14259. return DECRYPT_ERROR;
  14260. }
  14261. /* Remove padding from end of plain text. */
  14262. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  14263. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  14264. break;
  14265. }
  14266. /* Get the real content type from the end of the data. */
  14267. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  14268. ssl->keys.padSz = ssl->buffers.inputBuffer.length - i;
  14269. }
  14270. #endif
  14271. }
  14272. ssl->options.processReply = runProcessingOneMessage;
  14273. FALL_THROUGH;
  14274. /* the record layer is here */
  14275. case runProcessingOneMessage:
  14276. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14277. if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
  14278. if ((ssl->buffers.inputBuffer.length -
  14279. ssl->keys.padSz -
  14280. MacSize(ssl) -
  14281. ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ)
  14282. #ifdef WOLFSSL_ASYNC_CRYPT
  14283. && ssl->buffers.inputBuffer.length !=
  14284. ssl->buffers.inputBuffer.idx
  14285. #endif
  14286. ) {
  14287. WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
  14288. #if defined(WOLFSSL_EXTRA_ALERTS)
  14289. SendAlert(ssl, alert_fatal, record_overflow);
  14290. #endif
  14291. return BUFFER_ERROR;
  14292. }
  14293. }
  14294. else
  14295. #endif
  14296. if (ssl->buffers.inputBuffer.length -
  14297. ssl->keys.padSz -
  14298. ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ
  14299. #ifdef WOLFSSL_ASYNC_CRYPT
  14300. && ssl->buffers.inputBuffer.length !=
  14301. ssl->buffers.inputBuffer.idx
  14302. #endif
  14303. ) {
  14304. WOLFSSL_MSG("Plaintext too long");
  14305. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  14306. SendAlert(ssl, alert_fatal, record_overflow);
  14307. #endif
  14308. return BUFFER_ERROR;
  14309. }
  14310. #ifdef WOLFSSL_DTLS
  14311. if (IsDtlsNotSctpMode(ssl)) {
  14312. DtlsUpdateWindow(ssl);
  14313. }
  14314. #endif /* WOLFSSL_DTLS */
  14315. WOLFSSL_MSG("received record layer msg");
  14316. switch (ssl->curRL.type) {
  14317. case handshake :
  14318. WOLFSSL_MSG("got HANDSHAKE");
  14319. /* debugging in DoHandShakeMsg */
  14320. if (ssl->options.dtls) {
  14321. #ifdef WOLFSSL_DTLS
  14322. ret = DoDtlsHandShakeMsg(ssl,
  14323. ssl->buffers.inputBuffer.buffer,
  14324. &ssl->buffers.inputBuffer.idx,
  14325. ssl->buffers.inputBuffer.length);
  14326. #endif
  14327. }
  14328. else if (!IsAtLeastTLSv1_3(ssl->version)
  14329. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  14330. || !TLSv1_3_Capable(ssl)
  14331. #endif
  14332. ) {
  14333. #ifndef WOLFSSL_NO_TLS12
  14334. ret = DoHandShakeMsg(ssl,
  14335. ssl->buffers.inputBuffer.buffer,
  14336. &ssl->buffers.inputBuffer.idx,
  14337. ssl->buffers.inputBuffer.length);
  14338. #else
  14339. ret = BUFFER_ERROR;
  14340. #endif
  14341. }
  14342. else {
  14343. #ifdef WOLFSSL_TLS13
  14344. ssl->msgsReceived.got_change_cipher = 0;
  14345. ret = DoTls13HandShakeMsg(ssl,
  14346. ssl->buffers.inputBuffer.buffer,
  14347. &ssl->buffers.inputBuffer.idx,
  14348. ssl->buffers.inputBuffer.length);
  14349. #ifdef WOLFSSL_EARLY_DATA
  14350. if (ret != 0)
  14351. return ret;
  14352. if (ssl->options.side == WOLFSSL_SERVER_END &&
  14353. ssl->earlyData > early_data_ext &&
  14354. ssl->options.handShakeState == HANDSHAKE_DONE) {
  14355. ssl->earlyData = no_early_data;
  14356. ssl->options.processReply = doProcessInit;
  14357. return ZERO_RETURN;
  14358. }
  14359. #endif
  14360. #else
  14361. ret = BUFFER_ERROR;
  14362. #endif
  14363. }
  14364. if (ret != 0
  14365. #ifdef WOLFSSL_ASYNC_CRYPT
  14366. /* In async case, on pending, move onto next message.
  14367. * Current message should have been DtlsMsgStore'ed and
  14368. * should be processed with DtlsMsgDrain */
  14369. && (!ssl->options.dtls
  14370. || ret != WC_PENDING_E)
  14371. #endif
  14372. ) {
  14373. WOLFSSL_ERROR(ret);
  14374. return ret;
  14375. }
  14376. break;
  14377. case change_cipher_spec:
  14378. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  14379. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14380. if (ssl->hsInfoOn)
  14381. AddPacketName(ssl, "ChangeCipher");
  14382. /* add record header back on info */
  14383. if (ssl->toInfoOn) {
  14384. AddPacketInfo(ssl, "ChangeCipher",
  14385. change_cipher_spec,
  14386. ssl->buffers.inputBuffer.buffer +
  14387. ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ -
  14388. (ssl->options.dtls ? DTLS_RECORD_EXTRA : 0),
  14389. 1 + RECORD_HEADER_SZ, READ_PROTO, ssl->heap);
  14390. #ifdef WOLFSSL_CALLBACKS
  14391. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  14392. #endif
  14393. }
  14394. #endif
  14395. #ifdef WOLFSSL_TLS13
  14396. if (IsAtLeastTLSv1_3(ssl->version)) {
  14397. word32 i = ssl->buffers.inputBuffer.idx;
  14398. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  14399. SendAlert(ssl, alert_fatal, unexpected_message);
  14400. return UNKNOWN_RECORD_TYPE;
  14401. }
  14402. if (ssl->curSize != 1 ||
  14403. ssl->buffers.inputBuffer.buffer[i] != 1) {
  14404. SendAlert(ssl, alert_fatal, illegal_parameter);
  14405. return UNKNOWN_RECORD_TYPE;
  14406. }
  14407. ssl->buffers.inputBuffer.idx++;
  14408. if (!ssl->msgsReceived.got_change_cipher) {
  14409. ssl->msgsReceived.got_change_cipher = 1;
  14410. }
  14411. else {
  14412. SendAlert(ssl, alert_fatal, illegal_parameter);
  14413. return UNKNOWN_RECORD_TYPE;
  14414. }
  14415. break;
  14416. }
  14417. #endif
  14418. #ifndef WOLFSSL_NO_TLS12
  14419. if (ssl->buffers.inputBuffer.idx >=
  14420. ssl->buffers.inputBuffer.length ||
  14421. ssl->curSize < 1) {
  14422. WOLFSSL_MSG("ChangeCipher msg too short");
  14423. return LENGTH_ERROR;
  14424. }
  14425. if (ssl->buffers.inputBuffer.buffer[
  14426. ssl->buffers.inputBuffer.idx] != 1) {
  14427. WOLFSSL_MSG("ChangeCipher msg wrong value");
  14428. return LENGTH_ERROR;
  14429. }
  14430. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  14431. #ifdef HAVE_AEAD
  14432. if (ssl->specs.cipher_type == aead) {
  14433. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  14434. ssl->curSize -= AESGCM_EXP_IV_SZ;
  14435. ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
  14436. ssl->curSize -= ssl->specs.aead_mac_size;
  14437. }
  14438. else
  14439. #endif
  14440. {
  14441. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  14442. ssl->curSize -= (word16)ssl->keys.padSz;
  14443. ssl->curSize -= ssl->specs.iv_size;
  14444. }
  14445. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14446. if (ssl->options.startedETMRead) {
  14447. word32 digestSz = MacSize(ssl);
  14448. ssl->buffers.inputBuffer.idx += digestSz;
  14449. ssl->curSize -= (word16)digestSz;
  14450. }
  14451. #endif
  14452. }
  14453. if (ssl->curSize != 1) {
  14454. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  14455. return LENGTH_ERROR;
  14456. }
  14457. ssl->buffers.inputBuffer.idx++;
  14458. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  14459. if (ret != 0) {
  14460. if (!ssl->options.dtls) {
  14461. return ret;
  14462. }
  14463. else {
  14464. #ifdef WOLFSSL_DTLS
  14465. /* Check for duplicate CCS message in DTLS mode.
  14466. * DTLS allows for duplicate messages, and it should be
  14467. * skipped. Also skip if out of order. */
  14468. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  14469. return ret;
  14470. /* Reset error */
  14471. ret = 0;
  14472. break;
  14473. #endif /* WOLFSSL_DTLS */
  14474. }
  14475. }
  14476. ssl->keys.encryptionOn = 1;
  14477. /* setup decrypt keys for following messages */
  14478. /* XXX This might not be what we want to do when
  14479. * receiving a CCS with multicast. We update the
  14480. * key when the application updates them. */
  14481. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  14482. return ret;
  14483. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14484. ssl->options.startedETMRead = ssl->options.encThenMac;
  14485. #endif
  14486. #ifdef WOLFSSL_DTLS
  14487. if (ssl->options.dtls) {
  14488. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  14489. #ifdef WOLFSSL_MULTICAST
  14490. if (ssl->options.haveMcast) {
  14491. peerSeq += ssl->keys.curPeerId;
  14492. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  14493. ssl->ctx->mcastFirstSeq,
  14494. ssl->ctx->mcastSecondSeq,
  14495. ssl->ctx->mcastMaxSeq);
  14496. }
  14497. #endif
  14498. peerSeq->nextEpoch++;
  14499. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  14500. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  14501. peerSeq->nextSeq_lo = 0;
  14502. peerSeq->nextSeq_hi = 0;
  14503. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  14504. DTLS_SEQ_SZ);
  14505. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  14506. }
  14507. #endif
  14508. #ifdef HAVE_LIBZ
  14509. if (ssl->options.usingCompression)
  14510. if ( (ret = InitStreams(ssl)) != 0)
  14511. return ret;
  14512. #endif
  14513. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  14514. ssl->options.side == WOLFSSL_CLIENT_END ?
  14515. server : client);
  14516. if (ret != 0)
  14517. return ret;
  14518. #endif /* !WOLFSSL_NO_TLS12 */
  14519. break;
  14520. case application_data:
  14521. WOLFSSL_MSG("got app DATA");
  14522. #ifdef WOLFSSL_DTLS
  14523. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  14524. #ifdef HAVE_SECURE_RENEGOTIATION
  14525. /*
  14526. * Only free HS resources when not in the process of a
  14527. * secure renegotiation and we have received APP DATA
  14528. * from the current epoch
  14529. */
  14530. if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
  14531. || !DtlsSCRKeysSet(ssl))) {
  14532. FreeHandshakeResources(ssl);
  14533. ssl->options.dtlsHsRetain = 0;
  14534. }
  14535. #else
  14536. FreeHandshakeResources(ssl);
  14537. ssl->options.dtlsHsRetain = 0;
  14538. #endif
  14539. }
  14540. #endif
  14541. #ifdef WOLFSSL_TLS13
  14542. if (ssl->keys.keyUpdateRespond) {
  14543. WOLFSSL_MSG("No KeyUpdate from peer seen");
  14544. return SANITY_MSG_E;
  14545. }
  14546. #endif
  14547. if ((ret = DoApplicationData(ssl,
  14548. ssl->buffers.inputBuffer.buffer,
  14549. &ssl->buffers.inputBuffer.idx))
  14550. != 0) {
  14551. WOLFSSL_ERROR(ret);
  14552. return ret;
  14553. }
  14554. break;
  14555. case alert:
  14556. WOLFSSL_MSG("got ALERT!");
  14557. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  14558. &ssl->buffers.inputBuffer.idx, &type,
  14559. ssl->buffers.inputBuffer.length);
  14560. if (ret == alert_fatal)
  14561. return FATAL_ERROR;
  14562. else if (ret < 0)
  14563. return ret;
  14564. /* catch warnings that are handled as errors */
  14565. if (type == close_notify)
  14566. return ssl->error = ZERO_RETURN;
  14567. if (type == decrypt_error)
  14568. return FATAL_ERROR;
  14569. /* Reset error if we got an alert level in ret */
  14570. if (ret > 0)
  14571. ret = 0;
  14572. break;
  14573. default:
  14574. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  14575. return UNKNOWN_RECORD_TYPE;
  14576. }
  14577. ssl->options.processReply = doProcessInit;
  14578. /* input exhausted */
  14579. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
  14580. #ifdef WOLFSSL_DTLS
  14581. /* If app data was processed then return now to avoid
  14582. * dropping any app data. */
  14583. || (ssl->options.dtls && ssl->curRL.type == application_data)
  14584. #endif
  14585. )
  14586. return ret;
  14587. /* more messages per record */
  14588. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  14589. WOLFSSL_MSG("More messages in record");
  14590. ssl->options.processReply = runProcessingOneMessage;
  14591. if (IsEncryptionOn(ssl, 0)) {
  14592. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  14593. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14594. if (ssl->options.startedETMRead) {
  14595. word32 digestSz = MacSize(ssl);
  14596. if (ssl->buffers.inputBuffer.idx >=
  14597. ssl->keys.padSz + digestSz) {
  14598. ssl->buffers.inputBuffer.idx -=
  14599. ssl->keys.padSz + digestSz;
  14600. }
  14601. else {
  14602. WOLFSSL_MSG("\tmiddle padding error");
  14603. return FATAL_ERROR;
  14604. }
  14605. }
  14606. else
  14607. #endif
  14608. {
  14609. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  14610. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  14611. }
  14612. else {
  14613. WOLFSSL_MSG("\tmiddle padding error");
  14614. return FATAL_ERROR;
  14615. }
  14616. }
  14617. }
  14618. }
  14619. /* more records */
  14620. else {
  14621. WOLFSSL_MSG("More records in input");
  14622. }
  14623. #ifdef WOLFSSL_ASYNC_CRYPT
  14624. /* We are setup to read next message/record but we had an error
  14625. * (probably WC_PENDING_E) so return that so it can be handled
  14626. * by higher layers. */
  14627. if (ret != 0)
  14628. return ret;
  14629. #endif
  14630. continue;
  14631. default:
  14632. WOLFSSL_MSG("Bad process input state, programming error");
  14633. return INPUT_CASE_ERROR;
  14634. }
  14635. }
  14636. }
  14637. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  14638. (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
  14639. int SendChangeCipher(WOLFSSL* ssl)
  14640. {
  14641. byte *output;
  14642. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  14643. int idx = RECORD_HEADER_SZ;
  14644. int ret;
  14645. #ifdef OPENSSL_EXTRA
  14646. ssl->cbmode = SSL_CB_MODE_WRITE;
  14647. if (ssl->options.side == WOLFSSL_SERVER_END){
  14648. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  14649. if (ssl->CBIS != NULL)
  14650. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  14651. }
  14652. else{
  14653. ssl->options.clientState =
  14654. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  14655. if (ssl->CBIS != NULL)
  14656. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  14657. }
  14658. #endif
  14659. #ifdef WOLFSSL_DTLS
  14660. if (ssl->options.dtls) {
  14661. sendSz += DTLS_RECORD_EXTRA;
  14662. idx += DTLS_RECORD_EXTRA;
  14663. }
  14664. #endif
  14665. /* are we in scr */
  14666. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  14667. sendSz += MAX_MSG_EXTRA;
  14668. }
  14669. /* check for available size */
  14670. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  14671. return ret;
  14672. /* get output buffer */
  14673. output = ssl->buffers.outputBuffer.buffer +
  14674. ssl->buffers.outputBuffer.length;
  14675. AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
  14676. output[idx] = 1; /* turn it on */
  14677. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  14678. byte input[ENUM_LEN];
  14679. int inputSz = ENUM_LEN;
  14680. input[0] = 1; /* turn it on */
  14681. #ifdef WOLFSSL_DTLS
  14682. if (IsDtlsNotSctpMode(ssl) &&
  14683. (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
  14684. return ret;
  14685. }
  14686. #endif
  14687. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  14688. change_cipher_spec, 0, 0, 0, CUR_ORDER);
  14689. if (sendSz < 0) {
  14690. return sendSz;
  14691. }
  14692. }
  14693. #ifdef WOLFSSL_DTLS
  14694. else {
  14695. if (IsDtlsNotSctpMode(ssl)) {
  14696. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
  14697. return ret;
  14698. DtlsSEQIncrement(ssl, CUR_ORDER);
  14699. }
  14700. }
  14701. #endif
  14702. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14703. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  14704. if (ssl->toInfoOn)
  14705. AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  14706. sendSz, WRITE_PROTO, ssl->heap);
  14707. #endif
  14708. ssl->buffers.outputBuffer.length += sendSz;
  14709. #ifdef WOLFSSL_TLS13
  14710. if (!ssl->options.tls1_3)
  14711. #endif
  14712. {
  14713. /* setup encrypt keys */
  14714. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  14715. return ret;
  14716. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14717. ssl->options.startedETMWrite = ssl->options.encThenMac;
  14718. #endif
  14719. }
  14720. if (ssl->options.groupMessages)
  14721. return 0;
  14722. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  14723. else if (ssl->options.dtls) {
  14724. /* If using DTLS, force the ChangeCipherSpec message to be in the
  14725. * same datagram as the finished message. */
  14726. return 0;
  14727. }
  14728. #endif
  14729. else
  14730. return SendBuffered(ssl);
  14731. }
  14732. #endif
  14733. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  14734. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  14735. int padLen, int content, int verify, int epochOrder)
  14736. {
  14737. byte result[WC_MAX_DIGEST_SIZE];
  14738. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  14739. word32 padSz = ssl->specs.pad_size;
  14740. int ret = 0;
  14741. wc_Md5 md5;
  14742. wc_Sha sha;
  14743. /* data */
  14744. byte seq[SEQ_SZ];
  14745. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  14746. const byte* macSecret = NULL;
  14747. (void)padLen;
  14748. #ifdef HAVE_FUZZER
  14749. if (ssl->fuzzerCb)
  14750. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  14751. #endif
  14752. #ifdef WOLFSSL_DTLS
  14753. if (ssl->options.dtls)
  14754. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  14755. else
  14756. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  14757. #else
  14758. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  14759. #endif
  14760. XMEMSET(seq, 0, SEQ_SZ);
  14761. conLen[0] = (byte)content;
  14762. c16toa((word16)sz, &conLen[ENUM_LEN]);
  14763. WriteSEQ(ssl, epochOrder, seq);
  14764. if (ssl->specs.mac_algorithm == md5_mac) {
  14765. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  14766. if (ret != 0)
  14767. return ret;
  14768. /* inner */
  14769. ret = wc_Md5Update(&md5, macSecret, digestSz);
  14770. ret |= wc_Md5Update(&md5, PAD1, padSz);
  14771. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  14772. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  14773. /* in buffer */
  14774. ret |= wc_Md5Update(&md5, in, sz);
  14775. if (ret != 0)
  14776. return VERIFY_MAC_ERROR;
  14777. ret = wc_Md5Final(&md5, result);
  14778. #ifdef WOLFSSL_ASYNC_CRYPT
  14779. /* TODO: Make non-blocking */
  14780. if (ret == WC_PENDING_E) {
  14781. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  14782. }
  14783. #endif
  14784. if (ret != 0)
  14785. return VERIFY_MAC_ERROR;
  14786. /* outer */
  14787. ret = wc_Md5Update(&md5, macSecret, digestSz);
  14788. ret |= wc_Md5Update(&md5, PAD2, padSz);
  14789. ret |= wc_Md5Update(&md5, result, digestSz);
  14790. if (ret != 0)
  14791. return VERIFY_MAC_ERROR;
  14792. ret = wc_Md5Final(&md5, digest);
  14793. #ifdef WOLFSSL_ASYNC_CRYPT
  14794. /* TODO: Make non-blocking */
  14795. if (ret == WC_PENDING_E) {
  14796. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  14797. }
  14798. #endif
  14799. if (ret != 0)
  14800. return VERIFY_MAC_ERROR;
  14801. wc_Md5Free(&md5);
  14802. }
  14803. else {
  14804. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  14805. if (ret != 0)
  14806. return ret;
  14807. /* inner */
  14808. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  14809. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  14810. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  14811. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  14812. /* in buffer */
  14813. ret |= wc_ShaUpdate(&sha, in, sz);
  14814. if (ret != 0)
  14815. return VERIFY_MAC_ERROR;
  14816. ret = wc_ShaFinal(&sha, result);
  14817. #ifdef WOLFSSL_ASYNC_CRYPT
  14818. /* TODO: Make non-blocking */
  14819. if (ret == WC_PENDING_E) {
  14820. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  14821. }
  14822. #endif
  14823. if (ret != 0)
  14824. return VERIFY_MAC_ERROR;
  14825. /* outer */
  14826. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  14827. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  14828. ret |= wc_ShaUpdate(&sha, result, digestSz);
  14829. if (ret != 0)
  14830. return VERIFY_MAC_ERROR;
  14831. ret = wc_ShaFinal(&sha, digest);
  14832. #ifdef WOLFSSL_ASYNC_CRYPT
  14833. /* TODO: Make non-blocking */
  14834. if (ret == WC_PENDING_E) {
  14835. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  14836. }
  14837. #endif
  14838. if (ret != 0)
  14839. return VERIFY_MAC_ERROR;
  14840. wc_ShaFree(&sha);
  14841. }
  14842. return 0;
  14843. }
  14844. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  14845. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  14846. static int BuildMD5_CertVerify(WOLFSSL* ssl, byte* digest)
  14847. {
  14848. int ret;
  14849. byte md5_result[WC_MD5_DIGEST_SIZE];
  14850. #ifdef WOLFSSL_SMALL_STACK
  14851. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  14852. #else
  14853. wc_Md5 md5[1];
  14854. #endif
  14855. /* make md5 inner */
  14856. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  14857. if (ret == 0)
  14858. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  14859. if (ret == 0)
  14860. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  14861. if (ret == 0)
  14862. ret = wc_Md5Final(md5, md5_result);
  14863. /* make md5 outer */
  14864. if (ret == 0) {
  14865. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  14866. if (ret == 0) {
  14867. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  14868. if (ret == 0)
  14869. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  14870. if (ret == 0)
  14871. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  14872. if (ret == 0)
  14873. ret = wc_Md5Final(md5, digest);
  14874. wc_Md5Free(md5);
  14875. }
  14876. }
  14877. #ifdef WOLFSSL_SMALL_STACK
  14878. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  14879. #endif
  14880. return ret;
  14881. }
  14882. #endif /* !NO_MD5 && !NO_OLD_TLS */
  14883. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  14884. defined(WOLFSSL_ALLOW_TLS_SHA1))
  14885. static int BuildSHA_CertVerify(WOLFSSL* ssl, byte* digest)
  14886. {
  14887. int ret;
  14888. byte sha_result[WC_SHA_DIGEST_SIZE];
  14889. #ifdef WOLFSSL_SMALL_STACK
  14890. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  14891. #else
  14892. wc_Sha sha[1];
  14893. #endif
  14894. /* make sha inner */
  14895. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  14896. if (ret == 0)
  14897. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  14898. if (ret == 0)
  14899. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  14900. if (ret == 0)
  14901. ret = wc_ShaFinal(sha, sha_result);
  14902. /* make sha outer */
  14903. if (ret == 0) {
  14904. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  14905. if (ret == 0) {
  14906. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  14907. if (ret == 0)
  14908. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  14909. if (ret == 0)
  14910. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  14911. if (ret == 0)
  14912. ret = wc_ShaFinal(sha, digest);
  14913. wc_ShaFree(sha);
  14914. }
  14915. }
  14916. #ifdef WOLFSSL_SMALL_STACK
  14917. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  14918. #endif
  14919. return ret;
  14920. }
  14921. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  14922. int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes)
  14923. {
  14924. int ret = 0;
  14925. (void)hashes;
  14926. if (ssl->options.tls) {
  14927. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  14928. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  14929. if (ret != 0)
  14930. return ret;
  14931. #endif
  14932. #if !defined(NO_SHA)
  14933. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  14934. if (ret != 0)
  14935. return ret;
  14936. #endif
  14937. if (IsAtLeastTLSv1_2(ssl)) {
  14938. #ifndef NO_SHA256
  14939. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  14940. hashes->sha256);
  14941. if (ret != 0)
  14942. return ret;
  14943. #endif
  14944. #ifdef WOLFSSL_SHA384
  14945. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  14946. hashes->sha384);
  14947. if (ret != 0)
  14948. return ret;
  14949. #endif
  14950. #ifdef WOLFSSL_SHA512
  14951. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  14952. hashes->sha512);
  14953. if (ret != 0)
  14954. return ret;
  14955. #endif
  14956. }
  14957. }
  14958. else {
  14959. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  14960. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  14961. if (ret != 0)
  14962. return ret;
  14963. #endif
  14964. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  14965. defined(WOLFSSL_ALLOW_TLS_SHA1))
  14966. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  14967. if (ret != 0)
  14968. return ret;
  14969. #endif
  14970. }
  14971. return ret;
  14972. }
  14973. #ifndef WOLFSSL_NO_TLS12
  14974. void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
  14975. {
  14976. if (args) {
  14977. if (ssl && args->iv)
  14978. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  14979. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  14980. }
  14981. }
  14982. #endif
  14983. /* Build SSL Message, encrypted */
  14984. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  14985. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
  14986. int epochOrder)
  14987. {
  14988. #ifndef WOLFSSL_NO_TLS12
  14989. int ret = 0;
  14990. BuildMsgArgs* args;
  14991. BuildMsgArgs lcl_args;
  14992. #ifdef WOLFSSL_ASYNC_CRYPT
  14993. args = &ssl->async.buildArgs;
  14994. #endif
  14995. #endif
  14996. WOLFSSL_ENTER("BuildMessage");
  14997. if (ssl == NULL) {
  14998. return BAD_FUNC_ARG;
  14999. }
  15000. (void)epochOrder;
  15001. #ifdef WOLFSSL_NO_TLS12
  15002. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  15003. hashOutput, sizeOnly, asyncOkay);
  15004. #else
  15005. #ifdef WOLFSSL_TLS13
  15006. if (ssl->options.tls1_3) {
  15007. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  15008. hashOutput, sizeOnly, asyncOkay);
  15009. }
  15010. #endif
  15011. ret = WC_NOT_PENDING_E;
  15012. #ifdef WOLFSSL_ASYNC_CRYPT
  15013. if (asyncOkay) {
  15014. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  15015. if (ret != WC_NOT_PENDING_E) {
  15016. /* Check for error */
  15017. if (ret < 0)
  15018. goto exit_buildmsg;
  15019. }
  15020. }
  15021. else
  15022. #endif
  15023. {
  15024. args = &lcl_args;
  15025. }
  15026. /* Reset state */
  15027. if (ret == WC_NOT_PENDING_E) {
  15028. ret = 0;
  15029. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  15030. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  15031. args->sz = RECORD_HEADER_SZ + inSz;
  15032. args->idx = RECORD_HEADER_SZ;
  15033. args->headerSz = RECORD_HEADER_SZ;
  15034. }
  15035. switch (ssl->options.buildMsgState) {
  15036. case BUILD_MSG_BEGIN:
  15037. {
  15038. /* catch mistaken sizeOnly parameter */
  15039. if (!sizeOnly && (output == NULL || input == NULL) ) {
  15040. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  15041. }
  15042. if (sizeOnly && (output || input) ) {
  15043. WOLFSSL_MSG("BuildMessage w/sizeOnly doesn't need input/output");
  15044. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  15045. }
  15046. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15047. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  15048. /* For epochs >1 the current cipher parameters are located in
  15049. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  15050. * parameters and for epoch 1 use ssl->keys */
  15051. switch (epochOrder) {
  15052. case PREV_ORDER:
  15053. if (ssl->encrypt.src != KEYS) {
  15054. ssl->secure_renegotiation->cache_status =
  15055. SCR_CACHE_NULL;
  15056. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  15057. ERROR_OUT(ret, exit_buildmsg);
  15058. }
  15059. break;
  15060. case CUR_ORDER:
  15061. if (ssl->keys.dtls_epoch ==
  15062. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  15063. if (ssl->encrypt.src != SCR) {
  15064. ssl->secure_renegotiation->cache_status =
  15065. SCR_CACHE_NEEDED;
  15066. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  15067. != 0)
  15068. ERROR_OUT(ret, exit_buildmsg);
  15069. }
  15070. }
  15071. else {
  15072. if (ssl->encrypt.src != KEYS) {
  15073. ssl->secure_renegotiation->cache_status =
  15074. SCR_CACHE_NULL;
  15075. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  15076. != 0)
  15077. ERROR_OUT(ret, exit_buildmsg);
  15078. }
  15079. }
  15080. break;
  15081. default:
  15082. WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
  15083. "CUR_ORDER");
  15084. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  15085. }
  15086. }
  15087. #endif
  15088. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  15089. }
  15090. FALL_THROUGH;
  15091. case BUILD_MSG_SIZE:
  15092. {
  15093. args->digestSz = ssl->specs.hash_size;
  15094. #ifdef HAVE_TRUNCATED_HMAC
  15095. if (ssl->truncated_hmac)
  15096. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  15097. #endif
  15098. args->sz += args->digestSz;
  15099. #ifdef WOLFSSL_DTLS
  15100. if (ssl->options.dtls) {
  15101. args->sz += DTLS_RECORD_EXTRA;
  15102. args->idx += DTLS_RECORD_EXTRA;
  15103. args->headerSz += DTLS_RECORD_EXTRA;
  15104. }
  15105. #endif
  15106. #ifndef WOLFSSL_AEAD_ONLY
  15107. if (ssl->specs.cipher_type == block) {
  15108. word32 blockSz = ssl->specs.block_size;
  15109. if (ssl->options.tls1_1) {
  15110. args->ivSz = blockSz;
  15111. args->sz += args->ivSz;
  15112. if (args->ivSz > MAX_IV_SZ)
  15113. ERROR_OUT(BUFFER_E, exit_buildmsg);
  15114. }
  15115. args->sz += 1; /* pad byte */
  15116. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15117. if (ssl->options.startedETMWrite) {
  15118. args->pad = (args->sz - args->headerSz -
  15119. args->digestSz) % blockSz;
  15120. }
  15121. else
  15122. #endif
  15123. args->pad = (args->sz - args->headerSz) % blockSz;
  15124. #ifdef OPENSSL_EXTRA
  15125. if(args->pad != 0)
  15126. #endif
  15127. args->pad = blockSz - args->pad;
  15128. args->sz += args->pad;
  15129. }
  15130. #endif /* WOLFSSL_AEAD_ONLY */
  15131. #ifdef HAVE_AEAD
  15132. if (ssl->specs.cipher_type == aead) {
  15133. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  15134. args->ivSz = AESGCM_EXP_IV_SZ;
  15135. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  15136. }
  15137. #endif
  15138. /* done with size calculations */
  15139. if (sizeOnly)
  15140. goto exit_buildmsg;
  15141. if (args->sz > (word32)outSz) {
  15142. WOLFSSL_MSG("Oops, want to write past output buffer size");
  15143. ERROR_OUT(BUFFER_E, exit_buildmsg);
  15144. }
  15145. if (args->ivSz > 0) {
  15146. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap, DYNAMIC_TYPE_SALT);
  15147. if (args->iv == NULL)
  15148. ERROR_OUT(MEMORY_E, exit_buildmsg);
  15149. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  15150. if (ret != 0)
  15151. goto exit_buildmsg;
  15152. }
  15153. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15154. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  15155. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  15156. defined(HAVE_AEAD))
  15157. if (ssl->specs.cipher_type == aead) {
  15158. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  15159. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  15160. }
  15161. #endif
  15162. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  15163. AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
  15164. /* write to output */
  15165. if (args->ivSz > 0) {
  15166. XMEMCPY(output + args->idx, args->iv,
  15167. min(args->ivSz, MAX_IV_SZ));
  15168. args->idx += args->ivSz;
  15169. }
  15170. XMEMCPY(output + args->idx, input, inSz);
  15171. args->idx += inSz;
  15172. ssl->options.buildMsgState = BUILD_MSG_HASH;
  15173. }
  15174. FALL_THROUGH;
  15175. case BUILD_MSG_HASH:
  15176. {
  15177. if (type == handshake && hashOutput) {
  15178. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  15179. if (ret != 0)
  15180. goto exit_buildmsg;
  15181. }
  15182. #ifndef WOLFSSL_AEAD_ONLY
  15183. if (ssl->specs.cipher_type == block) {
  15184. word32 tmpIdx;
  15185. word32 i;
  15186. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15187. if (ssl->options.startedETMWrite)
  15188. tmpIdx = args->idx;
  15189. else
  15190. #endif
  15191. tmpIdx = args->idx + args->digestSz;
  15192. for (i = 0; i <= args->pad; i++)
  15193. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  15194. }
  15195. #endif
  15196. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  15197. }
  15198. FALL_THROUGH;
  15199. case BUILD_MSG_VERIFY_MAC:
  15200. {
  15201. /* User Record Layer Callback handling */
  15202. #ifdef ATOMIC_USER
  15203. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15204. if (ssl->options.startedETMWrite) {
  15205. if (ssl->ctx->EncryptMacCb) {
  15206. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  15207. args->pad + 1, type, 0,
  15208. output + args->headerSz,
  15209. output + args->headerSz,
  15210. args->size - args->digestSz,
  15211. ssl->MacEncryptCtx);
  15212. goto exit_buildmsg;
  15213. }
  15214. }
  15215. else
  15216. #endif
  15217. {
  15218. if (ssl->ctx->MacEncryptCb) {
  15219. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  15220. output + args->headerSz + args->ivSz, inSz,
  15221. type, 0, output + args->headerSz,
  15222. output + args->headerSz, args->size,
  15223. ssl->MacEncryptCtx);
  15224. goto exit_buildmsg;
  15225. }
  15226. }
  15227. #endif
  15228. #ifndef WOLFSSL_AEAD_ONLY
  15229. if (ssl->specs.cipher_type != aead
  15230. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15231. && !ssl->options.startedETMWrite
  15232. #endif
  15233. ) {
  15234. #ifdef HAVE_TRUNCATED_HMAC
  15235. if (ssl->truncated_hmac &&
  15236. ssl->specs.hash_size > args->digestSz) {
  15237. #ifdef WOLFSSL_SMALL_STACK
  15238. byte* hmac;
  15239. #else
  15240. byte hmac[WC_MAX_DIGEST_SIZE];
  15241. #endif
  15242. #ifdef WOLFSSL_SMALL_STACK
  15243. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  15244. DYNAMIC_TYPE_DIGEST);
  15245. if (hmac == NULL)
  15246. ERROR_OUT(MEMORY_E, exit_buildmsg);
  15247. #endif
  15248. ret = ssl->hmac(ssl, hmac,
  15249. output + args->headerSz + args->ivSz, inSz,
  15250. -1, type, 0, epochOrder);
  15251. XMEMCPY(output + args->idx, hmac, args->digestSz);
  15252. #ifdef WOLFSSL_SMALL_STACK
  15253. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  15254. #endif
  15255. }
  15256. else
  15257. #endif
  15258. {
  15259. ret = ssl->hmac(ssl, output + args->idx, output +
  15260. args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
  15261. }
  15262. }
  15263. #endif /* WOLFSSL_AEAD_ONLY */
  15264. if (ret != 0)
  15265. goto exit_buildmsg;
  15266. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  15267. }
  15268. FALL_THROUGH;
  15269. case BUILD_MSG_ENCRYPT:
  15270. {
  15271. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  15272. /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
  15273. * for all encryption algos that use it for encryption parameters */
  15274. word16 dtls_epoch = 0;
  15275. word16 dtls_sequence_number_hi = 0;
  15276. word32 dtls_sequence_number_lo = 0;
  15277. int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
  15278. DtlsUseSCRKeys(ssl);
  15279. if (swap_seq) {
  15280. dtls_epoch = ssl->keys.dtls_epoch;
  15281. dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
  15282. dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
  15283. ssl->keys.dtls_epoch--;
  15284. ssl->keys.dtls_sequence_number_hi =
  15285. ssl->keys.dtls_prev_sequence_number_hi;
  15286. ssl->keys.dtls_sequence_number_lo =
  15287. ssl->keys.dtls_prev_sequence_number_lo;
  15288. }
  15289. #endif
  15290. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15291. if (ssl->options.startedETMWrite) {
  15292. ret = Encrypt(ssl, output + args->headerSz,
  15293. output + args->headerSz,
  15294. (word16)(args->size - args->digestSz),
  15295. asyncOkay);
  15296. }
  15297. else
  15298. #endif
  15299. {
  15300. ret = Encrypt(ssl, output + args->headerSz,
  15301. output + args->headerSz, args->size, asyncOkay);
  15302. }
  15303. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  15304. /* Restore sequence numbers */
  15305. if (swap_seq) {
  15306. ssl->keys.dtls_epoch = dtls_epoch;
  15307. ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
  15308. ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
  15309. }
  15310. #endif
  15311. if (ret != 0)
  15312. goto exit_buildmsg;
  15313. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  15314. }
  15315. FALL_THROUGH;
  15316. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  15317. {
  15318. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15319. if (ssl->options.startedETMWrite) {
  15320. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  15321. #ifdef HAVE_TRUNCATED_HMAC
  15322. if (ssl->truncated_hmac &&
  15323. ssl->specs.hash_size > args->digestSz) {
  15324. #ifdef WOLFSSL_SMALL_STACK
  15325. byte* hmac = NULL;
  15326. #else
  15327. byte hmac[WC_MAX_DIGEST_SIZE];
  15328. #endif
  15329. #ifdef WOLFSSL_SMALL_STACK
  15330. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  15331. DYNAMIC_TYPE_DIGEST);
  15332. if (hmac == NULL)
  15333. ERROR_OUT(MEMORY_E, exit_buildmsg);
  15334. #endif
  15335. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  15336. args->ivSz + inSz + args->pad + 1, -1, type,
  15337. 0, epochOrder);
  15338. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  15339. args->digestSz);
  15340. #ifdef WOLFSSL_SMALL_STACK
  15341. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  15342. #endif
  15343. }
  15344. else
  15345. #endif
  15346. {
  15347. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  15348. output + args->headerSz,
  15349. args->ivSz + inSz + args->pad + 1, -1, type,
  15350. 0, epochOrder);
  15351. }
  15352. }
  15353. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  15354. }
  15355. FALL_THROUGH;
  15356. default:
  15357. break;
  15358. }
  15359. exit_buildmsg:
  15360. WOLFSSL_LEAVE("BuildMessage", ret);
  15361. #ifdef WOLFSSL_ASYNC_CRYPT
  15362. if (ret == WC_PENDING_E) {
  15363. return ret;
  15364. }
  15365. #endif
  15366. /* make sure build message state is reset */
  15367. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  15368. #ifdef WOLFSSL_DTLS
  15369. if (ret == 0 && ssl->options.dtls)
  15370. DtlsSEQIncrement(ssl, epochOrder);
  15371. #endif
  15372. /* return sz on success */
  15373. if (ret == 0)
  15374. ret = args->sz;
  15375. /* Final cleanup */
  15376. FreeBuildMsgArgs(ssl, args);
  15377. return ret;
  15378. #endif /* !WOLFSSL_NO_TLS12 */
  15379. }
  15380. #ifndef WOLFSSL_NO_TLS12
  15381. int SendFinished(WOLFSSL* ssl)
  15382. {
  15383. int sendSz,
  15384. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  15385. FINISHED_SZ;
  15386. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  15387. byte *output;
  15388. Hashes* hashes;
  15389. int ret;
  15390. int headerSz = HANDSHAKE_HEADER_SZ;
  15391. int outputSz;
  15392. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  15393. WOLFSSL_ENTER("SendFinished");
  15394. /* check for available size */
  15395. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  15396. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  15397. return ret;
  15398. #ifdef WOLFSSL_DTLS
  15399. if (ssl->options.dtls) {
  15400. headerSz += DTLS_HANDSHAKE_EXTRA;
  15401. ssl->keys.dtls_epoch++;
  15402. ssl->keys.dtls_prev_sequence_number_hi =
  15403. ssl->keys.dtls_sequence_number_hi;
  15404. ssl->keys.dtls_prev_sequence_number_lo =
  15405. ssl->keys.dtls_sequence_number_lo;
  15406. ssl->keys.dtls_sequence_number_hi = 0;
  15407. ssl->keys.dtls_sequence_number_lo = 0;
  15408. }
  15409. #endif
  15410. /* get output buffer */
  15411. output = ssl->buffers.outputBuffer.buffer +
  15412. ssl->buffers.outputBuffer.length;
  15413. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  15414. /* make finished hashes */
  15415. hashes = (Hashes*)&input[headerSz];
  15416. ret = BuildFinished(ssl, hashes,
  15417. ssl->options.side == WOLFSSL_CLIENT_END ? client : server);
  15418. if (ret != 0) return ret;
  15419. #ifdef HAVE_SECURE_RENEGOTIATION
  15420. if (ssl->secure_renegotiation) {
  15421. if (ssl->options.side == WOLFSSL_CLIENT_END)
  15422. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  15423. TLS_FINISHED_SZ);
  15424. else
  15425. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  15426. TLS_FINISHED_SZ);
  15427. }
  15428. #endif
  15429. #ifdef OPENSSL_ALL
  15430. if (ssl->options.side == WOLFSSL_CLIENT_END)
  15431. XMEMCPY(ssl->clientFinished,
  15432. hashes, TLS_FINISHED_SZ);
  15433. else
  15434. XMEMCPY(ssl->serverFinished,
  15435. hashes, TLS_FINISHED_SZ);
  15436. #endif
  15437. #ifdef WOLFSSL_DTLS
  15438. if (IsDtlsNotSctpMode(ssl)) {
  15439. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz, finished)) != 0)
  15440. return ret;
  15441. }
  15442. #endif
  15443. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  15444. handshake, 1, 0, 0, CUR_ORDER);
  15445. if (sendSz < 0)
  15446. return BUILD_MSG_ERROR;
  15447. if (!ssl->options.resuming) {
  15448. #ifndef NO_SESSION_CACHE
  15449. AddSession(ssl); /* just try */
  15450. #endif
  15451. if (ssl->options.side == WOLFSSL_SERVER_END) {
  15452. #ifdef OPENSSL_EXTRA
  15453. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  15454. ssl->cbmode = SSL_CB_MODE_WRITE;
  15455. if (ssl->CBIS != NULL)
  15456. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  15457. #endif
  15458. ssl->options.handShakeState = HANDSHAKE_DONE;
  15459. ssl->options.handShakeDone = 1;
  15460. }
  15461. }
  15462. else {
  15463. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  15464. #ifdef OPENSSL_EXTRA
  15465. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  15466. ssl->cbmode = SSL_CB_MODE_WRITE;
  15467. if (ssl->CBIS != NULL)
  15468. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  15469. #endif
  15470. ssl->options.handShakeState = HANDSHAKE_DONE;
  15471. ssl->options.handShakeDone = 1;
  15472. }
  15473. }
  15474. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15475. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  15476. if (ssl->toInfoOn)
  15477. AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  15478. WRITE_PROTO, ssl->heap);
  15479. #endif
  15480. ssl->buffers.outputBuffer.length += sendSz;
  15481. ret = SendBuffered(ssl);
  15482. #ifdef WOLFSSL_DTLS
  15483. if ((!ssl->options.resuming &&
  15484. ssl->options.side == WOLFSSL_SERVER_END) ||
  15485. (ssl->options.resuming &&
  15486. ssl->options.side == WOLFSSL_CLIENT_END)) {
  15487. ssl->keys.dtls_handshake_number = 0;
  15488. ssl->keys.dtls_expected_peer_handshake_number = 0;
  15489. }
  15490. #endif
  15491. WOLFSSL_LEAVE("SendFinished", ret);
  15492. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  15493. return ret;
  15494. }
  15495. #endif /* WOLFSSL_NO_TLS12 */
  15496. #ifndef NO_WOLFSSL_SERVER
  15497. #if (!defined(WOLFSSL_NO_TLS12) && \
  15498. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  15499. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  15500. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  15501. /* Parses and decodes the certificate then initializes "request". In the case
  15502. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  15503. *
  15504. * Returns 0 on success
  15505. */
  15506. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  15507. DecodedCert* cert, byte* certData, word32 length)
  15508. {
  15509. int ret;
  15510. if (request != NULL)
  15511. XMEMSET(request, 0, sizeof(OcspRequest));
  15512. InitDecodedCert(cert, certData, length, ssl->heap);
  15513. /* TODO: Setup async support here */
  15514. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, ssl->ctx->cm);
  15515. if (ret != 0) {
  15516. WOLFSSL_MSG("ParseCert failed");
  15517. }
  15518. if (ret == 0)
  15519. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  15520. if (ret == 0) {
  15521. /* make sure ctx OCSP request is updated */
  15522. if (!ssl->buffers.weOwnCert) {
  15523. wolfSSL_Mutex* ocspLock = &ssl->ctx->cm->ocsp_stapling->ocspLock;
  15524. if (wc_LockMutex(ocspLock) == 0) {
  15525. if (ssl->ctx->certOcspRequest == NULL)
  15526. ssl->ctx->certOcspRequest = request;
  15527. wc_UnLockMutex(ocspLock);
  15528. }
  15529. }
  15530. }
  15531. FreeDecodedCert(cert);
  15532. return ret;
  15533. }
  15534. /* Creates OCSP response and places it in variable "response". Memory
  15535. * management for "buffer* response" is up to the caller.
  15536. *
  15537. * Also creates an OcspRequest in the case that ocspRequest is null or that
  15538. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  15539. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  15540. * be set to point to "ocspRequest" and it then should not be free'd since
  15541. * wolfSSL_CTX_free will take care of it.
  15542. *
  15543. * Returns 0 on success
  15544. */
  15545. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  15546. buffer* response)
  15547. {
  15548. int ret = 0;
  15549. OcspRequest* request = NULL;
  15550. byte createdRequest = 0;
  15551. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  15552. return BAD_FUNC_ARG;
  15553. XMEMSET(response, 0, sizeof(*response));
  15554. request = *ocspRequest;
  15555. /* unable to fetch status. skip. */
  15556. if (ssl->ctx->cm == NULL || ssl->ctx->cm->ocspStaplingEnabled == 0)
  15557. return 0;
  15558. if (request == NULL || ssl->buffers.weOwnCert) {
  15559. DerBuffer* der = ssl->buffers.certificate;
  15560. #ifdef WOLFSSL_SMALL_STACK
  15561. DecodedCert* cert = NULL;
  15562. #else
  15563. DecodedCert cert[1];
  15564. #endif
  15565. /* unable to fetch status. skip. */
  15566. if (der->buffer == NULL || der->length == 0)
  15567. return 0;
  15568. #ifdef WOLFSSL_SMALL_STACK
  15569. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  15570. DYNAMIC_TYPE_DCERT);
  15571. if (cert == NULL)
  15572. return MEMORY_E;
  15573. #endif
  15574. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  15575. DYNAMIC_TYPE_OCSP_REQUEST);
  15576. if (request == NULL)
  15577. ret = MEMORY_E;
  15578. createdRequest = 1;
  15579. if (ret == 0) {
  15580. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  15581. der->length);
  15582. }
  15583. if (ret != 0) {
  15584. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15585. request = NULL;
  15586. }
  15587. #ifdef WOLFSSL_SMALL_STACK
  15588. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  15589. #endif
  15590. }
  15591. if (ret == 0) {
  15592. request->ssl = ssl;
  15593. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling, request, response);
  15594. /* Suppressing, not critical */
  15595. if (ret == OCSP_CERT_REVOKED ||
  15596. ret == OCSP_CERT_UNKNOWN ||
  15597. ret == OCSP_LOOKUP_FAIL) {
  15598. ret = 0;
  15599. }
  15600. }
  15601. /* free request up if error case found otherwise return it */
  15602. if (ret != 0 && createdRequest) {
  15603. FreeOcspRequest(request);
  15604. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15605. }
  15606. if (ret == 0)
  15607. *ocspRequest = request;
  15608. return ret;
  15609. }
  15610. #endif
  15611. #endif /* !NO_WOLFSSL_SERVER */
  15612. static int cipherExtraData(WOLFSSL* ssl)
  15613. {
  15614. /* Cipher data that may be added by BuildMessage */
  15615. return ssl->specs.hash_size + ssl->specs.block_size +
  15616. ssl->specs.aead_mac_size + ssl->specs.iv_size +
  15617. ssl->specs.pad_size;
  15618. }
  15619. #ifndef WOLFSSL_NO_TLS12
  15620. #ifndef NO_CERTS
  15621. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  15622. /* handle generation of certificate (11) */
  15623. int SendCertificate(WOLFSSL* ssl)
  15624. {
  15625. int ret = 0;
  15626. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  15627. word32 length, maxFragment;
  15628. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  15629. WOLFSSL_ENTER("SendCertificate");
  15630. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  15631. return 0; /* not needed */
  15632. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  15633. #ifdef OPENSSL_EXTRA
  15634. if (ssl->version.major == SSLv3_MAJOR
  15635. && ssl->version.minor == SSLv3_MINOR){
  15636. SendAlert(ssl, alert_warning, no_certificate);
  15637. return 0;
  15638. } else {
  15639. #endif
  15640. certSz = 0;
  15641. certChainSz = 0;
  15642. headerSz = CERT_HEADER_SZ;
  15643. length = CERT_HEADER_SZ;
  15644. listSz = 0;
  15645. #ifdef OPENSSL_EXTRA
  15646. }
  15647. #endif
  15648. }
  15649. else {
  15650. if (!ssl->buffers.certificate) {
  15651. WOLFSSL_MSG("Send Cert missing certificate buffer");
  15652. return BUFFER_ERROR;
  15653. }
  15654. certSz = ssl->buffers.certificate->length;
  15655. headerSz = 2 * CERT_HEADER_SZ;
  15656. /* list + cert size */
  15657. length = certSz + headerSz;
  15658. listSz = certSz + CERT_HEADER_SZ;
  15659. /* may need to send rest of chain, already has leading size(s) */
  15660. if (certSz && ssl->buffers.certChain) {
  15661. certChainSz = ssl->buffers.certChain->length;
  15662. length += certChainSz;
  15663. listSz += certChainSz;
  15664. }
  15665. else
  15666. certChainSz = 0;
  15667. }
  15668. payloadSz = length;
  15669. if (ssl->fragOffset != 0)
  15670. length -= (ssl->fragOffset + headerSz);
  15671. maxFragment = MAX_RECORD_SIZE;
  15672. maxFragment = wolfSSL_GetMaxRecordSize(ssl, maxFragment);
  15673. while (length > 0 && ret == 0) {
  15674. byte* output = NULL;
  15675. word32 fragSz = 0;
  15676. word32 i = RECORD_HEADER_SZ;
  15677. int sendSz = RECORD_HEADER_SZ;
  15678. if (!ssl->options.dtls) {
  15679. if (ssl->fragOffset == 0) {
  15680. if (headerSz + certSz + certChainSz <=
  15681. maxFragment - HANDSHAKE_HEADER_SZ) {
  15682. fragSz = headerSz + certSz + certChainSz;
  15683. }
  15684. else {
  15685. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  15686. }
  15687. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  15688. i += HANDSHAKE_HEADER_SZ;
  15689. }
  15690. else {
  15691. fragSz = min(length, maxFragment);
  15692. sendSz += fragSz;
  15693. }
  15694. if (IsEncryptionOn(ssl, 1))
  15695. sendSz += MAX_MSG_EXTRA;
  15696. }
  15697. else {
  15698. #ifdef WOLFSSL_DTLS
  15699. fragSz = min(length, maxFragment);
  15700. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA
  15701. + HANDSHAKE_HEADER_SZ;
  15702. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA
  15703. + HANDSHAKE_HEADER_SZ;
  15704. #endif
  15705. }
  15706. if (IsEncryptionOn(ssl, 1))
  15707. sendSz += cipherExtraData(ssl);
  15708. /* check for available size */
  15709. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  15710. return ret;
  15711. /* get output buffer */
  15712. output = ssl->buffers.outputBuffer.buffer +
  15713. ssl->buffers.outputBuffer.length;
  15714. if (ssl->fragOffset == 0) {
  15715. if (!ssl->options.dtls) {
  15716. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  15717. if (!IsEncryptionOn(ssl, 1))
  15718. HashRaw(ssl, output + RECORD_HEADER_SZ,
  15719. HANDSHAKE_HEADER_SZ);
  15720. }
  15721. else {
  15722. #ifdef WOLFSSL_DTLS
  15723. AddHeaders(output, payloadSz, certificate, ssl);
  15724. HashRaw(ssl,
  15725. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  15726. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  15727. /* Adding the headers increments these, decrement them for
  15728. * actual message header. */
  15729. ssl->keys.dtls_handshake_number--;
  15730. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  15731. ssl->keys.dtls_handshake_number--;
  15732. #endif /* WOLFSSL_DTLS */
  15733. }
  15734. /* list total */
  15735. c32to24(listSz, output + i);
  15736. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  15737. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  15738. i += CERT_HEADER_SZ;
  15739. length -= CERT_HEADER_SZ;
  15740. fragSz -= CERT_HEADER_SZ;
  15741. if (certSz) {
  15742. c32to24(certSz, output + i);
  15743. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  15744. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  15745. i += CERT_HEADER_SZ;
  15746. length -= CERT_HEADER_SZ;
  15747. fragSz -= CERT_HEADER_SZ;
  15748. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
  15749. HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  15750. if (certChainSz)
  15751. HashRaw(ssl, ssl->buffers.certChain->buffer,
  15752. certChainSz);
  15753. }
  15754. }
  15755. }
  15756. else {
  15757. if (!ssl->options.dtls) {
  15758. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  15759. }
  15760. else {
  15761. #ifdef WOLFSSL_DTLS
  15762. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  15763. payloadSz, certificate, ssl);
  15764. ssl->keys.dtls_handshake_number--;
  15765. #endif /* WOLFSSL_DTLS */
  15766. }
  15767. }
  15768. /* member */
  15769. if (certSz && ssl->fragOffset < certSz) {
  15770. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  15771. XMEMCPY(output + i,
  15772. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  15773. i += copySz;
  15774. ssl->fragOffset += copySz;
  15775. length -= copySz;
  15776. fragSz -= copySz;
  15777. }
  15778. if (certChainSz && fragSz) {
  15779. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  15780. XMEMCPY(output + i,
  15781. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  15782. copySz);
  15783. i += copySz;
  15784. ssl->fragOffset += copySz;
  15785. length -= copySz;
  15786. }
  15787. if (IsEncryptionOn(ssl, 1)) {
  15788. byte* input = NULL;
  15789. int inputSz = i; /* build msg adds rec hdr */
  15790. int recordHeaderSz = RECORD_HEADER_SZ;
  15791. if (ssl->options.dtls)
  15792. recordHeaderSz += DTLS_RECORD_EXTRA;
  15793. inputSz -= recordHeaderSz;
  15794. if (inputSz < 0) {
  15795. WOLFSSL_MSG("Send Cert bad inputSz");
  15796. return BUFFER_E;
  15797. }
  15798. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  15799. input = (byte*)XMALLOC(inputSz, ssl->heap,
  15800. DYNAMIC_TYPE_IN_BUFFER);
  15801. if (input == NULL)
  15802. return MEMORY_E;
  15803. XMEMCPY(input, output + recordHeaderSz, inputSz);
  15804. }
  15805. #ifndef WOLFSSL_DTLS
  15806. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15807. handshake, 1, 0, 0, CUR_ORDER);
  15808. #else
  15809. if (!ssl->options.dtls)
  15810. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15811. handshake, 1, 0, 0, CUR_ORDER);
  15812. else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
  15813. * calculate the hash ourselves above */ {
  15814. if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
  15815. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15816. return ret;
  15817. }
  15818. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15819. handshake, 0, 0, 0, CUR_ORDER);
  15820. }
  15821. #endif
  15822. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15823. if (sendSz < 0)
  15824. return sendSz;
  15825. }
  15826. else {
  15827. sendSz = i;
  15828. #ifdef WOLFSSL_DTLS
  15829. if (IsDtlsNotSctpMode(ssl)) {
  15830. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
  15831. return ret;
  15832. }
  15833. if (ssl->options.dtls)
  15834. DtlsSEQIncrement(ssl, CUR_ORDER);
  15835. #endif
  15836. }
  15837. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15838. if (ssl->hsInfoOn)
  15839. AddPacketName(ssl, "Certificate");
  15840. if (ssl->toInfoOn)
  15841. AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  15842. WRITE_PROTO, ssl->heap);
  15843. #endif
  15844. ssl->buffers.outputBuffer.length += sendSz;
  15845. if (!ssl->options.groupMessages)
  15846. ret = SendBuffered(ssl);
  15847. }
  15848. if (ret != WANT_WRITE) {
  15849. /* Clean up the fragment offset. */
  15850. ssl->fragOffset = 0;
  15851. #ifdef WOLFSSL_DTLS
  15852. if (ssl->options.dtls)
  15853. ssl->keys.dtls_handshake_number++;
  15854. #endif
  15855. if (ssl->options.side == WOLFSSL_SERVER_END){
  15856. ssl->options.serverState = SERVER_CERT_COMPLETE;
  15857. }
  15858. }
  15859. WOLFSSL_LEAVE("SendCertificate", ret);
  15860. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  15861. return ret;
  15862. }
  15863. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  15864. /* handle generation of certificate_request (13) */
  15865. int SendCertificateRequest(WOLFSSL* ssl)
  15866. {
  15867. byte *output;
  15868. int ret;
  15869. int sendSz;
  15870. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  15871. word32 dnLen = 0;
  15872. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  15873. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  15874. #endif
  15875. int typeTotal = 1; /* only 1 for now */
  15876. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  15877. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  15878. WOLFSSL_ENTER("SendCertificateRequest");
  15879. if (IsAtLeastTLSv1_2(ssl))
  15880. reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz;
  15881. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  15882. /* Certificate Authorities */
  15883. names = ssl->ctx->ca_names;
  15884. while (names != NULL) {
  15885. byte seq[MAX_SEQ_SZ];
  15886. /* 16-bit length | SEQ | Len | DER of name */
  15887. dnLen += OPAQUE16_LEN + SetSequence(names->data.name->rawLen, seq) +
  15888. names->data.name->rawLen;
  15889. names = names->next;
  15890. }
  15891. reqSz += dnLen;
  15892. #endif
  15893. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  15894. return 0; /* not needed */
  15895. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  15896. if (!ssl->options.dtls) {
  15897. if (IsEncryptionOn(ssl, 1))
  15898. sendSz += MAX_MSG_EXTRA;
  15899. }
  15900. else {
  15901. #ifdef WOLFSSL_DTLS
  15902. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  15903. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  15904. #endif
  15905. }
  15906. if (IsEncryptionOn(ssl, 1))
  15907. sendSz += cipherExtraData(ssl);
  15908. /* check for available size */
  15909. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  15910. return ret;
  15911. /* get output buffer */
  15912. output = ssl->buffers.outputBuffer.buffer +
  15913. ssl->buffers.outputBuffer.length;
  15914. AddHeaders(output, reqSz, certificate_request, ssl);
  15915. /* write to output */
  15916. output[i++] = (byte)typeTotal; /* # of types */
  15917. #ifdef HAVE_ECC
  15918. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  15919. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  15920. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  15921. output[i++] = ecdsa_sign;
  15922. } else
  15923. #endif /* HAVE_ECC */
  15924. {
  15925. output[i++] = rsa_sign;
  15926. }
  15927. /* supported hash/sig */
  15928. if (IsAtLeastTLSv1_2(ssl)) {
  15929. c16toa(ssl->suites->hashSigAlgoSz, &output[i]);
  15930. i += OPAQUE16_LEN;
  15931. XMEMCPY(&output[i],
  15932. ssl->suites->hashSigAlgo, ssl->suites->hashSigAlgoSz);
  15933. i += ssl->suites->hashSigAlgoSz;
  15934. }
  15935. /* Certificate Authorities */
  15936. c16toa((word16)dnLen, &output[i]); /* auth's */
  15937. i += REQ_HEADER_SZ;
  15938. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  15939. names = ssl->ctx->ca_names;
  15940. while (names != NULL) {
  15941. byte seq[MAX_SEQ_SZ];
  15942. c16toa((word16)names->data.name->rawLen +
  15943. SetSequence(names->data.name->rawLen, seq), &output[i]);
  15944. i += OPAQUE16_LEN;
  15945. i += SetSequence(names->data.name->rawLen, output + i);
  15946. XMEMCPY(output + i, names->data.name->raw, names->data.name->rawLen);
  15947. i += names->data.name->rawLen;
  15948. names = names->next;
  15949. }
  15950. #endif
  15951. (void)i;
  15952. if (IsEncryptionOn(ssl, 1)) {
  15953. byte* input = NULL;
  15954. int inputSz = i; /* build msg adds rec hdr */
  15955. int recordHeaderSz = RECORD_HEADER_SZ;
  15956. if (ssl->options.dtls)
  15957. recordHeaderSz += DTLS_RECORD_EXTRA;
  15958. inputSz -= recordHeaderSz;
  15959. if (inputSz <= 0) {
  15960. WOLFSSL_MSG("Send Cert Req bad inputSz");
  15961. return BUFFER_E;
  15962. }
  15963. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15964. if (input == NULL)
  15965. return MEMORY_E;
  15966. XMEMCPY(input, output + recordHeaderSz, inputSz);
  15967. #ifdef WOLFSSL_DTLS
  15968. if (IsDtlsNotSctpMode(ssl) &&
  15969. (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
  15970. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15971. return ret;
  15972. }
  15973. #endif
  15974. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15975. handshake, 1, 0, 0, CUR_ORDER);
  15976. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15977. if (sendSz < 0)
  15978. return sendSz;
  15979. } else {
  15980. sendSz = i;
  15981. #ifdef WOLFSSL_DTLS
  15982. if (IsDtlsNotSctpMode(ssl)) {
  15983. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
  15984. return ret;
  15985. }
  15986. if (ssl->options.dtls)
  15987. DtlsSEQIncrement(ssl, CUR_ORDER);
  15988. #endif
  15989. ret = HashOutput(ssl, output, sendSz, 0);
  15990. if (ret != 0)
  15991. return ret;
  15992. }
  15993. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15994. if (ssl->hsInfoOn)
  15995. AddPacketName(ssl, "CertificateRequest");
  15996. if (ssl->toInfoOn)
  15997. AddPacketInfo(ssl, "CertificateRequest", handshake, output, sendSz,
  15998. WRITE_PROTO, ssl->heap);
  15999. #endif
  16000. ssl->buffers.outputBuffer.length += sendSz;
  16001. if (ssl->options.groupMessages)
  16002. ret = 0;
  16003. else
  16004. ret = SendBuffered(ssl);
  16005. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  16006. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  16007. return ret;
  16008. }
  16009. #ifndef NO_WOLFSSL_SERVER
  16010. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  16011. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  16012. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  16013. byte count)
  16014. {
  16015. byte* output = NULL;
  16016. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  16017. word32 length = ENUM_LEN;
  16018. int sendSz = 0;
  16019. int ret = 0;
  16020. int i = 0;
  16021. WOLFSSL_ENTER("BuildCertificateStatus");
  16022. switch (type) {
  16023. case WOLFSSL_CSR2_OCSP_MULTI:
  16024. length += OPAQUE24_LEN;
  16025. FALL_THROUGH; /* followed by */
  16026. case WOLFSSL_CSR2_OCSP:
  16027. for (i = 0; i < count; i++)
  16028. length += OPAQUE24_LEN + status[i].length;
  16029. break;
  16030. default:
  16031. return 0;
  16032. }
  16033. sendSz = idx + length;
  16034. if (ssl->keys.encryptionOn)
  16035. sendSz += MAX_MSG_EXTRA;
  16036. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  16037. output = ssl->buffers.outputBuffer.buffer +
  16038. ssl->buffers.outputBuffer.length;
  16039. AddHeaders(output, length, certificate_status, ssl);
  16040. output[idx++] = type;
  16041. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  16042. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  16043. idx += OPAQUE24_LEN;
  16044. }
  16045. for (i = 0; i < count; i++) {
  16046. c32to24(status[i].length, output + idx);
  16047. idx += OPAQUE24_LEN;
  16048. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  16049. idx += status[i].length;
  16050. }
  16051. if (IsEncryptionOn(ssl, 1)) {
  16052. byte* input;
  16053. int inputSz = idx; /* build msg adds rec hdr */
  16054. int recordHeaderSz = RECORD_HEADER_SZ;
  16055. if (ssl->options.dtls)
  16056. recordHeaderSz += DTLS_RECORD_EXTRA;
  16057. inputSz -= recordHeaderSz;
  16058. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  16059. if (input == NULL)
  16060. return MEMORY_E;
  16061. XMEMCPY(input, output + recordHeaderSz, inputSz);
  16062. #ifdef WOLFSSL_DTLS
  16063. ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
  16064. #endif
  16065. if (ret == 0)
  16066. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  16067. handshake, 1, 0, 0, CUR_ORDER);
  16068. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  16069. if (sendSz < 0)
  16070. ret = sendSz;
  16071. }
  16072. else {
  16073. #ifdef WOLFSSL_DTLS
  16074. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  16075. ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
  16076. if (ret == 0 && ssl->options.dtls)
  16077. DtlsSEQIncrement(ssl, CUR_ORDER);
  16078. #endif
  16079. ret = HashOutput(ssl, output, sendSz, 0);
  16080. }
  16081. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16082. if (ret == 0 && ssl->hsInfoOn)
  16083. AddPacketName(ssl, "CertificateStatus");
  16084. if (ret == 0 && ssl->toInfoOn)
  16085. AddPacketInfo(ssl, "CertificateStatus", handshake, output, sendSz,
  16086. WRITE_PROTO, ssl->heap);
  16087. #endif
  16088. if (ret == 0) {
  16089. ssl->buffers.outputBuffer.length += sendSz;
  16090. if (!ssl->options.groupMessages)
  16091. ret = SendBuffered(ssl);
  16092. }
  16093. }
  16094. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  16095. return ret;
  16096. }
  16097. #endif
  16098. #endif /* NO_WOLFSSL_SERVER */
  16099. /* handle generation of certificate_status (22) */
  16100. int SendCertificateStatus(WOLFSSL* ssl)
  16101. {
  16102. int ret = 0;
  16103. byte status_type = 0;
  16104. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  16105. WOLFSSL_ENTER("SendCertificateStatus");
  16106. (void) ssl;
  16107. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  16108. status_type = ssl->status_request;
  16109. #endif
  16110. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  16111. status_type = status_type ? status_type : ssl->status_request_v2;
  16112. #endif
  16113. switch (status_type) {
  16114. #ifndef NO_WOLFSSL_SERVER
  16115. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  16116. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  16117. /* case WOLFSSL_CSR_OCSP: */
  16118. case WOLFSSL_CSR2_OCSP:
  16119. {
  16120. OcspRequest* request = ssl->ctx->certOcspRequest;
  16121. buffer response;
  16122. ret = CreateOcspResponse(ssl, &request, &response);
  16123. /* if a request was successfully created and not stored in
  16124. * ssl->ctx then free it */
  16125. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  16126. FreeOcspRequest(request);
  16127. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16128. request = NULL;
  16129. }
  16130. if (ret == 0 && response.buffer) {
  16131. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  16132. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16133. response.buffer = NULL;
  16134. }
  16135. break;
  16136. }
  16137. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  16138. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  16139. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  16140. case WOLFSSL_CSR2_OCSP_MULTI:
  16141. {
  16142. OcspRequest* request = ssl->ctx->certOcspRequest;
  16143. buffer responses[1 + MAX_CHAIN_DEPTH];
  16144. int i = 0;
  16145. XMEMSET(responses, 0, sizeof(responses));
  16146. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  16147. /* if a request was successfully created and not stored in
  16148. * ssl->ctx then free it */
  16149. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  16150. FreeOcspRequest(request);
  16151. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16152. request = NULL;
  16153. }
  16154. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  16155. || ssl->buffers.weOwnCertChain)) {
  16156. buffer der;
  16157. word32 idx = 0;
  16158. #ifdef WOLFSSL_SMALL_STACK
  16159. DecodedCert* cert;
  16160. #else
  16161. DecodedCert cert[1];
  16162. #endif
  16163. DerBuffer* chain;
  16164. #ifdef WOLFSSL_SMALL_STACK
  16165. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  16166. DYNAMIC_TYPE_DCERT);
  16167. if (cert == NULL)
  16168. return MEMORY_E;
  16169. #endif
  16170. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  16171. DYNAMIC_TYPE_OCSP_REQUEST);
  16172. if (request == NULL) {
  16173. #ifdef WOLFSSL_SMALL_STACK
  16174. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  16175. #endif
  16176. return MEMORY_E;
  16177. }
  16178. /* use certChain if available, otherwise use peer certificate */
  16179. chain = ssl->buffers.certChain;
  16180. if (chain == NULL) {
  16181. chain = ssl->buffers.certificate;
  16182. }
  16183. while (chain && idx + OPAQUE24_LEN < chain->length) {
  16184. c24to32(chain->buffer + idx, &der.length);
  16185. idx += OPAQUE24_LEN;
  16186. der.buffer = chain->buffer + idx;
  16187. idx += der.length;
  16188. if (idx > chain->length)
  16189. break;
  16190. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  16191. der.length);
  16192. if (ret == 0) {
  16193. request->ssl = ssl;
  16194. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling,
  16195. request, &responses[i + 1]);
  16196. /* Suppressing, not critical */
  16197. if (ret == OCSP_CERT_REVOKED ||
  16198. ret == OCSP_CERT_UNKNOWN ||
  16199. ret == OCSP_LOOKUP_FAIL) {
  16200. ret = 0;
  16201. }
  16202. i++;
  16203. FreeOcspRequest(request);
  16204. }
  16205. }
  16206. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16207. #ifdef WOLFSSL_SMALL_STACK
  16208. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  16209. #endif
  16210. }
  16211. else {
  16212. while (ret == 0 &&
  16213. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  16214. request->ssl = ssl;
  16215. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling,
  16216. request, &responses[++i]);
  16217. /* Suppressing, not critical */
  16218. if (ret == OCSP_CERT_REVOKED ||
  16219. ret == OCSP_CERT_UNKNOWN ||
  16220. ret == OCSP_LOOKUP_FAIL) {
  16221. ret = 0;
  16222. }
  16223. }
  16224. }
  16225. if (responses[0].buffer) {
  16226. if (ret == 0) {
  16227. ret = BuildCertificateStatus(ssl, status_type, responses,
  16228. (byte)i + 1);
  16229. }
  16230. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  16231. if (responses[i].buffer) {
  16232. XFREE(responses[i].buffer, ssl->heap,
  16233. DYNAMIC_TYPE_OCSP_REQUEST);
  16234. }
  16235. }
  16236. }
  16237. break;
  16238. }
  16239. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  16240. #endif /* NO_WOLFSSL_SERVER */
  16241. default:
  16242. break;
  16243. }
  16244. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  16245. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  16246. return ret;
  16247. }
  16248. #endif /* !NO_CERTS */
  16249. #endif /* WOLFSSL_NO_TLS12 */
  16250. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  16251. /**
  16252. * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
  16253. */
  16254. int DtlsSCRKeysSet(WOLFSSL* ssl)
  16255. {
  16256. return ssl->secure_renegotiation &&
  16257. ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
  16258. }
  16259. /**
  16260. * ssl->keys contains the current cipher parameters only for epoch 1. For
  16261. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  16262. * cipher parameters. This function checks if the message currently being
  16263. * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  16264. */
  16265. int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
  16266. {
  16267. return DtlsSCRKeysSet(ssl) &&
  16268. ssl->keys.curEpoch ==
  16269. ssl->secure_renegotiation->tmp_keys.dtls_epoch;
  16270. }
  16271. /**
  16272. * ssl->keys contains the current cipher parameters only for epoch 1. For
  16273. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  16274. * cipher parameters. This function checks if the message currently being
  16275. * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  16276. */
  16277. int DtlsUseSCRKeys(WOLFSSL* ssl)
  16278. {
  16279. return DtlsSCRKeysSet(ssl) &&
  16280. ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
  16281. ssl->keys.dtls_epoch;
  16282. }
  16283. /**
  16284. * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
  16285. * then PREV_ORDER refers to the current epoch.
  16286. * */
  16287. int DtlsCheckOrder(WOLFSSL* ssl, int order)
  16288. {
  16289. if (order == PREV_ORDER && ssl->secure_renegotiation &&
  16290. ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
  16291. return CUR_ORDER;
  16292. }
  16293. else {
  16294. return order;
  16295. }
  16296. }
  16297. #endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
  16298. /* If secure renegotiation is disabled, this will always return false.
  16299. * Otherwise it checks to see if we are currently renegotiating. */
  16300. int IsSCR(WOLFSSL* ssl)
  16301. {
  16302. #ifndef HAVE_SECURE_RENEGOTIATION
  16303. (void)ssl;
  16304. #else /* HAVE_SECURE_RENEGOTIATION */
  16305. if (ssl->secure_renegotiation &&
  16306. ssl->secure_renegotiation->enabled && /* Is SCR enabled? */
  16307. ssl->options.handShakeDone && /* At least one handshake done? */
  16308. ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
  16309. return 1;
  16310. #endif /* HAVE_SECURE_RENEGOTIATION */
  16311. return 0;
  16312. }
  16313. int SendData(WOLFSSL* ssl, const void* data, int sz)
  16314. {
  16315. int sent = 0, /* plainText size */
  16316. sendSz,
  16317. ret;
  16318. int groupMsgs = 0;
  16319. if (ssl->error == WANT_WRITE
  16320. #ifdef WOLFSSL_ASYNC_CRYPT
  16321. || ssl->error == WC_PENDING_E
  16322. #endif
  16323. ) {
  16324. ssl->error = 0;
  16325. }
  16326. /* don't allow write after decrypt or mac error */
  16327. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  16328. /* For DTLS allow these possible errors and allow the session
  16329. to continue despite them */
  16330. if (ssl->options.dtls) {
  16331. ssl->error = 0;
  16332. }
  16333. else {
  16334. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  16335. return WOLFSSL_FATAL_ERROR;
  16336. }
  16337. }
  16338. #ifdef WOLFSSL_EARLY_DATA
  16339. if (ssl->earlyData != no_early_data) {
  16340. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  16341. WOLFSSL_MSG("handshake complete, trying to send early data");
  16342. ssl->error = BUILD_MSG_ERROR;
  16343. return WOLFSSL_FATAL_ERROR;
  16344. }
  16345. #ifdef WOLFSSL_EARLY_DATA_GROUP
  16346. groupMsgs = 1;
  16347. #endif
  16348. }
  16349. else
  16350. #endif
  16351. if (ssl->options.handShakeState != HANDSHAKE_DONE && !IsSCR(ssl)) {
  16352. int err;
  16353. WOLFSSL_MSG("handshake not complete, trying to finish");
  16354. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  16355. #ifdef WOLFSSL_ASYNC_CRYPT
  16356. /* if async would block return WANT_WRITE */
  16357. if (ssl->error == WC_PENDING_E) {
  16358. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  16359. }
  16360. #endif
  16361. return err;
  16362. }
  16363. }
  16364. /* last time system socket output buffer was full, try again to send */
  16365. if (!groupMsgs && ssl->buffers.outputBuffer.length > 0) {
  16366. WOLFSSL_MSG("output buffer was full, trying to send again");
  16367. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  16368. WOLFSSL_ERROR(ssl->error);
  16369. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  16370. ssl->options.isClosed)) {
  16371. ssl->error = SOCKET_PEER_CLOSED_E;
  16372. WOLFSSL_ERROR(ssl->error);
  16373. return 0; /* peer reset or closed */
  16374. }
  16375. return ssl->error;
  16376. }
  16377. else {
  16378. /* advance sent to previous sent + plain size just sent */
  16379. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  16380. WOLFSSL_MSG("sent write buffered data");
  16381. if (sent > sz) {
  16382. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  16383. return ssl->error = BAD_FUNC_ARG;
  16384. }
  16385. }
  16386. }
  16387. for (;;) {
  16388. byte* out;
  16389. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  16390. int buffSz; /* may switch on comp */
  16391. int outputSz;
  16392. #ifdef HAVE_LIBZ
  16393. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  16394. #endif
  16395. if (sent == sz) break;
  16396. buffSz = wolfSSL_GetMaxRecordSize(ssl, sz - sent);
  16397. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
  16398. if (ssl->options.dtls && (buffSz < sz - sent)) {
  16399. ssl->error = DTLS_SIZE_ERROR;
  16400. WOLFSSL_ERROR(ssl->error);
  16401. return ssl->error;
  16402. }
  16403. #endif
  16404. outputSz = buffSz + COMP_EXTRA + DTLS_RECORD_HEADER_SZ +
  16405. DTLS_HANDSHAKE_HEADER_SZ;
  16406. if (IsEncryptionOn(ssl, 1))
  16407. outputSz += cipherExtraData(ssl);
  16408. /* check for available size */
  16409. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  16410. return ssl->error = ret;
  16411. /* get output buffer */
  16412. out = ssl->buffers.outputBuffer.buffer +
  16413. ssl->buffers.outputBuffer.length;
  16414. #ifdef HAVE_LIBZ
  16415. if (ssl->options.usingCompression) {
  16416. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  16417. if (buffSz < 0) {
  16418. return buffSz;
  16419. }
  16420. sendBuffer = comp;
  16421. }
  16422. #endif
  16423. if (!ssl->options.tls1_3) {
  16424. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  16425. application_data, 0, 0, 1, CUR_ORDER);
  16426. }
  16427. else {
  16428. #ifdef WOLFSSL_TLS13
  16429. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  16430. application_data, 0, 0, 1);
  16431. #else
  16432. sendSz = BUFFER_ERROR;
  16433. #endif
  16434. }
  16435. if (sendSz < 0) {
  16436. #ifdef WOLFSSL_ASYNC_CRYPT
  16437. if (sendSz == WC_PENDING_E)
  16438. ssl->error = sendSz;
  16439. #endif
  16440. return BUILD_MSG_ERROR;
  16441. }
  16442. ssl->buffers.outputBuffer.length += sendSz;
  16443. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  16444. WOLFSSL_ERROR(ssl->error);
  16445. /* store for next call if WANT_WRITE or user embedSend() that
  16446. doesn't present like WANT_WRITE */
  16447. ssl->buffers.plainSz = buffSz;
  16448. ssl->buffers.prevSent = sent;
  16449. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  16450. ssl->options.isClosed)) {
  16451. ssl->error = SOCKET_PEER_CLOSED_E;
  16452. WOLFSSL_ERROR(ssl->error);
  16453. return 0; /* peer reset or closed */
  16454. }
  16455. return ssl->error;
  16456. }
  16457. sent += buffSz;
  16458. /* only one message per attempt */
  16459. if (ssl->options.partialWrite == 1) {
  16460. WOLFSSL_MSG("Partial Write on, only sending one record");
  16461. break;
  16462. }
  16463. }
  16464. return sent;
  16465. }
  16466. /* process input data */
  16467. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  16468. {
  16469. int size;
  16470. WOLFSSL_ENTER("ReceiveData()");
  16471. /* reset error state */
  16472. if (ssl->error == WANT_READ) {
  16473. ssl->error = 0;
  16474. }
  16475. #ifdef WOLFSSL_DTLS
  16476. if (ssl->options.dtls) {
  16477. /* In DTLS mode, we forgive some errors and allow the session
  16478. * to continue despite them. */
  16479. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR)
  16480. ssl->error = 0;
  16481. }
  16482. #endif /* WOLFSSL_DTLS */
  16483. if (ssl->error != 0 && ssl->error != WANT_WRITE
  16484. #ifdef WOLFSSL_ASYNC_CRYPT
  16485. && ssl->error != WC_PENDING_E
  16486. #endif
  16487. #ifdef HAVE_SECURE_RENEGOTIATION
  16488. && ssl->error != APP_DATA_READY
  16489. #endif
  16490. ) {
  16491. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  16492. return ssl->error;
  16493. }
  16494. #ifdef WOLFSSL_EARLY_DATA
  16495. if (ssl->earlyData != no_early_data) {
  16496. }
  16497. else
  16498. #endif
  16499. {
  16500. int negotiate = 0;
  16501. #ifdef HAVE_SECURE_RENEGOTIATION
  16502. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  16503. if (ssl->options.handShakeState != HANDSHAKE_DONE
  16504. && ssl->buffers.clearOutputBuffer.length == 0)
  16505. negotiate = 1;
  16506. }
  16507. else
  16508. #endif
  16509. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  16510. negotiate = 1;
  16511. if (negotiate) {
  16512. int err;
  16513. WOLFSSL_MSG("Handshake not complete, trying to finish");
  16514. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  16515. #ifdef WOLFSSL_ASYNC_CRYPT
  16516. /* if async would block return WANT_WRITE */
  16517. if (ssl->error == WC_PENDING_E) {
  16518. return WOLFSSL_CBIO_ERR_WANT_READ;
  16519. }
  16520. #endif
  16521. return err;
  16522. }
  16523. }
  16524. }
  16525. #ifdef HAVE_SECURE_RENEGOTIATION
  16526. startScr:
  16527. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  16528. int ret;
  16529. WOLFSSL_MSG("Need to start scr, server requested");
  16530. ret = wolfSSL_Rehandshake(ssl);
  16531. ssl->secure_renegotiation->startScr = 0; /* only start once */
  16532. if (ret != WOLFSSL_SUCCESS)
  16533. return ret;
  16534. }
  16535. #endif
  16536. while (ssl->buffers.clearOutputBuffer.length == 0) {
  16537. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  16538. WOLFSSL_ERROR(ssl->error);
  16539. if (ssl->error == ZERO_RETURN) {
  16540. WOLFSSL_MSG("Zero return, no more data coming");
  16541. return 0; /* no more data coming */
  16542. }
  16543. if (ssl->error == SOCKET_ERROR_E) {
  16544. if (ssl->options.connReset || ssl->options.isClosed) {
  16545. WOLFSSL_MSG("Peer reset or closed, connection done");
  16546. ssl->error = SOCKET_PEER_CLOSED_E;
  16547. WOLFSSL_ERROR(ssl->error);
  16548. return 0; /* peer reset or closed */
  16549. }
  16550. }
  16551. return ssl->error;
  16552. }
  16553. #ifdef HAVE_SECURE_RENEGOTIATION
  16554. if (ssl->secure_renegotiation &&
  16555. ssl->secure_renegotiation->startScr) {
  16556. goto startScr;
  16557. }
  16558. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  16559. ssl->options.handShakeState != HANDSHAKE_DONE
  16560. && ssl->buffers.clearOutputBuffer.length == 0) {
  16561. /* ProcessReply processed a handshake packet and not any APP DATA
  16562. * so let's move the handshake along */
  16563. int err;
  16564. WOLFSSL_MSG("Handshake not complete, trying to finish");
  16565. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  16566. #ifdef WOLFSSL_ASYNC_CRYPT
  16567. /* if async would block return WANT_WRITE */
  16568. if (ssl->error == WC_PENDING_E) {
  16569. return WOLFSSL_CBIO_ERR_WANT_READ;
  16570. }
  16571. #endif
  16572. return err;
  16573. }
  16574. }
  16575. #endif
  16576. #ifdef WOLFSSL_TLS13
  16577. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
  16578. ssl->curRL.type == handshake && peek) {
  16579. WOLFSSL_MSG("Got Handshake Messge in APP data");
  16580. if (ssl->buffers.inputBuffer.length == 0) {
  16581. ssl->error = WOLFSSL_ERROR_WANT_READ;
  16582. return 0;
  16583. }
  16584. }
  16585. #endif
  16586. }
  16587. size = min(sz, (int)ssl->buffers.clearOutputBuffer.length);
  16588. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  16589. if (peek == 0) {
  16590. ssl->buffers.clearOutputBuffer.length -= size;
  16591. ssl->buffers.clearOutputBuffer.buffer += size;
  16592. }
  16593. if (ssl->buffers.clearOutputBuffer.length == 0 &&
  16594. ssl->buffers.inputBuffer.dynamicFlag)
  16595. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  16596. WOLFSSL_LEAVE("ReceiveData()", size);
  16597. return size;
  16598. }
  16599. /* send alert message */
  16600. int SendAlert(WOLFSSL* ssl, int severity, int type)
  16601. {
  16602. byte input[ALERT_SIZE];
  16603. byte *output;
  16604. int sendSz;
  16605. int ret;
  16606. int outputSz;
  16607. int dtlsExtra = 0;
  16608. WOLFSSL_ENTER("SendAlert");
  16609. #ifdef HAVE_WRITE_DUP
  16610. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  16611. int notifyErr = 0;
  16612. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  16613. if (type == close_notify) {
  16614. notifyErr = ZERO_RETURN;
  16615. } else if (severity == alert_fatal) {
  16616. notifyErr = FATAL_ERROR;
  16617. }
  16618. if (notifyErr != 0) {
  16619. return NotifyWriteSide(ssl, notifyErr);
  16620. }
  16621. return 0;
  16622. }
  16623. #endif
  16624. /* if sendalert is called again for nonblocking */
  16625. if (ssl->options.sendAlertState != 0) {
  16626. ret = SendBuffered(ssl);
  16627. if (ret == 0)
  16628. ssl->options.sendAlertState = 0;
  16629. return ret;
  16630. }
  16631. #ifdef OPENSSL_EXTRA
  16632. if (ssl->CBIS != NULL) {
  16633. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  16634. }
  16635. #endif
  16636. #ifdef WOLFSSL_DTLS
  16637. if (ssl->options.dtls)
  16638. dtlsExtra = DTLS_RECORD_EXTRA;
  16639. #endif
  16640. /* check for available size */
  16641. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  16642. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  16643. return ret;
  16644. /* Check output buffer */
  16645. if (ssl->buffers.outputBuffer.buffer == NULL)
  16646. return BUFFER_E;
  16647. /* get output buffer */
  16648. output = ssl->buffers.outputBuffer.buffer +
  16649. ssl->buffers.outputBuffer.length;
  16650. input[0] = (byte)severity;
  16651. input[1] = (byte)type;
  16652. ssl->alert_history.last_tx.code = type;
  16653. ssl->alert_history.last_tx.level = severity;
  16654. if (severity == alert_fatal) {
  16655. ssl->options.isClosed = 1; /* Don't send close_notify */
  16656. }
  16657. /* send encrypted alert if encryption is on - can be a rehandshake over
  16658. * an existing encrypted channel.
  16659. * TLS 1.3 encrypts handshake packets after the ServerHello
  16660. */
  16661. if (IsEncryptionOn(ssl, 1)) {
  16662. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  16663. 0, 0, 0, CUR_ORDER);
  16664. }
  16665. else {
  16666. AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
  16667. output += RECORD_HEADER_SZ;
  16668. #ifdef WOLFSSL_DTLS
  16669. if (ssl->options.dtls)
  16670. output += DTLS_RECORD_EXTRA;
  16671. #endif
  16672. XMEMCPY(output, input, ALERT_SIZE);
  16673. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  16674. #ifdef WOLFSSL_DTLS
  16675. if (ssl->options.dtls)
  16676. sendSz += DTLS_RECORD_EXTRA;
  16677. #endif
  16678. }
  16679. if (sendSz < 0)
  16680. return BUILD_MSG_ERROR;
  16681. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16682. if (ssl->hsInfoOn)
  16683. AddPacketName(ssl, "Alert");
  16684. if (ssl->toInfoOn)
  16685. AddPacketInfo(ssl, "Alert", alert, output, sendSz, WRITE_PROTO,
  16686. ssl->heap);
  16687. #endif
  16688. ssl->buffers.outputBuffer.length += sendSz;
  16689. ssl->options.sendAlertState = 1;
  16690. ret = SendBuffered(ssl);
  16691. WOLFSSL_LEAVE("SendAlert", ret);
  16692. return ret;
  16693. }
  16694. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  16695. {
  16696. #ifdef NO_ERROR_STRINGS
  16697. (void)e;
  16698. return "no support for error strings built in";
  16699. #else
  16700. int error = (int)e;
  16701. /* pass to wolfCrypt */
  16702. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  16703. return wc_GetErrorString(error);
  16704. }
  16705. switch (error) {
  16706. #ifdef WOLFSSL_WPAS
  16707. case 0 :
  16708. return "ok";
  16709. #endif
  16710. case UNSUPPORTED_SUITE :
  16711. return "unsupported cipher suite";
  16712. case INPUT_CASE_ERROR :
  16713. return "input state error";
  16714. case PREFIX_ERROR :
  16715. return "bad index to key rounds";
  16716. case MEMORY_ERROR :
  16717. return "out of memory";
  16718. case VERIFY_FINISHED_ERROR :
  16719. return "verify problem on finished";
  16720. case VERIFY_MAC_ERROR :
  16721. return "verify mac problem";
  16722. case PARSE_ERROR :
  16723. return "parse error on header";
  16724. case SIDE_ERROR :
  16725. return "wrong client/server type";
  16726. case NO_PEER_CERT :
  16727. return "peer didn't send cert";
  16728. case UNKNOWN_HANDSHAKE_TYPE :
  16729. return "weird handshake type";
  16730. case SOCKET_ERROR_E :
  16731. return "error state on socket";
  16732. case SOCKET_NODATA :
  16733. return "expected data, not there";
  16734. case INCOMPLETE_DATA :
  16735. return "don't have enough data to complete task";
  16736. case UNKNOWN_RECORD_TYPE :
  16737. return "unknown type in record hdr";
  16738. case DECRYPT_ERROR :
  16739. return "error during decryption";
  16740. case FATAL_ERROR :
  16741. return "received alert fatal error";
  16742. case ENCRYPT_ERROR :
  16743. return "error during encryption";
  16744. case FREAD_ERROR :
  16745. return "fread problem";
  16746. case NO_PEER_KEY :
  16747. return "need peer's key";
  16748. case NO_PRIVATE_KEY :
  16749. return "need the private key";
  16750. case NO_DH_PARAMS :
  16751. return "server missing DH params";
  16752. case RSA_PRIVATE_ERROR :
  16753. return "error during rsa priv op";
  16754. case MATCH_SUITE_ERROR :
  16755. return "can't match cipher suite";
  16756. case COMPRESSION_ERROR :
  16757. return "compression mismatch error";
  16758. case BUILD_MSG_ERROR :
  16759. return "build message failure";
  16760. case BAD_HELLO :
  16761. return "client hello malformed";
  16762. case DOMAIN_NAME_MISMATCH :
  16763. return "peer subject name mismatch";
  16764. case IPADDR_MISMATCH :
  16765. return "peer ip address mismatch";
  16766. case WANT_READ :
  16767. case WOLFSSL_ERROR_WANT_READ :
  16768. return "non-blocking socket wants data to be read";
  16769. case NOT_READY_ERROR :
  16770. return "handshake layer not ready yet, complete first";
  16771. case VERSION_ERROR :
  16772. return "record layer version error";
  16773. case WANT_WRITE :
  16774. case WOLFSSL_ERROR_WANT_WRITE :
  16775. return "non-blocking socket write buffer full";
  16776. case BUFFER_ERROR :
  16777. return "malformed buffer input error";
  16778. case VERIFY_CERT_ERROR :
  16779. return "verify problem on certificate";
  16780. case VERIFY_SIGN_ERROR :
  16781. return "verify problem based on signature";
  16782. case CLIENT_ID_ERROR :
  16783. return "psk client identity error";
  16784. case SERVER_HINT_ERROR:
  16785. return "psk server hint error";
  16786. case PSK_KEY_ERROR:
  16787. return "psk key callback error";
  16788. case NTRU_KEY_ERROR:
  16789. return "NTRU key error";
  16790. case NTRU_DRBG_ERROR:
  16791. return "NTRU drbg error";
  16792. case NTRU_ENCRYPT_ERROR:
  16793. return "NTRU encrypt error";
  16794. case NTRU_DECRYPT_ERROR:
  16795. return "NTRU decrypt error";
  16796. case GETTIME_ERROR:
  16797. return "gettimeofday() error";
  16798. case GETITIMER_ERROR:
  16799. return "getitimer() error";
  16800. case SIGACT_ERROR:
  16801. return "sigaction() error";
  16802. case SETITIMER_ERROR:
  16803. return "setitimer() error";
  16804. case LENGTH_ERROR:
  16805. return "record layer length error";
  16806. case PEER_KEY_ERROR:
  16807. return "cant decode peer key";
  16808. case ZERO_RETURN:
  16809. case WOLFSSL_ERROR_ZERO_RETURN:
  16810. return "peer sent close notify alert";
  16811. case ECC_CURVETYPE_ERROR:
  16812. return "Bad ECC Curve Type or unsupported";
  16813. case ECC_CURVE_ERROR:
  16814. return "Bad ECC Curve or unsupported";
  16815. case ECC_PEERKEY_ERROR:
  16816. return "Bad ECC Peer Key";
  16817. case ECC_MAKEKEY_ERROR:
  16818. return "ECC Make Key failure";
  16819. case ECC_EXPORT_ERROR:
  16820. return "ECC Export Key failure";
  16821. case ECC_SHARED_ERROR:
  16822. return "ECC DHE shared failure";
  16823. case NOT_CA_ERROR:
  16824. return "Not a CA by basic constraint error";
  16825. case HTTP_TIMEOUT:
  16826. return "HTTP timeout for OCSP or CRL req";
  16827. case BAD_CERT_MANAGER_ERROR:
  16828. return "Bad Cert Manager error";
  16829. case OCSP_CERT_REVOKED:
  16830. return "OCSP Cert revoked";
  16831. case CRL_CERT_REVOKED:
  16832. return "CRL Cert revoked";
  16833. case CRL_MISSING:
  16834. return "CRL missing, not loaded";
  16835. case MONITOR_SETUP_E:
  16836. return "CRL monitor setup error";
  16837. case THREAD_CREATE_E:
  16838. return "Thread creation problem";
  16839. case OCSP_NEED_URL:
  16840. return "OCSP need URL";
  16841. case OCSP_CERT_UNKNOWN:
  16842. return "OCSP Cert unknown";
  16843. case OCSP_LOOKUP_FAIL:
  16844. return "OCSP Responder lookup fail";
  16845. case MAX_CHAIN_ERROR:
  16846. return "Maximum Chain Depth Exceeded";
  16847. case COOKIE_ERROR:
  16848. return "DTLS Cookie Error";
  16849. case SEQUENCE_ERROR:
  16850. return "DTLS Sequence Error";
  16851. case SUITES_ERROR:
  16852. return "Suites Pointer Error";
  16853. case OUT_OF_ORDER_E:
  16854. return "Out of order message, fatal";
  16855. case BAD_KEA_TYPE_E:
  16856. return "Bad KEA type found";
  16857. case SANITY_CIPHER_E:
  16858. return "Sanity check on ciphertext failed";
  16859. case RECV_OVERFLOW_E:
  16860. return "Receive callback returned more than requested";
  16861. case GEN_COOKIE_E:
  16862. return "Generate Cookie Error";
  16863. case NO_PEER_VERIFY:
  16864. return "Need peer certificate verify Error";
  16865. case FWRITE_ERROR:
  16866. return "fwrite Error";
  16867. case CACHE_MATCH_ERROR:
  16868. return "Cache restore header match Error";
  16869. case UNKNOWN_SNI_HOST_NAME_E:
  16870. return "Unrecognized host name Error";
  16871. case UNKNOWN_MAX_FRAG_LEN_E:
  16872. return "Unrecognized max frag len Error";
  16873. case KEYUSE_SIGNATURE_E:
  16874. return "Key Use digitalSignature not set Error";
  16875. case KEYUSE_ENCIPHER_E:
  16876. return "Key Use keyEncipherment not set Error";
  16877. case EXTKEYUSE_AUTH_E:
  16878. return "Ext Key Use server/client auth not set Error";
  16879. case SEND_OOB_READ_E:
  16880. return "Send Callback Out of Bounds Read Error";
  16881. case SECURE_RENEGOTIATION_E:
  16882. return "Invalid Renegotiation Error";
  16883. case SESSION_TICKET_LEN_E:
  16884. return "Session Ticket Too Long Error";
  16885. case SESSION_TICKET_EXPECT_E:
  16886. return "Session Ticket Error";
  16887. case SESSION_SECRET_CB_E:
  16888. return "Session Secret Callback Error";
  16889. case NO_CHANGE_CIPHER_E:
  16890. return "Finished received from peer before Change Cipher Error";
  16891. case SANITY_MSG_E:
  16892. return "Sanity Check on message order Error";
  16893. case DUPLICATE_MSG_E:
  16894. return "Duplicate HandShake message Error";
  16895. case SNI_UNSUPPORTED:
  16896. return "Protocol version does not support SNI Error";
  16897. case SOCKET_PEER_CLOSED_E:
  16898. return "Peer closed underlying transport Error";
  16899. case BAD_TICKET_KEY_CB_SZ:
  16900. return "Bad user session ticket key callback Size Error";
  16901. case BAD_TICKET_MSG_SZ:
  16902. return "Bad session ticket message Size Error";
  16903. case BAD_TICKET_ENCRYPT:
  16904. return "Bad user ticket callback encrypt Error";
  16905. case DH_KEY_SIZE_E:
  16906. return "DH key too small Error";
  16907. case SNI_ABSENT_ERROR:
  16908. return "No Server Name Indication extension Error";
  16909. case RSA_SIGN_FAULT:
  16910. return "RSA Signature Fault Error";
  16911. case HANDSHAKE_SIZE_ERROR:
  16912. return "Handshake message too large Error";
  16913. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  16914. return "Unrecognized protocol name Error";
  16915. case BAD_CERTIFICATE_STATUS_ERROR:
  16916. return "Bad Certificate Status Message Error";
  16917. case OCSP_INVALID_STATUS:
  16918. return "Invalid OCSP Status Error";
  16919. case OCSP_WANT_READ:
  16920. return "OCSP nonblock wants read";
  16921. case RSA_KEY_SIZE_E:
  16922. return "RSA key too small";
  16923. case ECC_KEY_SIZE_E:
  16924. return "ECC key too small";
  16925. case DTLS_EXPORT_VER_E:
  16926. return "Version needs updated after code change or version mismatch";
  16927. case INPUT_SIZE_E:
  16928. return "Input size too large Error";
  16929. case CTX_INIT_MUTEX_E:
  16930. return "Initialize ctx mutex error";
  16931. case EXT_MASTER_SECRET_NEEDED_E:
  16932. return "Extended Master Secret must be enabled to resume EMS session";
  16933. case DTLS_POOL_SZ_E:
  16934. return "Maximum DTLS pool size exceeded";
  16935. case DECODE_E:
  16936. return "Decode handshake message error";
  16937. case WRITE_DUP_READ_E:
  16938. return "Write dup write side can't read error";
  16939. case WRITE_DUP_WRITE_E:
  16940. return "Write dup read side can't write error";
  16941. case INVALID_CERT_CTX_E:
  16942. return "Certificate context does not match request or not empty";
  16943. case BAD_KEY_SHARE_DATA:
  16944. return "The Key Share data contains group that wasn't in Client Hello";
  16945. case MISSING_HANDSHAKE_DATA:
  16946. return "The handshake message is missing required data";
  16947. case BAD_BINDER:
  16948. return "Binder value does not match value server calculated";
  16949. case EXT_NOT_ALLOWED:
  16950. return "Extension type not allowed in handshake message type";
  16951. case INVALID_PARAMETER:
  16952. return "The security parameter is invalid";
  16953. case UNSUPPORTED_EXTENSION:
  16954. return "TLS Extension not requested by the client";
  16955. case PRF_MISSING:
  16956. return "Pseudo-random function is not enabled";
  16957. case KEY_SHARE_ERROR:
  16958. return "Key share extension did not contain a valid named group";
  16959. case POST_HAND_AUTH_ERROR:
  16960. return "Client will not do post handshake authentication";
  16961. case HRR_COOKIE_ERROR:
  16962. return "Cookie does not match one sent in HelloRetryRequest";
  16963. case MCAST_HIGHWATER_CB_E:
  16964. return "Multicast highwater callback returned error";
  16965. case ALERT_COUNT_E:
  16966. return "Alert Count exceeded error";
  16967. case EXT_MISSING:
  16968. return "Required TLS extension missing";
  16969. case DTLS_RETX_OVER_TX:
  16970. return "DTLS interrupting flight transmit with retransmit";
  16971. case DH_PARAMS_NOT_FFDHE_E:
  16972. return "Server DH parameters were not from the FFDHE set as required";
  16973. case TCA_INVALID_ID_TYPE:
  16974. return "TLS Extension Trusted CA ID type invalid";
  16975. case TCA_ABSENT_ERROR:
  16976. return "TLS Extension Trusted CA ID response absent";
  16977. case TSIP_MAC_DIGSZ_E:
  16978. return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
  16979. case CLIENT_CERT_CB_ERROR:
  16980. return "Error importing client cert or key from callback";
  16981. case SSL_SHUTDOWN_ALREADY_DONE_E:
  16982. return "Shutdown has already occurred";
  16983. case TLS13_SECRET_CB_E:
  16984. return "TLS1.3 Secret Callback Error";
  16985. case DTLS_SIZE_ERROR:
  16986. return "DTLS trying to send too much in single datagram error";
  16987. case NO_CERT_ERROR:
  16988. return "TLS1.3 No Certificate Set Error";
  16989. case TOO_MUCH_EARLY_DATA:
  16990. return "Too much early data";
  16991. case SOCKET_FILTERED_E:
  16992. return "Session stopped by network filter";
  16993. default :
  16994. return "unknown error number";
  16995. }
  16996. #endif /* NO_ERROR_STRINGS */
  16997. }
  16998. void SetErrorString(int error, char* str)
  16999. {
  17000. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  17001. str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
  17002. }
  17003. #ifdef NO_CIPHER_SUITE_ALIASES
  17004. #ifndef NO_ERROR_STRINGS
  17005. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17006. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17007. #define SUITE_ALIAS(x,z,w,v,u)
  17008. #else
  17009. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17010. #define SUITE_ALIAS(x,z,w,v,u)
  17011. #endif
  17012. #else
  17013. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17014. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17015. #define SUITE_ALIAS(x,z,w,v,u)
  17016. #else
  17017. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17018. #define SUITE_ALIAS(x,z,w,v,u)
  17019. #endif
  17020. #endif
  17021. #else /* !NO_CIPHER_SUITE_ALIASES */
  17022. /* note that the comma is included at the end of the SUITE_ALIAS() macro
  17023. * definitions, to allow aliases to be gated out by the above null macros
  17024. * in the NO_CIPHER_SUITE_ALIASES section.
  17025. */
  17026. #ifndef NO_ERROR_STRINGS
  17027. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  17028. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  17029. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17030. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  17031. #else
  17032. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17033. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  17034. #endif
  17035. #else
  17036. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  17037. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  17038. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17039. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  17040. #else
  17041. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17042. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  17043. #endif
  17044. #endif
  17045. #endif /* NO_CIPHER_SUITE_ALIASES */
  17046. static const CipherSuiteInfo cipher_names[] =
  17047. {
  17048. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  17049. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  17050. #endif
  17051. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  17052. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
  17053. #endif
  17054. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  17055. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  17056. #endif
  17057. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  17058. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  17059. #endif
  17060. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  17061. 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),
  17062. SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
  17063. #endif
  17064. #ifdef BUILD_TLS_SHA256_SHA256
  17065. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  17066. #endif
  17067. #ifdef BUILD_TLS_SHA384_SHA384
  17068. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
  17069. #endif
  17070. #ifndef WOLFSSL_NO_TLS12
  17071. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  17072. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  17073. #endif
  17074. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  17075. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  17076. #endif
  17077. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  17078. 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),
  17079. #endif
  17080. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  17081. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  17082. #endif
  17083. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  17084. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  17085. #endif
  17086. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  17087. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  17088. #endif
  17089. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  17090. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  17091. #endif
  17092. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  17093. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  17094. #endif
  17095. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  17096. 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),
  17097. #endif
  17098. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  17099. 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),
  17100. #endif
  17101. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  17102. 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),
  17103. #endif
  17104. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  17105. 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),
  17106. #endif
  17107. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  17108. 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),
  17109. #endif
  17110. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  17111. 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),
  17112. #endif
  17113. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  17114. 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),
  17115. #endif
  17116. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  17117. 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),
  17118. #endif
  17119. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  17120. 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),
  17121. #endif
  17122. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  17123. 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),
  17124. #endif
  17125. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  17126. 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),
  17127. #endif
  17128. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  17129. 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),
  17130. #endif
  17131. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  17132. 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),
  17133. #endif
  17134. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  17135. 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),
  17136. #endif
  17137. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  17138. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  17139. #endif
  17140. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  17141. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  17142. #endif
  17143. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  17144. 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),
  17145. SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  17146. #endif
  17147. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  17148. 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),
  17149. SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  17150. #endif
  17151. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  17152. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  17153. #endif
  17154. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  17155. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  17156. #endif
  17157. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  17158. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  17159. #endif
  17160. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  17161. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  17162. #endif
  17163. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  17164. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  17165. #endif
  17166. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  17167. SUITE_INFO("HC128-MD5","TLS_RSA_WITH_HC_128_MD5",CIPHER_BYTE,TLS_RSA_WITH_HC_128_MD5,TLSv1_MINOR,SSLv3_MAJOR),
  17168. #endif
  17169. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  17170. SUITE_INFO("HC128-SHA","TLS_RSA_WITH_HC_128_SHA",CIPHER_BYTE,TLS_RSA_WITH_HC_128_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  17171. #endif
  17172. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  17173. SUITE_INFO("RABBIT-SHA","TLS_RSA_WITH_RABBIT_SHA",CIPHER_BYTE,TLS_RSA_WITH_RABBIT_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  17174. #endif
  17175. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  17176. SUITE_INFO("NTRU-RC4-SHA","TLS_NTRU_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  17177. #endif
  17178. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  17179. SUITE_INFO("NTRU-DES-CBC3-SHA","TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  17180. #endif
  17181. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  17182. SUITE_INFO("NTRU-AES128-SHA","TLS_NTRU_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  17183. #endif
  17184. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  17185. SUITE_INFO("NTRU-AES256-SHA","TLS_NTRU_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  17186. #endif
  17187. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  17188. 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),
  17189. SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  17190. #endif
  17191. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  17192. 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),
  17193. SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  17194. #endif
  17195. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  17196. 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),
  17197. #endif
  17198. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  17199. 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),
  17200. SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  17201. #endif
  17202. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  17203. 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),
  17204. SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  17205. #endif
  17206. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  17207. 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),
  17208. #endif
  17209. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  17210. 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),
  17211. #endif
  17212. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  17213. 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),
  17214. #endif
  17215. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  17216. 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),
  17217. #endif
  17218. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  17219. 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),
  17220. #endif
  17221. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  17222. 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),
  17223. #endif
  17224. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  17225. 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),
  17226. #endif
  17227. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  17228. 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),
  17229. #endif
  17230. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  17231. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
  17232. #endif
  17233. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  17234. 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),
  17235. #endif
  17236. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  17237. 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),
  17238. #endif
  17239. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  17240. 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),
  17241. #endif
  17242. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  17243. 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),
  17244. #endif
  17245. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  17246. 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),
  17247. #endif
  17248. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  17249. 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),
  17250. #endif
  17251. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  17252. 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),
  17253. #endif
  17254. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  17255. 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),
  17256. #endif
  17257. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  17258. 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),
  17259. #endif
  17260. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  17261. 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),
  17262. #endif
  17263. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  17264. 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),
  17265. #endif
  17266. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  17267. 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),
  17268. #endif
  17269. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  17270. 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),
  17271. #endif
  17272. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  17273. 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),
  17274. #endif
  17275. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  17276. 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),
  17277. #endif
  17278. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  17279. 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),
  17280. #endif
  17281. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  17282. 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),
  17283. #endif
  17284. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  17285. 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),
  17286. #endif
  17287. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  17288. 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),
  17289. #endif
  17290. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  17291. 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),
  17292. #endif
  17293. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  17294. 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),
  17295. #endif
  17296. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  17297. 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),
  17298. #endif
  17299. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  17300. 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),
  17301. #endif
  17302. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  17303. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  17304. #endif
  17305. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  17306. 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),
  17307. #endif
  17308. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  17309. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  17310. #endif
  17311. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  17312. 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),
  17313. #endif
  17314. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  17315. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  17316. #endif
  17317. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  17318. 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),
  17319. #endif
  17320. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  17321. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  17322. #endif
  17323. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  17324. 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),
  17325. #endif
  17326. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  17327. 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),
  17328. #endif
  17329. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  17330. 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),
  17331. #endif
  17332. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  17333. 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),
  17334. #endif
  17335. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  17336. 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),
  17337. #endif
  17338. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  17339. 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),
  17340. #endif
  17341. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  17342. 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),
  17343. #endif
  17344. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  17345. 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),
  17346. #endif
  17347. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  17348. 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),
  17349. #endif
  17350. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  17351. 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),
  17352. #endif
  17353. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  17354. 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),
  17355. #endif
  17356. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  17357. 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),
  17358. #endif
  17359. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  17360. 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),
  17361. #endif
  17362. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  17363. 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),
  17364. #endif
  17365. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  17366. 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),
  17367. #endif
  17368. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  17369. 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),
  17370. #endif
  17371. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  17372. 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),
  17373. #endif
  17374. #ifdef BUILD_TLS_QSH
  17375. SUITE_INFO("QSH","TLS_QSH",QSH_BYTE,TLS_QSH, TLSv1_MINOR, SSLv3_MAJOR),
  17376. #endif
  17377. #ifdef HAVE_RENEGOTIATION_INDICATION
  17378. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
  17379. #endif
  17380. #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA
  17381. SUITE_INFO("IDEA-CBC-SHA","SSL_RSA_WITH_IDEA_CBC_SHA",CIPHER_BYTE,SSL_RSA_WITH_IDEA_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  17382. #endif
  17383. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  17384. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  17385. #endif
  17386. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  17387. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  17388. #endif
  17389. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  17390. 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),
  17391. #endif
  17392. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  17393. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  17394. #endif
  17395. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  17396. 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),
  17397. #endif
  17398. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  17399. 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),
  17400. #endif
  17401. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  17402. 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),
  17403. #endif
  17404. #ifdef BUILD_WDM_WITH_NULL_SHA256
  17405. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
  17406. #endif
  17407. #endif /* WOLFSSL_NO_TLS12 */
  17408. };
  17409. /* returns the cipher_names array */
  17410. const CipherSuiteInfo* GetCipherNames(void)
  17411. {
  17412. return cipher_names;
  17413. }
  17414. /* returns the number of elements in the cipher_names array */
  17415. int GetCipherNamesSize(void)
  17416. {
  17417. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  17418. }
  17419. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  17420. {
  17421. int i;
  17422. const char* nameInternal = "None";
  17423. for (i = 0; i < GetCipherNamesSize(); i++) {
  17424. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  17425. (cipher_names[i].cipherSuite == cipherSuite)
  17426. #ifndef NO_CIPHER_SUITE_ALIASES
  17427. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  17428. #endif
  17429. ) {
  17430. nameInternal = cipher_names[i].name;
  17431. break;
  17432. }
  17433. }
  17434. return nameInternal;
  17435. }
  17436. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  17437. const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
  17438. const char* keaStr = NULL;
  17439. const char *n0,*n1,*n2,*n3,*n4;
  17440. n0 = n[0];
  17441. n1 = n[1];
  17442. n2 = n[2];
  17443. n3 = n[3];
  17444. n4 = n[4];
  17445. #ifdef HAVE_NTRU
  17446. if (XSTRNCMP(n0,"NTRU",4) == 0)
  17447. return "NTRU";
  17448. #endif
  17449. if (XSTRNCMP(n0,"ECDHE",5) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  17450. keaStr = "ECDHEPSK";
  17451. else if (XSTRNCMP(n0,"ECDH",4) == 0)
  17452. keaStr = "ECDH";
  17453. else if (XSTRNCMP(n0,"DHE",3) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  17454. keaStr = "DHEPSK";
  17455. else if (XSTRNCMP(n0,"DHE",3) == 0)
  17456. keaStr = "DH";
  17457. else if (XSTRNCMP(n0,"RSA",3) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  17458. keaStr = "RSAPSK";
  17459. else if (XSTRNCMP(n0,"SRP",3) == 0)
  17460. keaStr = "SRP";
  17461. else if (XSTRNCMP(n0,"PSK",3) == 0)
  17462. keaStr = "PSK";
  17463. else if (XSTRNCMP(n0,"EDH",3) == 0)
  17464. keaStr = "EDH";
  17465. else if ((XSTRNCMP(n1,"SHA",3) == 0) || (XSTRNCMP(n2,"SHA",3) == 0) ||
  17466. (XSTRNCMP(n3,"SHA",3) == 0) || (XSTRNCMP(n4,"SHA",3) == 0) ||
  17467. (XSTRNCMP(n2,"RSA",3) == 0) || (XSTRNCMP(n0,"AES128",6) == 0) ||
  17468. (XSTRNCMP(n0,"AES256",6) == 0) || (XSTRNCMP(n1,"MD5",3) == 0))
  17469. keaStr = "RSA";
  17470. else
  17471. keaStr = "unknown";
  17472. return keaStr;
  17473. }
  17474. const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
  17475. const char* authStr = NULL;
  17476. const char *n0,*n1,*n2;
  17477. n0 = n[0];
  17478. n1 = n[1];
  17479. n2 = n[2];
  17480. #ifdef HAVE_NTRU
  17481. if (XSTRNCMP(n0,"NTRU",4) == 0)
  17482. return "NTRU";
  17483. #endif
  17484. if ((XSTRNCMP(n0,"AES128",6) == 0) || (XSTRNCMP(n0,"AES256",6) == 0) ||
  17485. ((XSTRNCMP(n0,"TLS13",5) == 0) && ((XSTRNCMP(n1,"AES128",6) == 0) ||
  17486. (XSTRNCMP(n1,"AES256",6) == 0) || (XSTRNCMP(n1,"CHACHA20",8) == 0))) ||
  17487. (XSTRNCMP(n0,"RSA",3) == 0) || (XSTRNCMP(n1,"RSA",3) == 0) ||
  17488. (XSTRNCMP(n1,"SHA",3) == 0) || (XSTRNCMP(n2,"SHA",3) == 0) ||
  17489. (XSTRNCMP(n1,"MD5",3) == 0))
  17490. authStr = "RSA";
  17491. else if (XSTRNCMP(n0,"PSK",3) == 0 || XSTRNCMP(n1,"PSK",3) == 0)
  17492. authStr = "PSK";
  17493. else if (XSTRNCMP(n0,"SRP",3) == 0 && XSTRNCMP(n1,"AES",3) == 0)
  17494. authStr = "SRP";
  17495. else if (XSTRNCMP(n1,"ECDSA",5) == 0)
  17496. authStr = "ECDSA";
  17497. else if (XSTRNCMP(n0,"ADH",3) == 0)
  17498. authStr = "None";
  17499. else
  17500. authStr = "unknown";
  17501. return authStr;
  17502. }
  17503. const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
  17504. const char* encStr = NULL;
  17505. const char *n0,*n1,*n2,*n3;
  17506. n0 = n[0];
  17507. n1 = n[1];
  17508. n2 = n[2];
  17509. n3 = n[3];
  17510. if ((XSTRNCMP(n0,"AES256",6) == 0 && XSTRNCMP(n1,"GCM",3) == 0) ||
  17511. (XSTRNCMP(n1,"AES256",6) == 0 && XSTRNCMP(n2,"GCM",3) == 0) ||
  17512. (XSTRNCMP(n2,"AES256",6) == 0 && XSTRNCMP(n3,"GCM",3) == 0))
  17513. encStr = "AESGCM(256)";
  17514. else if ((XSTRNCMP(n0,"AES128",6) == 0 && XSTRNCMP(n1,"GCM",3) == 0) ||
  17515. (XSTRNCMP(n1,"AES128",6) == 0 && XSTRNCMP(n2,"GCM",3) == 0) ||
  17516. (XSTRNCMP(n2,"AES128",6) == 0 && XSTRNCMP(n3,"GCM",3) == 0))
  17517. encStr = "AESGCM(128)";
  17518. else if ((XSTRNCMP(n0,"AES128",6) == 0 && XSTRNCMP(n1,"CCM",3) == 0) ||
  17519. (XSTRNCMP(n1,"AES128",6) == 0 && XSTRNCMP(n2,"CCM",3) == 0) ||
  17520. (XSTRNCMP(n2,"AES128",6) == 0 && XSTRNCMP(n3,"CCM",3) == 0))
  17521. encStr = "AESCCM(128)";
  17522. else if ((XSTRNCMP(n0,"AES128",6) == 0) ||
  17523. (XSTRNCMP(n1,"AES128",6) == 0) ||
  17524. (XSTRNCMP(n2,"AES128",6) == 0) ||
  17525. (XSTRNCMP(n1,"AES",3) == 0 && XSTRNCMP(n2,"128",3) == 0) ||
  17526. (XSTRNCMP(n2,"AES",3) == 0 && XSTRNCMP(n3,"128",3) == 0))
  17527. encStr = "AES(128)";
  17528. else if ((XSTRNCMP(n0,"AES256",6) == 0) ||
  17529. (XSTRNCMP(n1,"AES256",6) == 0) ||
  17530. (XSTRNCMP(n2,"AES256",6) == 0) ||
  17531. (XSTRNCMP(n1,"AES",3) == 0 && XSTRNCMP(n2,"256",3) == 0) ||
  17532. (XSTRNCMP(n2,"AES",3) == 0 && XSTRNCMP(n3,"256",3) == 0))
  17533. encStr = "AES(256)";
  17534. else if ((XSTRNCMP(n0,"CAMELLIA256",11) == 0) ||
  17535. (XSTRNCMP(n2,"CAMELLIA256",11) == 0))
  17536. encStr = "CAMELLIA(256)";
  17537. else if ((XSTRNCMP(n0,"CAMELLIA128",11) == 0) ||
  17538. (XSTRNCMP(n2,"CAMELLIA128",11) == 0))
  17539. encStr = "CAMELLIA(128)";
  17540. else if ((XSTRNCMP(n0,"RC4",3) == 0) || (XSTRNCMP(n1,"RC4",3) == 0) ||
  17541. (XSTRNCMP(n2,"RC4",3) == 0))
  17542. encStr = "RC4";
  17543. else if (((XSTRNCMP(n0,"DES",3) == 0) || (XSTRNCMP(n1,"DES",3) == 0) ||
  17544. (XSTRNCMP(n2,"DES",3) == 0)) &&
  17545. ((XSTRNCMP(n1,"CBC3",4) == 0) || (XSTRNCMP(n2,"CBC3",4) == 0) ||
  17546. (XSTRNCMP(n3,"CBC3",4) == 0)))
  17547. encStr = "3DES";
  17548. else if ((XSTRNCMP(n1,"CHACHA20",8) == 0 && XSTRNCMP(n2,"POLY1305",8) == 0) ||
  17549. (XSTRNCMP(n2,"CHACHA20",8) == 0 && XSTRNCMP(n3,"POLY1305",8) == 0))
  17550. encStr = "CHACHA20/POLY1305(256)";
  17551. else if ((XSTRNCMP(n0,"NULL",4) == 0) || (XSTRNCMP(n1,"NULL",4) == 0) ||
  17552. (XSTRNCMP(n2,"NULL",4) == 0) ||
  17553. ((XSTRNCMP(n0,"TLS13",5) == 0) && (XSTRNCMP(n3,"",0) == 0)))
  17554. encStr = "None";
  17555. else if ((XSTRNCMP(n0,"IDEA",4) == 0))
  17556. encStr = "IDEA";
  17557. else if ((XSTRNCMP(n0,"RABBIT",4) == 0))
  17558. encStr = "RABBIT";
  17559. else if ((XSTRNCMP(n0,"HC128",5) == 0))
  17560. encStr = "HC128";
  17561. else
  17562. encStr = "unknown";
  17563. return encStr;
  17564. }
  17565. /* Returns the MAC string of a cipher or "unknown" on failure */
  17566. const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
  17567. const char* macStr = NULL;
  17568. const char *n1,*n2,*n3,*n4;
  17569. n1 = n[1];
  17570. n2 = n[2];
  17571. n3 = n[3];
  17572. n4 = n[4];
  17573. if ((XSTRNCMP(n4,"SHA256",6) == 0) || (XSTRNCMP(n3,"SHA256",6) == 0) ||
  17574. (XSTRNCMP(n2,"SHA256",6) == 0) || (XSTRNCMP(n1,"SHA256",6) == 0))
  17575. macStr = "SHA256";
  17576. else if ((XSTRNCMP(n4,"SHA384",6) == 0) ||
  17577. (XSTRNCMP(n3,"SHA384",6) == 0) ||
  17578. (XSTRNCMP(n2,"SHA384",6) == 0) ||
  17579. (XSTRNCMP(n1,"SHA384",6) == 0))
  17580. macStr = "SHA384";
  17581. else if ((XSTRNCMP(n4,"SHA",3) == 0) || (XSTRNCMP(n3,"SHA",3) == 0) ||
  17582. (XSTRNCMP(n2,"SHA",3) == 0) || (XSTRNCMP(n1,"SHA",3) == 0) ||
  17583. (XSTRNCMP(n1,"MD5",3) == 0))
  17584. macStr = "SHA1";
  17585. else if ((XSTRNCMP(n3,"GCM",3) == 0) ||
  17586. (XSTRNCMP(n1,"CCM",3) == 0) ||
  17587. (XSTRNCMP(n2,"CCM",3) == 0) || (XSTRNCMP(n3,"CCM",3) == 0) ||
  17588. (XSTRNCMP(n1,"CHACHA20",8) == 0 && XSTRNCMP(n2,"POLY1305",8) == 0) ||
  17589. (XSTRNCMP(n2,"CHACHA20",8) == 0 && XSTRNCMP(n3,"POLY1305",8) == 0))
  17590. macStr = "AEAD";
  17591. else
  17592. macStr = "unknown";
  17593. return macStr;
  17594. }
  17595. /* Returns the number of bits based on the cipher enc string, or 0 on failure */
  17596. int SetCipherBits(const char* enc) {
  17597. int ret = WOLFSSL_FAILURE;
  17598. if ((XSTRNCMP(enc,"AESGCM(256)",11) == 0) ||
  17599. (XSTRNCMP(enc,"AES(256)",8) == 0) ||
  17600. (XSTRNCMP(enc,"CAMELLIA(256)",13) == 0) ||
  17601. (XSTRNCMP(enc,"CHACHA20/POLY1305(256)",22) == 0))
  17602. ret = 256;
  17603. else if
  17604. ((XSTRNCMP(enc,"3DES",4) == 0))
  17605. ret = 168;
  17606. else if
  17607. ((XSTRNCMP(enc,"AESGCM(128)",11) == 0) ||
  17608. (XSTRNCMP(enc,"AES(128)",8) == 0) ||
  17609. (XSTRNCMP(enc,"CAMELLIA(128)",13) == 0) ||
  17610. (XSTRNCMP(enc,"IDEA",4) == 0) ||
  17611. (XSTRNCMP(enc,"RC4",3) == 0))
  17612. ret = 128;
  17613. else if
  17614. ((XSTRNCMP(enc,"DES",3) == 0))
  17615. ret = 56;
  17616. return ret;
  17617. }
  17618. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  17619. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  17620. {
  17621. #ifndef NO_ERROR_STRINGS
  17622. int i;
  17623. const char* nameIana = "NONE";
  17624. for (i = 0; i < GetCipherNamesSize(); i++) {
  17625. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  17626. (cipher_names[i].cipherSuite == cipherSuite)
  17627. #ifndef NO_CIPHER_SUITE_ALIASES
  17628. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  17629. #endif
  17630. ) {
  17631. nameIana = cipher_names[i].name_iana;
  17632. break;
  17633. }
  17634. }
  17635. return nameIana;
  17636. #else
  17637. (void)cipherSuite0;
  17638. (void)cipherSuite;
  17639. return NULL;
  17640. #endif
  17641. }
  17642. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  17643. {
  17644. if (ssl == NULL) {
  17645. return NULL;
  17646. }
  17647. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  17648. }
  17649. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  17650. {
  17651. if (ssl == NULL) {
  17652. return NULL;
  17653. }
  17654. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  17655. }
  17656. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  17657. byte* cipherSuite, int* flags)
  17658. {
  17659. int ret = BAD_FUNC_ARG;
  17660. int i;
  17661. unsigned long len;
  17662. const char* nameDelim;
  17663. /* Support trailing : */
  17664. nameDelim = XSTRSTR(name, ":");
  17665. if (nameDelim)
  17666. len = (unsigned long)(nameDelim - name);
  17667. else
  17668. len = (unsigned long)XSTRLEN(name);
  17669. for (i = 0; i < GetCipherNamesSize(); i++) {
  17670. if ((XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
  17671. (cipher_names[i].name[len] == 0)) {
  17672. *cipherSuite0 = cipher_names[i].cipherSuite0;
  17673. *cipherSuite = cipher_names[i].cipherSuite;
  17674. *flags = cipher_names[i].flags;
  17675. ret = 0;
  17676. break;
  17677. }
  17678. }
  17679. return ret;
  17680. }
  17681. /**
  17682. Set the enabled cipher suites.
  17683. @param [out] suites Suites structure.
  17684. @param [in] list List of cipher suites, only supports full name from
  17685. cipher_names[] delimited by ':'.
  17686. @return true on success, else false.
  17687. */
  17688. int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list)
  17689. {
  17690. int ret = 0;
  17691. int idx = 0;
  17692. int haveRSAsig = 0;
  17693. int haveECDSAsig = 0;
  17694. int haveAnon = 0;
  17695. const int suiteSz = GetCipherNamesSize();
  17696. char* next = (char*)list;
  17697. if (suites == NULL || list == NULL) {
  17698. WOLFSSL_MSG("SetCipherList parameter error");
  17699. return 0;
  17700. }
  17701. if (next[0] == 0 || XSTRNCMP(next, "ALL", 3) == 0 ||
  17702. XSTRNCMP(next, "DEFAULT", 7) == 0)
  17703. return 1; /* wolfSSL default */
  17704. do {
  17705. char* current = next;
  17706. char name[MAX_SUITE_NAME + 1];
  17707. int i;
  17708. word32 length;
  17709. next = XSTRSTR(next, ":");
  17710. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /* last */
  17711. : (word32)(next - current));
  17712. XSTRNCPY(name, current, length);
  17713. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  17714. for (i = 0; i < suiteSz; i++) {
  17715. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  17716. #ifndef NO_ERROR_STRINGS
  17717. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  17718. #endif
  17719. ) {
  17720. #ifdef WOLFSSL_DTLS
  17721. /* don't allow stream ciphers with DTLS */
  17722. if (ctx->method->version.major == DTLS_MAJOR) {
  17723. if (XSTRSTR(name, "RC4") ||
  17724. XSTRSTR(name, "HC128") ||
  17725. XSTRSTR(name, "RABBIT"))
  17726. {
  17727. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  17728. continue;
  17729. }
  17730. }
  17731. #endif /* WOLFSSL_DTLS */
  17732. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  17733. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  17734. return 0; /* suites buffer not large enough, error out */
  17735. }
  17736. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  17737. suites->suites[idx++] = cipher_names[i].cipherSuite;
  17738. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  17739. * suites don't necessarily have RSA in the name. */
  17740. #ifdef WOLFSSL_TLS13
  17741. if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
  17742. (cipher_names[i].cipherSuite0 == ECC_BYTE &&
  17743. (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
  17744. cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
  17745. #ifndef NO_RSA
  17746. haveRSAsig = 1;
  17747. #endif
  17748. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  17749. defined(HAVE_ED448)
  17750. haveECDSAsig = 1;
  17751. #endif
  17752. }
  17753. else
  17754. #endif
  17755. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  17756. defined(HAVE_ED448)
  17757. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  17758. haveECDSAsig = 1;
  17759. else
  17760. #endif
  17761. #ifdef HAVE_ANON
  17762. if (XSTRSTR(name, "ADH"))
  17763. haveAnon = 1;
  17764. else
  17765. #endif
  17766. if (haveRSAsig == 0
  17767. #ifndef NO_PSK
  17768. && (XSTRSTR(name, "PSK") == NULL)
  17769. #endif
  17770. ) {
  17771. haveRSAsig = 1;
  17772. }
  17773. ret = 1; /* found at least one */
  17774. break;
  17775. }
  17776. }
  17777. }
  17778. while (next++); /* ++ needed to skip ':' */
  17779. if (ret) {
  17780. int keySz = 0;
  17781. #ifndef NO_CERTS
  17782. keySz = ctx->privateKeySz;
  17783. #endif
  17784. suites->setSuites = 1;
  17785. suites->suiteSz = (word16)idx;
  17786. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig, haveAnon, 1,
  17787. keySz);
  17788. }
  17789. (void)ctx;
  17790. return ret;
  17791. }
  17792. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  17793. static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
  17794. {
  17795. #ifdef HAVE_ED25519
  17796. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  17797. /* Certificate has Ed25519 key, only match with Ed25519 sig alg */
  17798. return sigAlgo == ed25519_sa_algo;
  17799. }
  17800. #endif
  17801. #ifdef HAVE_ED448
  17802. if (ssl->pkCurveOID == ECC_ED448_OID) {
  17803. /* Certificate has Ed448 key, only match with Ed448 sig alg */
  17804. return sigAlgo == ed448_sa_algo;
  17805. }
  17806. #endif
  17807. #ifdef WC_RSA_PSS
  17808. /* RSA certificate and PSS sig alg. */
  17809. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  17810. #if defined(WOLFSSL_TLS13)
  17811. /* TLS 1.3 only supports RSA-PSS. */
  17812. if (IsAtLeastTLSv1_3(ssl->version))
  17813. return sigAlgo == rsa_pss_sa_algo;
  17814. #endif
  17815. /* TLS 1.2 and below - RSA-PSS allowed. */
  17816. if (sigAlgo == rsa_pss_sa_algo)
  17817. return 1;
  17818. }
  17819. #endif
  17820. /* Signature algorithm matches certificate. */
  17821. return sigAlgo == ssl->suites->sigAlgo;
  17822. }
  17823. #if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
  17824. defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  17825. static int CmpEccStrength(int hashAlgo, int curveSz)
  17826. {
  17827. int dgstSz = GetMacDigestSize((byte)hashAlgo);
  17828. if (dgstSz <= 0)
  17829. return -1;
  17830. return dgstSz - (curveSz & (~0x3));
  17831. }
  17832. #endif
  17833. static byte MinHashAlgo(WOLFSSL* ssl)
  17834. {
  17835. #ifdef WOLFSSL_TLS13
  17836. if (IsAtLeastTLSv1_3(ssl->version)) {
  17837. return sha256_mac;
  17838. }
  17839. #endif
  17840. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
  17841. if (IsAtLeastTLSv1_2(ssl)) {
  17842. return sha256_mac;
  17843. }
  17844. #endif /* WOLFSSL_NO_TLS12 */
  17845. (void)ssl;
  17846. return sha_mac;
  17847. }
  17848. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  17849. {
  17850. word32 i;
  17851. int ret = MATCH_SUITE_ERROR;
  17852. byte minHash;
  17853. /* set defaults */
  17854. if (IsAtLeastTLSv1_3(ssl->version)) {
  17855. #ifndef NO_CERTS
  17856. /* TLS 1.3 cipher suites don't have public key algorithms in them.
  17857. * Using the one in the certificate - if any.
  17858. */
  17859. ssl->suites->sigAlgo = ssl->buffers.keyType;
  17860. #endif
  17861. }
  17862. else
  17863. ssl->suites->sigAlgo = ssl->specs.sig_algo;
  17864. if (ssl->suites->sigAlgo == 0) {
  17865. /* PSK ciphersuite - get digest to use from cipher suite */
  17866. ssl->suites->hashAlgo = ssl->specs.mac_algorithm;
  17867. return 0;
  17868. }
  17869. ssl->suites->hashAlgo = minHash = MinHashAlgo(ssl);
  17870. /* No list means go with the defaults. */
  17871. if (hashSigAlgoSz == 0)
  17872. return 0;
  17873. /* i+1 since two bytes used to describe hash and signature algorithm */
  17874. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  17875. byte hashAlgo = 0, sigAlgo = 0;
  17876. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  17877. /* Keep looking if hash algorithm not strong enough. */
  17878. if (hashAlgo < minHash)
  17879. continue;
  17880. /* Keep looking if signature algorithm isn't supported by cert. */
  17881. if (!MatchSigAlgo(ssl, sigAlgo))
  17882. continue;
  17883. #ifdef HAVE_ED25519
  17884. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  17885. /* Matched Ed25519 - set chosen and finished. */
  17886. ssl->suites->sigAlgo = sigAlgo;
  17887. ssl->suites->hashAlgo = hashAlgo;
  17888. ret = 0;
  17889. break;
  17890. }
  17891. #endif
  17892. #ifdef HAVE_ED448
  17893. if (ssl->pkCurveOID == ECC_ED448_OID) {
  17894. /* Matched Ed448 - set chosen and finished. */
  17895. ssl->suites->sigAlgo = sigAlgo;
  17896. ssl->suites->hashAlgo = hashAlgo;
  17897. ret = 0;
  17898. break;
  17899. }
  17900. #endif
  17901. #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  17902. #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
  17903. "be used together"
  17904. #endif
  17905. #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
  17906. defined(WOLFSSL_ECDSA_MATCH_HASH))
  17907. if (sigAlgo == ecc_dsa_sa_algo
  17908. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  17909. && IsAtLeastTLSv1_3(ssl->version)
  17910. #endif
  17911. ) {
  17912. /* Must be exact match. */
  17913. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  17914. continue;
  17915. /* Matched ECDSA exaclty - set chosen and finished. */
  17916. ssl->suites->hashAlgo = hashAlgo;
  17917. ssl->suites->sigAlgo = sigAlgo;
  17918. ret = 0;
  17919. break;
  17920. }
  17921. #endif
  17922. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  17923. * algorithm that matches the ephemeral ECDHE key size or the next highest
  17924. * available. This workaround resolves issue with some peer's that do not
  17925. * properly support scenarios such as a P-256 key hashed with SHA512.
  17926. */
  17927. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  17928. if (sigAlgo == ecc_dsa_sa_algo) {
  17929. int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
  17930. /* Keep looking if digest not strong enough. */
  17931. if (cmp < 0)
  17932. continue;
  17933. /* Looking for exact match or next highest. */
  17934. if (ret != 0 || hashAlgo <= ssl->suites->hashAlgo) {
  17935. ssl->suites->hashAlgo = hashAlgo;
  17936. ssl->suites->sigAlgo = sigAlgo;
  17937. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  17938. ssl->namedGroup = 0;
  17939. #endif
  17940. ret = 0;
  17941. }
  17942. /* Continue looking if not the same strength. */
  17943. if (cmp > 0)
  17944. continue;
  17945. /* Exact match - finished. */
  17946. break;
  17947. }
  17948. #endif
  17949. switch (hashAlgo) {
  17950. #ifndef NO_SHA
  17951. case sha_mac:
  17952. #endif
  17953. #ifdef WOLFSSL_SHA224
  17954. case sha224_mac:
  17955. #endif
  17956. #ifndef NO_SHA256
  17957. case sha256_mac:
  17958. #endif
  17959. #ifdef WOLFSSL_SHA384
  17960. case sha384_mac:
  17961. #endif
  17962. #ifdef WOLFSSL_SHA512
  17963. case sha512_mac:
  17964. #endif
  17965. #ifdef WOLFSSL_STRONGEST_HASH_SIG
  17966. /* Is hash algorithm weaker than chosen/min? */
  17967. if (hashAlgo < ssl->suites->hashAlgo)
  17968. break;
  17969. #else
  17970. /* Is hash algorithm stonger than last chosen? */
  17971. if (ret == 0 && hashAlgo > ssl->suites->hashAlgo)
  17972. break;
  17973. #endif
  17974. /* The chosen one - but keep looking. */
  17975. ssl->suites->hashAlgo = hashAlgo;
  17976. ssl->suites->sigAlgo = sigAlgo;
  17977. ret = 0;
  17978. break;
  17979. default:
  17980. /* Support for hash algorithm not compiled in. */
  17981. break;
  17982. }
  17983. }
  17984. return ret;
  17985. }
  17986. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  17987. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17988. /* Initialize HandShakeInfo */
  17989. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  17990. {
  17991. int i;
  17992. info->ssl = ssl;
  17993. info->cipherName[0] = 0;
  17994. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  17995. info->packetNames[i][0] = 0;
  17996. info->numberPackets = 0;
  17997. info->negotiationError = 0;
  17998. }
  17999. /* Set Final HandShakeInfo parameters */
  18000. void FinishHandShakeInfo(HandShakeInfo* info)
  18001. {
  18002. int i;
  18003. int sz = GetCipherNamesSize();
  18004. for (i = 0; i < sz; i++) {
  18005. #ifndef NO_CIPHER_SUITE_ALIASES
  18006. if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  18007. continue;
  18008. #endif
  18009. if (info->ssl->options.cipherSuite ==
  18010. (byte)cipher_names[i].cipherSuite) {
  18011. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  18012. continue; /* ECC suites at end */
  18013. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  18014. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  18015. break;
  18016. }
  18017. }
  18018. /* error max and min are negative numbers */
  18019. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  18020. info->negotiationError = info->ssl->error;
  18021. }
  18022. /* Add name to info packet names, increase packet name count */
  18023. void AddPacketName(WOLFSSL* ssl, const char* name)
  18024. {
  18025. #ifdef WOLFSSL_CALLBACKS
  18026. HandShakeInfo* info = &ssl->handShakeInfo;
  18027. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  18028. char* packetName = info->packetNames[info->numberPackets];
  18029. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  18030. packetName[MAX_PACKETNAME_SZ] = '\0';
  18031. info->numberPackets++;
  18032. }
  18033. #endif
  18034. (void)ssl;
  18035. (void)name;
  18036. }
  18037. #ifdef WOLFSSL_CALLBACKS
  18038. /* Initialize TimeoutInfo */
  18039. void InitTimeoutInfo(TimeoutInfo* info)
  18040. {
  18041. int i;
  18042. info->timeoutName[0] = 0;
  18043. info->flags = 0;
  18044. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  18045. info->packets[i].packetName[0] = 0;
  18046. info->packets[i].timestamp.tv_sec = 0;
  18047. info->packets[i].timestamp.tv_usec = 0;
  18048. info->packets[i].bufferValue = 0;
  18049. info->packets[i].valueSz = 0;
  18050. }
  18051. info->numberPackets = 0;
  18052. info->timeoutValue.tv_sec = 0;
  18053. info->timeoutValue.tv_usec = 0;
  18054. }
  18055. /* Free TimeoutInfo */
  18056. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  18057. {
  18058. int i;
  18059. (void)heap;
  18060. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  18061. if (info->packets[i].bufferValue) {
  18062. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  18063. info->packets[i].bufferValue = 0;
  18064. }
  18065. }
  18066. /* Add packet name to previously added packet info */
  18067. void AddLateName(const char* name, TimeoutInfo* info)
  18068. {
  18069. /* make sure we have a valid previous one */
  18070. if (info->numberPackets > 0 && info->numberPackets <
  18071. MAX_PACKETS_HANDSHAKE) {
  18072. char* packetName = info->packets[info->numberPackets-1].packetName;
  18073. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  18074. packetName[MAX_PACKETNAME_SZ] = '\0';
  18075. }
  18076. }
  18077. /* Add record header to previously added packet info */
  18078. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  18079. {
  18080. /* make sure we have a valid previous one */
  18081. if (info->numberPackets > 0 && info->numberPackets <
  18082. MAX_PACKETS_HANDSHAKE) {
  18083. if (info->packets[info->numberPackets - 1].bufferValue)
  18084. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  18085. RECORD_HEADER_SZ);
  18086. else
  18087. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  18088. RECORD_HEADER_SZ);
  18089. }
  18090. }
  18091. #endif /* WOLFSSL_CALLBACKS */
  18092. /* Add PacketInfo to TimeoutInfo
  18093. *
  18094. * ssl WOLFSSL structure sending or receiving packet
  18095. * name name of packet being sent
  18096. * type type of packet being sent
  18097. * data data bing sent with packet
  18098. * sz size of data buffer
  18099. * written 1 if this packet is being written to wire, 0 if being read
  18100. * heap custom heap to use for mallocs/frees
  18101. */
  18102. void AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  18103. const byte* data, int sz, int written, void* heap)
  18104. {
  18105. #ifdef WOLFSSL_CALLBACKS
  18106. TimeoutInfo* info = &ssl->timeoutInfo;
  18107. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  18108. WOLFSSL_TIMEVAL currTime;
  18109. /* may add name after */
  18110. if (name) {
  18111. char* packetName = info->packets[info->numberPackets].packetName;
  18112. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  18113. packetName[MAX_PACKETNAME_SZ] = '\0';
  18114. }
  18115. /* add data, put in buffer if bigger than static buffer */
  18116. info->packets[info->numberPackets].valueSz = sz;
  18117. if (sz < MAX_VALUE_SZ)
  18118. XMEMCPY(info->packets[info->numberPackets].value, data, sz);
  18119. else {
  18120. info->packets[info->numberPackets].bufferValue =
  18121. (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_INFO);
  18122. if (!info->packets[info->numberPackets].bufferValue)
  18123. /* let next alloc catch, just don't fill, not fatal here */
  18124. info->packets[info->numberPackets].valueSz = 0;
  18125. else
  18126. XMEMCPY(info->packets[info->numberPackets].bufferValue,
  18127. data, sz);
  18128. }
  18129. gettimeofday(&currTime, 0);
  18130. info->packets[info->numberPackets].timestamp.tv_sec =
  18131. currTime.tv_sec;
  18132. info->packets[info->numberPackets].timestamp.tv_usec =
  18133. currTime.tv_usec;
  18134. info->numberPackets++;
  18135. }
  18136. #endif /* WOLFSSL_CALLBACKS */
  18137. #ifdef OPENSSL_EXTRA
  18138. if (ssl->protoMsgCb != NULL && sz > RECORD_HEADER_SZ) {
  18139. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  18140. 4096 from 16^3 */
  18141. int version = (ssl->version.minor & 0X0F) +
  18142. (ssl->version.minor & 0xF0) * 16 +
  18143. (ssl->version.major & 0X0F) * 256 +
  18144. (ssl->version.major & 0xF0) * 4096;
  18145. ssl->protoMsgCb(written, version, type,
  18146. (const void *)(data + RECORD_HEADER_SZ),
  18147. (size_t)(sz - RECORD_HEADER_SZ),
  18148. ssl, ssl->protoMsgCtx);
  18149. }
  18150. #endif /* OPENSSL_EXTRA */
  18151. (void)written;
  18152. (void)name;
  18153. (void)heap;
  18154. (void)type;
  18155. (void)ssl;
  18156. }
  18157. #endif /* WOLFSSL_CALLBACKS */
  18158. #if !defined(NO_CERTS)
  18159. #ifdef WOLF_CRYPTO_CB
  18160. /* Create a private key for a device.
  18161. *
  18162. * pkey Key object.
  18163. * data Data to identify key.
  18164. * length Length of data.
  18165. * hsType Type of the key to create.
  18166. * heap Custom heap to use for mallocs/frees
  18167. * devId Id for device.
  18168. * return 0 on success.
  18169. * return NOT_COMPILED_IN if algorithm type not supported.
  18170. * return MEMORY_E on memory allocation failure.
  18171. * return other internal error
  18172. */
  18173. int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
  18174. int label, int id, void* heap, int devId)
  18175. {
  18176. int ret = NOT_COMPILED_IN;
  18177. if (hsType == DYNAMIC_TYPE_RSA) {
  18178. #ifndef NO_RSA
  18179. RsaKey* rsaKey;
  18180. rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  18181. if (rsaKey == NULL) {
  18182. return MEMORY_E;
  18183. }
  18184. if (label) {
  18185. ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
  18186. }
  18187. else if (id) {
  18188. ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId);
  18189. }
  18190. if (ret == 0) {
  18191. *pkey = (void*)rsaKey;
  18192. }
  18193. else {
  18194. XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
  18195. }
  18196. #endif
  18197. }
  18198. else if (hsType == DYNAMIC_TYPE_ECC) {
  18199. #ifdef HAVE_ECC
  18200. ecc_key* ecKey;
  18201. ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  18202. if (ecKey == NULL) {
  18203. return MEMORY_E;
  18204. }
  18205. if (label) {
  18206. ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
  18207. }
  18208. else if (id) {
  18209. ret = wc_ecc_init_id(ecKey, data, length, heap, devId);
  18210. }
  18211. if (ret == 0) {
  18212. *pkey = (void*)ecKey;
  18213. }
  18214. else {
  18215. XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
  18216. }
  18217. #endif
  18218. }
  18219. return ret;
  18220. }
  18221. #endif
  18222. /* Decode the private key - RSA/ECC/Ed25519/Ed448 - and creates a key object.
  18223. * The signature type is set as well.
  18224. * The maximum length of a signature is returned.
  18225. *
  18226. * ssl The SSL/TLS object.
  18227. * length The length of a signature.
  18228. * returns 0 on success, otherwise failure.
  18229. */
  18230. int DecodePrivateKey(WOLFSSL *ssl, word16* length)
  18231. {
  18232. int ret = BAD_FUNC_ARG;
  18233. int keySz;
  18234. word32 idx;
  18235. #ifdef HAVE_PK_CALLBACKS
  18236. /* allow no private key if using PK callbacks and CB is set */
  18237. if (wolfSSL_IsPrivatePkSet(ssl)) {
  18238. *length = GetPrivateKeySigSize(ssl);
  18239. return 0;
  18240. }
  18241. else
  18242. #endif
  18243. /* make sure private key exists */
  18244. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  18245. WOLFSSL_MSG("Private key missing!");
  18246. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  18247. }
  18248. #ifdef HAVE_PKCS11
  18249. if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
  18250. ssl->buffers.keyLabel)) {
  18251. if (ssl->buffers.keyType == rsa_sa_algo)
  18252. ssl->hsType = DYNAMIC_TYPE_RSA;
  18253. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  18254. ssl->hsType = DYNAMIC_TYPE_ECC;
  18255. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  18256. if (ret != 0) {
  18257. goto exit_dpk;
  18258. }
  18259. if (ssl->buffers.keyType == rsa_sa_algo) {
  18260. #ifndef NO_RSA
  18261. if (ssl->buffers.keyLabel) {
  18262. ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
  18263. (char*)ssl->buffers.key->buffer,
  18264. ssl->heap, ssl->buffers.keyDevId);
  18265. }
  18266. else if (ssl->buffers.keyId) {
  18267. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  18268. ssl->buffers.key->buffer,
  18269. ssl->buffers.key->length, ssl->heap,
  18270. ssl->buffers.keyDevId);
  18271. }
  18272. if (ret == 0) {
  18273. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  18274. WOLFSSL_MSG("RSA key size too small");
  18275. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  18276. }
  18277. /* Return the maximum signature length. */
  18278. *length = (word16)ssl->buffers.keySz;
  18279. }
  18280. #else
  18281. ret = NOT_COMPILED_IN;
  18282. #endif
  18283. }
  18284. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  18285. #ifdef HAVE_ECC
  18286. if (ssl->buffers.keyLabel) {
  18287. ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
  18288. (char*)ssl->buffers.key->buffer,
  18289. ssl->heap, ssl->buffers.keyDevId);
  18290. }
  18291. else if (ssl->buffers.keyId) {
  18292. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
  18293. ssl->buffers.key->buffer,
  18294. ssl->buffers.key->length, ssl->heap,
  18295. ssl->buffers.keyDevId);
  18296. }
  18297. if (ret == 0) {
  18298. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  18299. WOLFSSL_MSG("ECC key size too small");
  18300. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  18301. }
  18302. /* Return the maximum signature length. */
  18303. *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz);
  18304. }
  18305. #else
  18306. ret = NOT_COMPILED_IN;
  18307. #endif
  18308. }
  18309. goto exit_dpk;
  18310. }
  18311. #endif
  18312. #ifndef NO_RSA
  18313. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  18314. ssl->hsType = DYNAMIC_TYPE_RSA;
  18315. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  18316. if (ret != 0) {
  18317. goto exit_dpk;
  18318. }
  18319. WOLFSSL_MSG("Trying RSA private key");
  18320. /* Set start of data to beginning of buffer. */
  18321. idx = 0;
  18322. /* Decode the key assuming it is an RSA private key. */
  18323. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  18324. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  18325. if (ret == 0) {
  18326. WOLFSSL_MSG("Using RSA private key");
  18327. /* It worked so check it meets minimum key size requirements. */
  18328. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  18329. if (keySz < 0) { /* check if keySz has error case */
  18330. ERROR_OUT(keySz, exit_dpk);
  18331. }
  18332. if (keySz < ssl->options.minRsaKeySz) {
  18333. WOLFSSL_MSG("RSA key size too small");
  18334. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  18335. }
  18336. /* Return the maximum signature length. */
  18337. *length = (word16)keySz;
  18338. goto exit_dpk;
  18339. }
  18340. }
  18341. #endif /* !NO_RSA */
  18342. #ifdef HAVE_ECC
  18343. #ifndef NO_RSA
  18344. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  18345. #endif /* !NO_RSA */
  18346. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0) {
  18347. ssl->hsType = DYNAMIC_TYPE_ECC;
  18348. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  18349. if (ret != 0) {
  18350. goto exit_dpk;
  18351. }
  18352. #ifndef NO_RSA
  18353. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  18354. #else
  18355. WOLFSSL_MSG("Trying ECC private key");
  18356. #endif
  18357. /* Set start of data to beginning of buffer. */
  18358. idx = 0;
  18359. /* Decode the key assuming it is an ECC private key. */
  18360. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  18361. (ecc_key*)ssl->hsKey,
  18362. ssl->buffers.key->length);
  18363. if (ret == 0) {
  18364. WOLFSSL_MSG("Using ECC private key");
  18365. /* Check it meets the minimum ECC key size requirements. */
  18366. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  18367. if (keySz < ssl->options.minEccKeySz) {
  18368. WOLFSSL_MSG("ECC key size too small");
  18369. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  18370. }
  18371. /* Return the maximum signature length. */
  18372. *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  18373. goto exit_dpk;
  18374. }
  18375. }
  18376. #endif
  18377. #ifdef HAVE_ED25519
  18378. #if !defined(NO_RSA) || defined(HAVE_ECC)
  18379. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  18380. #endif
  18381. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  18382. ssl->hsType = DYNAMIC_TYPE_ED25519;
  18383. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  18384. if (ret != 0) {
  18385. goto exit_dpk;
  18386. }
  18387. #ifdef HAVE_ECC
  18388. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  18389. #elif !defined(NO_RSA)
  18390. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  18391. #else
  18392. WOLFSSL_MSG("Trying ED25519 private key");
  18393. #endif
  18394. /* Set start of data to beginning of buffer. */
  18395. idx = 0;
  18396. /* Decode the key assuming it is an ED25519 private key. */
  18397. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  18398. (ed25519_key*)ssl->hsKey,
  18399. ssl->buffers.key->length);
  18400. if (ret == 0) {
  18401. WOLFSSL_MSG("Using ED25519 private key");
  18402. /* Check it meets the minimum ECC key size requirements. */
  18403. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  18404. WOLFSSL_MSG("ED25519 key size too small");
  18405. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  18406. }
  18407. /* Return the maximum signature length. */
  18408. *length = ED25519_SIG_SIZE;
  18409. goto exit_dpk;
  18410. }
  18411. }
  18412. #endif /* HAVE_ED25519 */
  18413. #ifdef HAVE_ED448
  18414. #if !defined(NO_RSA) || defined(HAVE_ECC)
  18415. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  18416. #endif
  18417. if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
  18418. ssl->hsType = DYNAMIC_TYPE_ED448;
  18419. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  18420. if (ret != 0) {
  18421. goto exit_dpk;
  18422. }
  18423. #ifdef HAVE_ED25519
  18424. WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
  18425. #elif defined(HAVE_ECC)
  18426. WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
  18427. #elif !defined(NO_RSA)
  18428. WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
  18429. #else
  18430. WOLFSSL_MSG("Trying ED447 private key");
  18431. #endif
  18432. /* Set start of data to beginning of buffer. */
  18433. idx = 0;
  18434. /* Decode the key assuming it is an ED448 private key. */
  18435. ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  18436. (ed448_key*)ssl->hsKey,
  18437. ssl->buffers.key->length);
  18438. if (ret == 0) {
  18439. WOLFSSL_MSG("Using ED448 private key");
  18440. /* Check it meets the minimum ECC key size requirements. */
  18441. if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  18442. WOLFSSL_MSG("ED448 key size too small");
  18443. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  18444. }
  18445. /* Return the maximum signature length. */
  18446. *length = ED448_SIG_SIZE;
  18447. goto exit_dpk;
  18448. }
  18449. }
  18450. #endif /* HAVE_ED448 */
  18451. (void)idx;
  18452. (void)keySz;
  18453. (void)length;
  18454. exit_dpk:
  18455. return ret;
  18456. }
  18457. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  18458. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  18459. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  18460. int TLSv1_3_Capable(WOLFSSL* ssl)
  18461. {
  18462. #ifndef WOLFSSL_TLS13
  18463. return 0;
  18464. #else
  18465. int ret = 0;
  18466. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  18467. ret = 1;
  18468. }
  18469. #ifdef OPENSSL_EXTRA
  18470. if ((wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_3)) {
  18471. /* option set at run time to disable TLS 1.3 */
  18472. ret = 0;
  18473. }
  18474. #endif
  18475. return ret;
  18476. #endif
  18477. }
  18478. #endif /* WOLFSSL_TLS13 */
  18479. /* client only parts */
  18480. #ifndef NO_WOLFSSL_CLIENT
  18481. #ifndef WOLFSSL_NO_TLS12
  18482. /* handle generation of client_hello (1) */
  18483. int SendClientHello(WOLFSSL* ssl)
  18484. {
  18485. byte *output;
  18486. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  18487. int sendSz;
  18488. int idSz = ssl->options.resuming
  18489. ? ssl->session.sessionIDSz
  18490. : 0;
  18491. int ret;
  18492. word16 extSz = 0;
  18493. #ifdef WOLFSSL_TLS13
  18494. if (IsAtLeastTLSv1_3(ssl->version))
  18495. return SendTls13ClientHello(ssl);
  18496. #endif
  18497. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  18498. WOLFSSL_ENTER("SendClientHello");
  18499. if (ssl->suites == NULL) {
  18500. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  18501. return SUITES_ERROR;
  18502. }
  18503. #ifdef HAVE_SESSION_TICKET
  18504. if (ssl->options.resuming && ssl->session.ticketLen > 0) {
  18505. SessionTicket* ticket;
  18506. ticket = TLSX_SessionTicket_Create(0, ssl->session.ticket,
  18507. ssl->session.ticketLen, ssl->heap);
  18508. if (ticket == NULL) return MEMORY_E;
  18509. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  18510. if (ret != WOLFSSL_SUCCESS) {
  18511. TLSX_SessionTicket_Free(ticket, ssl->heap);
  18512. return ret;
  18513. }
  18514. idSz = 0;
  18515. }
  18516. #endif
  18517. length = VERSION_SZ + RAN_LEN
  18518. + idSz + ENUM_LEN
  18519. + ssl->suites->suiteSz + SUITE_LEN
  18520. + COMP_LEN + ENUM_LEN;
  18521. #ifdef HAVE_TLS_EXTENSIONS
  18522. /* auto populate extensions supported unless user defined */
  18523. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  18524. return ret;
  18525. #ifdef HAVE_QSH
  18526. if (QSH_Init(ssl) != 0)
  18527. return MEMORY_E;
  18528. #endif
  18529. extSz = 0;
  18530. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  18531. if (ret != 0)
  18532. return ret;
  18533. length += extSz;
  18534. #else
  18535. if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
  18536. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  18537. + ssl->suites->hashSigAlgoSz;
  18538. #ifdef HAVE_EXTENDED_MASTER
  18539. if (ssl->options.haveEMS)
  18540. extSz += HELLO_EXT_SZ;
  18541. #endif
  18542. if (extSz != 0)
  18543. length += extSz + HELLO_EXT_SZ_SZ;
  18544. #endif
  18545. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  18546. #ifdef WOLFSSL_DTLS
  18547. if (ssl->options.dtls) {
  18548. length += ENUM_LEN; /* cookie */
  18549. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  18550. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  18551. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  18552. }
  18553. #endif
  18554. if (IsEncryptionOn(ssl, 1))
  18555. sendSz += MAX_MSG_EXTRA;
  18556. /* check for available size */
  18557. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  18558. return ret;
  18559. /* get output buffer */
  18560. output = ssl->buffers.outputBuffer.buffer +
  18561. ssl->buffers.outputBuffer.length;
  18562. AddHeaders(output, length, client_hello, ssl);
  18563. /* client hello, first version */
  18564. output[idx++] = ssl->version.major;
  18565. output[idx++] = ssl->version.minor;
  18566. ssl->chVersion = ssl->version; /* store in case changed */
  18567. /* then random */
  18568. if (ssl->options.connectState == CONNECT_BEGIN) {
  18569. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  18570. if (ret != 0)
  18571. return ret;
  18572. /* store random */
  18573. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  18574. } else {
  18575. #ifdef WOLFSSL_DTLS
  18576. /* send same random on hello again */
  18577. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  18578. #endif
  18579. }
  18580. idx += RAN_LEN;
  18581. /* then session id */
  18582. output[idx++] = (byte)idSz;
  18583. if (idSz) {
  18584. XMEMCPY(output + idx, ssl->session.sessionID,
  18585. ssl->session.sessionIDSz);
  18586. idx += ssl->session.sessionIDSz;
  18587. }
  18588. /* then DTLS cookie */
  18589. #ifdef WOLFSSL_DTLS
  18590. if (ssl->options.dtls) {
  18591. byte cookieSz = ssl->arrays->cookieSz;
  18592. output[idx++] = cookieSz;
  18593. if (cookieSz) {
  18594. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  18595. idx += cookieSz;
  18596. }
  18597. }
  18598. #endif
  18599. /* then cipher suites */
  18600. c16toa(ssl->suites->suiteSz, output + idx);
  18601. idx += OPAQUE16_LEN;
  18602. XMEMCPY(output + idx, &ssl->suites->suites, ssl->suites->suiteSz);
  18603. idx += ssl->suites->suiteSz;
  18604. /* last, compression */
  18605. output[idx++] = COMP_LEN;
  18606. if (ssl->options.usingCompression)
  18607. output[idx++] = ZLIB_COMPRESSION;
  18608. else
  18609. output[idx++] = NO_COMPRESSION;
  18610. #ifdef HAVE_TLS_EXTENSIONS
  18611. extSz = 0;
  18612. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  18613. if (ret != 0)
  18614. return ret;
  18615. idx += extSz;
  18616. (void)idx; /* suppress analyzer warning, keep idx current */
  18617. #else
  18618. if (extSz != 0) {
  18619. c16toa(extSz, output + idx);
  18620. idx += HELLO_EXT_SZ_SZ;
  18621. if (IsAtLeastTLSv1_2(ssl)) {
  18622. if (ssl->suites->hashSigAlgoSz) {
  18623. word16 i;
  18624. /* extension type */
  18625. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  18626. idx += HELLO_EXT_TYPE_SZ;
  18627. /* extension data length */
  18628. c16toa(HELLO_EXT_SIGALGO_SZ + ssl->suites->hashSigAlgoSz,
  18629. output + idx);
  18630. idx += HELLO_EXT_SZ_SZ;
  18631. /* sig algos length */
  18632. c16toa(ssl->suites->hashSigAlgoSz, output + idx);
  18633. idx += HELLO_EXT_SIGALGO_SZ;
  18634. for (i=0; i < ssl->suites->hashSigAlgoSz; i++, idx++) {
  18635. output[idx] = ssl->suites->hashSigAlgo[i];
  18636. }
  18637. }
  18638. }
  18639. #ifdef HAVE_EXTENDED_MASTER
  18640. if (ssl->options.haveEMS) {
  18641. c16toa(HELLO_EXT_EXTMS, output + idx);
  18642. idx += HELLO_EXT_TYPE_SZ;
  18643. c16toa(0, output + idx);
  18644. idx += HELLO_EXT_SZ_SZ;
  18645. }
  18646. #endif
  18647. }
  18648. #endif
  18649. if (IsEncryptionOn(ssl, 1)) {
  18650. byte* input;
  18651. int inputSz = idx; /* build msg adds rec hdr */
  18652. int recordHeaderSz = RECORD_HEADER_SZ;
  18653. if (ssl->options.dtls)
  18654. recordHeaderSz += DTLS_RECORD_EXTRA;
  18655. inputSz -= recordHeaderSz;
  18656. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18657. if (input == NULL)
  18658. return MEMORY_E;
  18659. XMEMCPY(input, output + recordHeaderSz, inputSz);
  18660. #ifdef WOLFSSL_DTLS
  18661. if (IsDtlsNotSctpMode(ssl) &&
  18662. (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
  18663. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18664. return ret;
  18665. }
  18666. #endif
  18667. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  18668. handshake, 1, 0, 0, CUR_ORDER);
  18669. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18670. if (sendSz < 0)
  18671. return sendSz;
  18672. } else {
  18673. #ifdef WOLFSSL_DTLS
  18674. if (IsDtlsNotSctpMode(ssl)) {
  18675. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
  18676. return ret;
  18677. }
  18678. if (ssl->options.dtls)
  18679. DtlsSEQIncrement(ssl, CUR_ORDER);
  18680. #endif
  18681. ret = HashOutput(ssl, output, sendSz, 0);
  18682. if (ret != 0)
  18683. return ret;
  18684. }
  18685. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  18686. #ifdef OPENSSL_EXTRA
  18687. ssl->cbmode = SSL_CB_MODE_WRITE;
  18688. if (ssl->CBIS != NULL)
  18689. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  18690. #endif
  18691. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18692. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  18693. if (ssl->toInfoOn)
  18694. AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  18695. WRITE_PROTO, ssl->heap);
  18696. #endif
  18697. ssl->buffers.outputBuffer.length += sendSz;
  18698. ret = SendBuffered(ssl);
  18699. WOLFSSL_LEAVE("SendClientHello", ret);
  18700. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  18701. return ret;
  18702. }
  18703. /* handle processing of DTLS hello_verify_request (3) */
  18704. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input,
  18705. word32* inOutIdx, word32 size)
  18706. {
  18707. ProtocolVersion pv;
  18708. byte cookieSz;
  18709. word32 begin = *inOutIdx;
  18710. #ifdef WOLFSSL_CALLBACKS
  18711. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  18712. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  18713. #endif
  18714. #ifdef WOLFSSL_DTLS
  18715. if (ssl->options.dtls) {
  18716. DtlsMsgPoolReset(ssl);
  18717. }
  18718. #endif
  18719. if (OPAQUE16_LEN + OPAQUE8_LEN > size)
  18720. return BUFFER_ERROR;
  18721. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  18722. *inOutIdx += OPAQUE16_LEN;
  18723. if (pv.major != DTLS_MAJOR ||
  18724. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  18725. return VERSION_ERROR;
  18726. cookieSz = input[(*inOutIdx)++];
  18727. if (cookieSz) {
  18728. if ((*inOutIdx - begin) + cookieSz > size)
  18729. return BUFFER_ERROR;
  18730. #ifdef WOLFSSL_DTLS
  18731. if (cookieSz <= MAX_COOKIE_LEN) {
  18732. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  18733. ssl->arrays->cookieSz = cookieSz;
  18734. }
  18735. #endif
  18736. *inOutIdx += cookieSz;
  18737. }
  18738. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  18739. return 0;
  18740. }
  18741. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  18742. {
  18743. int ret = 0;
  18744. #ifdef HAVE_SECRET_CALLBACK
  18745. /* If a session secret callback exists, we are using that
  18746. * key instead of the saved session key. */
  18747. ret = ret || (ssl->sessionSecretCb != NULL);
  18748. #endif
  18749. #ifdef HAVE_SESSION_TICKET
  18750. /* server may send blank ticket which may not be expected to indicate
  18751. * existing one ok but will also be sending a new one */
  18752. ret = ret || (ssl->session.ticketLen > 0);
  18753. #endif
  18754. ret = ret ||
  18755. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  18756. ssl->session.sessionID, ID_LEN) == 0);
  18757. return ret;
  18758. }
  18759. /* Check the version in the received message is valid and set protocol
  18760. * version to use.
  18761. *
  18762. * ssl The SSL/TLS object.
  18763. * pv The protocol version from the packet.
  18764. * returns 0 on success, otherwise failure.
  18765. */
  18766. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  18767. {
  18768. #ifdef WOLFSSL_TLS13_DRAFT
  18769. if (pv.major == TLS_DRAFT_MAJOR) {
  18770. pv.major = SSLv3_MAJOR;
  18771. pv.minor = TLSv1_3_MINOR;
  18772. }
  18773. #endif
  18774. #ifdef OPENSSL_EXTRA
  18775. if (ssl->CBIS != NULL) {
  18776. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, SSL_SUCCESS);
  18777. }
  18778. #endif
  18779. if (pv.minor > ssl->version.minor) {
  18780. WOLFSSL_MSG("Server using higher version, fatal error");
  18781. return VERSION_ERROR;
  18782. }
  18783. if (pv.minor < ssl->version.minor) {
  18784. WOLFSSL_MSG("server using lower version");
  18785. /* Check for downgrade attack. */
  18786. if (!ssl->options.downgrade) {
  18787. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  18788. return VERSION_ERROR;
  18789. }
  18790. if (pv.minor < ssl->options.minDowngrade) {
  18791. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  18792. return VERSION_ERROR;
  18793. }
  18794. #ifdef HAVE_SECURE_RENEGOTIATION
  18795. if (ssl->secure_renegotiation &&
  18796. ssl->secure_renegotiation->enabled &&
  18797. ssl->options.handShakeDone) {
  18798. WOLFSSL_MSG("Server changed version during scr");
  18799. return VERSION_ERROR;
  18800. }
  18801. #endif
  18802. /* Checks made - OK to downgrade. */
  18803. if (pv.minor == SSLv3_MINOR) {
  18804. /* turn off tls */
  18805. WOLFSSL_MSG("\tdowngrading to SSLv3");
  18806. ssl->options.tls = 0;
  18807. ssl->options.tls1_1 = 0;
  18808. ssl->version.minor = SSLv3_MINOR;
  18809. }
  18810. else if (pv.minor == TLSv1_MINOR) {
  18811. /* turn off tls 1.1+ */
  18812. WOLFSSL_MSG("\tdowngrading to TLSv1");
  18813. ssl->options.tls1_1 = 0;
  18814. ssl->version.minor = TLSv1_MINOR;
  18815. }
  18816. else if (pv.minor == TLSv1_1_MINOR) {
  18817. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  18818. ssl->version.minor = TLSv1_1_MINOR;
  18819. }
  18820. else if (pv.minor == TLSv1_2_MINOR) {
  18821. WOLFSSL_MSG(" downgrading to TLSv1.2");
  18822. ssl->version.minor = TLSv1_2_MINOR;
  18823. }
  18824. }
  18825. #ifdef OPENSSL_EXTRA
  18826. /* check if option is set to not allow the current version
  18827. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  18828. if (!ssl->options.dtls && ssl->options.downgrade &&
  18829. ssl->options.mask > 0) {
  18830. if (ssl->version.minor == TLSv1_2_MINOR &&
  18831. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  18832. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  18833. ssl->version.minor = TLSv1_1_MINOR;
  18834. }
  18835. if (ssl->version.minor == TLSv1_1_MINOR &&
  18836. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  18837. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  18838. ssl->options.tls1_1 = 0;
  18839. ssl->version.minor = TLSv1_MINOR;
  18840. }
  18841. if (ssl->version.minor == TLSv1_MINOR &&
  18842. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  18843. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  18844. ssl->options.tls = 0;
  18845. ssl->options.tls1_1 = 0;
  18846. ssl->version.minor = SSLv3_MINOR;
  18847. }
  18848. if (ssl->version.minor == SSLv3_MINOR &&
  18849. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  18850. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  18851. return VERSION_ERROR;
  18852. }
  18853. if (ssl->version.minor < ssl->options.minDowngrade) {
  18854. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  18855. return VERSION_ERROR;
  18856. }
  18857. }
  18858. #endif
  18859. return 0;
  18860. }
  18861. /* handle processing of server_hello (2) */
  18862. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  18863. word32 helloSz)
  18864. {
  18865. byte cs0; /* cipher suite bytes 0, 1 */
  18866. byte cs1;
  18867. ProtocolVersion pv;
  18868. byte compression;
  18869. word32 i = *inOutIdx;
  18870. word32 begin = i;
  18871. int ret;
  18872. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  18873. WOLFSSL_ENTER("DoServerHello");
  18874. #ifdef WOLFSSL_CALLBACKS
  18875. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  18876. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  18877. #endif
  18878. /* protocol version, random and session id length check */
  18879. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  18880. return BUFFER_ERROR;
  18881. /* protocol version */
  18882. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  18883. i += OPAQUE16_LEN;
  18884. ret = CheckVersion(ssl, pv);
  18885. if (ret != 0)
  18886. return ret;
  18887. #ifdef WOLFSSL_TLS13
  18888. if (IsAtLeastTLSv1_3(pv)) {
  18889. byte type = server_hello;
  18890. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  18891. }
  18892. #endif
  18893. /* random */
  18894. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  18895. i += RAN_LEN;
  18896. /* session id */
  18897. ssl->arrays->sessionIDSz = input[i++];
  18898. if (ssl->arrays->sessionIDSz > ID_LEN) {
  18899. WOLFSSL_MSG("Invalid session ID size");
  18900. ssl->arrays->sessionIDSz = 0;
  18901. return BUFFER_ERROR;
  18902. }
  18903. else if (ssl->arrays->sessionIDSz) {
  18904. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  18905. return BUFFER_ERROR;
  18906. XMEMCPY(ssl->arrays->sessionID, input + i,
  18907. ssl->arrays->sessionIDSz);
  18908. i += ssl->arrays->sessionIDSz;
  18909. ssl->options.haveSessionId = 1;
  18910. }
  18911. /* suite and compression */
  18912. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  18913. return BUFFER_ERROR;
  18914. cs0 = input[i++];
  18915. cs1 = input[i++];
  18916. #ifdef HAVE_SECURE_RENEGOTIATION
  18917. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  18918. ssl->options.handShakeDone) {
  18919. if (ssl->options.cipherSuite0 != cs0 ||
  18920. ssl->options.cipherSuite != cs1) {
  18921. WOLFSSL_MSG("Server changed cipher suite during scr");
  18922. return MATCH_SUITE_ERROR;
  18923. }
  18924. }
  18925. #endif
  18926. ssl->options.cipherSuite0 = cs0;
  18927. ssl->options.cipherSuite = cs1;
  18928. compression = input[i++];
  18929. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  18930. {
  18931. word32 idx, found = 0;
  18932. /* confirm server_hello cipher suite is one sent in client_hello */
  18933. for (idx = 0; idx < ssl->suites->suiteSz; idx += 2) {
  18934. if (ssl->suites->suites[idx] == cs0 &&
  18935. ssl->suites->suites[idx+1] == cs1) {
  18936. found = 1;
  18937. break;
  18938. }
  18939. }
  18940. if (!found) {
  18941. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  18942. return MATCH_SUITE_ERROR;
  18943. }
  18944. }
  18945. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  18946. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  18947. WOLFSSL_MSG("Server forcing compression w/o support");
  18948. return COMPRESSION_ERROR;
  18949. }
  18950. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  18951. WOLFSSL_MSG("Server refused compression, turning off");
  18952. ssl->options.usingCompression = 0; /* turn off if server refused */
  18953. }
  18954. *inOutIdx = i;
  18955. #ifdef HAVE_TLS_EXTENSIONS
  18956. if ( (i - begin) < helloSz) {
  18957. if (TLSX_SupportExtensions(ssl)) {
  18958. word16 totalExtSz;
  18959. if ((i - begin) + OPAQUE16_LEN > helloSz)
  18960. return BUFFER_ERROR;
  18961. ato16(&input[i], &totalExtSz);
  18962. i += OPAQUE16_LEN;
  18963. if ((i - begin) + totalExtSz > helloSz)
  18964. return BUFFER_ERROR;
  18965. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  18966. server_hello, NULL)))
  18967. return ret;
  18968. i += totalExtSz;
  18969. *inOutIdx = i;
  18970. }
  18971. else
  18972. *inOutIdx = begin + helloSz; /* skip extensions */
  18973. }
  18974. else
  18975. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  18976. #else
  18977. {
  18978. int allowExt = 0;
  18979. byte pendingEMS = 0;
  18980. if ( (i - begin) < helloSz) {
  18981. if (ssl->version.major == SSLv3_MAJOR &&
  18982. ssl->version.minor >= TLSv1_MINOR) {
  18983. allowExt = 1;
  18984. }
  18985. #ifdef WOLFSSL_DTLS
  18986. if (ssl->version.major == DTLS_MAJOR)
  18987. allowExt = 1;
  18988. #endif
  18989. if (allowExt) {
  18990. word16 totalExtSz;
  18991. if ((i - begin) + OPAQUE16_LEN > helloSz)
  18992. return BUFFER_ERROR;
  18993. ato16(&input[i], &totalExtSz);
  18994. i += OPAQUE16_LEN;
  18995. if ((i - begin) + totalExtSz > helloSz)
  18996. return BUFFER_ERROR;
  18997. while (totalExtSz) {
  18998. word16 extId, extSz;
  18999. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  19000. return BUFFER_ERROR;
  19001. ato16(&input[i], &extId);
  19002. i += OPAQUE16_LEN;
  19003. ato16(&input[i], &extSz);
  19004. i += OPAQUE16_LEN;
  19005. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  19006. return BUFFER_ERROR;
  19007. if (extId == HELLO_EXT_EXTMS)
  19008. pendingEMS = 1;
  19009. else
  19010. i += extSz;
  19011. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  19012. }
  19013. *inOutIdx = i;
  19014. }
  19015. else
  19016. *inOutIdx = begin + helloSz; /* skip extensions */
  19017. }
  19018. if (!pendingEMS && ssl->options.haveEMS)
  19019. ssl->options.haveEMS = 0;
  19020. }
  19021. #endif
  19022. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  19023. if (IsEncryptionOn(ssl, 0)) {
  19024. *inOutIdx += ssl->keys.padSz;
  19025. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19026. if (ssl->options.startedETMWrite &&
  19027. ssl->specs.cipher_type == block) {
  19028. *inOutIdx += MacSize(ssl);
  19029. }
  19030. #endif
  19031. }
  19032. #ifdef HAVE_SECRET_CALLBACK
  19033. if (ssl->sessionSecretCb != NULL) {
  19034. int secretSz = SECRET_LEN;
  19035. ret = ssl->sessionSecretCb(ssl, ssl->session.masterSecret,
  19036. &secretSz, ssl->sessionSecretCtx);
  19037. if (ret != 0 || secretSz != SECRET_LEN)
  19038. return SESSION_SECRET_CB_E;
  19039. }
  19040. #endif /* HAVE_SECRET_CALLBACK */
  19041. ret = CompleteServerHello(ssl);
  19042. WOLFSSL_LEAVE("DoServerHello", ret);
  19043. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  19044. return ret;
  19045. }
  19046. int CompleteServerHello(WOLFSSL* ssl)
  19047. {
  19048. int ret;
  19049. if (!ssl->options.resuming) {
  19050. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  19051. TLS13_DOWNGRADE_SZ - 1;
  19052. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  19053. #ifdef WOLFSSL_TLS13
  19054. if (TLSv1_3_Capable(ssl)) {
  19055. /* TLS v1.3 capable client not allowed to downgrade when
  19056. * connecting to TLS v1.3 capable server unless cipher suite
  19057. * demands it.
  19058. */
  19059. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  19060. (vers == 0 || vers == 1)) {
  19061. SendAlert(ssl, alert_fatal, illegal_parameter);
  19062. return VERSION_ERROR;
  19063. }
  19064. }
  19065. else
  19066. #endif
  19067. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  19068. ssl->ctx->method->version.minor == TLSv1_2_MINOR
  19069. #ifdef OPENSSL_EXTRA
  19070. && (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0
  19071. #endif
  19072. ) {
  19073. /* TLS v1.2 capable client not allowed to downgrade when
  19074. * connecting to TLS v1.2 capable server.
  19075. */
  19076. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  19077. vers == 0) {
  19078. SendAlert(ssl, alert_fatal, illegal_parameter);
  19079. return VERSION_ERROR;
  19080. }
  19081. }
  19082. }
  19083. else {
  19084. if (DSH_CheckSessionId(ssl)) {
  19085. if (SetCipherSpecs(ssl) == 0) {
  19086. XMEMCPY(ssl->arrays->masterSecret,
  19087. ssl->session.masterSecret, SECRET_LEN);
  19088. #ifdef NO_OLD_TLS
  19089. ret = DeriveTlsKeys(ssl);
  19090. #else
  19091. ret = -1; /* default value */
  19092. #ifndef NO_TLS
  19093. if (ssl->options.tls)
  19094. ret = DeriveTlsKeys(ssl);
  19095. #endif
  19096. if (!ssl->options.tls)
  19097. ret = DeriveKeys(ssl);
  19098. #endif /* NO_OLD_TLS */
  19099. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  19100. return ret;
  19101. }
  19102. else {
  19103. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  19104. return UNSUPPORTED_SUITE;
  19105. }
  19106. }
  19107. else {
  19108. WOLFSSL_MSG("Server denied resumption attempt");
  19109. ssl->options.resuming = 0; /* server denied resumption try */
  19110. }
  19111. }
  19112. return SetCipherSpecs(ssl);
  19113. }
  19114. #endif /* !WOLFSSL_NO_TLS12 */
  19115. /* Make sure client setup is valid for this suite, true on success */
  19116. int VerifyClientSuite(WOLFSSL* ssl)
  19117. {
  19118. int havePSK = 0;
  19119. byte first = ssl->options.cipherSuite0;
  19120. byte second = ssl->options.cipherSuite;
  19121. WOLFSSL_ENTER("VerifyClientSuite");
  19122. #ifndef NO_PSK
  19123. havePSK = ssl->options.havePSK;
  19124. #endif
  19125. if (CipherRequires(first, second, REQUIRES_PSK)) {
  19126. WOLFSSL_MSG("Requires PSK");
  19127. if (havePSK == 0) {
  19128. WOLFSSL_MSG("Don't have PSK");
  19129. return 0;
  19130. }
  19131. }
  19132. return 1; /* success */
  19133. }
  19134. #ifndef WOLFSSL_NO_TLS12
  19135. #ifndef NO_CERTS
  19136. /* handle processing of certificate_request (13) */
  19137. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  19138. inOutIdx, word32 size)
  19139. {
  19140. word16 len;
  19141. word32 begin = *inOutIdx;
  19142. #ifdef OPENSSL_EXTRA
  19143. int ret;
  19144. WOLFSSL_X509* x509 = NULL;
  19145. WOLFSSL_EVP_PKEY* pkey = NULL;
  19146. #endif
  19147. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  19148. WOLFSSL_ENTER("DoCertificateRequest");
  19149. #ifdef WOLFSSL_CALLBACKS
  19150. if (ssl->hsInfoOn)
  19151. AddPacketName(ssl, "CertificateRequest");
  19152. if (ssl->toInfoOn)
  19153. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  19154. #endif
  19155. if (OPAQUE8_LEN > size)
  19156. return BUFFER_ERROR;
  19157. len = input[(*inOutIdx)++];
  19158. if ((*inOutIdx - begin) + len > size)
  19159. return BUFFER_ERROR;
  19160. /* types, read in here */
  19161. *inOutIdx += len;
  19162. /* signature and hash signature algorithm */
  19163. if (IsAtLeastTLSv1_2(ssl)) {
  19164. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  19165. return BUFFER_ERROR;
  19166. ato16(input + *inOutIdx, &len);
  19167. *inOutIdx += OPAQUE16_LEN;
  19168. if ((len > size) || ((*inOutIdx - begin) + len > size))
  19169. return BUFFER_ERROR;
  19170. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  19171. ssl->buffers.certificate &&
  19172. ssl->buffers.certificate->buffer) {
  19173. #ifdef HAVE_PK_CALLBACKS
  19174. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  19175. WOLFSSL_MSG("Using PK for client private key");
  19176. return INVALID_PARAMETER;
  19177. }
  19178. #endif
  19179. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  19180. return INVALID_PARAMETER;
  19181. }
  19182. }
  19183. *inOutIdx += len;
  19184. #ifdef WC_RSA_PSS
  19185. ssl->pssAlgo = 0;
  19186. if (ssl->suites->sigAlgo == rsa_pss_sa_algo)
  19187. ssl->pssAlgo |= 1 << ssl->suites->hashAlgo;
  19188. #endif
  19189. }
  19190. /* authorities */
  19191. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  19192. return BUFFER_ERROR;
  19193. ato16(input + *inOutIdx, &len);
  19194. *inOutIdx += OPAQUE16_LEN;
  19195. if ((*inOutIdx - begin) + len > size)
  19196. return BUFFER_ERROR;
  19197. while (len) {
  19198. word16 dnSz;
  19199. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  19200. return BUFFER_ERROR;
  19201. ato16(input + *inOutIdx, &dnSz);
  19202. *inOutIdx += OPAQUE16_LEN;
  19203. if ((*inOutIdx - begin) + dnSz > size)
  19204. return BUFFER_ERROR;
  19205. *inOutIdx += dnSz;
  19206. len -= OPAQUE16_LEN + dnSz;
  19207. }
  19208. #ifdef OPENSSL_EXTRA
  19209. /* call client cert callback if no cert has been loaded */
  19210. if ((ssl->ctx->CBClientCert != NULL) &&
  19211. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  19212. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  19213. if (ret == 1) {
  19214. if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
  19215. (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
  19216. return CLIENT_CERT_CB_ERROR;
  19217. }
  19218. wolfSSL_X509_free(x509);
  19219. wolfSSL_EVP_PKEY_free(pkey);
  19220. } else if (ret < 0) {
  19221. return WOLFSSL_ERROR_WANT_X509_LOOKUP;
  19222. }
  19223. }
  19224. #endif
  19225. /* don't send client cert or cert verify if user hasn't provided
  19226. cert and private key */
  19227. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  19228. #ifdef HAVE_PK_CALLBACKS
  19229. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  19230. WOLFSSL_MSG("Using PK for client private key");
  19231. ssl->options.sendVerify = SEND_CERT;
  19232. }
  19233. #endif
  19234. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  19235. ssl->options.sendVerify = SEND_CERT;
  19236. }
  19237. }
  19238. #ifdef OPENSSL_EXTRA
  19239. else
  19240. #else
  19241. else if (IsTLS(ssl))
  19242. #endif
  19243. {
  19244. ssl->options.sendVerify = SEND_BLANK_CERT;
  19245. }
  19246. if (IsEncryptionOn(ssl, 0)) {
  19247. *inOutIdx += ssl->keys.padSz;
  19248. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19249. if (ssl->options.startedETMRead)
  19250. *inOutIdx += MacSize(ssl);
  19251. #endif
  19252. }
  19253. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  19254. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  19255. return 0;
  19256. }
  19257. #endif /* !NO_CERTS */
  19258. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  19259. static int CheckCurveId(int tlsCurveId)
  19260. {
  19261. int ret = ECC_CURVE_ERROR;
  19262. switch (tlsCurveId) {
  19263. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  19264. #ifndef NO_ECC_SECP
  19265. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  19266. #endif /* !NO_ECC_SECP */
  19267. #ifdef HAVE_ECC_SECPR2
  19268. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  19269. #endif /* HAVE_ECC_SECPR2 */
  19270. #ifdef HAVE_ECC_KOBLITZ
  19271. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  19272. #endif /* HAVE_ECC_KOBLITZ */
  19273. #endif
  19274. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  19275. #ifndef NO_ECC_SECP
  19276. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  19277. #endif /* !NO_ECC_SECP */
  19278. #ifdef HAVE_ECC_KOBLITZ
  19279. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  19280. #endif /* HAVE_ECC_KOBLITZ */
  19281. #endif
  19282. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  19283. #ifndef NO_ECC_SECP
  19284. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  19285. #endif /* !NO_ECC_SECP */
  19286. #ifdef HAVE_ECC_KOBLITZ
  19287. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  19288. #endif /* HAVE_ECC_KOBLITZ */
  19289. #endif
  19290. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  19291. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  19292. #endif
  19293. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  19294. #ifndef NO_ECC_SECP
  19295. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  19296. #endif /* !NO_ECC_SECP */
  19297. #ifdef HAVE_ECC_KOBLITZ
  19298. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  19299. #endif /* HAVE_ECC_KOBLITZ */
  19300. #ifdef HAVE_ECC_BRAINPOOL
  19301. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  19302. #endif /* HAVE_ECC_BRAINPOOL */
  19303. #endif
  19304. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  19305. case WOLFSSL_ECC_X448: return ECC_X448_OID;
  19306. #endif
  19307. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  19308. #ifndef NO_ECC_SECP
  19309. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  19310. #endif /* !NO_ECC_SECP */
  19311. #ifdef HAVE_ECC_BRAINPOOL
  19312. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  19313. #endif /* HAVE_ECC_BRAINPOOL */
  19314. #endif
  19315. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  19316. #ifdef HAVE_ECC_BRAINPOOL
  19317. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  19318. #endif /* HAVE_ECC_BRAINPOOL */
  19319. #endif
  19320. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  19321. #ifndef NO_ECC_SECP
  19322. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  19323. #endif /* !NO_ECC_SECP */
  19324. #endif
  19325. default: break;
  19326. }
  19327. return ret;
  19328. }
  19329. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  19330. /* Persistable DoServerKeyExchange arguments */
  19331. typedef struct DskeArgs {
  19332. byte* output; /* not allocated */
  19333. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  19334. defined(HAVE_CURVE448)
  19335. byte* verifySig;
  19336. #endif
  19337. word32 idx;
  19338. word32 begin;
  19339. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  19340. defined(HAVE_CURVE448)
  19341. word16 verifySigSz;
  19342. #endif
  19343. word16 sigSz;
  19344. byte sigAlgo;
  19345. byte hashAlgo;
  19346. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  19347. int bits;
  19348. #endif
  19349. } DskeArgs;
  19350. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  19351. {
  19352. DskeArgs* args = (DskeArgs*)pArgs;
  19353. (void)ssl;
  19354. (void)args;
  19355. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  19356. defined(HAVE_CURVE448)
  19357. if (args->verifySig) {
  19358. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  19359. args->verifySig = NULL;
  19360. }
  19361. #endif
  19362. }
  19363. #ifndef NO_DH
  19364. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  19365. DskeArgs* args)
  19366. {
  19367. int ret = 0;
  19368. word16 length;
  19369. #ifdef HAVE_FFDHE
  19370. const DhParams* params = NULL;
  19371. word16 group = 0;
  19372. #endif
  19373. if (ssl->buffers.weOwnDH) {
  19374. if (ssl->buffers.serverDH_P.buffer) {
  19375. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  19376. DYNAMIC_TYPE_PUBLIC_KEY);
  19377. ssl->buffers.serverDH_P.buffer = NULL;
  19378. }
  19379. if (ssl->buffers.serverDH_G.buffer) {
  19380. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  19381. DYNAMIC_TYPE_PUBLIC_KEY);
  19382. ssl->buffers.serverDH_G.buffer = NULL;
  19383. }
  19384. }
  19385. if (ssl->buffers.serverDH_Pub.buffer) {
  19386. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
  19387. DYNAMIC_TYPE_PUBLIC_KEY);
  19388. ssl->buffers.serverDH_Pub.buffer = NULL;
  19389. }
  19390. /* p */
  19391. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  19392. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  19393. }
  19394. ato16(input + args->idx, &length);
  19395. args->idx += OPAQUE16_LEN;
  19396. if ((args->idx - args->begin) + length > size) {
  19397. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  19398. }
  19399. if (length < ssl->options.minDhKeySz) {
  19400. WOLFSSL_MSG("Server using a DH key that is too small");
  19401. SendAlert(ssl, alert_fatal, handshake_failure);
  19402. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  19403. }
  19404. if (length > ssl->options.maxDhKeySz) {
  19405. WOLFSSL_MSG("Server using a DH key that is too big");
  19406. SendAlert(ssl, alert_fatal, handshake_failure);
  19407. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  19408. }
  19409. ssl->buffers.serverDH_P.buffer =
  19410. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  19411. if (ssl->buffers.serverDH_P.buffer) {
  19412. ssl->buffers.serverDH_P.length = length;
  19413. }
  19414. else {
  19415. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  19416. }
  19417. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  19418. length);
  19419. args->idx += length;
  19420. ssl->options.dhKeySz = length;
  19421. /* g */
  19422. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  19423. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  19424. DYNAMIC_TYPE_PUBLIC_KEY);
  19425. ssl->buffers.serverDH_P.buffer = NULL;
  19426. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  19427. }
  19428. ato16(input + args->idx, &length);
  19429. args->idx += OPAQUE16_LEN;
  19430. if ((args->idx - args->begin) + length > size) {
  19431. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  19432. DYNAMIC_TYPE_PUBLIC_KEY);
  19433. ssl->buffers.serverDH_P.buffer = NULL;
  19434. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  19435. }
  19436. if (length > ssl->options.maxDhKeySz) {
  19437. WOLFSSL_MSG("Server using a DH key generator that is too big");
  19438. SendAlert(ssl, alert_fatal, handshake_failure);
  19439. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  19440. DYNAMIC_TYPE_PUBLIC_KEY);
  19441. ssl->buffers.serverDH_P.buffer = NULL;
  19442. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  19443. }
  19444. ssl->buffers.serverDH_G.buffer =
  19445. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  19446. if (ssl->buffers.serverDH_G.buffer) {
  19447. ssl->buffers.serverDH_G.length = length;
  19448. }
  19449. else {
  19450. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  19451. DYNAMIC_TYPE_PUBLIC_KEY);
  19452. ssl->buffers.serverDH_P.buffer = NULL;
  19453. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  19454. }
  19455. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  19456. length);
  19457. args->idx += length;
  19458. /* pub */
  19459. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  19460. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  19461. DYNAMIC_TYPE_PUBLIC_KEY);
  19462. ssl->buffers.serverDH_P.buffer = NULL;
  19463. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  19464. DYNAMIC_TYPE_PUBLIC_KEY);
  19465. ssl->buffers.serverDH_G.buffer = NULL;
  19466. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  19467. }
  19468. ato16(input + args->idx, &length);
  19469. args->idx += OPAQUE16_LEN;
  19470. if ((args->idx - args->begin) + length > size) {
  19471. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  19472. DYNAMIC_TYPE_PUBLIC_KEY);
  19473. ssl->buffers.serverDH_P.buffer = NULL;
  19474. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  19475. DYNAMIC_TYPE_PUBLIC_KEY);
  19476. ssl->buffers.serverDH_G.buffer = NULL;
  19477. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  19478. }
  19479. if (length > ssl->options.maxDhKeySz) {
  19480. WOLFSSL_MSG("Server using a public DH key that is too big");
  19481. SendAlert(ssl, alert_fatal, handshake_failure);
  19482. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  19483. DYNAMIC_TYPE_PUBLIC_KEY);
  19484. ssl->buffers.serverDH_P.buffer = NULL;
  19485. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  19486. DYNAMIC_TYPE_PUBLIC_KEY);
  19487. ssl->buffers.serverDH_G.buffer = NULL;
  19488. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  19489. }
  19490. ssl->buffers.serverDH_Pub.buffer =
  19491. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  19492. if (ssl->buffers.serverDH_Pub.buffer) {
  19493. ssl->buffers.serverDH_Pub.length = length;
  19494. }
  19495. else {
  19496. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  19497. DYNAMIC_TYPE_PUBLIC_KEY);
  19498. ssl->buffers.serverDH_P.buffer = NULL;
  19499. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  19500. DYNAMIC_TYPE_PUBLIC_KEY);
  19501. ssl->buffers.serverDH_G.buffer = NULL;
  19502. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  19503. }
  19504. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  19505. length);
  19506. ssl->buffers.weOwnDH = 1;
  19507. args->idx += length;
  19508. #ifdef HAVE_FFDHE
  19509. switch (ssl->options.dhKeySz) {
  19510. #ifdef HAVE_FFDHE_2048
  19511. case 2048/8:
  19512. params = wc_Dh_ffdhe2048_Get();
  19513. group = WOLFSSL_FFDHE_2048;
  19514. break;
  19515. #endif
  19516. #ifdef HAVE_FFDHE_3072
  19517. case 3072/8:
  19518. params = wc_Dh_ffdhe3072_Get();
  19519. group = WOLFSSL_FFDHE_3072;
  19520. break;
  19521. #endif
  19522. #ifdef HAVE_FFDHE_4096
  19523. case 4096/8:
  19524. params = wc_Dh_ffdhe4096_Get();
  19525. group = WOLFSSL_FFDHE_4096;
  19526. break;
  19527. #endif
  19528. #ifdef HAVE_FFDHE_6144
  19529. case 6144/8:
  19530. params = wc_Dh_ffdhe6144_Get();
  19531. group = WOLFSSL_FFDHE_6144;
  19532. break;
  19533. #endif
  19534. #ifdef HAVE_FFDHE_8192
  19535. case 8192/8:
  19536. params = wc_Dh_ffdhe8192_Get();
  19537. group = WOLFSSL_FFDHE_8192;
  19538. break;
  19539. #endif
  19540. default:
  19541. break;
  19542. }
  19543. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  19544. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  19545. params->g_len) != 0) ||
  19546. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  19547. params->p_len) != 0)) {
  19548. WOLFSSL_MSG("Server not using FFDHE parameters");
  19549. #ifdef WOLFSSL_REQUIRE_FFDHE
  19550. SendAlert(ssl, alert_fatal, handshake_failure);
  19551. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  19552. #endif
  19553. }
  19554. else {
  19555. ssl->namedGroup = group;
  19556. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  19557. !defined(HAVE_SELFTEST)
  19558. ssl->options.dhDoKeyTest = 0;
  19559. #endif
  19560. }
  19561. #endif /* HAVE_FFDHE */
  19562. exit_gdpk:
  19563. return ret;
  19564. }
  19565. #endif
  19566. /* handle processing of server_key_exchange (12) */
  19567. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  19568. word32* inOutIdx, word32 size)
  19569. {
  19570. int ret = 0;
  19571. #ifdef WOLFSSL_ASYNC_CRYPT
  19572. DskeArgs* args = (DskeArgs*)ssl->async.args;
  19573. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  19574. (void)sizeof(args_test);
  19575. #else
  19576. DskeArgs args[1];
  19577. #endif
  19578. (void)input;
  19579. (void)size;
  19580. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  19581. WOLFSSL_ENTER("DoServerKeyExchange");
  19582. #ifdef WOLFSSL_ASYNC_CRYPT
  19583. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  19584. if (ret != WC_NOT_PENDING_E) {
  19585. /* Check for error */
  19586. if (ret < 0)
  19587. goto exit_dske;
  19588. }
  19589. else
  19590. #endif
  19591. {
  19592. /* Reset state */
  19593. ret = 0;
  19594. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  19595. XMEMSET(args, 0, sizeof(DskeArgs));
  19596. args->idx = *inOutIdx;
  19597. args->begin = *inOutIdx;
  19598. args->sigAlgo = ssl->specs.sig_algo;
  19599. args->hashAlgo = sha_mac;
  19600. #ifdef WOLFSSL_ASYNC_CRYPT
  19601. ssl->async.freeArgs = FreeDskeArgs;
  19602. #endif
  19603. }
  19604. switch(ssl->options.asyncState)
  19605. {
  19606. case TLS_ASYNC_BEGIN:
  19607. {
  19608. #ifdef WOLFSSL_CALLBACKS
  19609. if (ssl->hsInfoOn)
  19610. AddPacketName(ssl, "ServerKeyExchange");
  19611. if (ssl->toInfoOn)
  19612. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  19613. #endif
  19614. switch(ssl->specs.kea)
  19615. {
  19616. #ifndef NO_PSK
  19617. case psk_kea:
  19618. {
  19619. int srvHintLen;
  19620. word16 length;
  19621. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  19622. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19623. }
  19624. ato16(input + args->idx, &length);
  19625. args->idx += OPAQUE16_LEN;
  19626. if ((args->idx - args->begin) + length > size) {
  19627. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19628. }
  19629. /* get PSK server hint from the wire */
  19630. srvHintLen = min(length, MAX_PSK_ID_LEN);
  19631. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  19632. srvHintLen);
  19633. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  19634. args->idx += length;
  19635. break;
  19636. }
  19637. #endif /* !NO_PSK */
  19638. #ifndef NO_DH
  19639. case diffie_hellman_kea:
  19640. {
  19641. ret = GetDhPublicKey(ssl, input, size, args);
  19642. if (ret != 0)
  19643. goto exit_dske;
  19644. break;
  19645. }
  19646. #endif /* !NO_DH */
  19647. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  19648. defined(HAVE_CURVE448)
  19649. case ecc_diffie_hellman_kea:
  19650. {
  19651. byte b;
  19652. #ifdef HAVE_ECC
  19653. int curveId;
  19654. #endif
  19655. int curveOid;
  19656. word16 length;
  19657. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  19658. OPAQUE8_LEN > size) {
  19659. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19660. }
  19661. b = input[args->idx++];
  19662. if (b != named_curve) {
  19663. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  19664. }
  19665. args->idx += 1; /* curve type, eat leading 0 */
  19666. b = input[args->idx++];
  19667. if ((curveOid = CheckCurveId(b)) < 0) {
  19668. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  19669. }
  19670. ssl->ecdhCurveOID = curveOid;
  19671. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  19672. ssl->namedGroup = 0;
  19673. #endif
  19674. length = input[args->idx++];
  19675. if ((args->idx - args->begin) + length > size) {
  19676. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19677. }
  19678. #ifdef HAVE_CURVE25519
  19679. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  19680. if (ssl->peerX25519Key == NULL) {
  19681. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  19682. (void**)&ssl->peerX25519Key);
  19683. if (ret != 0) {
  19684. goto exit_dske;
  19685. }
  19686. } else if (ssl->peerX25519KeyPresent) {
  19687. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  19688. ssl->peerX25519Key);
  19689. ssl->peerX25519KeyPresent = 0;
  19690. if (ret != 0) {
  19691. goto exit_dske;
  19692. }
  19693. }
  19694. if ((ret = wc_curve25519_check_public(
  19695. input + args->idx, length,
  19696. EC25519_LITTLE_ENDIAN)) != 0) {
  19697. #ifdef WOLFSSL_EXTRA_ALERTS
  19698. if (ret == BUFFER_E)
  19699. SendAlert(ssl, alert_fatal, decode_error);
  19700. else if (ret == ECC_OUT_OF_RANGE_E)
  19701. SendAlert(ssl, alert_fatal, bad_record_mac);
  19702. else {
  19703. SendAlert(ssl, alert_fatal, illegal_parameter);
  19704. }
  19705. #endif
  19706. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19707. }
  19708. if (wc_curve25519_import_public_ex(input + args->idx,
  19709. length, ssl->peerX25519Key,
  19710. EC25519_LITTLE_ENDIAN) != 0) {
  19711. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19712. }
  19713. args->idx += length;
  19714. ssl->peerX25519KeyPresent = 1;
  19715. break;
  19716. }
  19717. #endif
  19718. #ifdef HAVE_CURVE448
  19719. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  19720. if (ssl->peerX448Key == NULL) {
  19721. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  19722. (void**)&ssl->peerX448Key);
  19723. if (ret != 0) {
  19724. goto exit_dske;
  19725. }
  19726. } else if (ssl->peerX448KeyPresent) {
  19727. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  19728. ssl->peerX448Key);
  19729. ssl->peerX448KeyPresent = 0;
  19730. if (ret != 0) {
  19731. goto exit_dske;
  19732. }
  19733. }
  19734. if ((ret = wc_curve448_check_public(
  19735. input + args->idx, length,
  19736. EC448_LITTLE_ENDIAN)) != 0) {
  19737. #ifdef WOLFSSL_EXTRA_ALERTS
  19738. if (ret == BUFFER_E)
  19739. SendAlert(ssl, alert_fatal, decode_error);
  19740. else if (ret == ECC_OUT_OF_RANGE_E)
  19741. SendAlert(ssl, alert_fatal, bad_record_mac);
  19742. else {
  19743. SendAlert(ssl, alert_fatal, illegal_parameter);
  19744. }
  19745. #endif
  19746. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19747. }
  19748. if (wc_curve448_import_public_ex(input + args->idx,
  19749. length, ssl->peerX448Key,
  19750. EC448_LITTLE_ENDIAN) != 0) {
  19751. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19752. }
  19753. args->idx += length;
  19754. ssl->peerX448KeyPresent = 1;
  19755. break;
  19756. }
  19757. #endif
  19758. #ifdef HAVE_ECC
  19759. if (ssl->peerEccKey == NULL) {
  19760. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  19761. (void**)&ssl->peerEccKey);
  19762. if (ret != 0) {
  19763. goto exit_dske;
  19764. }
  19765. } else if (ssl->peerEccKeyPresent) {
  19766. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  19767. ssl->peerEccKeyPresent = 0;
  19768. if (ret != 0) {
  19769. goto exit_dske;
  19770. }
  19771. }
  19772. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  19773. if (wc_ecc_import_x963_ex(input + args->idx, length,
  19774. ssl->peerEccKey, curveId) != 0) {
  19775. #ifdef WOLFSSL_EXTRA_ALERTS
  19776. SendAlert(ssl, alert_fatal, illegal_parameter);
  19777. #endif
  19778. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19779. }
  19780. args->idx += length;
  19781. ssl->peerEccKeyPresent = 1;
  19782. #endif
  19783. break;
  19784. }
  19785. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  19786. #if !defined(NO_DH) && !defined(NO_PSK)
  19787. case dhe_psk_kea:
  19788. {
  19789. int srvHintLen;
  19790. word16 length;
  19791. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  19792. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19793. }
  19794. ato16(input + args->idx, &length);
  19795. args->idx += OPAQUE16_LEN;
  19796. if ((args->idx - args->begin) + length > size) {
  19797. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19798. }
  19799. /* get PSK server hint from the wire */
  19800. srvHintLen = min(length, MAX_PSK_ID_LEN);
  19801. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  19802. srvHintLen);
  19803. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  19804. args->idx += length;
  19805. ret = GetDhPublicKey(ssl, input, size, args);
  19806. if (ret != 0)
  19807. goto exit_dske;
  19808. break;
  19809. }
  19810. #endif /* !NO_DH && !NO_PSK */
  19811. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  19812. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  19813. case ecdhe_psk_kea:
  19814. {
  19815. byte b;
  19816. int curveOid, curveId;
  19817. int srvHintLen;
  19818. word16 length;
  19819. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  19820. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19821. }
  19822. ato16(input + args->idx, &length);
  19823. args->idx += OPAQUE16_LEN;
  19824. if ((args->idx - args->begin) + length > size) {
  19825. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19826. }
  19827. /* get PSK server hint from the wire */
  19828. srvHintLen = min(length, MAX_PSK_ID_LEN);
  19829. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  19830. srvHintLen);
  19831. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  19832. args->idx += length;
  19833. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  19834. OPAQUE8_LEN > size) {
  19835. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19836. }
  19837. /* Check curve name and ID */
  19838. b = input[args->idx++];
  19839. if (b != named_curve) {
  19840. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  19841. }
  19842. args->idx += 1; /* curve type, eat leading 0 */
  19843. b = input[args->idx++];
  19844. if ((curveOid = CheckCurveId(b)) < 0) {
  19845. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  19846. }
  19847. length = input[args->idx++];
  19848. if ((args->idx - args->begin) + length > size) {
  19849. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19850. }
  19851. #ifdef HAVE_CURVE25519
  19852. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  19853. if (ssl->peerX25519Key == NULL) {
  19854. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  19855. (void**)&ssl->peerX25519Key);
  19856. if (ret != 0) {
  19857. goto exit_dske;
  19858. }
  19859. } else if (ssl->peerEccKeyPresent) {
  19860. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  19861. ssl->peerX25519Key);
  19862. ssl->peerX25519KeyPresent = 0;
  19863. if (ret != 0) {
  19864. goto exit_dske;
  19865. }
  19866. }
  19867. if ((ret = wc_curve25519_check_public(
  19868. input + args->idx, length,
  19869. EC25519_LITTLE_ENDIAN)) != 0) {
  19870. #ifdef WOLFSSL_EXTRA_ALERTS
  19871. if (ret == BUFFER_E)
  19872. SendAlert(ssl, alert_fatal, decode_error);
  19873. else if (ret == ECC_OUT_OF_RANGE_E)
  19874. SendAlert(ssl, alert_fatal, bad_record_mac);
  19875. else {
  19876. SendAlert(ssl, alert_fatal, illegal_parameter);
  19877. }
  19878. #endif
  19879. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19880. }
  19881. if (wc_curve25519_import_public_ex(input + args->idx,
  19882. length, ssl->peerX25519Key,
  19883. EC25519_LITTLE_ENDIAN) != 0) {
  19884. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19885. }
  19886. args->idx += length;
  19887. ssl->peerX25519KeyPresent = 1;
  19888. break;
  19889. }
  19890. #endif
  19891. #ifdef HAVE_CURVE448
  19892. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  19893. if (ssl->peerX448Key == NULL) {
  19894. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  19895. (void**)&ssl->peerX448Key);
  19896. if (ret != 0) {
  19897. goto exit_dske;
  19898. }
  19899. } else if (ssl->peerEccKeyPresent) {
  19900. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  19901. ssl->peerX448Key);
  19902. ssl->peerX448KeyPresent = 0;
  19903. if (ret != 0) {
  19904. goto exit_dske;
  19905. }
  19906. }
  19907. if ((ret = wc_curve448_check_public(
  19908. input + args->idx, length,
  19909. EC448_LITTLE_ENDIAN)) != 0) {
  19910. #ifdef WOLFSSL_EXTRA_ALERTS
  19911. if (ret == BUFFER_E)
  19912. SendAlert(ssl, alert_fatal, decode_error);
  19913. else if (ret == ECC_OUT_OF_RANGE_E)
  19914. SendAlert(ssl, alert_fatal, bad_record_mac);
  19915. else {
  19916. SendAlert(ssl, alert_fatal, illegal_parameter);
  19917. }
  19918. #endif
  19919. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19920. }
  19921. if (wc_curve448_import_public_ex(input + args->idx,
  19922. length, ssl->peerX448Key,
  19923. EC448_LITTLE_ENDIAN) != 0) {
  19924. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19925. }
  19926. args->idx += length;
  19927. ssl->peerX448KeyPresent = 1;
  19928. break;
  19929. }
  19930. #endif
  19931. if (ssl->peerEccKey == NULL) {
  19932. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  19933. (void**)&ssl->peerEccKey);
  19934. if (ret != 0) {
  19935. goto exit_dske;
  19936. }
  19937. } else if (ssl->peerEccKeyPresent) {
  19938. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  19939. ssl->peerEccKeyPresent = 0;
  19940. if (ret != 0) {
  19941. goto exit_dske;
  19942. }
  19943. }
  19944. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  19945. if (wc_ecc_import_x963_ex(input + args->idx, length,
  19946. ssl->peerEccKey, curveId) != 0) {
  19947. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19948. }
  19949. args->idx += length;
  19950. ssl->peerEccKeyPresent = 1;
  19951. break;
  19952. }
  19953. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  19954. default:
  19955. ret = BAD_KEA_TYPE_E;
  19956. } /* switch(ssl->specs.kea) */
  19957. /* Check for error */
  19958. if (ret != 0) {
  19959. goto exit_dske;
  19960. }
  19961. /* Advance state and proceed */
  19962. ssl->options.asyncState = TLS_ASYNC_BUILD;
  19963. } /* case TLS_ASYNC_BEGIN */
  19964. FALL_THROUGH;
  19965. case TLS_ASYNC_BUILD:
  19966. {
  19967. switch(ssl->specs.kea)
  19968. {
  19969. case psk_kea:
  19970. case dhe_psk_kea:
  19971. case ecdhe_psk_kea:
  19972. {
  19973. /* Nothing to do in this sub-state */
  19974. break;
  19975. }
  19976. case diffie_hellman_kea:
  19977. case ecc_diffie_hellman_kea:
  19978. {
  19979. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  19980. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  19981. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  19982. #else
  19983. enum wc_HashType hashType;
  19984. word16 verifySz;
  19985. if (ssl->options.usingAnon_cipher) {
  19986. break;
  19987. }
  19988. verifySz = (word16)(args->idx - args->begin);
  19989. if (verifySz > MAX_DH_SZ) {
  19990. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19991. }
  19992. if (IsAtLeastTLSv1_2(ssl)) {
  19993. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  19994. size) {
  19995. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19996. }
  19997. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  19998. &args->sigAlgo);
  19999. args->idx += 2;
  20000. hashType = HashAlgoToType(args->hashAlgo);
  20001. if (hashType == WC_HASH_TYPE_NONE) {
  20002. ERROR_OUT(ALGO_ID_E, exit_dske);
  20003. }
  20004. } else {
  20005. /* only using sha and md5 for rsa */
  20006. #ifndef NO_OLD_TLS
  20007. hashType = WC_HASH_TYPE_SHA;
  20008. if (args->sigAlgo == rsa_sa_algo) {
  20009. hashType = WC_HASH_TYPE_MD5_SHA;
  20010. }
  20011. #else
  20012. ERROR_OUT(ALGO_ID_E, exit_dske);
  20013. #endif
  20014. }
  20015. /* signature */
  20016. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  20017. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20018. }
  20019. ato16(input + args->idx, &args->verifySigSz);
  20020. args->idx += OPAQUE16_LEN;
  20021. if ((args->idx - args->begin) + args->verifySigSz > size) {
  20022. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20023. }
  20024. /* buffer for signature */
  20025. ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + verifySz,
  20026. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20027. if (ssl->buffers.sig.buffer == NULL) {
  20028. ERROR_OUT(MEMORY_E, exit_dske);
  20029. }
  20030. ssl->buffers.sig.length = SEED_LEN + verifySz;
  20031. /* build message to hash */
  20032. XMEMCPY(ssl->buffers.sig.buffer,
  20033. ssl->arrays->clientRandom, RAN_LEN);
  20034. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN],
  20035. ssl->arrays->serverRandom, RAN_LEN);
  20036. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2],
  20037. input + args->begin, verifySz); /* message */
  20038. if (args->sigAlgo != ed25519_sa_algo) {
  20039. int digest_sz = wc_HashGetDigestSize(hashType);
  20040. if (digest_sz <= 0) {
  20041. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20042. }
  20043. ssl->buffers.digest.length = (unsigned int)digest_sz;
  20044. /* buffer for hash */
  20045. ssl->buffers.digest.buffer = (byte*)XMALLOC(
  20046. ssl->buffers.digest.length, ssl->heap,
  20047. DYNAMIC_TYPE_DIGEST);
  20048. if (ssl->buffers.digest.buffer == NULL) {
  20049. ERROR_OUT(MEMORY_E, exit_dske);
  20050. }
  20051. /* Perform hash */
  20052. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  20053. ssl->buffers.sig.length,
  20054. ssl->buffers.digest.buffer,
  20055. ssl->buffers.digest.length);
  20056. if (ret != 0) {
  20057. goto exit_dske;
  20058. }
  20059. }
  20060. switch (args->sigAlgo)
  20061. {
  20062. #ifndef NO_RSA
  20063. #ifdef WC_RSA_PSS
  20064. case rsa_pss_sa_algo:
  20065. #endif
  20066. case rsa_sa_algo:
  20067. {
  20068. if (ssl->peerRsaKey == NULL ||
  20069. !ssl->peerRsaKeyPresent) {
  20070. ERROR_OUT(NO_PEER_KEY, exit_dske);
  20071. }
  20072. break;
  20073. }
  20074. #endif /* !NO_RSA */
  20075. #ifdef HAVE_ECC
  20076. case ecc_dsa_sa_algo:
  20077. {
  20078. if (!ssl->peerEccDsaKeyPresent) {
  20079. ERROR_OUT(NO_PEER_KEY, exit_dske);
  20080. }
  20081. break;
  20082. }
  20083. #endif /* HAVE_ECC */
  20084. #if defined(HAVE_ED25519)
  20085. case ed25519_sa_algo:
  20086. {
  20087. if (!ssl->peerEd25519KeyPresent) {
  20088. ERROR_OUT(NO_PEER_KEY, exit_dske);
  20089. }
  20090. break;
  20091. }
  20092. #endif /* HAVE_ED25519 */
  20093. #if defined(HAVE_ED448)
  20094. case ed448_sa_algo:
  20095. {
  20096. if (!ssl->peerEd448KeyPresent) {
  20097. ERROR_OUT(NO_PEER_KEY, exit_dske);
  20098. }
  20099. break;
  20100. }
  20101. #endif /* HAVE_ED448 */
  20102. default:
  20103. ret = ALGO_ID_E;
  20104. } /* switch (args->sigAlgo) */
  20105. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  20106. break;
  20107. }
  20108. default:
  20109. ret = BAD_KEA_TYPE_E;
  20110. } /* switch(ssl->specs.kea) */
  20111. /* Check for error */
  20112. if (ret != 0) {
  20113. goto exit_dske;
  20114. }
  20115. /* Advance state and proceed */
  20116. ssl->options.asyncState = TLS_ASYNC_DO;
  20117. } /* case TLS_ASYNC_BUILD */
  20118. FALL_THROUGH;
  20119. case TLS_ASYNC_DO:
  20120. {
  20121. switch(ssl->specs.kea)
  20122. {
  20123. case psk_kea:
  20124. case dhe_psk_kea:
  20125. case ecdhe_psk_kea:
  20126. {
  20127. /* Nothing to do in this sub-state */
  20128. break;
  20129. }
  20130. case diffie_hellman_kea:
  20131. case ecc_diffie_hellman_kea:
  20132. {
  20133. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  20134. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  20135. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  20136. #else
  20137. if (ssl->options.usingAnon_cipher) {
  20138. break;
  20139. }
  20140. if (args->verifySig == NULL) {
  20141. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  20142. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20143. if (args->verifySig == NULL) {
  20144. ERROR_OUT(MEMORY_E, exit_dske);
  20145. }
  20146. XMEMCPY(args->verifySig, input + args->idx,
  20147. args->verifySigSz);
  20148. }
  20149. switch (args->sigAlgo)
  20150. {
  20151. #ifndef NO_RSA
  20152. #ifdef WC_RSA_PSS
  20153. case rsa_pss_sa_algo:
  20154. #endif
  20155. case rsa_sa_algo:
  20156. {
  20157. ret = RsaVerify(ssl,
  20158. args->verifySig, args->verifySigSz,
  20159. &args->output,
  20160. args->sigAlgo, args->hashAlgo,
  20161. ssl->peerRsaKey,
  20162. #ifdef HAVE_PK_CALLBACKS
  20163. &ssl->buffers.peerRsaKey
  20164. #else
  20165. NULL
  20166. #endif
  20167. );
  20168. if (ret >= 0) {
  20169. args->sigSz = (word16)ret;
  20170. #ifdef WC_RSA_PSS
  20171. args->bits = mp_count_bits(&ssl->peerRsaKey->n);
  20172. #endif
  20173. ret = 0;
  20174. }
  20175. #ifdef WOLFSSL_ASYNC_CRYPT
  20176. if (ret != WC_PENDING_E)
  20177. #endif
  20178. {
  20179. /* peerRsaKey */
  20180. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  20181. (void**)&ssl->peerRsaKey);
  20182. ssl->peerRsaKeyPresent = 0;
  20183. }
  20184. break;
  20185. }
  20186. #endif /* !NO_RSA */
  20187. #ifdef HAVE_ECC
  20188. case ecc_dsa_sa_algo:
  20189. {
  20190. ret = EccVerify(ssl,
  20191. args->verifySig, args->verifySigSz,
  20192. ssl->buffers.digest.buffer,
  20193. ssl->buffers.digest.length,
  20194. ssl->peerEccDsaKey,
  20195. #ifdef HAVE_PK_CALLBACKS
  20196. &ssl->buffers.peerEccDsaKey
  20197. #else
  20198. NULL
  20199. #endif
  20200. );
  20201. #ifdef WOLFSSL_ASYNC_CRYPT
  20202. if (ret != WC_PENDING_E)
  20203. #endif
  20204. {
  20205. /* peerEccDsaKey */
  20206. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  20207. (void**)&ssl->peerEccDsaKey);
  20208. ssl->peerEccDsaKeyPresent = 0;
  20209. }
  20210. break;
  20211. }
  20212. #endif /* HAVE_ECC */
  20213. #if defined(HAVE_ED25519)
  20214. case ed25519_sa_algo:
  20215. {
  20216. ret = Ed25519Verify(ssl,
  20217. args->verifySig, args->verifySigSz,
  20218. ssl->buffers.sig.buffer,
  20219. ssl->buffers.sig.length,
  20220. ssl->peerEd25519Key,
  20221. #ifdef HAVE_PK_CALLBACKS
  20222. &ssl->buffers.peerEd25519Key
  20223. #else
  20224. NULL
  20225. #endif
  20226. );
  20227. #ifdef WOLFSSL_ASYNC_CRYPT
  20228. if (ret != WC_PENDING_E)
  20229. #endif
  20230. {
  20231. /* peerEccDsaKey */
  20232. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  20233. (void**)&ssl->peerEd25519Key);
  20234. ssl->peerEd25519KeyPresent = 0;
  20235. }
  20236. break;
  20237. }
  20238. #endif /* HAVE_ED25519 */
  20239. #if defined(HAVE_ED448)
  20240. case ed448_sa_algo:
  20241. {
  20242. ret = Ed448Verify(ssl,
  20243. args->verifySig, args->verifySigSz,
  20244. ssl->buffers.sig.buffer,
  20245. ssl->buffers.sig.length,
  20246. ssl->peerEd448Key,
  20247. #ifdef HAVE_PK_CALLBACKS
  20248. &ssl->buffers.peerEd448Key
  20249. #else
  20250. NULL
  20251. #endif
  20252. );
  20253. #ifdef WOLFSSL_ASYNC_CRYPT
  20254. if (ret != WC_PENDING_E)
  20255. #endif
  20256. {
  20257. /* peerEccDsaKey */
  20258. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  20259. (void**)&ssl->peerEd448Key);
  20260. ssl->peerEd448KeyPresent = 0;
  20261. }
  20262. break;
  20263. }
  20264. #endif /* HAVE_ED448 */
  20265. default:
  20266. ret = ALGO_ID_E;
  20267. } /* switch (sigAlgo) */
  20268. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  20269. break;
  20270. }
  20271. default:
  20272. ret = BAD_KEA_TYPE_E;
  20273. } /* switch(ssl->specs.kea) */
  20274. /* Check for error */
  20275. if (ret != 0) {
  20276. goto exit_dske;
  20277. }
  20278. /* Advance state and proceed */
  20279. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  20280. } /* case TLS_ASYNC_DO */
  20281. FALL_THROUGH;
  20282. case TLS_ASYNC_VERIFY:
  20283. {
  20284. switch(ssl->specs.kea)
  20285. {
  20286. case psk_kea:
  20287. case dhe_psk_kea:
  20288. case ecdhe_psk_kea:
  20289. {
  20290. /* Nothing to do in this sub-state */
  20291. break;
  20292. }
  20293. case diffie_hellman_kea:
  20294. case ecc_diffie_hellman_kea:
  20295. {
  20296. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  20297. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  20298. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  20299. #else
  20300. if (ssl->options.usingAnon_cipher) {
  20301. break;
  20302. }
  20303. /* increment index after verify is done */
  20304. args->idx += args->verifySigSz;
  20305. switch(args->sigAlgo)
  20306. {
  20307. #ifndef NO_RSA
  20308. #ifdef WC_RSA_PSS
  20309. case rsa_pss_sa_algo:
  20310. #ifdef HAVE_SELFTEST
  20311. ret = wc_RsaPSS_CheckPadding(
  20312. ssl->buffers.digest.buffer,
  20313. ssl->buffers.digest.length,
  20314. args->output, args->sigSz,
  20315. HashAlgoToType(args->hashAlgo));
  20316. #else
  20317. ret = wc_RsaPSS_CheckPadding_ex(
  20318. ssl->buffers.digest.buffer,
  20319. ssl->buffers.digest.length,
  20320. args->output, args->sigSz,
  20321. HashAlgoToType(args->hashAlgo),
  20322. -1, args->bits);
  20323. #endif
  20324. if (ret != 0)
  20325. return ret;
  20326. break;
  20327. #endif
  20328. case rsa_sa_algo:
  20329. {
  20330. if (IsAtLeastTLSv1_2(ssl)) {
  20331. #ifdef WOLFSSL_SMALL_STACK
  20332. byte* encodedSig;
  20333. #else
  20334. byte encodedSig[MAX_ENCODED_SIG_SZ];
  20335. #endif
  20336. word32 encSigSz;
  20337. #ifdef WOLFSSL_SMALL_STACK
  20338. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  20339. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20340. if (encodedSig == NULL) {
  20341. ERROR_OUT(MEMORY_E, exit_dske);
  20342. }
  20343. #endif
  20344. encSigSz = wc_EncodeSignature(encodedSig,
  20345. ssl->buffers.digest.buffer,
  20346. ssl->buffers.digest.length,
  20347. TypeHash(args->hashAlgo));
  20348. if (encSigSz != args->sigSz || !args->output ||
  20349. XMEMCMP(args->output, encodedSig,
  20350. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  20351. ret = VERIFY_SIGN_ERROR;
  20352. }
  20353. #ifdef WOLFSSL_SMALL_STACK
  20354. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20355. #endif
  20356. if (ret != 0) {
  20357. goto exit_dske;
  20358. }
  20359. }
  20360. else if (args->sigSz != FINISHED_SZ ||
  20361. !args->output ||
  20362. XMEMCMP(args->output,
  20363. ssl->buffers.digest.buffer,
  20364. FINISHED_SZ) != 0) {
  20365. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  20366. }
  20367. break;
  20368. }
  20369. #endif /* !NO_RSA */
  20370. #ifdef HAVE_ECC
  20371. case ecc_dsa_sa_algo:
  20372. /* Nothing to do in this algo */
  20373. break;
  20374. #endif /* HAVE_ECC */
  20375. #if defined(HAVE_ED25519)
  20376. case ed25519_sa_algo:
  20377. /* Nothing to do in this algo */
  20378. break;
  20379. #endif /* HAVE_ED25519 */
  20380. #if defined(HAVE_ED448)
  20381. case ed448_sa_algo:
  20382. /* Nothing to do in this algo */
  20383. break;
  20384. #endif /* HAVE_ED448 */
  20385. default:
  20386. ret = ALGO_ID_E;
  20387. } /* switch (sigAlgo) */
  20388. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  20389. break;
  20390. }
  20391. default:
  20392. ret = BAD_KEA_TYPE_E;
  20393. } /* switch(ssl->specs.kea) */
  20394. /* Check for error */
  20395. if (ret != 0) {
  20396. goto exit_dske;
  20397. }
  20398. /* Advance state and proceed */
  20399. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  20400. } /* case TLS_ASYNC_VERIFY */
  20401. FALL_THROUGH;
  20402. case TLS_ASYNC_FINALIZE:
  20403. {
  20404. if (IsEncryptionOn(ssl, 0)) {
  20405. args->idx += ssl->keys.padSz;
  20406. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  20407. if (ssl->options.startedETMRead)
  20408. args->idx += MacSize(ssl);
  20409. #endif
  20410. }
  20411. /* QSH extensions */
  20412. #ifdef HAVE_QSH
  20413. if (ssl->peerQSHKeyPresent) {
  20414. word16 name;
  20415. int qshSz;
  20416. /* extension name */
  20417. ato16(input + args->idx, &name);
  20418. args->idx += OPAQUE16_LEN;
  20419. if (name == TLSX_QUANTUM_SAFE_HYBRID) {
  20420. /* if qshSz is larger than 0 it is the length of
  20421. buffer used */
  20422. if ((qshSz = TLSX_QSHCipher_Parse(ssl, input + args->idx,
  20423. size, 0)) < 0) {
  20424. ERROR_OUT(qshSz, exit_dske);
  20425. }
  20426. args->idx += qshSz;
  20427. }
  20428. else {
  20429. /* unknown extension sent server ignored handshake */
  20430. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20431. }
  20432. }
  20433. #endif
  20434. /* Advance state and proceed */
  20435. ssl->options.asyncState = TLS_ASYNC_END;
  20436. } /* case TLS_ASYNC_FINALIZE */
  20437. FALL_THROUGH;
  20438. case TLS_ASYNC_END:
  20439. {
  20440. /* return index */
  20441. *inOutIdx = args->idx;
  20442. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  20443. break;
  20444. }
  20445. default:
  20446. ret = INPUT_CASE_ERROR;
  20447. } /* switch(ssl->options.asyncState) */
  20448. exit_dske:
  20449. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  20450. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  20451. #ifdef WOLFSSL_ASYNC_CRYPT
  20452. /* Handle async operation */
  20453. if (ret == WC_PENDING_E) {
  20454. /* Mark message as not received so it can process again */
  20455. ssl->msgsReceived.got_server_key_exchange = 0;
  20456. return ret;
  20457. }
  20458. #endif /* WOLFSSL_ASYNC_CRYPT */
  20459. /* Final cleanup */
  20460. FreeDskeArgs(ssl, args);
  20461. FreeKeyExchange(ssl);
  20462. return ret;
  20463. }
  20464. #ifdef HAVE_QSH
  20465. #ifdef HAVE_NTRU
  20466. /* Encrypt a byte array using ntru
  20467. key a struct containing the public key to use
  20468. bufIn array to be encrypted
  20469. inSz size of bufIn array
  20470. bufOut cipher text out
  20471. outSz will be set to the new size of cipher text
  20472. */
  20473. static int NtruSecretEncrypt(QSHKey* key, byte* bufIn, word32 inSz,
  20474. byte* bufOut, word16* outSz)
  20475. {
  20476. int ret;
  20477. DRBG_HANDLE drbg;
  20478. /* sanity checks on input arguments */
  20479. if (key == NULL || bufIn == NULL || bufOut == NULL || outSz == NULL)
  20480. return BAD_FUNC_ARG;
  20481. if (key->pub.buffer == NULL)
  20482. return BAD_FUNC_ARG;
  20483. switch (key->name) {
  20484. case WOLFSSL_NTRU_EESS439:
  20485. case WOLFSSL_NTRU_EESS593:
  20486. case WOLFSSL_NTRU_EESS743:
  20487. break;
  20488. default:
  20489. WOLFSSL_MSG("Unknown QSH encryption key!");
  20490. return -1;
  20491. }
  20492. /* set up ntru drbg */
  20493. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  20494. if (ret != DRBG_OK)
  20495. return NTRU_DRBG_ERROR;
  20496. /* encrypt the byte array */
  20497. ret = ntru_crypto_ntru_encrypt(drbg, key->pub.length, key->pub.buffer,
  20498. inSz, bufIn, outSz, bufOut);
  20499. ntru_crypto_drbg_uninstantiate(drbg);
  20500. if (ret != NTRU_OK)
  20501. return NTRU_ENCRYPT_ERROR;
  20502. return ret;
  20503. }
  20504. /* Decrypt a byte array using ntru
  20505. key a struct containing the private key to use
  20506. bufIn array to be decrypted
  20507. inSz size of bufIn array
  20508. bufOut plain text out
  20509. outSz will be set to the new size of plain text
  20510. */
  20511. static int NtruSecretDecrypt(QSHKey* key, byte* bufIn, word32 inSz,
  20512. byte* bufOut, word16* outSz)
  20513. {
  20514. int ret;
  20515. DRBG_HANDLE drbg;
  20516. /* sanity checks on input arguments */
  20517. if (key == NULL || bufIn == NULL || bufOut == NULL || outSz == NULL)
  20518. return BAD_FUNC_ARG;
  20519. if (key->pri.buffer == NULL)
  20520. return BAD_FUNC_ARG;
  20521. switch (key->name) {
  20522. case WOLFSSL_NTRU_EESS439:
  20523. case WOLFSSL_NTRU_EESS593:
  20524. case WOLFSSL_NTRU_EESS743:
  20525. break;
  20526. default:
  20527. WOLFSSL_MSG("Unknown QSH decryption key!");
  20528. return -1;
  20529. }
  20530. /* set up drbg */
  20531. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  20532. if (ret != DRBG_OK)
  20533. return NTRU_DRBG_ERROR;
  20534. /* decrypt cipher text */
  20535. ret = ntru_crypto_ntru_decrypt(key->pri.length, key->pri.buffer,
  20536. inSz, bufIn, outSz, bufOut);
  20537. ntru_crypto_drbg_uninstantiate(drbg);
  20538. if (ret != NTRU_OK)
  20539. return NTRU_ENCRYPT_ERROR;
  20540. return ret;
  20541. }
  20542. #endif /* HAVE_NTRU */
  20543. int QSH_Init(WOLFSSL* ssl)
  20544. {
  20545. /* check so not initializing twice when running DTLS */
  20546. if (ssl->QSH_secret != NULL)
  20547. return 0;
  20548. /* malloc memory for holding generated secret information */
  20549. if ((ssl->QSH_secret = (QSHSecret*)XMALLOC(sizeof(QSHSecret), ssl->heap,
  20550. DYNAMIC_TYPE_QSH)) == NULL)
  20551. return MEMORY_E;
  20552. ssl->QSH_secret->CliSi = (buffer*)XMALLOC(sizeof(buffer), ssl->heap,
  20553. DYNAMIC_TYPE_SECRET);
  20554. if (ssl->QSH_secret->CliSi == NULL)
  20555. return MEMORY_E;
  20556. ssl->QSH_secret->SerSi = (buffer*)XMALLOC(sizeof(buffer), ssl->heap,
  20557. DYNAMIC_TYPE_SECRET);
  20558. if (ssl->QSH_secret->SerSi == NULL)
  20559. return MEMORY_E;
  20560. /* initialize variables */
  20561. ssl->QSH_secret->list = NULL;
  20562. ssl->QSH_secret->CliSi->length = 0;
  20563. ssl->QSH_secret->CliSi->buffer = NULL;
  20564. ssl->QSH_secret->SerSi->length = 0;
  20565. ssl->QSH_secret->SerSi->buffer = NULL;
  20566. return 0;
  20567. }
  20568. static int QSH_Encrypt(QSHKey* key, byte* in, word32 szIn,
  20569. byte* out, word32* szOut)
  20570. {
  20571. int ret = 0;
  20572. word16 size = *szOut;
  20573. (void)in;
  20574. (void)szIn;
  20575. (void)out;
  20576. (void)szOut;
  20577. WOLFSSL_MSG("Encrypting QSH key material");
  20578. switch (key->name) {
  20579. #ifdef HAVE_NTRU
  20580. case WOLFSSL_NTRU_EESS439:
  20581. case WOLFSSL_NTRU_EESS593:
  20582. case WOLFSSL_NTRU_EESS743:
  20583. ret = NtruSecretEncrypt(key, in, szIn, out, &size);
  20584. break;
  20585. #endif
  20586. default:
  20587. WOLFSSL_MSG("Unknown QSH encryption key!");
  20588. return -1;
  20589. }
  20590. *szOut = size;
  20591. return ret;
  20592. }
  20593. /* Decrypt using Quantum Safe Handshake algorithms */
  20594. int QSH_Decrypt(QSHKey* key, byte* in, word32 szIn, byte* out, word16* szOut)
  20595. {
  20596. int ret = 0;
  20597. word16 size = *szOut;
  20598. (void)in;
  20599. (void)szIn;
  20600. (void)out;
  20601. (void)szOut;
  20602. WOLFSSL_MSG("Decrypting QSH key material");
  20603. switch (key->name) {
  20604. #ifdef HAVE_NTRU
  20605. case WOLFSSL_NTRU_EESS439:
  20606. case WOLFSSL_NTRU_EESS593:
  20607. case WOLFSSL_NTRU_EESS743:
  20608. ret = NtruSecretDecrypt(key, in, szIn, out, &size);
  20609. break;
  20610. #endif
  20611. default:
  20612. WOLFSSL_MSG("Unknown QSH decryption key!");
  20613. return -1;
  20614. }
  20615. *szOut = size;
  20616. return ret;
  20617. }
  20618. /* Get the max cipher text for corresponding encryption scheme
  20619. (encrypting 48 or max plain text whichever is smaller)
  20620. */
  20621. static word32 QSH_MaxSecret(QSHKey* key)
  20622. {
  20623. int ret = 0;
  20624. #ifdef HAVE_NTRU
  20625. byte isNtru = 0;
  20626. word16 inSz = 48;
  20627. word16 outSz;
  20628. DRBG_HANDLE drbg = 0;
  20629. byte bufIn[48];
  20630. #endif
  20631. if (key == NULL || key->pub.length == 0)
  20632. return 0;
  20633. switch(key->name) {
  20634. #ifdef HAVE_NTRU
  20635. case WOLFSSL_NTRU_EESS439:
  20636. isNtru = 1;
  20637. break;
  20638. case WOLFSSL_NTRU_EESS593:
  20639. isNtru = 1;
  20640. break;
  20641. case WOLFSSL_NTRU_EESS743:
  20642. isNtru = 1;
  20643. break;
  20644. #endif
  20645. default:
  20646. WOLFSSL_MSG("Unknown QSH encryption scheme size!");
  20647. return 0;
  20648. }
  20649. #ifdef HAVE_NTRU
  20650. if (isNtru) {
  20651. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  20652. if (ret != DRBG_OK)
  20653. return NTRU_DRBG_ERROR;
  20654. ret = ntru_crypto_ntru_encrypt(drbg, key->pub.length,
  20655. key->pub.buffer, inSz, bufIn, &outSz, NULL);
  20656. if (ret != NTRU_OK) {
  20657. return NTRU_ENCRYPT_ERROR;
  20658. }
  20659. ntru_crypto_drbg_uninstantiate(drbg);
  20660. ret = outSz;
  20661. }
  20662. #endif
  20663. return ret;
  20664. }
  20665. /* Generate the secret byte material for pms
  20666. returns length on success and -1 on fail
  20667. */
  20668. static int QSH_GenerateSerCliSecret(WOLFSSL* ssl, byte isServer)
  20669. {
  20670. int sz = 0;
  20671. int plainSz = 48; /* lesser of 48 and max plain text able to encrypt */
  20672. int offset = 0;
  20673. word32 tmpSz = 0;
  20674. buffer* buf;
  20675. QSHKey* current;
  20676. QSHScheme* schmPre = NULL;
  20677. QSHScheme* schm = NULL;
  20678. if (ssl == NULL)
  20679. return -1;
  20680. WOLFSSL_MSG("Generating QSH secret key material");
  20681. current = ssl->peerQSHKey;
  20682. /* get size of buffer needed */
  20683. while (current) {
  20684. if (current->pub.length != 0) {
  20685. sz += plainSz;
  20686. }
  20687. current = (QSHKey*)current->next;
  20688. }
  20689. /* allocate memory for buffer */
  20690. if (isServer) {
  20691. buf = ssl->QSH_secret->SerSi;
  20692. }
  20693. else {
  20694. buf = ssl->QSH_secret->CliSi;
  20695. }
  20696. buf->length = sz;
  20697. buf->buffer = (byte*)XMALLOC(sz, ssl->heap, DYNAMIC_TYPE_SECRET);
  20698. if (buf->buffer == NULL) {
  20699. WOLFSSL_ERROR(MEMORY_E);
  20700. }
  20701. /* create secret information */
  20702. sz = 0;
  20703. current = ssl->peerQSHKey;
  20704. while (current) {
  20705. schm = (QSHScheme*)XMALLOC(sizeof(QSHScheme), ssl->heap,
  20706. DYNAMIC_TYPE_QSH);
  20707. if (schm == NULL)
  20708. return MEMORY_E;
  20709. /* initialize variables */
  20710. schm->name = 0;
  20711. schm->PK = NULL;
  20712. schm->PKLen = 0;
  20713. schm->next = NULL;
  20714. if (ssl->QSH_secret->list == NULL) {
  20715. ssl->QSH_secret->list = schm;
  20716. }
  20717. else {
  20718. if (schmPre)
  20719. schmPre->next = schm;
  20720. }
  20721. tmpSz = QSH_MaxSecret(current);
  20722. if ((schm->PK = (byte*)XMALLOC(tmpSz, ssl->heap,
  20723. DYNAMIC_TYPE_SECRET)) == NULL)
  20724. return -1;
  20725. /* store info for writing extension */
  20726. schm->name = current->name;
  20727. /* no key to use for encryption */
  20728. if (tmpSz == 0) {
  20729. current = (QSHKey*)current->next;
  20730. continue;
  20731. }
  20732. if (wc_RNG_GenerateBlock(ssl->rng, buf->buffer + offset, plainSz)
  20733. != 0) {
  20734. return -1;
  20735. }
  20736. if (QSH_Encrypt(current, buf->buffer + offset, plainSz, schm->PK,
  20737. &tmpSz) != 0) {
  20738. return -1;
  20739. }
  20740. schm->PKLen = tmpSz;
  20741. sz += tmpSz;
  20742. offset += plainSz;
  20743. schmPre = schm;
  20744. current = (QSHKey*)current->next;
  20745. }
  20746. return sz;
  20747. }
  20748. static word32 QSH_KeyGetSize(WOLFSSL* ssl)
  20749. {
  20750. word32 sz = 0;
  20751. QSHKey* current;
  20752. if (ssl == NULL)
  20753. return -1;
  20754. current = ssl->peerQSHKey;
  20755. sz += OPAQUE16_LEN; /* type of extension ie 0x00 0x18 */
  20756. sz += OPAQUE24_LEN;
  20757. /* get size of buffer needed */
  20758. while (current) {
  20759. sz += OPAQUE16_LEN; /* scheme id */
  20760. sz += OPAQUE16_LEN; /* encrypted key len*/
  20761. sz += QSH_MaxSecret(current);
  20762. current = (QSHKey*)current->next;
  20763. }
  20764. return sz;
  20765. }
  20766. /* handle QSH key Exchange
  20767. return 0 on success
  20768. */
  20769. static word32 QSH_KeyExchangeWrite(WOLFSSL* ssl, byte isServer)
  20770. {
  20771. int ret = 0;
  20772. WOLFSSL_ENTER("QSH KeyExchange");
  20773. ret = QSH_GenerateSerCliSecret(ssl, isServer);
  20774. if (ret < 0)
  20775. return MEMORY_E;
  20776. return 0;
  20777. }
  20778. #endif /* HAVE_QSH */
  20779. typedef struct SckeArgs {
  20780. byte* output; /* not allocated */
  20781. byte* encSecret;
  20782. byte* input;
  20783. word32 encSz;
  20784. word32 length;
  20785. int sendSz;
  20786. int inputSz;
  20787. } SckeArgs;
  20788. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  20789. {
  20790. SckeArgs* args = (SckeArgs*)pArgs;
  20791. (void)ssl;
  20792. if (args->encSecret) {
  20793. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  20794. args->encSecret = NULL;
  20795. }
  20796. if (args->input) {
  20797. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20798. args->input = NULL;
  20799. }
  20800. }
  20801. /* handle generation client_key_exchange (16) */
  20802. int SendClientKeyExchange(WOLFSSL* ssl)
  20803. {
  20804. int ret = 0;
  20805. #ifdef WOLFSSL_ASYNC_CRYPT
  20806. SckeArgs* args = (SckeArgs*)ssl->async.args;
  20807. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  20808. (void)sizeof(args_test);
  20809. #else
  20810. SckeArgs args[1];
  20811. #endif
  20812. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  20813. WOLFSSL_ENTER("SendClientKeyExchange");
  20814. #ifdef OPENSSL_EXTRA
  20815. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  20816. ssl->cbmode = SSL_CB_MODE_WRITE;
  20817. if (ssl->CBIS != NULL)
  20818. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  20819. #endif
  20820. #ifdef WOLFSSL_ASYNC_CRYPT
  20821. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  20822. if (ret != WC_NOT_PENDING_E) {
  20823. /* Check for error */
  20824. if (ret < 0)
  20825. goto exit_scke;
  20826. }
  20827. else
  20828. #endif
  20829. {
  20830. /* Reset state */
  20831. ret = 0;
  20832. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  20833. XMEMSET(args, 0, sizeof(SckeArgs));
  20834. #ifdef WOLFSSL_ASYNC_CRYPT
  20835. ssl->async.freeArgs = FreeSckeArgs;
  20836. #endif
  20837. }
  20838. switch(ssl->options.asyncState)
  20839. {
  20840. case TLS_ASYNC_BEGIN:
  20841. {
  20842. switch (ssl->specs.kea) {
  20843. #ifndef NO_RSA
  20844. case rsa_kea:
  20845. if (ssl->peerRsaKey == NULL ||
  20846. ssl->peerRsaKeyPresent == 0) {
  20847. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20848. }
  20849. break;
  20850. #endif
  20851. #ifndef NO_DH
  20852. case diffie_hellman_kea:
  20853. if (ssl->buffers.serverDH_P.buffer == NULL ||
  20854. ssl->buffers.serverDH_G.buffer == NULL ||
  20855. ssl->buffers.serverDH_Pub.buffer == NULL) {
  20856. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20857. }
  20858. break;
  20859. #endif /* NO_DH */
  20860. #ifndef NO_PSK
  20861. case psk_kea:
  20862. /* sanity check that PSK client callback has been set */
  20863. if (ssl->options.client_psk_cb == NULL) {
  20864. WOLFSSL_MSG("No client PSK callback set");
  20865. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  20866. }
  20867. break;
  20868. #endif /* NO_PSK */
  20869. #if !defined(NO_DH) && !defined(NO_PSK)
  20870. case dhe_psk_kea:
  20871. if (ssl->buffers.serverDH_P.buffer == NULL ||
  20872. ssl->buffers.serverDH_G.buffer == NULL ||
  20873. ssl->buffers.serverDH_Pub.buffer == NULL) {
  20874. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20875. }
  20876. /* sanity check that PSK client callback has been set */
  20877. if (ssl->options.client_psk_cb == NULL) {
  20878. WOLFSSL_MSG("No client PSK callback set");
  20879. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  20880. }
  20881. break;
  20882. #endif /* !NO_DH && !NO_PSK */
  20883. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20884. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  20885. case ecdhe_psk_kea:
  20886. /* sanity check that PSK client callback has been set */
  20887. if (ssl->options.client_psk_cb == NULL) {
  20888. WOLFSSL_MSG("No client PSK callback set");
  20889. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  20890. }
  20891. #ifdef HAVE_CURVE25519
  20892. if (ssl->peerX25519KeyPresent) {
  20893. /* Check client ECC public key */
  20894. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  20895. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20896. }
  20897. #ifdef HAVE_PK_CALLBACKS
  20898. /* if callback then use it for shared secret */
  20899. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  20900. break;
  20901. }
  20902. #endif
  20903. /* create private key */
  20904. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  20905. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20906. if (ret != 0) {
  20907. goto exit_scke;
  20908. }
  20909. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  20910. ssl->peerX25519Key);
  20911. break;
  20912. }
  20913. #endif
  20914. #ifdef HAVE_CURVE448
  20915. if (ssl->peerX448KeyPresent) {
  20916. /* Check client ECC public key */
  20917. if (!ssl->peerX448Key) {
  20918. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20919. }
  20920. #ifdef HAVE_PK_CALLBACKS
  20921. /* if callback then use it for shared secret */
  20922. if (ssl->ctx->X448SharedSecretCb != NULL) {
  20923. break;
  20924. }
  20925. #endif
  20926. /* create private key */
  20927. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  20928. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20929. if (ret != 0) {
  20930. goto exit_scke;
  20931. }
  20932. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  20933. ssl->peerX448Key);
  20934. break;
  20935. }
  20936. #endif
  20937. /* Check client ECC public key */
  20938. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  20939. !ssl->peerEccKey->dp) {
  20940. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20941. }
  20942. #ifdef HAVE_PK_CALLBACKS
  20943. /* if callback then use it for shared secret */
  20944. if (ssl->ctx->EccSharedSecretCb != NULL) {
  20945. break;
  20946. }
  20947. #endif
  20948. /* create ephemeral private key */
  20949. ssl->hsType = DYNAMIC_TYPE_ECC;
  20950. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20951. if (ret != 0) {
  20952. goto exit_scke;
  20953. }
  20954. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  20955. break;
  20956. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  20957. #ifdef HAVE_NTRU
  20958. case ntru_kea:
  20959. if (ssl->peerNtruKeyPresent == 0) {
  20960. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20961. }
  20962. break;
  20963. #endif /* HAVE_NTRU */
  20964. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20965. defined(HAVE_CURVE448)
  20966. case ecc_diffie_hellman_kea:
  20967. {
  20968. #ifdef HAVE_ECC
  20969. ecc_key* peerKey;
  20970. #endif
  20971. #ifdef HAVE_PK_CALLBACKS
  20972. /* if callback then use it for shared secret */
  20973. #ifdef HAVE_CURVE25519
  20974. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  20975. if (ssl->ctx->X25519SharedSecretCb != NULL)
  20976. break;
  20977. }
  20978. else
  20979. #endif
  20980. #ifdef HAVE_CURVE448
  20981. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  20982. if (ssl->ctx->X448SharedSecretCb != NULL)
  20983. break;
  20984. }
  20985. else
  20986. #endif
  20987. #ifdef HAVE_ECC
  20988. if (ssl->ctx->EccSharedSecretCb != NULL) {
  20989. break;
  20990. }
  20991. else
  20992. #endif
  20993. {
  20994. }
  20995. #endif /* HAVE_PK_CALLBACKS */
  20996. #ifdef HAVE_CURVE25519
  20997. if (ssl->peerX25519KeyPresent) {
  20998. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  20999. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21000. }
  21001. /* create private key */
  21002. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  21003. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21004. if (ret != 0) {
  21005. goto exit_scke;
  21006. }
  21007. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  21008. ssl->peerX25519Key);
  21009. break;
  21010. }
  21011. #endif
  21012. #ifdef HAVE_CURVE448
  21013. if (ssl->peerX448KeyPresent) {
  21014. if (!ssl->peerX448Key) {
  21015. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21016. }
  21017. /* create private key */
  21018. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  21019. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21020. if (ret != 0) {
  21021. goto exit_scke;
  21022. }
  21023. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  21024. ssl->peerX448Key);
  21025. break;
  21026. }
  21027. #endif
  21028. #ifdef HAVE_ECC
  21029. if (ssl->specs.static_ecdh) {
  21030. /* Note: EccDsa is really fixed Ecc key here */
  21031. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
  21032. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21033. }
  21034. peerKey = ssl->peerEccDsaKey;
  21035. }
  21036. else {
  21037. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
  21038. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21039. }
  21040. peerKey = ssl->peerEccKey;
  21041. }
  21042. if (peerKey == NULL) {
  21043. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21044. }
  21045. /* create ephemeral private key */
  21046. ssl->hsType = DYNAMIC_TYPE_ECC;
  21047. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21048. if (ret != 0) {
  21049. goto exit_scke;
  21050. }
  21051. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  21052. #endif
  21053. break;
  21054. }
  21055. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  21056. default:
  21057. ret = BAD_KEA_TYPE_E;
  21058. } /* switch(ssl->specs.kea) */
  21059. /* Check for error */
  21060. if (ret != 0) {
  21061. goto exit_scke;
  21062. }
  21063. /* Advance state and proceed */
  21064. ssl->options.asyncState = TLS_ASYNC_BUILD;
  21065. } /* case TLS_ASYNC_BEGIN */
  21066. FALL_THROUGH;
  21067. case TLS_ASYNC_BUILD:
  21068. {
  21069. args->encSz = MAX_ENCRYPT_SZ;
  21070. args->encSecret = (byte*)XMALLOC(args->encSz, ssl->heap,
  21071. DYNAMIC_TYPE_SECRET);
  21072. if (args->encSecret == NULL) {
  21073. ERROR_OUT(MEMORY_E, exit_scke);
  21074. }
  21075. if (ssl->arrays->preMasterSecret == NULL) {
  21076. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  21077. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  21078. ssl->heap, DYNAMIC_TYPE_SECRET);
  21079. if (ssl->arrays->preMasterSecret == NULL) {
  21080. ERROR_OUT(MEMORY_E, exit_scke);
  21081. }
  21082. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  21083. }
  21084. switch(ssl->specs.kea)
  21085. {
  21086. #ifndef NO_RSA
  21087. case rsa_kea:
  21088. {
  21089. /* build PreMasterSecret with RNG data */
  21090. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  21091. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  21092. if (tsip_useable(ssl)) {
  21093. ret = tsip_generatePremasterSecret(
  21094. &ssl->arrays->preMasterSecret[VERSION_SZ],
  21095. ENCRYPT_LEN - VERSION_SZ);
  21096. } else {
  21097. #endif
  21098. ret = wc_RNG_GenerateBlock(ssl->rng,
  21099. &ssl->arrays->preMasterSecret[VERSION_SZ],
  21100. SECRET_LEN - VERSION_SZ);
  21101. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  21102. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  21103. }
  21104. #endif
  21105. if (ret != 0) {
  21106. goto exit_scke;
  21107. }
  21108. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  21109. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  21110. ssl->arrays->preMasterSz = SECRET_LEN;
  21111. break;
  21112. }
  21113. #endif /* !NO_RSA */
  21114. #ifndef NO_DH
  21115. case diffie_hellman_kea:
  21116. {
  21117. ssl->buffers.sig.length = ENCRYPT_LEN;
  21118. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  21119. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21120. if (ssl->buffers.sig.buffer == NULL) {
  21121. ERROR_OUT(MEMORY_E, exit_scke);
  21122. }
  21123. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  21124. (void**)&ssl->buffers.serverDH_Key);
  21125. if (ret != 0) {
  21126. goto exit_scke;
  21127. }
  21128. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  21129. !defined(WOLFSSL_OLD_PRIME_CHECK)
  21130. if (ssl->options.dhDoKeyTest &&
  21131. !ssl->options.dhKeyTested)
  21132. {
  21133. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  21134. ssl->buffers.serverDH_P.buffer,
  21135. ssl->buffers.serverDH_P.length,
  21136. ssl->buffers.serverDH_G.buffer,
  21137. ssl->buffers.serverDH_G.length,
  21138. NULL, 0, 0, ssl->rng);
  21139. if (ret != 0) {
  21140. goto exit_scke;
  21141. }
  21142. ssl->options.dhKeyTested = 1;
  21143. }
  21144. else
  21145. #endif
  21146. {
  21147. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  21148. ssl->buffers.serverDH_P.buffer,
  21149. ssl->buffers.serverDH_P.length,
  21150. ssl->buffers.serverDH_G.buffer,
  21151. ssl->buffers.serverDH_G.length);
  21152. if (ret != 0) {
  21153. goto exit_scke;
  21154. }
  21155. }
  21156. /* for DH, encSecret is Yc, agree is pre-master */
  21157. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  21158. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  21159. args->encSecret, &args->encSz);
  21160. /* set the max agree result size */
  21161. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  21162. break;
  21163. }
  21164. #endif /* !NO_DH */
  21165. #ifndef NO_PSK
  21166. case psk_kea:
  21167. {
  21168. byte* pms = ssl->arrays->preMasterSecret;
  21169. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  21170. ssl->arrays->server_hint, ssl->arrays->client_identity,
  21171. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  21172. if (ssl->arrays->psk_keySz == 0 ||
  21173. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  21174. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  21175. }
  21176. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  21177. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  21178. if (args->encSz > MAX_PSK_ID_LEN) {
  21179. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  21180. }
  21181. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  21182. args->encSz);
  21183. /* make psk pre master secret */
  21184. /* length of key + length 0s + length of key + key */
  21185. c16toa((word16)ssl->arrays->psk_keySz, pms);
  21186. pms += OPAQUE16_LEN;
  21187. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  21188. pms += ssl->arrays->psk_keySz;
  21189. c16toa((word16)ssl->arrays->psk_keySz, pms);
  21190. pms += OPAQUE16_LEN;
  21191. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21192. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
  21193. (2 * OPAQUE16_LEN);
  21194. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21195. ssl->arrays->psk_keySz = 0; /* No further need */
  21196. break;
  21197. }
  21198. #endif /* !NO_PSK */
  21199. #if !defined(NO_DH) && !defined(NO_PSK)
  21200. case dhe_psk_kea:
  21201. {
  21202. word32 esSz = 0;
  21203. args->output = args->encSecret;
  21204. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  21205. ssl->arrays->server_hint, ssl->arrays->client_identity,
  21206. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  21207. if (ssl->arrays->psk_keySz == 0 ||
  21208. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  21209. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  21210. }
  21211. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  21212. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  21213. if (esSz > MAX_PSK_ID_LEN) {
  21214. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  21215. }
  21216. ssl->buffers.sig.length = ENCRYPT_LEN;
  21217. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  21218. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21219. if (ssl->buffers.sig.buffer == NULL) {
  21220. ERROR_OUT(MEMORY_E, exit_scke);
  21221. }
  21222. c16toa((word16)esSz, args->output);
  21223. args->output += OPAQUE16_LEN;
  21224. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  21225. args->output += esSz;
  21226. args->length = args->encSz - esSz - OPAQUE16_LEN;
  21227. args->encSz = esSz + OPAQUE16_LEN;
  21228. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  21229. (void**)&ssl->buffers.serverDH_Key);
  21230. if (ret != 0) {
  21231. goto exit_scke;
  21232. }
  21233. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  21234. !defined(WOLFSSL_OLD_PRIME_CHECK)
  21235. if (ssl->options.dhDoKeyTest &&
  21236. !ssl->options.dhKeyTested)
  21237. {
  21238. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  21239. ssl->buffers.serverDH_P.buffer,
  21240. ssl->buffers.serverDH_P.length,
  21241. ssl->buffers.serverDH_G.buffer,
  21242. ssl->buffers.serverDH_G.length,
  21243. NULL, 0, 0, ssl->rng);
  21244. if (ret != 0) {
  21245. goto exit_scke;
  21246. }
  21247. ssl->options.dhKeyTested = 1;
  21248. }
  21249. else
  21250. #endif
  21251. {
  21252. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  21253. ssl->buffers.serverDH_P.buffer,
  21254. ssl->buffers.serverDH_P.length,
  21255. ssl->buffers.serverDH_G.buffer,
  21256. ssl->buffers.serverDH_G.length);
  21257. if (ret != 0) {
  21258. goto exit_scke;
  21259. }
  21260. }
  21261. /* for DH, encSecret is Yc, agree is pre-master */
  21262. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  21263. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  21264. args->output + OPAQUE16_LEN, &args->length);
  21265. break;
  21266. }
  21267. #endif /* !NO_DH && !NO_PSK */
  21268. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21269. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  21270. case ecdhe_psk_kea:
  21271. {
  21272. word32 esSz = 0;
  21273. args->output = args->encSecret;
  21274. /* Send PSK client identity */
  21275. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  21276. ssl->arrays->server_hint, ssl->arrays->client_identity,
  21277. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  21278. if (ssl->arrays->psk_keySz == 0 ||
  21279. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  21280. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  21281. }
  21282. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  21283. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  21284. if (esSz > MAX_PSK_ID_LEN) {
  21285. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  21286. }
  21287. /* place size and identity in output buffer sz:identity */
  21288. c16toa((word16)esSz, args->output);
  21289. args->output += OPAQUE16_LEN;
  21290. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  21291. args->output += esSz;
  21292. args->encSz = esSz + OPAQUE16_LEN;
  21293. /* length is used for public key size */
  21294. args->length = MAX_ENCRYPT_SZ;
  21295. /* Create shared ECC key leaving room at the beginning
  21296. of buffer for size of shared key. */
  21297. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  21298. #ifdef HAVE_CURVE25519
  21299. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  21300. #ifdef HAVE_PK_CALLBACKS
  21301. /* if callback then use it for shared secret */
  21302. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  21303. break;
  21304. }
  21305. #endif
  21306. ret = wc_curve25519_export_public_ex(
  21307. (curve25519_key*)ssl->hsKey,
  21308. args->output + OPAQUE8_LEN, &args->length,
  21309. EC25519_LITTLE_ENDIAN);
  21310. if (ret != 0) {
  21311. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  21312. }
  21313. break;
  21314. }
  21315. #endif
  21316. #ifdef HAVE_CURVE448
  21317. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  21318. #ifdef HAVE_PK_CALLBACKS
  21319. /* if callback then use it for shared secret */
  21320. if (ssl->ctx->X448SharedSecretCb != NULL) {
  21321. break;
  21322. }
  21323. #endif
  21324. ret = wc_curve448_export_public_ex(
  21325. (curve448_key*)ssl->hsKey,
  21326. args->output + OPAQUE8_LEN, &args->length,
  21327. EC448_LITTLE_ENDIAN);
  21328. if (ret != 0) {
  21329. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  21330. }
  21331. break;
  21332. }
  21333. #endif
  21334. #ifdef HAVE_PK_CALLBACKS
  21335. /* if callback then use it for shared secret */
  21336. if (ssl->ctx->EccSharedSecretCb != NULL) {
  21337. break;
  21338. }
  21339. #endif
  21340. /* Place ECC key in output buffer, leaving room for size */
  21341. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  21342. args->output + OPAQUE8_LEN, &args->length);
  21343. if (ret != 0) {
  21344. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  21345. }
  21346. break;
  21347. }
  21348. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  21349. #ifdef HAVE_NTRU
  21350. case ntru_kea:
  21351. {
  21352. ret = wc_RNG_GenerateBlock(ssl->rng,
  21353. ssl->arrays->preMasterSecret, SECRET_LEN);
  21354. if (ret != 0) {
  21355. goto exit_scke;
  21356. }
  21357. ssl->arrays->preMasterSz = SECRET_LEN;
  21358. args->encSz = MAX_ENCRYPT_SZ;
  21359. break;
  21360. }
  21361. #endif /* HAVE_NTRU */
  21362. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21363. defined(HAVE_CURVE448)
  21364. case ecc_diffie_hellman_kea:
  21365. {
  21366. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  21367. #ifdef HAVE_CURVE25519
  21368. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  21369. #ifdef HAVE_PK_CALLBACKS
  21370. /* if callback then use it for shared secret */
  21371. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  21372. break;
  21373. }
  21374. #endif
  21375. ret = wc_curve25519_export_public_ex(
  21376. (curve25519_key*)ssl->hsKey,
  21377. args->encSecret + OPAQUE8_LEN, &args->encSz,
  21378. EC25519_LITTLE_ENDIAN);
  21379. if (ret != 0) {
  21380. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  21381. }
  21382. break;
  21383. }
  21384. #endif
  21385. #ifdef HAVE_CURVE448
  21386. if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
  21387. #ifdef HAVE_PK_CALLBACKS
  21388. /* if callback then use it for shared secret */
  21389. if (ssl->ctx->X448SharedSecretCb != NULL) {
  21390. break;
  21391. }
  21392. #endif
  21393. ret = wc_curve448_export_public_ex(
  21394. (curve448_key*)ssl->hsKey,
  21395. args->encSecret + OPAQUE8_LEN, &args->encSz,
  21396. EC448_LITTLE_ENDIAN);
  21397. if (ret != 0) {
  21398. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  21399. }
  21400. break;
  21401. }
  21402. #endif
  21403. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  21404. #ifdef HAVE_PK_CALLBACKS
  21405. /* if callback then use it for shared secret */
  21406. if (ssl->ctx->EccSharedSecretCb != NULL) {
  21407. break;
  21408. }
  21409. #endif
  21410. /* Place ECC key in buffer, leaving room for size */
  21411. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  21412. args->encSecret + OPAQUE8_LEN, &args->encSz);
  21413. if (ret != 0) {
  21414. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  21415. }
  21416. #endif /* HAVE_ECC */
  21417. break;
  21418. }
  21419. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  21420. default:
  21421. ret = BAD_KEA_TYPE_E;
  21422. } /* switch(ssl->specs.kea) */
  21423. /* Check for error */
  21424. if (ret != 0) {
  21425. goto exit_scke;
  21426. }
  21427. /* Advance state and proceed */
  21428. ssl->options.asyncState = TLS_ASYNC_DO;
  21429. } /* case TLS_ASYNC_BUILD */
  21430. FALL_THROUGH;
  21431. case TLS_ASYNC_DO:
  21432. {
  21433. switch(ssl->specs.kea)
  21434. {
  21435. #ifndef NO_RSA
  21436. case rsa_kea:
  21437. {
  21438. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  21439. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  21440. if (tsip_useable(ssl) &&
  21441. wc_RsaEncryptSize(ssl->peerRsaKey) == 256) {
  21442. ret = tsip_generateEncryptPreMasterSecret(ssl,
  21443. args->encSecret,
  21444. &args->encSz);
  21445. } else
  21446. #endif
  21447. ret = RsaEnc(ssl,
  21448. ssl->arrays->preMasterSecret, SECRET_LEN,
  21449. args->encSecret, &args->encSz,
  21450. ssl->peerRsaKey,
  21451. #if defined(HAVE_PK_CALLBACKS)
  21452. &ssl->buffers.peerRsaKey
  21453. #else
  21454. NULL
  21455. #endif
  21456. );
  21457. break;
  21458. }
  21459. #endif /* !NO_RSA */
  21460. #ifndef NO_DH
  21461. case diffie_hellman_kea:
  21462. {
  21463. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  21464. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  21465. ssl->buffers.serverDH_Pub.buffer,
  21466. ssl->buffers.serverDH_Pub.length,
  21467. ssl->arrays->preMasterSecret,
  21468. &ssl->arrays->preMasterSz);
  21469. break;
  21470. }
  21471. #endif /* !NO_DH */
  21472. #ifndef NO_PSK
  21473. case psk_kea:
  21474. {
  21475. break;
  21476. }
  21477. #endif /* !NO_PSK */
  21478. #if !defined(NO_DH) && !defined(NO_PSK)
  21479. case dhe_psk_kea:
  21480. {
  21481. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  21482. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  21483. ssl->buffers.serverDH_Pub.buffer,
  21484. ssl->buffers.serverDH_Pub.length,
  21485. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  21486. &ssl->arrays->preMasterSz);
  21487. break;
  21488. }
  21489. #endif /* !NO_DH && !NO_PSK */
  21490. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21491. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  21492. case ecdhe_psk_kea:
  21493. {
  21494. #ifdef HAVE_CURVE25519
  21495. if (ssl->peerX25519KeyPresent) {
  21496. ret = X25519SharedSecret(ssl,
  21497. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  21498. args->output + OPAQUE8_LEN, &args->length,
  21499. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  21500. &ssl->arrays->preMasterSz,
  21501. WOLFSSL_CLIENT_END
  21502. );
  21503. if (!ssl->specs.static_ecdh
  21504. #ifdef WOLFSSL_ASYNC_CRYPT
  21505. && ret != WC_PENDING_E
  21506. #endif
  21507. ) {
  21508. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  21509. (void**)&ssl->peerX25519Key);
  21510. ssl->peerX25519KeyPresent = 0;
  21511. }
  21512. break;
  21513. }
  21514. #endif
  21515. #ifdef HAVE_CURVE448
  21516. if (ssl->peerX448KeyPresent) {
  21517. ret = X448SharedSecret(ssl,
  21518. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  21519. args->output + OPAQUE8_LEN, &args->length,
  21520. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  21521. &ssl->arrays->preMasterSz,
  21522. WOLFSSL_CLIENT_END
  21523. );
  21524. if (!ssl->specs.static_ecdh
  21525. #ifdef WOLFSSL_ASYNC_CRYPT
  21526. && ret != WC_PENDING_E
  21527. #endif
  21528. ) {
  21529. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  21530. (void**)&ssl->peerX448Key);
  21531. ssl->peerX448KeyPresent = 0;
  21532. }
  21533. break;
  21534. }
  21535. #endif
  21536. ret = EccSharedSecret(ssl,
  21537. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  21538. args->output + OPAQUE8_LEN, &args->length,
  21539. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  21540. &ssl->arrays->preMasterSz,
  21541. WOLFSSL_CLIENT_END
  21542. );
  21543. #ifdef WOLFSSL_ASYNC_CRYPT
  21544. if (ret != WC_PENDING_E)
  21545. #endif
  21546. {
  21547. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  21548. (void**)&ssl->peerEccKey);
  21549. ssl->peerEccKeyPresent = 0;
  21550. }
  21551. break;
  21552. }
  21553. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  21554. #ifdef HAVE_NTRU
  21555. case ntru_kea:
  21556. {
  21557. word32 rc;
  21558. word16 tmpEncSz = (word16)args->encSz;
  21559. DRBG_HANDLE drbg;
  21560. rc = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  21561. if (rc != DRBG_OK) {
  21562. ERROR_OUT(NTRU_DRBG_ERROR, exit_scke);
  21563. }
  21564. rc = ntru_crypto_ntru_encrypt(drbg, ssl->peerNtruKeyLen,
  21565. ssl->peerNtruKey,
  21566. ssl->arrays->preMasterSz,
  21567. ssl->arrays->preMasterSecret,
  21568. &tmpEncSz,
  21569. args->encSecret);
  21570. args->encSz = tmpEncSz;
  21571. ntru_crypto_drbg_uninstantiate(drbg);
  21572. if (rc != NTRU_OK) {
  21573. ERROR_OUT(NTRU_ENCRYPT_ERROR, exit_scke);
  21574. }
  21575. ret = 0;
  21576. break;
  21577. }
  21578. #endif /* HAVE_NTRU */
  21579. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21580. defined(HAVE_CURVE448)
  21581. case ecc_diffie_hellman_kea:
  21582. {
  21583. #ifdef HAVE_ECC
  21584. ecc_key* peerKey;
  21585. #endif
  21586. #ifdef HAVE_CURVE25519
  21587. if (ssl->peerX25519KeyPresent) {
  21588. ret = X25519SharedSecret(ssl,
  21589. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  21590. args->encSecret + OPAQUE8_LEN, &args->encSz,
  21591. ssl->arrays->preMasterSecret,
  21592. &ssl->arrays->preMasterSz,
  21593. WOLFSSL_CLIENT_END
  21594. );
  21595. if (!ssl->specs.static_ecdh
  21596. #ifdef WOLFSSL_ASYNC_CRYPT
  21597. && ret != WC_PENDING_E
  21598. #endif
  21599. ) {
  21600. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  21601. (void**)&ssl->peerX25519Key);
  21602. ssl->peerX25519KeyPresent = 0;
  21603. }
  21604. break;
  21605. }
  21606. #endif
  21607. #ifdef HAVE_CURVE448
  21608. if (ssl->peerX448KeyPresent) {
  21609. ret = X448SharedSecret(ssl,
  21610. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  21611. args->encSecret + OPAQUE8_LEN, &args->encSz,
  21612. ssl->arrays->preMasterSecret,
  21613. &ssl->arrays->preMasterSz,
  21614. WOLFSSL_CLIENT_END
  21615. );
  21616. if (!ssl->specs.static_ecdh
  21617. #ifdef WOLFSSL_ASYNC_CRYPT
  21618. && ret != WC_PENDING_E
  21619. #endif
  21620. ) {
  21621. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  21622. (void**)&ssl->peerX448Key);
  21623. ssl->peerX448KeyPresent = 0;
  21624. }
  21625. break;
  21626. }
  21627. #endif
  21628. #ifdef HAVE_ECC
  21629. peerKey = (ssl->specs.static_ecdh) ?
  21630. ssl->peerEccDsaKey : ssl->peerEccKey;
  21631. ret = EccSharedSecret(ssl,
  21632. (ecc_key*)ssl->hsKey, peerKey,
  21633. args->encSecret + OPAQUE8_LEN, &args->encSz,
  21634. ssl->arrays->preMasterSecret,
  21635. &ssl->arrays->preMasterSz,
  21636. WOLFSSL_CLIENT_END
  21637. );
  21638. if (!ssl->specs.static_ecdh
  21639. #ifdef WOLFSSL_ASYNC_CRYPT
  21640. && ret != WC_PENDING_E
  21641. #endif
  21642. && !ssl->options.keepResources) {
  21643. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  21644. (void**)&ssl->peerEccKey);
  21645. ssl->peerEccKeyPresent = 0;
  21646. }
  21647. #endif
  21648. break;
  21649. }
  21650. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  21651. default:
  21652. ret = BAD_KEA_TYPE_E;
  21653. } /* switch(ssl->specs.kea) */
  21654. /* Check for error */
  21655. if (ret != 0) {
  21656. goto exit_scke;
  21657. }
  21658. /* Advance state and proceed */
  21659. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  21660. } /* case TLS_ASYNC_DO */
  21661. FALL_THROUGH;
  21662. case TLS_ASYNC_VERIFY:
  21663. {
  21664. switch(ssl->specs.kea)
  21665. {
  21666. #ifndef NO_RSA
  21667. case rsa_kea:
  21668. {
  21669. break;
  21670. }
  21671. #endif /* !NO_RSA */
  21672. #ifndef NO_DH
  21673. case diffie_hellman_kea:
  21674. {
  21675. break;
  21676. }
  21677. #endif /* !NO_DH */
  21678. #ifndef NO_PSK
  21679. case psk_kea:
  21680. {
  21681. break;
  21682. }
  21683. #endif /* !NO_PSK */
  21684. #if !defined(NO_DH) && !defined(NO_PSK)
  21685. case dhe_psk_kea:
  21686. {
  21687. byte* pms = ssl->arrays->preMasterSecret;
  21688. /* validate args */
  21689. if (args->output == NULL || args->length == 0) {
  21690. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  21691. }
  21692. c16toa((word16)args->length, args->output);
  21693. args->encSz += args->length + OPAQUE16_LEN;
  21694. c16toa((word16)ssl->arrays->preMasterSz, pms);
  21695. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  21696. pms += ssl->arrays->preMasterSz;
  21697. /* make psk pre master secret */
  21698. /* length of key + length 0s + length of key + key */
  21699. c16toa((word16)ssl->arrays->psk_keySz, pms);
  21700. pms += OPAQUE16_LEN;
  21701. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21702. ssl->arrays->preMasterSz +=
  21703. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  21704. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21705. ssl->arrays->psk_keySz = 0; /* No further need */
  21706. break;
  21707. }
  21708. #endif /* !NO_DH && !NO_PSK */
  21709. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21710. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  21711. case ecdhe_psk_kea:
  21712. {
  21713. byte* pms = ssl->arrays->preMasterSecret;
  21714. /* validate args */
  21715. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  21716. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  21717. }
  21718. /* place size of public key in output buffer */
  21719. *args->output = (byte)args->length;
  21720. args->encSz += args->length + OPAQUE8_LEN;
  21721. /* Create pre master secret is the concatenation of
  21722. eccSize + eccSharedKey + pskSize + pskKey */
  21723. c16toa((word16)ssl->arrays->preMasterSz, pms);
  21724. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  21725. pms += ssl->arrays->preMasterSz;
  21726. c16toa((word16)ssl->arrays->psk_keySz, pms);
  21727. pms += OPAQUE16_LEN;
  21728. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21729. ssl->arrays->preMasterSz +=
  21730. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  21731. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21732. ssl->arrays->psk_keySz = 0; /* No further need */
  21733. break;
  21734. }
  21735. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  21736. #ifdef HAVE_NTRU
  21737. case ntru_kea:
  21738. {
  21739. break;
  21740. }
  21741. #endif /* HAVE_NTRU */
  21742. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21743. defined(HAVE_CURVE448)
  21744. case ecc_diffie_hellman_kea:
  21745. {
  21746. /* place size of public key in buffer */
  21747. *args->encSecret = (byte)args->encSz;
  21748. args->encSz += OPAQUE8_LEN;
  21749. break;
  21750. }
  21751. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  21752. default:
  21753. ret = BAD_KEA_TYPE_E;
  21754. } /* switch(ssl->specs.kea) */
  21755. /* Check for error */
  21756. if (ret != 0) {
  21757. goto exit_scke;
  21758. }
  21759. /* Advance state and proceed */
  21760. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  21761. } /* case TLS_ASYNC_VERIFY */
  21762. FALL_THROUGH;
  21763. case TLS_ASYNC_FINALIZE:
  21764. {
  21765. word32 tlsSz = 0;
  21766. word32 idx = 0;
  21767. #ifdef HAVE_QSH
  21768. word32 qshSz = 0;
  21769. if (ssl->peerQSHKeyPresent) {
  21770. qshSz = QSH_KeyGetSize(ssl);
  21771. }
  21772. #endif
  21773. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  21774. tlsSz = 2;
  21775. }
  21776. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  21777. ssl->specs.kea == dhe_psk_kea ||
  21778. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  21779. tlsSz = 0;
  21780. }
  21781. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  21782. args->sendSz = args->encSz + tlsSz + idx;
  21783. #ifdef WOLFSSL_DTLS
  21784. if (ssl->options.dtls) {
  21785. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  21786. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  21787. }
  21788. #endif
  21789. if (IsEncryptionOn(ssl, 1)) {
  21790. args->sendSz += MAX_MSG_EXTRA;
  21791. }
  21792. #ifdef HAVE_QSH
  21793. args->encSz += qshSz;
  21794. args->sendSz += qshSz;
  21795. #endif
  21796. /* check for available size */
  21797. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  21798. goto exit_scke;
  21799. }
  21800. /* get output buffer */
  21801. args->output = ssl->buffers.outputBuffer.buffer +
  21802. ssl->buffers.outputBuffer.length;
  21803. #ifdef HAVE_QSH
  21804. if (ssl->peerQSHKeyPresent) {
  21805. byte idxSave = idx;
  21806. idx = args->sendSz - qshSz;
  21807. if (QSH_KeyExchangeWrite(ssl, 0) != 0) {
  21808. ERROR_OUT(MEMORY_E, exit_scke);
  21809. }
  21810. /* extension type */
  21811. c16toa(TLSX_QUANTUM_SAFE_HYBRID, args->output + idx);
  21812. idx += OPAQUE16_LEN;
  21813. /* write to output and check amount written */
  21814. if (TLSX_QSHPK_Write(ssl->QSH_secret->list,
  21815. args->output + idx) > qshSz - OPAQUE16_LEN) {
  21816. ERROR_OUT(MEMORY_E, exit_scke);
  21817. }
  21818. idx = idxSave;
  21819. }
  21820. #endif
  21821. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  21822. #ifdef HAVE_QSH
  21823. if (ssl->peerQSHKeyPresent) {
  21824. args->encSz -= qshSz;
  21825. }
  21826. #endif
  21827. if (tlsSz) {
  21828. c16toa((word16)args->encSz, &args->output[idx]);
  21829. idx += OPAQUE16_LEN;
  21830. }
  21831. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  21832. idx += args->encSz;
  21833. if (IsEncryptionOn(ssl, 1)) {
  21834. int recordHeaderSz = RECORD_HEADER_SZ;
  21835. if (ssl->options.dtls)
  21836. recordHeaderSz += DTLS_RECORD_EXTRA;
  21837. args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
  21838. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  21839. DYNAMIC_TYPE_IN_BUFFER);
  21840. if (args->input == NULL) {
  21841. ERROR_OUT(MEMORY_E, exit_scke);
  21842. }
  21843. XMEMCPY(args->input, args->output + recordHeaderSz,
  21844. args->inputSz);
  21845. }
  21846. /* Advance state and proceed */
  21847. ssl->options.asyncState = TLS_ASYNC_END;
  21848. } /* case TLS_ASYNC_FINALIZE */
  21849. FALL_THROUGH;
  21850. case TLS_ASYNC_END:
  21851. {
  21852. if (IsEncryptionOn(ssl, 1)) {
  21853. #ifdef WOLFSSL_DTLS
  21854. if (IsDtlsNotSctpMode(ssl) &&
  21855. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
  21856. goto exit_scke;
  21857. }
  21858. #endif
  21859. ret = BuildMessage(ssl, args->output, args->sendSz,
  21860. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  21861. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21862. args->input = NULL; /* make sure its not double free'd on cleanup */
  21863. if (ret >= 0) {
  21864. args->sendSz = ret;
  21865. ret = 0;
  21866. }
  21867. }
  21868. else {
  21869. #ifdef WOLFSSL_DTLS
  21870. if (IsDtlsNotSctpMode(ssl)) {
  21871. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
  21872. goto exit_scke;
  21873. }
  21874. }
  21875. if (ssl->options.dtls)
  21876. DtlsSEQIncrement(ssl, CUR_ORDER);
  21877. #endif
  21878. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  21879. }
  21880. if (ret != 0) {
  21881. goto exit_scke;
  21882. }
  21883. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  21884. if (ssl->hsInfoOn)
  21885. AddPacketName(ssl, "ClientKeyExchange");
  21886. if (ssl->toInfoOn)
  21887. AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  21888. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  21889. #endif
  21890. ssl->buffers.outputBuffer.length += args->sendSz;
  21891. if (!ssl->options.groupMessages) {
  21892. ret = SendBuffered(ssl);
  21893. }
  21894. if (ret == 0 || ret == WANT_WRITE) {
  21895. int tmpRet = MakeMasterSecret(ssl);
  21896. if (tmpRet != 0) {
  21897. ret = tmpRet; /* save WANT_WRITE unless more serious */
  21898. }
  21899. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  21900. }
  21901. break;
  21902. }
  21903. default:
  21904. ret = INPUT_CASE_ERROR;
  21905. } /* switch(ssl->options.asyncState) */
  21906. exit_scke:
  21907. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  21908. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  21909. #ifdef WOLFSSL_ASYNC_CRYPT
  21910. /* Handle async operation */
  21911. if (ret == WC_PENDING_E)
  21912. return ret;
  21913. #endif
  21914. /* No further need for PMS */
  21915. if (ssl->arrays->preMasterSecret != NULL) {
  21916. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  21917. }
  21918. ssl->arrays->preMasterSz = 0;
  21919. /* Final cleanup */
  21920. FreeSckeArgs(ssl, args);
  21921. FreeKeyExchange(ssl);
  21922. return ret;
  21923. }
  21924. #endif /* !WOLFSSL_NO_TLS12 */
  21925. #ifndef NO_CERTS
  21926. #ifndef WOLFSSL_NO_TLS12
  21927. #ifndef WOLFSSL_NO_CLIENT_AUTH
  21928. typedef struct ScvArgs {
  21929. byte* output; /* not allocated */
  21930. #ifndef NO_RSA
  21931. byte* verifySig;
  21932. #endif
  21933. byte* verify; /* not allocated */
  21934. byte* input;
  21935. word32 idx;
  21936. word32 extraSz;
  21937. word32 sigSz;
  21938. int sendSz;
  21939. int inputSz;
  21940. word16 length;
  21941. byte sigAlgo;
  21942. } ScvArgs;
  21943. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  21944. {
  21945. ScvArgs* args = (ScvArgs*)pArgs;
  21946. (void)ssl;
  21947. #ifndef NO_RSA
  21948. if (args->verifySig) {
  21949. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21950. args->verifySig = NULL;
  21951. }
  21952. #endif
  21953. if (args->input) {
  21954. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21955. args->input = NULL;
  21956. }
  21957. }
  21958. /* handle generation of certificate_verify (15) */
  21959. int SendCertificateVerify(WOLFSSL* ssl)
  21960. {
  21961. int ret = 0;
  21962. #ifdef WOLFSSL_ASYNC_CRYPT
  21963. ScvArgs* args = (ScvArgs*)ssl->async.args;
  21964. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  21965. (void)sizeof(args_test);
  21966. #else
  21967. ScvArgs args[1];
  21968. #endif
  21969. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  21970. WOLFSSL_ENTER("SendCertificateVerify");
  21971. #ifdef WOLFSSL_ASYNC_CRYPT
  21972. /* BuildMessage does its own Pop */
  21973. if (ssl->error != WC_PENDING_E ||
  21974. ssl->options.asyncState != TLS_ASYNC_END)
  21975. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  21976. if (ret != WC_NOT_PENDING_E) {
  21977. /* Check for error */
  21978. if (ret < 0)
  21979. goto exit_scv;
  21980. }
  21981. else
  21982. #endif
  21983. {
  21984. /* Reset state */
  21985. ret = 0;
  21986. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  21987. XMEMSET(args, 0, sizeof(ScvArgs));
  21988. #ifdef WOLFSSL_ASYNC_CRYPT
  21989. ssl->async.freeArgs = FreeScvArgs;
  21990. #endif
  21991. }
  21992. switch(ssl->options.asyncState)
  21993. {
  21994. case TLS_ASYNC_BEGIN:
  21995. {
  21996. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  21997. return 0; /* sent blank cert, can't verify */
  21998. }
  21999. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  22000. if (IsEncryptionOn(ssl, 1)) {
  22001. args->sendSz += MAX_MSG_EXTRA;
  22002. }
  22003. /* Use tmp buffer */
  22004. args->input = (byte*)XMALLOC(args->sendSz,
  22005. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22006. if (args->input == NULL)
  22007. ERROR_OUT(MEMORY_E, exit_scv);
  22008. args->output = args->input;
  22009. /* Advance state and proceed */
  22010. ssl->options.asyncState = TLS_ASYNC_BUILD;
  22011. } /* case TLS_ASYNC_BEGIN */
  22012. FALL_THROUGH;
  22013. case TLS_ASYNC_BUILD:
  22014. {
  22015. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  22016. if (ret != 0) {
  22017. goto exit_scv;
  22018. }
  22019. if (ssl->buffers.key == NULL) {
  22020. #ifdef HAVE_PK_CALLBACKS
  22021. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  22022. args->length = GetPrivateKeySigSize(ssl);
  22023. else
  22024. #endif
  22025. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  22026. }
  22027. else {
  22028. /* Decode private key. */
  22029. ret = DecodePrivateKey(ssl, &args->length);
  22030. if (ret != 0) {
  22031. goto exit_scv;
  22032. }
  22033. }
  22034. if (args->length == 0) {
  22035. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  22036. }
  22037. /* idx is used to track verify pointer offset to output */
  22038. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22039. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  22040. args->extraSz = 0; /* tls 1.2 hash/sig */
  22041. /* build encoded signature buffer */
  22042. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  22043. ssl->buffers.sig.buffer = (byte*)XMALLOC(ssl->buffers.sig.length,
  22044. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22045. if (ssl->buffers.sig.buffer == NULL) {
  22046. ERROR_OUT(MEMORY_E, exit_scv);
  22047. }
  22048. #ifdef WOLFSSL_DTLS
  22049. if (ssl->options.dtls) {
  22050. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22051. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22052. }
  22053. #endif
  22054. #ifndef NO_OLD_TLS
  22055. #ifndef NO_SHA
  22056. /* old tls default */
  22057. SetDigest(ssl, sha_mac);
  22058. #endif
  22059. #else
  22060. #ifndef NO_SHA256
  22061. /* new tls default */
  22062. SetDigest(ssl, sha256_mac);
  22063. #endif
  22064. #endif /* !NO_OLD_TLS */
  22065. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  22066. #ifdef WC_RSA_PSS
  22067. if (IsAtLeastTLSv1_2(ssl) &&
  22068. (ssl->pssAlgo & (1 << ssl->suites->hashAlgo))) {
  22069. args->sigAlgo = rsa_pss_sa_algo;
  22070. }
  22071. else
  22072. #endif
  22073. args->sigAlgo = rsa_sa_algo;
  22074. }
  22075. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  22076. args->sigAlgo = ecc_dsa_sa_algo;
  22077. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  22078. args->sigAlgo = ed25519_sa_algo;
  22079. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  22080. args->sigAlgo = ed448_sa_algo;
  22081. if (IsAtLeastTLSv1_2(ssl)) {
  22082. EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo,
  22083. args->verify);
  22084. args->extraSz = HASH_SIG_SIZE;
  22085. SetDigest(ssl, ssl->suites->hashAlgo);
  22086. }
  22087. #ifndef NO_OLD_TLS
  22088. else {
  22089. /* if old TLS load MD5 and SHA hash as value to sign */
  22090. XMEMCPY(ssl->buffers.sig.buffer,
  22091. (byte*)ssl->hsHashes->certHashes.md5, FINISHED_SZ);
  22092. }
  22093. #endif
  22094. #ifndef NO_RSA
  22095. if (args->sigAlgo == rsa_sa_algo) {
  22096. ssl->buffers.sig.length = FINISHED_SZ;
  22097. args->sigSz = ENCRYPT_LEN;
  22098. if (IsAtLeastTLSv1_2(ssl)) {
  22099. ssl->buffers.sig.length = wc_EncodeSignature(
  22100. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  22101. ssl->buffers.digest.length,
  22102. TypeHash(ssl->suites->hashAlgo));
  22103. }
  22104. /* prepend hdr */
  22105. c16toa(args->length, args->verify + args->extraSz);
  22106. }
  22107. #ifdef WC_RSA_PSS
  22108. else if (args->sigAlgo == rsa_pss_sa_algo) {
  22109. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  22110. ssl->buffers.digest.length);
  22111. ssl->buffers.sig.length = ssl->buffers.digest.length;
  22112. args->sigSz = ENCRYPT_LEN;
  22113. /* prepend hdr */
  22114. c16toa(args->length, args->verify + args->extraSz);
  22115. }
  22116. #endif
  22117. #endif /* !NO_RSA */
  22118. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  22119. if (args->sigAlgo == ed25519_sa_algo) {
  22120. ret = Ed25519CheckPubKey(ssl);
  22121. if (ret != 0)
  22122. goto exit_scv;
  22123. }
  22124. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  22125. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  22126. if (args->sigAlgo == ed448_sa_algo) {
  22127. ret = Ed448CheckPubKey(ssl);
  22128. if (ret != 0)
  22129. goto exit_scv;
  22130. }
  22131. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  22132. /* Advance state and proceed */
  22133. ssl->options.asyncState = TLS_ASYNC_DO;
  22134. } /* case TLS_ASYNC_BUILD */
  22135. FALL_THROUGH;
  22136. case TLS_ASYNC_DO:
  22137. {
  22138. #ifdef HAVE_ECC
  22139. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  22140. ecc_key* key = (ecc_key*)ssl->hsKey;
  22141. ret = EccSign(ssl,
  22142. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  22143. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  22144. key,
  22145. #ifdef HAVE_PK_CALLBACKS
  22146. ssl->buffers.key
  22147. #else
  22148. NULL
  22149. #endif
  22150. );
  22151. }
  22152. #endif /* HAVE_ECC */
  22153. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  22154. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  22155. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  22156. ret = Ed25519Sign(ssl,
  22157. ssl->hsHashes->messages, ssl->hsHashes->length,
  22158. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  22159. key,
  22160. #ifdef HAVE_PK_CALLBACKS
  22161. ssl->buffers.key
  22162. #else
  22163. NULL
  22164. #endif
  22165. );
  22166. }
  22167. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  22168. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  22169. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  22170. ed448_key* key = (ed448_key*)ssl->hsKey;
  22171. ret = Ed448Sign(ssl,
  22172. ssl->hsHashes->messages, ssl->hsHashes->length,
  22173. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  22174. key,
  22175. #ifdef HAVE_PK_CALLBACKS
  22176. ssl->buffers.key
  22177. #else
  22178. NULL
  22179. #endif
  22180. );
  22181. }
  22182. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  22183. #ifndef NO_RSA
  22184. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  22185. RsaKey* key = (RsaKey*)ssl->hsKey;
  22186. /* restore verify pointer */
  22187. args->verify = &args->output[args->idx];
  22188. ret = RsaSign(ssl,
  22189. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  22190. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  22191. args->sigAlgo, ssl->suites->hashAlgo, key,
  22192. ssl->buffers.key
  22193. );
  22194. }
  22195. #endif /* !NO_RSA */
  22196. /* Check for error */
  22197. if (ret != 0) {
  22198. goto exit_scv;
  22199. }
  22200. /* Advance state and proceed */
  22201. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  22202. } /* case TLS_ASYNC_DO */
  22203. FALL_THROUGH;
  22204. case TLS_ASYNC_VERIFY:
  22205. {
  22206. /* restore verify pointer */
  22207. args->verify = &args->output[args->idx];
  22208. switch (ssl->hsType) {
  22209. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  22210. #ifdef HAVE_ECC
  22211. case DYNAMIC_TYPE_ECC:
  22212. #endif
  22213. #ifdef HAVE_ED25519
  22214. case DYNAMIC_TYPE_ED25519:
  22215. #endif
  22216. #ifdef HAVE_ED448
  22217. case DYNAMIC_TYPE_ED448:
  22218. #endif
  22219. args->length = (word16)ssl->buffers.sig.length;
  22220. /* prepend hdr */
  22221. c16toa(args->length, args->verify + args->extraSz);
  22222. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  22223. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  22224. break;
  22225. #endif
  22226. #ifndef NO_RSA
  22227. case DYNAMIC_TYPE_RSA:
  22228. {
  22229. RsaKey* key = (RsaKey*)ssl->hsKey;
  22230. if (args->verifySig == NULL) {
  22231. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  22232. DYNAMIC_TYPE_SIGNATURE);
  22233. if (args->verifySig == NULL) {
  22234. ERROR_OUT(MEMORY_E, exit_scv);
  22235. }
  22236. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  22237. VERIFY_HEADER, args->sigSz);
  22238. }
  22239. /* check for signature faults */
  22240. ret = VerifyRsaSign(ssl,
  22241. args->verifySig, args->sigSz,
  22242. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  22243. args->sigAlgo, ssl->suites->hashAlgo, key,
  22244. ssl->buffers.key
  22245. );
  22246. break;
  22247. }
  22248. #endif /* !NO_RSA */
  22249. default:
  22250. break;
  22251. }
  22252. /* Check for error */
  22253. if (ret != 0) {
  22254. goto exit_scv;
  22255. }
  22256. /* Advance state and proceed */
  22257. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  22258. } /* case TLS_ASYNC_VERIFY */
  22259. FALL_THROUGH;
  22260. case TLS_ASYNC_FINALIZE:
  22261. {
  22262. if (args->output == NULL) {
  22263. ERROR_OUT(BUFFER_ERROR, exit_scv);
  22264. }
  22265. AddHeaders(args->output, (word32)args->length + args->extraSz +
  22266. VERIFY_HEADER, certificate_verify, ssl);
  22267. /* Advance state and proceed */
  22268. ssl->options.asyncState = TLS_ASYNC_END;
  22269. } /* case TLS_ASYNC_FINALIZE */
  22270. FALL_THROUGH;
  22271. case TLS_ASYNC_END:
  22272. {
  22273. ret = SendHandshakeMsg(ssl, args->output, (word32)args->length + args->extraSz +
  22274. VERIFY_HEADER, certificate_verify, "CertificateVerify");
  22275. if (ret != 0)
  22276. goto exit_scv;
  22277. break;
  22278. }
  22279. default:
  22280. ret = INPUT_CASE_ERROR;
  22281. } /* switch(ssl->options.asyncState) */
  22282. exit_scv:
  22283. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  22284. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  22285. #ifdef WOLFSSL_ASYNC_CRYPT
  22286. /* Handle async operation */
  22287. if (ret == WC_PENDING_E) {
  22288. return ret;
  22289. }
  22290. #endif /* WOLFSSL_ASYNC_CRYPT */
  22291. /* Digest is not allocated, so do this to prevent free */
  22292. ssl->buffers.digest.buffer = NULL;
  22293. ssl->buffers.digest.length = 0;
  22294. /* Final cleanup */
  22295. FreeScvArgs(ssl, args);
  22296. FreeKeyExchange(ssl);
  22297. return ret;
  22298. }
  22299. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  22300. #endif /* WOLFSSL_NO_TLS12 */
  22301. #endif /* NO_CERTS */
  22302. #ifdef HAVE_SESSION_TICKET
  22303. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  22304. {
  22305. /* Free old dynamic ticket if we already had one */
  22306. if (ssl->session.isDynamic) {
  22307. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  22308. ssl->session.ticket = ssl->session.staticTicket;
  22309. ssl->session.isDynamic = 0;
  22310. }
  22311. if (length > sizeof(ssl->session.staticTicket)) {
  22312. byte* sessionTicket =
  22313. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  22314. if (sessionTicket == NULL)
  22315. return MEMORY_E;
  22316. ssl->session.ticket = sessionTicket;
  22317. ssl->session.isDynamic = 1;
  22318. }
  22319. ssl->session.ticketLen = (word16)length;
  22320. if (length > 0) {
  22321. XMEMCPY(ssl->session.ticket, ticket, length);
  22322. if (ssl->session_ticket_cb != NULL) {
  22323. ssl->session_ticket_cb(ssl,
  22324. ssl->session.ticket, ssl->session.ticketLen,
  22325. ssl->session_ticket_ctx);
  22326. }
  22327. /* Create a fake sessionID based on the ticket, this will
  22328. * supersede the existing session cache info. */
  22329. ssl->options.haveSessionId = 1;
  22330. #ifdef WOLFSSL_TLS13
  22331. if (ssl->options.tls1_3) {
  22332. XMEMCPY(ssl->session.sessionID,
  22333. ssl->session.ticket + length - ID_LEN, ID_LEN);
  22334. }
  22335. else
  22336. #endif
  22337. XMEMCPY(ssl->arrays->sessionID,
  22338. ssl->session.ticket + length - ID_LEN, ID_LEN);
  22339. }
  22340. return 0;
  22341. }
  22342. #ifndef WOLFSSL_NO_TLS12
  22343. /* handle processing of session_ticket (4) */
  22344. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  22345. word32 size)
  22346. {
  22347. word32 begin = *inOutIdx;
  22348. word32 lifetime;
  22349. word16 length;
  22350. int ret;
  22351. if (ssl->expect_session_ticket == 0) {
  22352. WOLFSSL_MSG("Unexpected session ticket");
  22353. return SESSION_TICKET_EXPECT_E;
  22354. }
  22355. if (OPAQUE32_LEN > size)
  22356. return BUFFER_ERROR;
  22357. ato32(input + *inOutIdx, &lifetime);
  22358. *inOutIdx += OPAQUE32_LEN;
  22359. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  22360. return BUFFER_ERROR;
  22361. ato16(input + *inOutIdx, &length);
  22362. *inOutIdx += OPAQUE16_LEN;
  22363. if ((*inOutIdx - begin) + length > size)
  22364. return BUFFER_ERROR;
  22365. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  22366. return ret;
  22367. *inOutIdx += length;
  22368. if (length > 0) {
  22369. ssl->timeout = lifetime;
  22370. #ifndef NO_SESSION_CACHE
  22371. AddSession(ssl);
  22372. #endif
  22373. }
  22374. if (IsEncryptionOn(ssl, 0)) {
  22375. *inOutIdx += ssl->keys.padSz;
  22376. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  22377. if (ssl->options.startedETMRead)
  22378. *inOutIdx += MacSize(ssl);
  22379. #endif
  22380. }
  22381. ssl->expect_session_ticket = 0;
  22382. return 0;
  22383. }
  22384. #endif /* !WOLFSSL_NO_TLS12 */
  22385. #endif /* HAVE_SESSION_TICKET */
  22386. #endif /* NO_WOLFSSL_CLIENT */
  22387. #ifndef NO_CERTS
  22388. #ifdef HAVE_PK_CALLBACKS
  22389. int GetPrivateKeySigSize(WOLFSSL* ssl)
  22390. {
  22391. int sigSz = 0;
  22392. if (ssl == NULL)
  22393. return 0;
  22394. switch (ssl->buffers.keyType) {
  22395. #ifndef NO_RSA
  22396. #ifdef WC_RSA_PSS
  22397. case rsa_pss_sa_algo:
  22398. #endif
  22399. case rsa_sa_algo:
  22400. sigSz = ssl->buffers.keySz;
  22401. ssl->hsType = DYNAMIC_TYPE_RSA;
  22402. break;
  22403. #endif
  22404. #ifdef HAVE_ECC
  22405. case ecc_dsa_sa_algo:
  22406. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  22407. ssl->hsType = DYNAMIC_TYPE_ECC;
  22408. break;
  22409. #endif
  22410. #ifdef HAVE_ED25519
  22411. case ed25519_sa_algo:
  22412. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  22413. ssl->hsType = DYNAMIC_TYPE_ED25519;
  22414. break;
  22415. #endif
  22416. #ifdef HAVE_ED448
  22417. case ed448_sa_algo:
  22418. sigSz = ED448_SIG_SIZE; /* fixed known value */
  22419. ssl->hsType = DYNAMIC_TYPE_ED448;
  22420. break;
  22421. #endif
  22422. default:
  22423. break;
  22424. }
  22425. return sigSz;
  22426. }
  22427. #endif /* HAVE_PK_CALLBACKS */
  22428. #endif /* NO_CERTS */
  22429. #ifdef HAVE_ECC
  22430. /* returns the WOLFSSL_* version of the curve from the OID sum */
  22431. word16 GetCurveByOID(int oidSum) {
  22432. switch(oidSum) {
  22433. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  22434. #ifndef NO_ECC_SECP
  22435. case ECC_SECP160R1_OID:
  22436. return WOLFSSL_ECC_SECP160R1;
  22437. #endif /* !NO_ECC_SECP */
  22438. #ifdef HAVE_ECC_SECPR2
  22439. case ECC_SECP160R2_OID:
  22440. return WOLFSSL_ECC_SECP160R2;
  22441. #endif /* HAVE_ECC_SECPR2 */
  22442. #ifdef HAVE_ECC_KOBLITZ
  22443. case ECC_SECP160K1_OID:
  22444. return WOLFSSL_ECC_SECP160K1;
  22445. #endif /* HAVE_ECC_KOBLITZ */
  22446. #endif
  22447. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  22448. #ifndef NO_ECC_SECP
  22449. case ECC_SECP192R1_OID:
  22450. return WOLFSSL_ECC_SECP192R1;
  22451. #endif /* !NO_ECC_SECP */
  22452. #ifdef HAVE_ECC_KOBLITZ
  22453. case ECC_SECP192K1_OID:
  22454. return WOLFSSL_ECC_SECP192K1;
  22455. #endif /* HAVE_ECC_KOBLITZ */
  22456. #endif
  22457. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  22458. #ifndef NO_ECC_SECP
  22459. case ECC_SECP224R1_OID:
  22460. return WOLFSSL_ECC_SECP224R1;
  22461. #endif /* !NO_ECC_SECP */
  22462. #ifdef HAVE_ECC_KOBLITZ
  22463. case ECC_SECP224K1_OID:
  22464. return WOLFSSL_ECC_SECP224K1;
  22465. #endif /* HAVE_ECC_KOBLITZ */
  22466. #endif
  22467. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  22468. #ifndef NO_ECC_SECP
  22469. case ECC_SECP256R1_OID:
  22470. return WOLFSSL_ECC_SECP256R1;
  22471. #endif /* !NO_ECC_SECP */
  22472. #ifdef HAVE_ECC_KOBLITZ
  22473. case ECC_SECP256K1_OID:
  22474. return WOLFSSL_ECC_SECP256K1;
  22475. #endif /* HAVE_ECC_KOBLITZ */
  22476. #ifdef HAVE_ECC_BRAINPOOL
  22477. case ECC_BRAINPOOLP256R1_OID:
  22478. return WOLFSSL_ECC_BRAINPOOLP256R1;
  22479. #endif /* HAVE_ECC_BRAINPOOL */
  22480. #endif
  22481. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  22482. #ifndef NO_ECC_SECP
  22483. case ECC_SECP384R1_OID:
  22484. return WOLFSSL_ECC_SECP384R1;
  22485. #endif /* !NO_ECC_SECP */
  22486. #ifdef HAVE_ECC_BRAINPOOL
  22487. case ECC_BRAINPOOLP384R1_OID:
  22488. return WOLFSSL_ECC_BRAINPOOLP384R1;
  22489. #endif /* HAVE_ECC_BRAINPOOL */
  22490. #endif
  22491. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  22492. #ifdef HAVE_ECC_BRAINPOOL
  22493. case ECC_BRAINPOOLP512R1_OID:
  22494. return WOLFSSL_ECC_BRAINPOOLP512R1;
  22495. #endif /* HAVE_ECC_BRAINPOOL */
  22496. #endif
  22497. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  22498. #ifndef NO_ECC_SECP
  22499. case ECC_SECP521R1_OID:
  22500. return WOLFSSL_ECC_SECP521R1;
  22501. #endif /* !NO_ECC_SECP */
  22502. #endif
  22503. default:
  22504. WOLFSSL_MSG("Curve OID not compiled in or implemented");
  22505. return 0;
  22506. }
  22507. }
  22508. #endif /* HAVE_ECC */
  22509. #ifndef NO_WOLFSSL_SERVER
  22510. #ifndef WOLFSSL_NO_TLS12
  22511. /* handle generation of server_hello (2) */
  22512. int SendServerHello(WOLFSSL* ssl)
  22513. {
  22514. int ret;
  22515. byte *output;
  22516. word16 length;
  22517. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22518. int sendSz;
  22519. byte sessIdSz = ID_LEN;
  22520. byte echoId = 0; /* ticket echo id flag */
  22521. byte cacheOff = 0; /* session cache off flag */
  22522. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  22523. WOLFSSL_ENTER("SendServerHello");
  22524. length = VERSION_SZ + RAN_LEN
  22525. + ID_LEN + ENUM_LEN
  22526. + SUITE_LEN
  22527. + ENUM_LEN;
  22528. #ifdef HAVE_TLS_EXTENSIONS
  22529. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  22530. if (ret != 0)
  22531. return ret;
  22532. #ifdef HAVE_SESSION_TICKET
  22533. if (ssl->options.useTicket) {
  22534. /* echo session id sz can be 0,32 or bogus len in between */
  22535. sessIdSz = ssl->arrays->sessionIDSz;
  22536. if (sessIdSz > ID_LEN) {
  22537. WOLFSSL_MSG("Bad bogus session id len");
  22538. return BUFFER_ERROR;
  22539. }
  22540. if (!IsAtLeastTLSv1_3(ssl->version))
  22541. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  22542. echoId = 1;
  22543. }
  22544. #endif /* HAVE_SESSION_TICKET */
  22545. #else
  22546. if (ssl->options.haveEMS) {
  22547. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  22548. }
  22549. #endif
  22550. /* is the session cache off at build or runtime */
  22551. #ifdef NO_SESSION_CACHE
  22552. cacheOff = 1;
  22553. #else
  22554. if (ssl->options.sessionCacheOff == 1) {
  22555. cacheOff = 1;
  22556. }
  22557. #endif
  22558. /* if no session cache don't send a session ID unless we're echoing
  22559. * an ID as part of session tickets */
  22560. if (echoId == 0 && cacheOff == 1) {
  22561. length -= ID_LEN; /* adjust ID_LEN assumption */
  22562. sessIdSz = 0;
  22563. }
  22564. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  22565. #ifdef WOLFSSL_DTLS
  22566. if (ssl->options.dtls) {
  22567. if (((ssl->keys.dtls_sequence_number_hi == ssl->keys.curSeq_hi &&
  22568. ssl->keys.dtls_sequence_number_lo < ssl->keys.curSeq_lo) ||
  22569. (ssl->keys.dtls_sequence_number_hi < ssl->keys.curSeq_hi))) {
  22570. /* Server Hello should use the same sequence number as the
  22571. * Client Hello if available. */
  22572. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  22573. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  22574. }
  22575. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22576. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22577. }
  22578. #endif /* WOLFSSL_DTLS */
  22579. if (IsEncryptionOn(ssl, 1))
  22580. sendSz += MAX_MSG_EXTRA;
  22581. /* check for available size */
  22582. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  22583. return ret;
  22584. /* get output buffer */
  22585. output = ssl->buffers.outputBuffer.buffer +
  22586. ssl->buffers.outputBuffer.length;
  22587. AddHeaders(output, length, server_hello, ssl);
  22588. /* now write to output */
  22589. /* first version */
  22590. output[idx++] = (byte)ssl->version.major;
  22591. output[idx++] = (byte)ssl->version.minor;
  22592. /* then random and session id */
  22593. if (!ssl->options.resuming) {
  22594. /* generate random part and session id */
  22595. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  22596. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  22597. if (ret != 0)
  22598. return ret;
  22599. #ifdef WOLFSSL_TLS13
  22600. if (TLSv1_3_Capable(ssl)) {
  22601. /* TLS v1.3 capable server downgraded. */
  22602. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  22603. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  22604. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  22605. }
  22606. else
  22607. #endif
  22608. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  22609. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  22610. #ifdef OPENSSL_EXTRA
  22611. (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0 &&
  22612. #endif
  22613. !IsAtLeastTLSv1_2(ssl)) {
  22614. /* TLS v1.2 capable server downgraded. */
  22615. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  22616. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  22617. output[idx + RAN_LEN - 1] = 0;
  22618. }
  22619. /* store info in SSL for later */
  22620. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  22621. idx += RAN_LEN;
  22622. output[idx++] = sessIdSz;
  22623. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  22624. ssl->arrays->sessionIDSz = sessIdSz;
  22625. }
  22626. else {
  22627. /* If resuming, use info from SSL */
  22628. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  22629. idx += RAN_LEN;
  22630. output[idx++] = sessIdSz;
  22631. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  22632. }
  22633. idx += sessIdSz;
  22634. #ifdef SHOW_SECRETS
  22635. {
  22636. int j;
  22637. printf("server random: ");
  22638. for (j = 0; j < RAN_LEN; j++)
  22639. printf("%02x", ssl->arrays->serverRandom[j]);
  22640. printf("\n");
  22641. }
  22642. #endif
  22643. /* then cipher suite */
  22644. output[idx++] = ssl->options.cipherSuite0;
  22645. output[idx++] = ssl->options.cipherSuite;
  22646. /* then compression */
  22647. if (ssl->options.usingCompression)
  22648. output[idx++] = ZLIB_COMPRESSION;
  22649. else
  22650. output[idx++] = NO_COMPRESSION;
  22651. /* last, extensions */
  22652. #ifdef HAVE_TLS_EXTENSIONS
  22653. {
  22654. word16 offset = 0;
  22655. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  22656. if (ret != 0)
  22657. return ret;
  22658. idx += offset;
  22659. }
  22660. #else
  22661. #ifdef HAVE_EXTENDED_MASTER
  22662. if (ssl->options.haveEMS) {
  22663. c16toa(HELLO_EXT_SZ, output + idx);
  22664. idx += HELLO_EXT_SZ_SZ;
  22665. c16toa(HELLO_EXT_EXTMS, output + idx);
  22666. idx += HELLO_EXT_TYPE_SZ;
  22667. c16toa(0, output + idx);
  22668. /*idx += HELLO_EXT_SZ_SZ;*/
  22669. /* idx is not used after this point. uncomment the line above
  22670. * if adding any more extensions in the future. */
  22671. }
  22672. #endif
  22673. #endif
  22674. if (IsEncryptionOn(ssl, 1)) {
  22675. byte* input;
  22676. int inputSz = idx; /* build msg adds rec hdr */
  22677. int recordHeaderSz = RECORD_HEADER_SZ;
  22678. if (ssl->options.dtls)
  22679. recordHeaderSz += DTLS_RECORD_EXTRA;
  22680. inputSz -= recordHeaderSz;
  22681. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22682. if (input == NULL)
  22683. return MEMORY_E;
  22684. XMEMCPY(input, output + recordHeaderSz, inputSz);
  22685. #ifdef WOLFSSL_DTLS
  22686. if (IsDtlsNotSctpMode(ssl) &&
  22687. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
  22688. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22689. return ret;
  22690. }
  22691. #endif
  22692. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  22693. handshake, 1, 0, 0, CUR_ORDER);
  22694. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22695. if (sendSz < 0)
  22696. return sendSz;
  22697. } else {
  22698. #ifdef WOLFSSL_DTLS
  22699. if (IsDtlsNotSctpMode(ssl)) {
  22700. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
  22701. return ret;
  22702. }
  22703. if (ssl->options.dtls)
  22704. DtlsSEQIncrement(ssl, CUR_ORDER);
  22705. #endif
  22706. ret = HashOutput(ssl, output, sendSz, 0);
  22707. if (ret != 0)
  22708. return ret;
  22709. }
  22710. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  22711. if (ssl->hsInfoOn)
  22712. AddPacketName(ssl, "ServerHello");
  22713. if (ssl->toInfoOn)
  22714. AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  22715. WRITE_PROTO, ssl->heap);
  22716. #endif
  22717. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  22718. ssl->buffers.outputBuffer.length += sendSz;
  22719. if (ssl->options.groupMessages)
  22720. ret = 0;
  22721. else
  22722. ret = SendBuffered(ssl);
  22723. WOLFSSL_LEAVE("SendServerHello", ret);
  22724. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  22725. return ret;
  22726. }
  22727. #if defined(HAVE_ECC)
  22728. static byte SetCurveId(ecc_key* key)
  22729. {
  22730. if (key == NULL || key->dp == NULL) {
  22731. WOLFSSL_MSG("SetCurveId: Invalid key!");
  22732. return 0;
  22733. }
  22734. return (byte)GetCurveByOID(key->dp->oidSum);
  22735. }
  22736. #endif /* HAVE_ECC */
  22737. typedef struct SskeArgs {
  22738. byte* output; /* not allocated */
  22739. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  22740. !defined(NO_RSA)
  22741. byte* sigDataBuf;
  22742. #endif
  22743. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  22744. byte* exportBuf;
  22745. #endif
  22746. #ifndef NO_RSA
  22747. byte* verifySig;
  22748. #endif
  22749. byte* input;
  22750. word32 idx;
  22751. word32 tmpSigSz;
  22752. word32 length;
  22753. word32 sigSz;
  22754. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  22755. !defined(NO_RSA)
  22756. word32 sigDataSz;
  22757. #endif
  22758. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  22759. word32 exportSz;
  22760. #endif
  22761. #ifdef HAVE_QSH
  22762. word32 qshSz;
  22763. #endif
  22764. int sendSz;
  22765. int inputSz;
  22766. } SskeArgs;
  22767. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  22768. {
  22769. SskeArgs* args = (SskeArgs*)pArgs;
  22770. (void)ssl;
  22771. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  22772. if (args->exportBuf) {
  22773. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  22774. args->exportBuf = NULL;
  22775. }
  22776. #endif
  22777. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  22778. (!defined(NO_DH) && !defined(NO_RSA))
  22779. if (args->sigDataBuf) {
  22780. XFREE(args->sigDataBuf, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22781. args->sigDataBuf = NULL;
  22782. }
  22783. #endif
  22784. #ifndef NO_RSA
  22785. if (args->verifySig) {
  22786. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22787. args->verifySig = NULL;
  22788. }
  22789. #endif
  22790. (void)args;
  22791. }
  22792. /* handle generation of server_key_exchange (12) */
  22793. int SendServerKeyExchange(WOLFSSL* ssl)
  22794. {
  22795. int ret;
  22796. #ifdef WOLFSSL_ASYNC_CRYPT
  22797. SskeArgs* args = (SskeArgs*)ssl->async.args;
  22798. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  22799. (void)sizeof(args_test);
  22800. #else
  22801. SskeArgs args[1];
  22802. #endif
  22803. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  22804. WOLFSSL_ENTER("SendServerKeyExchange");
  22805. #ifdef WOLFSSL_ASYNC_CRYPT
  22806. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  22807. if (ret != WC_NOT_PENDING_E) {
  22808. /* Check for error */
  22809. if (ret < 0)
  22810. goto exit_sske;
  22811. }
  22812. else
  22813. #endif
  22814. {
  22815. /* Reset state */
  22816. ret = 0;
  22817. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  22818. XMEMSET(args, 0, sizeof(SskeArgs));
  22819. #ifdef WOLFSSL_ASYNC_CRYPT
  22820. ssl->async.freeArgs = FreeSskeArgs;
  22821. #endif
  22822. }
  22823. switch(ssl->options.asyncState)
  22824. {
  22825. case TLS_ASYNC_BEGIN:
  22826. {
  22827. #ifdef HAVE_QSH
  22828. if (ssl->peerQSHKeyPresent && ssl->options.haveQSH) {
  22829. args->qshSz = QSH_KeyGetSize(ssl);
  22830. }
  22831. #endif
  22832. /* Do some checks / debug msgs */
  22833. switch(ssl->specs.kea)
  22834. {
  22835. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22836. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22837. case ecdhe_psk_kea:
  22838. {
  22839. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  22840. break;
  22841. }
  22842. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  22843. #if defined(HAVE_ECC)
  22844. case ecc_diffie_hellman_kea:
  22845. {
  22846. if (ssl->specs.static_ecdh) {
  22847. WOLFSSL_MSG("Using Static ECDH, not sending "
  22848. "ServerKeyExchange");
  22849. ERROR_OUT(0, exit_sske);
  22850. }
  22851. WOLFSSL_MSG("Using ephemeral ECDH");
  22852. break;
  22853. }
  22854. #endif /* HAVE_ECC */
  22855. }
  22856. /* Preparing keys */
  22857. switch(ssl->specs.kea)
  22858. {
  22859. #ifndef NO_PSK
  22860. case psk_kea:
  22861. {
  22862. /* Nothing to do in this sub-state */
  22863. break;
  22864. }
  22865. #endif /* !NO_PSK */
  22866. #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA))
  22867. #if !defined(NO_PSK)
  22868. case dhe_psk_kea:
  22869. #endif
  22870. #if !defined(NO_RSA)
  22871. case diffie_hellman_kea:
  22872. #endif
  22873. {
  22874. /* Allocate DH key buffers and generate key */
  22875. if (ssl->buffers.serverDH_P.buffer == NULL ||
  22876. ssl->buffers.serverDH_G.buffer == NULL) {
  22877. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  22878. }
  22879. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  22880. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  22881. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  22882. ssl->buffers.serverDH_P.length + OPAQUE16_LEN,
  22883. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  22884. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  22885. ERROR_OUT(MEMORY_E, exit_sske);
  22886. }
  22887. ssl->buffers.serverDH_Pub.length =
  22888. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  22889. }
  22890. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  22891. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  22892. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  22893. ssl->buffers.serverDH_P.length + OPAQUE16_LEN,
  22894. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  22895. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  22896. ERROR_OUT(MEMORY_E, exit_sske);
  22897. }
  22898. ssl->buffers.serverDH_Priv.length =
  22899. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  22900. }
  22901. ssl->options.dhKeySz =
  22902. (word16)ssl->buffers.serverDH_P.length;
  22903. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  22904. (void**)&ssl->buffers.serverDH_Key);
  22905. if (ret != 0) {
  22906. goto exit_sske;
  22907. }
  22908. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  22909. !defined(HAVE_FIPS) && \
  22910. !defined(HAVE_SELFTEST)
  22911. if (ssl->options.dhDoKeyTest &&
  22912. !ssl->options.dhKeyTested)
  22913. {
  22914. ret = wc_DhSetCheckKey(
  22915. ssl->buffers.serverDH_Key,
  22916. ssl->buffers.serverDH_P.buffer,
  22917. ssl->buffers.serverDH_P.length,
  22918. ssl->buffers.serverDH_G.buffer,
  22919. ssl->buffers.serverDH_G.length,
  22920. NULL, 0, 0, ssl->rng);
  22921. if (ret != 0) {
  22922. goto exit_sske;
  22923. }
  22924. ssl->options.dhKeyTested = 1;
  22925. }
  22926. else
  22927. #endif
  22928. {
  22929. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  22930. ssl->buffers.serverDH_P.buffer,
  22931. ssl->buffers.serverDH_P.length,
  22932. ssl->buffers.serverDH_G.buffer,
  22933. ssl->buffers.serverDH_G.length);
  22934. if (ret != 0) {
  22935. goto exit_sske;
  22936. }
  22937. }
  22938. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  22939. ssl->buffers.serverDH_Priv.buffer,
  22940. (word32*)&ssl->buffers.serverDH_Priv.length,
  22941. ssl->buffers.serverDH_Pub.buffer,
  22942. (word32*)&ssl->buffers.serverDH_Pub.length);
  22943. break;
  22944. }
  22945. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  22946. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22947. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22948. case ecdhe_psk_kea:
  22949. /* Fall through to create temp ECC key */
  22950. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  22951. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22952. defined(HAVE_CURVE448)
  22953. case ecc_diffie_hellman_kea:
  22954. {
  22955. #ifdef HAVE_CURVE25519
  22956. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22957. /* need ephemeral key now, create it if missing */
  22958. if (ssl->eccTempKey == NULL) {
  22959. /* alloc/init on demand */
  22960. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  22961. (void**)&ssl->eccTempKey);
  22962. if (ret != 0) {
  22963. goto exit_sske;
  22964. }
  22965. }
  22966. if (ssl->eccTempKeyPresent == 0) {
  22967. ret = X25519MakeKey(ssl,
  22968. (curve25519_key*)ssl->eccTempKey, NULL);
  22969. if (ret == 0 || ret == WC_PENDING_E) {
  22970. ssl->eccTempKeyPresent =
  22971. DYNAMIC_TYPE_CURVE25519;
  22972. }
  22973. }
  22974. break;
  22975. }
  22976. #endif
  22977. #ifdef HAVE_CURVE448
  22978. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  22979. /* need ephemeral key now, create it if missing */
  22980. if (ssl->eccTempKey == NULL) {
  22981. /* alloc/init on demand */
  22982. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  22983. (void**)&ssl->eccTempKey);
  22984. if (ret != 0) {
  22985. goto exit_sske;
  22986. }
  22987. }
  22988. if (ssl->eccTempKeyPresent == 0) {
  22989. ret = X448MakeKey(ssl,
  22990. (curve448_key*)ssl->eccTempKey, NULL);
  22991. if (ret == 0 || ret == WC_PENDING_E) {
  22992. ssl->eccTempKeyPresent =
  22993. DYNAMIC_TYPE_CURVE448;
  22994. }
  22995. }
  22996. break;
  22997. }
  22998. #endif
  22999. #ifdef HAVE_ECC
  23000. /* need ephemeral key now, create it if missing */
  23001. if (ssl->eccTempKey == NULL) {
  23002. /* alloc/init on demand */
  23003. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  23004. (void**)&ssl->eccTempKey);
  23005. if (ret != 0) {
  23006. goto exit_sske;
  23007. }
  23008. }
  23009. if (ssl->eccTempKeyPresent == 0) {
  23010. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  23011. if (ret == 0 || ret == WC_PENDING_E) {
  23012. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  23013. }
  23014. }
  23015. #endif
  23016. break;
  23017. }
  23018. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23019. default:
  23020. /* Skip ServerKeyExchange */
  23021. goto exit_sske;
  23022. } /* switch(ssl->specs.kea) */
  23023. /* Check for error */
  23024. if (ret != 0) {
  23025. goto exit_sske;
  23026. }
  23027. /* Advance state and proceed */
  23028. ssl->options.asyncState = TLS_ASYNC_BUILD;
  23029. } /* case TLS_ASYNC_BEGIN */
  23030. FALL_THROUGH;
  23031. case TLS_ASYNC_BUILD:
  23032. {
  23033. #if (!defined(NO_DH) && !defined(NO_RSA)) || (defined(HAVE_ECC) || \
  23034. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))
  23035. word32 preSigSz, preSigIdx;
  23036. #endif
  23037. switch(ssl->specs.kea)
  23038. {
  23039. #ifndef NO_PSK
  23040. case psk_kea:
  23041. {
  23042. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23043. if (ssl->arrays->server_hint[0] == 0) {
  23044. ERROR_OUT(0, exit_sske); /* don't send */
  23045. }
  23046. /* include size part */
  23047. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  23048. if (args->length > MAX_PSK_ID_LEN) {
  23049. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  23050. }
  23051. args->length += HINT_LEN_SZ;
  23052. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  23053. RECORD_HEADER_SZ;
  23054. #ifdef HAVE_QSH
  23055. args->length += args->qshSz;
  23056. args->sendSz += args->qshSz;
  23057. #endif
  23058. #ifdef WOLFSSL_DTLS
  23059. if (ssl->options.dtls) {
  23060. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23061. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23062. }
  23063. #endif
  23064. if (IsEncryptionOn(ssl, 1)) {
  23065. args->sendSz += MAX_MSG_EXTRA;
  23066. }
  23067. /* Use tmp buffer */
  23068. args->input = (byte*)XMALLOC(args->sendSz,
  23069. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23070. if (args->input == NULL)
  23071. ERROR_OUT(MEMORY_E, exit_sske);
  23072. args->output = args->input;
  23073. AddHeaders(args->output, args->length,
  23074. server_key_exchange, ssl);
  23075. /* key data */
  23076. #ifdef HAVE_QSH
  23077. c16toa((word16)(args->length - args->qshSz -
  23078. HINT_LEN_SZ), args->output + args->idx);
  23079. #else
  23080. c16toa((word16)(args->length - HINT_LEN_SZ),
  23081. args->output + args->idx);
  23082. #endif
  23083. args->idx += HINT_LEN_SZ;
  23084. XMEMCPY(args->output + args->idx,
  23085. ssl->arrays->server_hint,
  23086. args->length - HINT_LEN_SZ);
  23087. break;
  23088. }
  23089. #endif /* !NO_PSK */
  23090. #if !defined(NO_DH) && !defined(NO_PSK)
  23091. case dhe_psk_kea:
  23092. {
  23093. word32 hintLen;
  23094. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23095. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  23096. ssl->buffers.serverDH_P.length +
  23097. ssl->buffers.serverDH_G.length +
  23098. ssl->buffers.serverDH_Pub.length;
  23099. /* include size part */
  23100. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  23101. if (hintLen > MAX_PSK_ID_LEN) {
  23102. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  23103. }
  23104. args->length += hintLen + HINT_LEN_SZ;
  23105. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  23106. RECORD_HEADER_SZ;
  23107. #ifdef HAVE_QSH
  23108. args->length += args->qshSz;
  23109. args->sendSz += args->qshSz;
  23110. #endif
  23111. #ifdef WOLFSSL_DTLS
  23112. if (ssl->options.dtls) {
  23113. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23114. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23115. }
  23116. #endif
  23117. if (IsEncryptionOn(ssl, 1)) {
  23118. args->sendSz += MAX_MSG_EXTRA;
  23119. }
  23120. /* Use tmp buffer */
  23121. args->input = (byte*)XMALLOC(args->sendSz,
  23122. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23123. if (args->input == NULL)
  23124. ERROR_OUT(MEMORY_E, exit_sske);
  23125. args->output = args->input;
  23126. AddHeaders(args->output, args->length,
  23127. server_key_exchange, ssl);
  23128. /* key data */
  23129. c16toa((word16)hintLen, args->output + args->idx);
  23130. args->idx += HINT_LEN_SZ;
  23131. XMEMCPY(args->output + args->idx,
  23132. ssl->arrays->server_hint, hintLen);
  23133. args->idx += hintLen;
  23134. /* add p, g, pub */
  23135. c16toa((word16)ssl->buffers.serverDH_P.length,
  23136. args->output + args->idx);
  23137. args->idx += LENGTH_SZ;
  23138. XMEMCPY(args->output + args->idx,
  23139. ssl->buffers.serverDH_P.buffer,
  23140. ssl->buffers.serverDH_P.length);
  23141. args->idx += ssl->buffers.serverDH_P.length;
  23142. /* g */
  23143. c16toa((word16)ssl->buffers.serverDH_G.length,
  23144. args->output + args->idx);
  23145. args->idx += LENGTH_SZ;
  23146. XMEMCPY(args->output + args->idx,
  23147. ssl->buffers.serverDH_G.buffer,
  23148. ssl->buffers.serverDH_G.length);
  23149. args->idx += ssl->buffers.serverDH_G.length;
  23150. /* pub */
  23151. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  23152. args->output + args->idx);
  23153. args->idx += LENGTH_SZ;
  23154. XMEMCPY(args->output + args->idx,
  23155. ssl->buffers.serverDH_Pub.buffer,
  23156. ssl->buffers.serverDH_Pub.length);
  23157. /* No need to update idx, since sizes are already set */
  23158. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  23159. break;
  23160. }
  23161. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  23162. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23163. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23164. case ecdhe_psk_kea:
  23165. {
  23166. word32 hintLen;
  23167. /* curve type, named curve, length(1) */
  23168. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23169. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  23170. args->exportSz = MAX_EXPORT_ECC_SZ;
  23171. args->exportBuf = (byte*)XMALLOC(args->exportSz,
  23172. ssl->heap, DYNAMIC_TYPE_DER);
  23173. if (args->exportBuf == NULL) {
  23174. ERROR_OUT(MEMORY_E, exit_sske);
  23175. }
  23176. #ifdef HAVE_CURVE25519
  23177. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  23178. if (wc_curve25519_export_public_ex(
  23179. (curve25519_key*)ssl->eccTempKey,
  23180. args->exportBuf, &args->exportSz,
  23181. EC25519_LITTLE_ENDIAN) != 0) {
  23182. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  23183. }
  23184. }
  23185. else
  23186. #endif
  23187. #ifdef HAVE_CURVE448
  23188. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  23189. if (wc_curve448_export_public_ex(
  23190. (curve448_key*)ssl->eccTempKey,
  23191. args->exportBuf, &args->exportSz,
  23192. EC448_LITTLE_ENDIAN) != 0) {
  23193. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  23194. }
  23195. }
  23196. else
  23197. #endif
  23198. {
  23199. if (wc_ecc_export_x963(ssl->eccTempKey,
  23200. args->exportBuf, &args->exportSz) != 0) {
  23201. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  23202. }
  23203. }
  23204. args->length += args->exportSz;
  23205. /* include size part */
  23206. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  23207. if (hintLen > MAX_PSK_ID_LEN) {
  23208. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  23209. }
  23210. args->length += hintLen + HINT_LEN_SZ;
  23211. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  23212. #ifdef HAVE_QSH
  23213. args->length += args->qshSz;
  23214. args->sendSz += args->qshSz;
  23215. #endif
  23216. #ifdef WOLFSSL_DTLS
  23217. if (ssl->options.dtls) {
  23218. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23219. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23220. }
  23221. #endif
  23222. if (IsEncryptionOn(ssl, 1)) {
  23223. args->sendSz += MAX_MSG_EXTRA;
  23224. }
  23225. /* Use tmp buffer */
  23226. args->input = (byte*)XMALLOC(args->sendSz,
  23227. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23228. if (args->input == NULL)
  23229. ERROR_OUT(MEMORY_E, exit_sske);
  23230. args->output = args->input;
  23231. /* key data */
  23232. c16toa((word16)hintLen, args->output + args->idx);
  23233. args->idx += HINT_LEN_SZ;
  23234. XMEMCPY(args->output + args->idx,
  23235. ssl->arrays->server_hint, hintLen);
  23236. args->idx += hintLen;
  23237. /* ECC key exchange data */
  23238. args->output[args->idx++] = named_curve;
  23239. args->output[args->idx++] = 0x00; /* leading zero */
  23240. #ifdef HAVE_CURVE25519
  23241. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  23242. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  23243. else
  23244. #endif
  23245. #ifdef HAVE_CURVE448
  23246. if (ssl->ecdhCurveOID == ECC_X448_OID)
  23247. args->output[args->idx++] = WOLFSSL_ECC_X448;
  23248. else
  23249. #endif
  23250. {
  23251. #ifdef HAVE_ECC
  23252. args->output[args->idx++] =
  23253. SetCurveId(ssl->eccTempKey);
  23254. #endif
  23255. }
  23256. args->output[args->idx++] = (byte)args->exportSz;
  23257. XMEMCPY(args->output + args->idx, args->exportBuf,
  23258. args->exportSz);
  23259. break;
  23260. }
  23261. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  23262. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23263. defined(HAVE_CURVE448)
  23264. case ecc_diffie_hellman_kea:
  23265. {
  23266. enum wc_HashType hashType;
  23267. /* curve type, named curve, length(1) */
  23268. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23269. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  23270. /* Export temp ECC key and add to length */
  23271. args->exportSz = MAX_EXPORT_ECC_SZ;
  23272. args->exportBuf = (byte*)XMALLOC(args->exportSz,
  23273. ssl->heap, DYNAMIC_TYPE_DER);
  23274. if (args->exportBuf == NULL) {
  23275. ERROR_OUT(MEMORY_E, exit_sske);
  23276. }
  23277. #ifdef HAVE_CURVE25519
  23278. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  23279. if (wc_curve25519_export_public_ex(
  23280. (curve25519_key*)ssl->eccTempKey,
  23281. args->exportBuf, &args->exportSz,
  23282. EC25519_LITTLE_ENDIAN) != 0) {
  23283. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  23284. }
  23285. }
  23286. else
  23287. #endif
  23288. #ifdef HAVE_CURVE448
  23289. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  23290. if (wc_curve448_export_public_ex(
  23291. (curve448_key*)ssl->eccTempKey,
  23292. args->exportBuf, &args->exportSz,
  23293. EC448_LITTLE_ENDIAN) != 0) {
  23294. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  23295. }
  23296. }
  23297. else
  23298. #endif
  23299. {
  23300. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  23301. if (wc_ecc_export_x963(ssl->eccTempKey,
  23302. args->exportBuf, &args->exportSz) != 0) {
  23303. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  23304. }
  23305. #endif
  23306. }
  23307. args->length += args->exportSz;
  23308. preSigSz = args->length;
  23309. preSigIdx = args->idx;
  23310. if (ssl->buffers.key == NULL) {
  23311. #ifdef HAVE_PK_CALLBACKS
  23312. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  23313. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  23314. if (args->tmpSigSz == 0) {
  23315. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  23316. }
  23317. }
  23318. else
  23319. #endif
  23320. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  23321. }
  23322. else {
  23323. switch(ssl->suites->sigAlgo) {
  23324. #ifndef NO_RSA
  23325. #ifdef WC_RSA_PSS
  23326. case rsa_pss_sa_algo:
  23327. #endif
  23328. case rsa_sa_algo:
  23329. {
  23330. word16 keySz;
  23331. ssl->buffers.keyType = rsa_sa_algo;
  23332. ret = DecodePrivateKey(ssl, &keySz);
  23333. if (ret != 0) {
  23334. goto exit_sske;
  23335. }
  23336. args->tmpSigSz = (word32)keySz;
  23337. break;
  23338. }
  23339. #endif /* !NO_RSA */
  23340. #ifdef HAVE_ECC
  23341. case ecc_dsa_sa_algo:
  23342. {
  23343. word16 keySz;
  23344. ssl->buffers.keyType = ecc_dsa_sa_algo;
  23345. ret = DecodePrivateKey(ssl, &keySz);
  23346. if (ret != 0) {
  23347. goto exit_sske;
  23348. }
  23349. /* worst case estimate */
  23350. args->tmpSigSz = keySz;
  23351. break;
  23352. }
  23353. #endif
  23354. #ifdef HAVE_ED25519
  23355. case ed25519_sa_algo:
  23356. {
  23357. word16 keySz;
  23358. ssl->buffers.keyType = ed25519_sa_algo;
  23359. ret = DecodePrivateKey(ssl, &keySz);
  23360. if (ret != 0) {
  23361. goto exit_sske;
  23362. }
  23363. /* worst case estimate */
  23364. args->tmpSigSz = ED25519_SIG_SIZE;
  23365. break;
  23366. }
  23367. #endif /* HAVE_ED25519 */
  23368. #ifdef HAVE_ED448
  23369. case ed448_sa_algo:
  23370. {
  23371. word16 keySz;
  23372. ssl->buffers.keyType = ed448_sa_algo;
  23373. ret = DecodePrivateKey(ssl, &keySz);
  23374. if (ret != 0) {
  23375. goto exit_sske;
  23376. }
  23377. /* worst case estimate */
  23378. args->tmpSigSz = ED448_SIG_SIZE;
  23379. break;
  23380. }
  23381. #endif /* HAVE_ED448 */
  23382. default:
  23383. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  23384. } /* switch(ssl->specs.sig_algo) */
  23385. }
  23386. /* sig length */
  23387. args->length += LENGTH_SZ;
  23388. args->length += args->tmpSigSz;
  23389. if (IsAtLeastTLSv1_2(ssl)) {
  23390. args->length += HASH_SIG_SIZE;
  23391. }
  23392. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  23393. #ifdef HAVE_QSH
  23394. args->length += args->qshSz;
  23395. args->sendSz += args->qshSz;
  23396. #endif
  23397. #ifdef WOLFSSL_DTLS
  23398. if (ssl->options.dtls) {
  23399. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23400. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23401. preSigIdx = args->idx;
  23402. }
  23403. #endif
  23404. if (IsEncryptionOn(ssl, 1)) {
  23405. args->sendSz += MAX_MSG_EXTRA;
  23406. }
  23407. /* Use tmp buffer */
  23408. args->input = (byte*)XMALLOC(args->sendSz,
  23409. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23410. if (args->input == NULL)
  23411. ERROR_OUT(MEMORY_E, exit_sske);
  23412. args->output = args->input;
  23413. /* record and message headers will be added below, when we're sure
  23414. of the sig length */
  23415. /* key exchange data */
  23416. args->output[args->idx++] = named_curve;
  23417. args->output[args->idx++] = 0x00; /* leading zero */
  23418. #ifdef HAVE_CURVE25519
  23419. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  23420. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  23421. else
  23422. #endif
  23423. #ifdef HAVE_CURVE448
  23424. if (ssl->ecdhCurveOID == ECC_X448_OID)
  23425. args->output[args->idx++] = WOLFSSL_ECC_X448;
  23426. else
  23427. #endif
  23428. {
  23429. #ifdef HAVE_ECC
  23430. args->output[args->idx++] =
  23431. SetCurveId(ssl->eccTempKey);
  23432. #endif
  23433. }
  23434. args->output[args->idx++] = (byte)args->exportSz;
  23435. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  23436. args->idx += args->exportSz;
  23437. /* Determine hash type */
  23438. if (IsAtLeastTLSv1_2(ssl)) {
  23439. EncodeSigAlg(ssl->suites->hashAlgo,
  23440. ssl->suites->sigAlgo,
  23441. &args->output[args->idx]);
  23442. args->idx += 2;
  23443. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  23444. if (hashType == WC_HASH_TYPE_NONE) {
  23445. ERROR_OUT(ALGO_ID_E, exit_sske);
  23446. }
  23447. } else {
  23448. /* only using sha and md5 for rsa */
  23449. #ifndef NO_OLD_TLS
  23450. hashType = WC_HASH_TYPE_SHA;
  23451. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  23452. hashType = WC_HASH_TYPE_MD5_SHA;
  23453. }
  23454. #else
  23455. ERROR_OUT(ALGO_ID_E, exit_sske);
  23456. #endif
  23457. }
  23458. /* Signature length will be written later, when we're sure what it is */
  23459. #ifdef HAVE_FUZZER
  23460. if (ssl->fuzzerCb) {
  23461. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  23462. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  23463. }
  23464. #endif
  23465. /* Assemble buffer to hash for signature */
  23466. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  23467. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  23468. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23469. if (args->sigDataBuf == NULL) {
  23470. ERROR_OUT(MEMORY_E, exit_sske);
  23471. }
  23472. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  23473. RAN_LEN);
  23474. XMEMCPY(args->sigDataBuf+RAN_LEN,
  23475. ssl->arrays->serverRandom, RAN_LEN);
  23476. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  23477. args->output + preSigIdx, preSigSz);
  23478. if (ssl->suites->sigAlgo != ed25519_sa_algo &&
  23479. ssl->suites->sigAlgo != ed448_sa_algo) {
  23480. ssl->buffers.sig.length =
  23481. wc_HashGetDigestSize(hashType);
  23482. if ((int)ssl->buffers.sig.length < 0) {
  23483. ERROR_OUT(HASH_TYPE_E, exit_sske);
  23484. }
  23485. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  23486. ssl->buffers.sig.length,
  23487. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23488. if (ssl->buffers.sig.buffer == NULL) {
  23489. ERROR_OUT(MEMORY_E, exit_sske);
  23490. }
  23491. /* Perform hash */
  23492. ret = wc_Hash(hashType, args->sigDataBuf,
  23493. args->sigDataSz,
  23494. ssl->buffers.sig.buffer,
  23495. ssl->buffers.sig.length);
  23496. if (ret != 0) {
  23497. goto exit_sske;
  23498. }
  23499. }
  23500. args->sigSz = args->tmpSigSz;
  23501. /* Sign hash to create signature */
  23502. switch (ssl->suites->sigAlgo)
  23503. {
  23504. #ifndef NO_RSA
  23505. case rsa_sa_algo:
  23506. {
  23507. /* For TLS 1.2 re-encode signature */
  23508. if (IsAtLeastTLSv1_2(ssl)) {
  23509. byte* encodedSig = (byte*)XMALLOC(
  23510. MAX_ENCODED_SIG_SZ, ssl->heap,
  23511. DYNAMIC_TYPE_SIGNATURE);
  23512. if (encodedSig == NULL) {
  23513. ERROR_OUT(MEMORY_E, exit_sske);
  23514. }
  23515. ssl->buffers.sig.length =
  23516. wc_EncodeSignature(encodedSig,
  23517. ssl->buffers.sig.buffer,
  23518. ssl->buffers.sig.length,
  23519. TypeHash(ssl->suites->hashAlgo));
  23520. /* Replace sig buffer with new one */
  23521. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  23522. DYNAMIC_TYPE_SIGNATURE);
  23523. ssl->buffers.sig.buffer = encodedSig;
  23524. }
  23525. /* write sig size here */
  23526. c16toa((word16)args->sigSz,
  23527. args->output + args->idx);
  23528. args->idx += LENGTH_SZ;
  23529. break;
  23530. }
  23531. #ifdef WC_RSA_PSS
  23532. case rsa_pss_sa_algo:
  23533. /* write sig size here */
  23534. c16toa((word16)args->sigSz,
  23535. args->output + args->idx);
  23536. args->idx += LENGTH_SZ;
  23537. break;
  23538. #endif
  23539. #endif /* !NO_RSA */
  23540. case ecc_dsa_sa_algo:
  23541. {
  23542. break;
  23543. }
  23544. #ifdef HAVE_ED25519
  23545. case ed25519_sa_algo:
  23546. ret = Ed25519CheckPubKey(ssl);
  23547. if (ret != 0)
  23548. goto exit_sske;
  23549. break;
  23550. #endif /* HAVE_ED25519 */
  23551. #ifdef HAVE_ED448
  23552. case ed448_sa_algo:
  23553. ret = Ed448CheckPubKey(ssl);
  23554. if (ret != 0)
  23555. goto exit_sske;
  23556. break;
  23557. #endif /* HAVE_ED448 */
  23558. default:
  23559. break;
  23560. } /* switch(ssl->specs.sig_algo) */
  23561. break;
  23562. }
  23563. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23564. #if !defined(NO_DH) && !defined(NO_RSA)
  23565. case diffie_hellman_kea:
  23566. {
  23567. enum wc_HashType hashType;
  23568. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23569. args->length = LENGTH_SZ * 3; /* p, g, pub */
  23570. args->length += ssl->buffers.serverDH_P.length +
  23571. ssl->buffers.serverDH_G.length +
  23572. ssl->buffers.serverDH_Pub.length;
  23573. preSigIdx = args->idx;
  23574. preSigSz = args->length;
  23575. if (!ssl->options.usingAnon_cipher) {
  23576. word16 keySz = 0;
  23577. /* sig length */
  23578. args->length += LENGTH_SZ;
  23579. if (ssl->buffers.key == NULL) {
  23580. #ifdef HAVE_PK_CALLBACKS
  23581. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  23582. keySz = (word32)GetPrivateKeySigSize(ssl);
  23583. else
  23584. #endif
  23585. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  23586. }
  23587. else
  23588. {
  23589. if (ssl->buffers.keyType == 0)
  23590. ssl->buffers.keyType = rsa_sa_algo;
  23591. ret = DecodePrivateKey(ssl, &keySz);
  23592. if (ret != 0) {
  23593. goto exit_sske;
  23594. }
  23595. }
  23596. /* test if keySz has error */
  23597. if (keySz == 0) {
  23598. ERROR_OUT(keySz, exit_sske);
  23599. }
  23600. args->tmpSigSz = (word32)keySz;
  23601. args->length += args->tmpSigSz;
  23602. if (IsAtLeastTLSv1_2(ssl)) {
  23603. args->length += HASH_SIG_SIZE;
  23604. }
  23605. }
  23606. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  23607. RECORD_HEADER_SZ;
  23608. #ifdef HAVE_QSH
  23609. args->length += args->qshSz;
  23610. args->sendSz += args->qshSz;
  23611. #endif
  23612. #ifdef WOLFSSL_DTLS
  23613. if (ssl->options.dtls) {
  23614. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23615. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23616. preSigIdx = args->idx;
  23617. }
  23618. #endif
  23619. if (IsEncryptionOn(ssl, 1)) {
  23620. args->sendSz += MAX_MSG_EXTRA;
  23621. }
  23622. /* Use tmp buffer */
  23623. args->input = (byte*)XMALLOC(args->sendSz,
  23624. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23625. if (args->input == NULL)
  23626. ERROR_OUT(MEMORY_E, exit_sske);
  23627. args->output = args->input;
  23628. AddHeaders(args->output, args->length,
  23629. server_key_exchange, ssl);
  23630. /* add p, g, pub */
  23631. c16toa((word16)ssl->buffers.serverDH_P.length,
  23632. args->output + args->idx);
  23633. args->idx += LENGTH_SZ;
  23634. XMEMCPY(args->output + args->idx,
  23635. ssl->buffers.serverDH_P.buffer,
  23636. ssl->buffers.serverDH_P.length);
  23637. args->idx += ssl->buffers.serverDH_P.length;
  23638. /* g */
  23639. c16toa((word16)ssl->buffers.serverDH_G.length,
  23640. args->output + args->idx);
  23641. args->idx += LENGTH_SZ;
  23642. XMEMCPY(args->output + args->idx,
  23643. ssl->buffers.serverDH_G.buffer,
  23644. ssl->buffers.serverDH_G.length);
  23645. args->idx += ssl->buffers.serverDH_G.length;
  23646. /* pub */
  23647. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  23648. args->output + args->idx);
  23649. args->idx += LENGTH_SZ;
  23650. XMEMCPY(args->output + args->idx,
  23651. ssl->buffers.serverDH_Pub.buffer,
  23652. ssl->buffers.serverDH_Pub.length);
  23653. args->idx += ssl->buffers.serverDH_Pub.length;
  23654. #ifdef HAVE_FUZZER
  23655. if (ssl->fuzzerCb) {
  23656. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  23657. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  23658. }
  23659. #endif
  23660. if (ssl->options.usingAnon_cipher) {
  23661. break;
  23662. }
  23663. /* Determine hash type */
  23664. if (IsAtLeastTLSv1_2(ssl)) {
  23665. EncodeSigAlg(ssl->suites->hashAlgo,
  23666. ssl->suites->sigAlgo,
  23667. &args->output[args->idx]);
  23668. args->idx += 2;
  23669. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  23670. if (hashType == WC_HASH_TYPE_NONE) {
  23671. ERROR_OUT(ALGO_ID_E, exit_sske);
  23672. }
  23673. } else {
  23674. /* only using sha and md5 for rsa */
  23675. #ifndef NO_OLD_TLS
  23676. hashType = WC_HASH_TYPE_SHA;
  23677. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  23678. hashType = WC_HASH_TYPE_MD5_SHA;
  23679. }
  23680. #else
  23681. ERROR_OUT(ALGO_ID_E, exit_sske);
  23682. #endif
  23683. }
  23684. /* signature size */
  23685. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  23686. args->idx += LENGTH_SZ;
  23687. /* Assemble buffer to hash for signature */
  23688. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  23689. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  23690. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23691. if (args->sigDataBuf == NULL) {
  23692. ERROR_OUT(MEMORY_E, exit_sske);
  23693. }
  23694. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  23695. RAN_LEN);
  23696. XMEMCPY(args->sigDataBuf+RAN_LEN,
  23697. ssl->arrays->serverRandom, RAN_LEN);
  23698. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  23699. args->output + preSigIdx, preSigSz);
  23700. if (ssl->suites->sigAlgo != ed25519_sa_algo &&
  23701. ssl->suites->sigAlgo != ed448_sa_algo) {
  23702. ssl->buffers.sig.length =
  23703. wc_HashGetDigestSize(hashType);
  23704. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  23705. ssl->buffers.sig.length, ssl->heap,
  23706. DYNAMIC_TYPE_SIGNATURE);
  23707. if (ssl->buffers.sig.buffer == NULL) {
  23708. ERROR_OUT(MEMORY_E, exit_sske);
  23709. }
  23710. /* Perform hash */
  23711. ret = wc_Hash(hashType, args->sigDataBuf,
  23712. args->sigDataSz,
  23713. ssl->buffers.sig.buffer,
  23714. ssl->buffers.sig.length);
  23715. if (ret != 0) {
  23716. goto exit_sske;
  23717. }
  23718. }
  23719. args->sigSz = args->tmpSigSz;
  23720. /* Sign hash to create signature */
  23721. switch (ssl->suites->sigAlgo)
  23722. {
  23723. #ifndef NO_RSA
  23724. case rsa_sa_algo:
  23725. {
  23726. /* For TLS 1.2 re-encode signature */
  23727. if (IsAtLeastTLSv1_2(ssl)) {
  23728. byte* encodedSig = (byte*)XMALLOC(
  23729. MAX_ENCODED_SIG_SZ, ssl->heap,
  23730. DYNAMIC_TYPE_SIGNATURE);
  23731. if (encodedSig == NULL) {
  23732. ERROR_OUT(MEMORY_E, exit_sske);
  23733. }
  23734. ssl->buffers.sig.length =
  23735. wc_EncodeSignature(encodedSig,
  23736. ssl->buffers.sig.buffer,
  23737. ssl->buffers.sig.length,
  23738. TypeHash(ssl->suites->hashAlgo));
  23739. /* Replace sig buffer with new one */
  23740. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  23741. DYNAMIC_TYPE_SIGNATURE);
  23742. ssl->buffers.sig.buffer = encodedSig;
  23743. }
  23744. break;
  23745. }
  23746. #endif /* NO_RSA */
  23747. default:
  23748. break;
  23749. } /* switch (ssl->suites->sigAlgo) */
  23750. break;
  23751. }
  23752. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  23753. default:
  23754. break;
  23755. } /* switch(ssl->specs.kea) */
  23756. /* Check for error */
  23757. if (ret != 0) {
  23758. goto exit_sske;
  23759. }
  23760. /* Advance state and proceed */
  23761. ssl->options.asyncState = TLS_ASYNC_DO;
  23762. } /* case TLS_ASYNC_BUILD */
  23763. FALL_THROUGH;
  23764. case TLS_ASYNC_DO:
  23765. {
  23766. switch(ssl->specs.kea)
  23767. {
  23768. #ifndef NO_PSK
  23769. case psk_kea:
  23770. {
  23771. break;
  23772. }
  23773. #endif /* !NO_PSK */
  23774. #if !defined(NO_DH) && !defined(NO_PSK)
  23775. case dhe_psk_kea:
  23776. {
  23777. break;
  23778. }
  23779. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  23780. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23781. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23782. case ecdhe_psk_kea:
  23783. {
  23784. break;
  23785. }
  23786. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  23787. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23788. defined(HAVE_CURVE448)
  23789. case ecc_diffie_hellman_kea:
  23790. {
  23791. /* Sign hash to create signature */
  23792. switch (ssl->suites->sigAlgo)
  23793. {
  23794. #ifndef NO_RSA
  23795. #ifdef WC_RSA_PSS
  23796. case rsa_pss_sa_algo:
  23797. #endif
  23798. case rsa_sa_algo:
  23799. {
  23800. RsaKey* key = (RsaKey*)ssl->hsKey;
  23801. ret = RsaSign(ssl,
  23802. ssl->buffers.sig.buffer,
  23803. ssl->buffers.sig.length,
  23804. args->output + args->idx,
  23805. &args->sigSz,
  23806. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  23807. key,
  23808. ssl->buffers.key
  23809. );
  23810. break;
  23811. }
  23812. #endif /* !NO_RSA */
  23813. #ifdef HAVE_ECC
  23814. case ecc_dsa_sa_algo:
  23815. {
  23816. ecc_key* key = (ecc_key*)ssl->hsKey;
  23817. ret = EccSign(ssl,
  23818. ssl->buffers.sig.buffer,
  23819. ssl->buffers.sig.length,
  23820. args->output + LENGTH_SZ + args->idx,
  23821. &args->sigSz,
  23822. key,
  23823. #ifdef HAVE_PK_CALLBACKS
  23824. ssl->buffers.key
  23825. #else
  23826. NULL
  23827. #endif
  23828. );
  23829. break;
  23830. }
  23831. #endif /* HAVE_ECC */
  23832. #ifdef HAVE_ED25519
  23833. case ed25519_sa_algo:
  23834. {
  23835. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  23836. ret = Ed25519Sign(ssl,
  23837. args->sigDataBuf, args->sigDataSz,
  23838. args->output + LENGTH_SZ + args->idx,
  23839. &args->sigSz,
  23840. key,
  23841. #ifdef HAVE_PK_CALLBACKS
  23842. ssl->buffers.key
  23843. #else
  23844. NULL
  23845. #endif
  23846. );
  23847. break;
  23848. }
  23849. #endif
  23850. #ifdef HAVE_ED448
  23851. case ed448_sa_algo:
  23852. {
  23853. ed448_key* key = (ed448_key*)ssl->hsKey;
  23854. ret = Ed448Sign(ssl,
  23855. args->sigDataBuf, args->sigDataSz,
  23856. args->output + LENGTH_SZ + args->idx,
  23857. &args->sigSz,
  23858. key,
  23859. #ifdef HAVE_PK_CALLBACKS
  23860. ssl->buffers.key
  23861. #else
  23862. NULL
  23863. #endif
  23864. );
  23865. break;
  23866. }
  23867. #endif
  23868. default:
  23869. ERROR_OUT(ALGO_ID_E, exit_sske);
  23870. } /* switch(ssl->specs.sig_algo) */
  23871. break;
  23872. }
  23873. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23874. #if !defined(NO_DH) && !defined(NO_RSA)
  23875. case diffie_hellman_kea:
  23876. {
  23877. /* Sign hash to create signature */
  23878. switch (ssl->suites->sigAlgo)
  23879. {
  23880. #ifndef NO_RSA
  23881. #ifdef WC_RSA_PSS
  23882. case rsa_pss_sa_algo:
  23883. #endif
  23884. case rsa_sa_algo:
  23885. {
  23886. RsaKey* key = (RsaKey*)ssl->hsKey;
  23887. if (ssl->options.usingAnon_cipher) {
  23888. break;
  23889. }
  23890. ret = RsaSign(ssl,
  23891. ssl->buffers.sig.buffer,
  23892. ssl->buffers.sig.length,
  23893. args->output + args->idx,
  23894. &args->sigSz,
  23895. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  23896. key,
  23897. ssl->buffers.key
  23898. );
  23899. break;
  23900. }
  23901. #endif /* NO_RSA */
  23902. default:
  23903. break;
  23904. } /* switch (ssl->suites->sigAlgo) */
  23905. break;
  23906. }
  23907. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  23908. default:
  23909. break;
  23910. } /* switch(ssl->specs.kea) */
  23911. /* Check for error */
  23912. if (ret != 0) {
  23913. goto exit_sske;
  23914. }
  23915. /* Advance state and proceed */
  23916. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  23917. } /* case TLS_ASYNC_DO */
  23918. FALL_THROUGH;
  23919. case TLS_ASYNC_VERIFY:
  23920. {
  23921. switch(ssl->specs.kea)
  23922. {
  23923. #ifndef NO_PSK
  23924. case psk_kea:
  23925. {
  23926. /* Nothing to do in this sub-state */
  23927. break;
  23928. }
  23929. #endif /* !NO_PSK */
  23930. #if !defined(NO_DH) && !defined(NO_PSK)
  23931. case dhe_psk_kea:
  23932. {
  23933. /* Nothing to do in this sub-state */
  23934. break;
  23935. }
  23936. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  23937. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23938. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23939. case ecdhe_psk_kea:
  23940. {
  23941. /* Nothing to do in this sub-state */
  23942. break;
  23943. }
  23944. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  23945. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23946. defined(HAVE_CURVE448)
  23947. case ecc_diffie_hellman_kea:
  23948. {
  23949. switch(ssl->suites->sigAlgo)
  23950. {
  23951. #ifndef NO_RSA
  23952. #ifdef WC_RSA_PSS
  23953. case rsa_pss_sa_algo:
  23954. #endif
  23955. case rsa_sa_algo:
  23956. {
  23957. RsaKey* key = (RsaKey*)ssl->hsKey;
  23958. if (args->verifySig == NULL) {
  23959. if (args->sigSz == 0) {
  23960. ERROR_OUT(BAD_COND_E, exit_sske);
  23961. }
  23962. args->verifySig = (byte*)XMALLOC(
  23963. args->sigSz, ssl->heap,
  23964. DYNAMIC_TYPE_SIGNATURE);
  23965. if (!args->verifySig) {
  23966. ERROR_OUT(MEMORY_E, exit_sske);
  23967. }
  23968. XMEMCPY(args->verifySig,
  23969. args->output + args->idx, args->sigSz);
  23970. }
  23971. /* check for signature faults */
  23972. ret = VerifyRsaSign(ssl,
  23973. args->verifySig, args->sigSz,
  23974. ssl->buffers.sig.buffer,
  23975. ssl->buffers.sig.length,
  23976. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  23977. key, ssl->buffers.key
  23978. );
  23979. break;
  23980. }
  23981. #endif
  23982. case ecc_dsa_sa_algo:
  23983. #ifdef HAVE_ED25519
  23984. case ed25519_sa_algo:
  23985. #endif
  23986. #ifdef HAVE_ED448
  23987. case ed448_sa_algo:
  23988. #endif
  23989. {
  23990. /* Now that we know the real sig size, write it. */
  23991. c16toa((word16)args->sigSz,
  23992. args->output + args->idx);
  23993. /* And adjust length and sendSz from estimates */
  23994. args->length += args->sigSz - args->tmpSigSz;
  23995. args->sendSz += args->sigSz - args->tmpSigSz;
  23996. break;
  23997. }
  23998. default:
  23999. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  24000. } /* switch(ssl->specs.sig_algo) */
  24001. break;
  24002. }
  24003. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24004. #if !defined(NO_DH) && !defined(NO_RSA)
  24005. case diffie_hellman_kea:
  24006. {
  24007. switch (ssl->suites->sigAlgo)
  24008. {
  24009. #ifndef NO_RSA
  24010. #ifndef WC_RSA_PSS
  24011. case rsa_pss_sa_algo:
  24012. #endif
  24013. case rsa_sa_algo:
  24014. {
  24015. RsaKey* key = (RsaKey*)ssl->hsKey;
  24016. if (ssl->options.usingAnon_cipher) {
  24017. break;
  24018. }
  24019. if (args->verifySig == NULL) {
  24020. if (args->sigSz == 0) {
  24021. ERROR_OUT(BAD_COND_E, exit_sske);
  24022. }
  24023. args->verifySig = (byte*)XMALLOC(
  24024. args->sigSz, ssl->heap,
  24025. DYNAMIC_TYPE_SIGNATURE);
  24026. if (!args->verifySig) {
  24027. ERROR_OUT(MEMORY_E, exit_sske);
  24028. }
  24029. XMEMCPY(args->verifySig,
  24030. args->output + args->idx, args->sigSz);
  24031. }
  24032. /* check for signature faults */
  24033. ret = VerifyRsaSign(ssl,
  24034. args->verifySig, args->sigSz,
  24035. ssl->buffers.sig.buffer,
  24036. ssl->buffers.sig.length,
  24037. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  24038. key, ssl->buffers.key
  24039. );
  24040. break;
  24041. }
  24042. #endif
  24043. } /* switch (ssl->suites->sigAlgo) */
  24044. break;
  24045. }
  24046. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  24047. default:
  24048. break;
  24049. } /* switch(ssl->specs.kea) */
  24050. /* Check for error */
  24051. if (ret != 0) {
  24052. goto exit_sske;
  24053. }
  24054. /* Advance state and proceed */
  24055. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  24056. } /* case TLS_ASYNC_VERIFY */
  24057. FALL_THROUGH;
  24058. case TLS_ASYNC_FINALIZE:
  24059. {
  24060. #ifdef HAVE_QSH
  24061. if (ssl->peerQSHKeyPresent) {
  24062. if (args->qshSz > 0) {
  24063. args->idx = args->sendSz - args->qshSz;
  24064. if (QSH_KeyExchangeWrite(ssl, 1) != 0) {
  24065. ERROR_OUT(MEMORY_E, exit_sske);
  24066. }
  24067. /* extension type */
  24068. c16toa(TLSX_QUANTUM_SAFE_HYBRID,
  24069. args->output + args->idx);
  24070. args->idx += OPAQUE16_LEN;
  24071. /* write to output and check amount written */
  24072. if (TLSX_QSHPK_Write(ssl->QSH_secret->list,
  24073. args->output + args->idx) >
  24074. args->qshSz - OPAQUE16_LEN) {
  24075. ERROR_OUT(MEMORY_E, exit_sske);
  24076. }
  24077. }
  24078. }
  24079. #endif
  24080. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24081. defined(HAVE_CURVE448)
  24082. if (ssl->specs.kea == ecdhe_psk_kea ||
  24083. ssl->specs.kea == ecc_diffie_hellman_kea) {
  24084. /* Check output to make sure it was set */
  24085. if (args->output) {
  24086. AddHeaders(args->output, args->length,
  24087. server_key_exchange, ssl);
  24088. }
  24089. else {
  24090. ERROR_OUT(BUFFER_ERROR, exit_sske);
  24091. }
  24092. }
  24093. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24094. ret = SendHandshakeMsg(ssl, args->output, args->length,
  24095. server_key_exchange, "ServerKeyExchange");
  24096. if (ret != 0)
  24097. goto exit_sske;
  24098. /* Advance state and proceed */
  24099. ssl->options.asyncState = TLS_ASYNC_END;
  24100. } /* case TLS_ASYNC_FINALIZE */
  24101. FALL_THROUGH;
  24102. case TLS_ASYNC_END:
  24103. {
  24104. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  24105. break;
  24106. }
  24107. default:
  24108. ret = INPUT_CASE_ERROR;
  24109. } /* switch(ssl->options.asyncState) */
  24110. exit_sske:
  24111. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  24112. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  24113. #ifdef WOLFSSL_ASYNC_CRYPT
  24114. /* Handle async operation */
  24115. if (ret == WC_PENDING_E)
  24116. return ret;
  24117. #endif /* WOLFSSL_ASYNC_CRYPT */
  24118. /* Final cleanup */
  24119. if (args->input != NULL) {
  24120. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24121. args->input = NULL;
  24122. }
  24123. FreeSskeArgs(ssl, args);
  24124. FreeKeyExchange(ssl);
  24125. return ret;
  24126. }
  24127. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  24128. defined(OPENSSL_ALL)
  24129. /* search suites for specific one, idx on success, negative on error */
  24130. #ifndef WOLFSSL_TLS13
  24131. static
  24132. #endif
  24133. int FindSuite(Suites* suites, byte first, byte second)
  24134. {
  24135. int i;
  24136. if (suites == NULL || suites->suiteSz == 0) {
  24137. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  24138. return SUITES_ERROR;
  24139. }
  24140. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  24141. if (suites->suites[i] == first &&
  24142. suites->suites[i+1] == second )
  24143. return i;
  24144. }
  24145. return MATCH_SUITE_ERROR;
  24146. }
  24147. #endif
  24148. #endif /* !WOLFSSL_NO_TLS12 */
  24149. /* Make sure server cert/key are valid for this suite, true on success */
  24150. static int VerifyServerSuite(WOLFSSL* ssl, word16 idx)
  24151. {
  24152. int haveRSA = !ssl->options.haveStaticECC;
  24153. int havePSK = 0;
  24154. byte first;
  24155. byte second;
  24156. WOLFSSL_ENTER("VerifyServerSuite");
  24157. if (ssl->suites == NULL) {
  24158. WOLFSSL_MSG("Suites pointer error");
  24159. return 0;
  24160. }
  24161. first = ssl->suites->suites[idx];
  24162. second = ssl->suites->suites[idx+1];
  24163. #ifndef NO_PSK
  24164. havePSK = ssl->options.havePSK;
  24165. #endif
  24166. if (ssl->options.haveNTRU)
  24167. haveRSA = 0;
  24168. if (CipherRequires(first, second, REQUIRES_RSA)) {
  24169. WOLFSSL_MSG("Requires RSA");
  24170. if (haveRSA == 0) {
  24171. WOLFSSL_MSG("Don't have RSA");
  24172. return 0;
  24173. }
  24174. }
  24175. if (CipherRequires(first, second, REQUIRES_DHE)) {
  24176. WOLFSSL_MSG("Requires DHE");
  24177. if (ssl->options.haveDH == 0) {
  24178. WOLFSSL_MSG("Don't have DHE");
  24179. return 0;
  24180. }
  24181. }
  24182. if (CipherRequires(first, second, REQUIRES_ECC)) {
  24183. WOLFSSL_MSG("Requires ECC");
  24184. if (ssl->options.haveECC == 0) {
  24185. WOLFSSL_MSG("Don't have ECC");
  24186. return 0;
  24187. }
  24188. }
  24189. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  24190. WOLFSSL_MSG("Requires static ECC");
  24191. if (ssl->options.haveStaticECC == 0) {
  24192. WOLFSSL_MSG("Don't have static ECC");
  24193. return 0;
  24194. }
  24195. }
  24196. if (CipherRequires(first, second, REQUIRES_PSK)) {
  24197. WOLFSSL_MSG("Requires PSK");
  24198. if (havePSK == 0) {
  24199. WOLFSSL_MSG("Don't have PSK");
  24200. return 0;
  24201. }
  24202. }
  24203. if (CipherRequires(first, second, REQUIRES_NTRU)) {
  24204. WOLFSSL_MSG("Requires NTRU");
  24205. if (ssl->options.haveNTRU == 0) {
  24206. WOLFSSL_MSG("Don't have NTRU");
  24207. return 0;
  24208. }
  24209. }
  24210. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  24211. WOLFSSL_MSG("Requires RSA Signature");
  24212. if (ssl->options.side == WOLFSSL_SERVER_END &&
  24213. ssl->options.haveECDSAsig == 1) {
  24214. WOLFSSL_MSG("Don't have RSA Signature");
  24215. return 0;
  24216. }
  24217. }
  24218. #if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
  24219. if (CipherRequires(first, second, REQUIRES_AEAD)) {
  24220. WOLFSSL_MSG("Requires AEAD");
  24221. if (ssl->version.major == SSLv3_MAJOR &&
  24222. ssl->version.minor < TLSv1_2_MINOR) {
  24223. WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
  24224. return 0;
  24225. }
  24226. }
  24227. #endif
  24228. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24229. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  24230. if (!TLSX_ValidateSupportedCurves(ssl, first, second)) {
  24231. WOLFSSL_MSG("Don't have matching curves");
  24232. return 0;
  24233. }
  24234. #endif
  24235. /* ECCDHE is always supported if ECC on */
  24236. #ifdef HAVE_QSH
  24237. /* need to negotiate a classic suite in addition to TLS_QSH */
  24238. if (first == QSH_BYTE && second == TLS_QSH) {
  24239. if (TLSX_SupportExtensions(ssl)) {
  24240. ssl->options.haveQSH = 1; /* matched TLS_QSH */
  24241. }
  24242. else {
  24243. WOLFSSL_MSG("Version of SSL connection does not support "
  24244. "TLS_QSH");
  24245. }
  24246. return 0;
  24247. }
  24248. #endif
  24249. #ifdef WOLFSSL_TLS13
  24250. if (IsAtLeastTLSv1_3(ssl->version) &&
  24251. ssl->options.side == WOLFSSL_SERVER_END) {
  24252. #ifdef HAVE_SUPPORTED_CURVES
  24253. /* Try to establish a key share. */
  24254. int ret = TLSX_KeyShare_Establish(ssl);
  24255. if (ret == KEY_SHARE_ERROR)
  24256. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  24257. else if (ret != 0)
  24258. return 0;
  24259. #endif
  24260. }
  24261. else if (first == TLS13_BYTE || (first == ECC_BYTE &&
  24262. (second == TLS_SHA256_SHA256 || second == TLS_SHA384_SHA384))) {
  24263. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  24264. * version. */
  24265. return 0;
  24266. }
  24267. #endif
  24268. return 1;
  24269. }
  24270. #ifndef NO_WOLFSSL_SERVER
  24271. static int CompareSuites(WOLFSSL* ssl, Suites* peerSuites, word16 i,
  24272. word16 j)
  24273. {
  24274. if (ssl->suites->suites[i] == peerSuites->suites[j] &&
  24275. ssl->suites->suites[i+1] == peerSuites->suites[j+1] ) {
  24276. if (VerifyServerSuite(ssl, i)) {
  24277. int result;
  24278. WOLFSSL_MSG("Verified suite validity");
  24279. ssl->options.cipherSuite0 = ssl->suites->suites[i];
  24280. ssl->options.cipherSuite = ssl->suites->suites[i+1];
  24281. result = SetCipherSpecs(ssl);
  24282. if (result == 0) {
  24283. result = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  24284. peerSuites->hashSigAlgoSz);
  24285. }
  24286. return result;
  24287. }
  24288. else {
  24289. WOLFSSL_MSG("Could not verify suite validity, continue");
  24290. }
  24291. }
  24292. return MATCH_SUITE_ERROR;
  24293. }
  24294. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  24295. {
  24296. int ret;
  24297. word16 i, j;
  24298. WOLFSSL_ENTER("MatchSuite");
  24299. /* & 0x1 equivalent % 2 */
  24300. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  24301. return BUFFER_ERROR;
  24302. if (ssl->suites == NULL)
  24303. return SUITES_ERROR;
  24304. if (!ssl->options.useClientOrder) {
  24305. /* Server order */
  24306. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  24307. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  24308. ret = CompareSuites(ssl, peerSuites, i, j);
  24309. if (ret != MATCH_SUITE_ERROR)
  24310. return ret;
  24311. }
  24312. }
  24313. }
  24314. else {
  24315. /* Client order */
  24316. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  24317. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  24318. ret = CompareSuites(ssl, peerSuites, i, j);
  24319. if (ret != MATCH_SUITE_ERROR)
  24320. return ret;
  24321. }
  24322. }
  24323. }
  24324. return MATCH_SUITE_ERROR;
  24325. }
  24326. #endif
  24327. #ifdef OLD_HELLO_ALLOWED
  24328. /* process old style client hello, deprecate? */
  24329. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  24330. word32 inSz, word16 sz)
  24331. {
  24332. word32 idx = *inOutIdx;
  24333. word16 sessionSz;
  24334. word16 randomSz;
  24335. word16 i, j;
  24336. ProtocolVersion pv;
  24337. Suites clSuites;
  24338. int ret = -1;
  24339. (void)inSz;
  24340. WOLFSSL_MSG("Got old format client hello");
  24341. #ifdef WOLFSSL_CALLBACKS
  24342. if (ssl->hsInfoOn)
  24343. AddPacketName(ssl, "ClientHello");
  24344. if (ssl->toInfoOn)
  24345. AddLateName("ClientHello", &ssl->timeoutInfo);
  24346. #endif
  24347. /* manually hash input since different format */
  24348. #ifndef NO_OLD_TLS
  24349. #ifndef NO_MD5
  24350. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  24351. #endif
  24352. #ifndef NO_SHA
  24353. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  24354. #endif
  24355. #endif
  24356. #ifndef NO_SHA256
  24357. if (IsAtLeastTLSv1_2(ssl)) {
  24358. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  24359. input + idx, sz);
  24360. if (shaRet != 0)
  24361. return shaRet;
  24362. }
  24363. #endif
  24364. /* does this value mean client_hello? */
  24365. idx++;
  24366. /* version */
  24367. pv.major = input[idx++];
  24368. pv.minor = input[idx++];
  24369. ssl->chVersion = pv; /* store */
  24370. if (ssl->version.minor > pv.minor) {
  24371. byte haveRSA = 0;
  24372. byte havePSK = 0;
  24373. int keySz = 0;
  24374. if (!ssl->options.downgrade) {
  24375. WOLFSSL_MSG("Client trying to connect with lesser version");
  24376. return VERSION_ERROR;
  24377. }
  24378. if (pv.minor < ssl->options.minDowngrade) {
  24379. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  24380. return VERSION_ERROR;
  24381. }
  24382. if (pv.minor == SSLv3_MINOR) {
  24383. /* turn off tls */
  24384. WOLFSSL_MSG("\tdowngrading to SSLv3");
  24385. ssl->options.tls = 0;
  24386. ssl->options.tls1_1 = 0;
  24387. ssl->version.minor = SSLv3_MINOR;
  24388. }
  24389. else if (pv.minor == TLSv1_MINOR) {
  24390. WOLFSSL_MSG("\tdowngrading to TLSv1");
  24391. /* turn off tls 1.1+ */
  24392. ssl->options.tls1_1 = 0;
  24393. ssl->version.minor = TLSv1_MINOR;
  24394. }
  24395. else if (pv.minor == TLSv1_1_MINOR) {
  24396. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  24397. ssl->version.minor = TLSv1_1_MINOR;
  24398. }
  24399. else if (pv.minor == TLSv1_2_MINOR) {
  24400. WOLFSSL_MSG(" downgrading to TLSv1.2");
  24401. ssl->version.minor = TLSv1_2_MINOR;
  24402. }
  24403. #ifndef NO_RSA
  24404. haveRSA = 1;
  24405. #endif
  24406. #ifndef NO_PSK
  24407. havePSK = ssl->options.havePSK;
  24408. #endif
  24409. #ifndef NO_CERTS
  24410. keySz = ssl->buffers.keySz;
  24411. #endif
  24412. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  24413. ssl->options.haveDH, ssl->options.haveNTRU,
  24414. ssl->options.haveECDSAsig, ssl->options.haveECC,
  24415. ssl->options.haveStaticECC, ssl->options.haveAnon,
  24416. ssl->options.side);
  24417. }
  24418. /* suite size */
  24419. ato16(&input[idx], &clSuites.suiteSz);
  24420. idx += OPAQUE16_LEN;
  24421. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  24422. return BUFFER_ERROR;
  24423. /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
  24424. if (clSuites.suiteSz % 3 != 0)
  24425. return BUFFER_ERROR;
  24426. clSuites.hashSigAlgoSz = 0;
  24427. /* session size */
  24428. ato16(&input[idx], &sessionSz);
  24429. idx += OPAQUE16_LEN;
  24430. if (sessionSz > ID_LEN)
  24431. return BUFFER_ERROR;
  24432. /* random size */
  24433. ato16(&input[idx], &randomSz);
  24434. idx += OPAQUE16_LEN;
  24435. if (randomSz > RAN_LEN)
  24436. return BUFFER_ERROR;
  24437. /* suites */
  24438. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  24439. byte first = input[idx++];
  24440. if (!first) { /* implicit: skip sslv2 type */
  24441. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  24442. j += SUITE_LEN;
  24443. }
  24444. idx += SUITE_LEN;
  24445. }
  24446. clSuites.suiteSz = j;
  24447. /* session id */
  24448. if (sessionSz) {
  24449. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  24450. ssl->arrays->sessionIDSz = (byte)sessionSz;
  24451. idx += sessionSz;
  24452. ssl->options.resuming = 1;
  24453. }
  24454. /* random */
  24455. if (randomSz < RAN_LEN)
  24456. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  24457. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  24458. randomSz);
  24459. idx += randomSz;
  24460. if (ssl->options.usingCompression)
  24461. ssl->options.usingCompression = 0; /* turn off */
  24462. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  24463. ssl->cbmode = SSL_CB_MODE_WRITE;
  24464. *inOutIdx = idx;
  24465. ssl->options.haveSessionId = 1;
  24466. /* DoClientHello uses same resume code */
  24467. if (ssl->options.resuming) { /* let's try */
  24468. WOLFSSL_SESSION* session = GetSession(ssl,
  24469. ssl->arrays->masterSecret, 1);
  24470. #ifdef HAVE_SESSION_TICKET
  24471. if (ssl->options.useTicket == 1) {
  24472. session = &ssl->session;
  24473. }
  24474. #endif
  24475. if (!session) {
  24476. WOLFSSL_MSG("Session lookup for resume failed");
  24477. ssl->options.resuming = 0;
  24478. } else {
  24479. #ifdef HAVE_EXT_CACHE
  24480. wolfSSL_SESSION_free(session);
  24481. #endif
  24482. if (MatchSuite(ssl, &clSuites) < 0) {
  24483. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  24484. return UNSUPPORTED_SUITE;
  24485. }
  24486. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  24487. RAN_LEN);
  24488. if (ret != 0)
  24489. return ret;
  24490. #ifdef NO_OLD_TLS
  24491. ret = DeriveTlsKeys(ssl);
  24492. #else
  24493. #ifndef NO_TLS
  24494. if (ssl->options.tls)
  24495. ret = DeriveTlsKeys(ssl);
  24496. #endif
  24497. if (!ssl->options.tls)
  24498. ret = DeriveKeys(ssl);
  24499. #endif
  24500. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  24501. return ret;
  24502. }
  24503. }
  24504. ret = MatchSuite(ssl, &clSuites);
  24505. if (ret != 0)return ret;
  24506. return SanityCheckMsgReceived(ssl, client_hello);
  24507. }
  24508. #endif /* OLD_HELLO_ALLOWED */
  24509. #ifndef WOLFSSL_NO_TLS12
  24510. int HandleTlsResumption(WOLFSSL* ssl, int bogusID, Suites* clSuites)
  24511. {
  24512. int ret = 0;
  24513. WOLFSSL_SESSION* session;
  24514. (void)bogusID;
  24515. session = GetSession(ssl, ssl->arrays->masterSecret, 1);
  24516. #ifdef HAVE_SESSION_TICKET
  24517. if (ssl->options.useTicket == 1) {
  24518. session = &ssl->session;
  24519. } else if (bogusID == 1 && ssl->options.rejectTicket == 0) {
  24520. WOLFSSL_MSG("Bogus session ID without session ticket");
  24521. return BUFFER_ERROR;
  24522. }
  24523. #endif
  24524. if (!session) {
  24525. WOLFSSL_MSG("Session lookup for resume failed");
  24526. ssl->options.resuming = 0;
  24527. }
  24528. else if (session->haveEMS != ssl->options.haveEMS) {
  24529. /* RFC 7627, 5.3, server-side */
  24530. /* if old sess didn't have EMS, but new does, full handshake */
  24531. if (!session->haveEMS && ssl->options.haveEMS) {
  24532. WOLFSSL_MSG("Attempting to resume a session that didn't "
  24533. "use EMS with a new session with EMS. Do full "
  24534. "handshake.");
  24535. ssl->options.resuming = 0;
  24536. }
  24537. /* if old sess used EMS, but new doesn't, MUST abort */
  24538. else if (session->haveEMS && !ssl->options.haveEMS) {
  24539. WOLFSSL_MSG("Trying to resume a session with EMS without "
  24540. "using EMS");
  24541. #ifdef WOLFSSL_EXTRA_ALERTS
  24542. SendAlert(ssl, alert_fatal, handshake_failure);
  24543. #endif
  24544. #ifdef HAVE_EXT_CACHE
  24545. wolfSSL_SESSION_free(session);
  24546. #endif
  24547. return EXT_MASTER_SECRET_NEEDED_E;
  24548. }
  24549. #ifdef HAVE_EXT_CACHE
  24550. wolfSSL_SESSION_free(session);
  24551. #endif
  24552. }
  24553. else {
  24554. #ifndef NO_RESUME_SUITE_CHECK
  24555. int j;
  24556. /* Check client suites include the one in session */
  24557. for (j = 0; j < clSuites->suiteSz; j += 2) {
  24558. if (clSuites->suites[j] == session->cipherSuite0 &&
  24559. clSuites->suites[j+1] == session->cipherSuite) {
  24560. break;
  24561. }
  24562. }
  24563. if (j == clSuites->suiteSz) {
  24564. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  24565. #ifdef WOLFSSL_EXTRA_ALERTS
  24566. SendAlert(ssl, alert_fatal, illegal_parameter);
  24567. #endif
  24568. return UNSUPPORTED_SUITE;
  24569. }
  24570. #endif
  24571. #ifdef HAVE_EXT_CACHE
  24572. wolfSSL_SESSION_free(session);
  24573. #endif
  24574. if (MatchSuite(ssl, clSuites) < 0) {
  24575. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  24576. return UNSUPPORTED_SUITE;
  24577. }
  24578. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  24579. RAN_LEN);
  24580. if (ret != 0)
  24581. return ret;
  24582. #ifdef NO_OLD_TLS
  24583. ret = DeriveTlsKeys(ssl);
  24584. #else
  24585. #ifndef NO_TLS
  24586. if (ssl->options.tls)
  24587. ret = DeriveTlsKeys(ssl);
  24588. #endif
  24589. if (!ssl->options.tls)
  24590. ret = DeriveKeys(ssl);
  24591. #endif
  24592. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  24593. }
  24594. return ret;
  24595. }
  24596. /* handle processing of client_hello (1) */
  24597. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  24598. word32 helloSz)
  24599. {
  24600. byte b;
  24601. byte bogusID = 0; /* flag for a bogus session id */
  24602. ProtocolVersion pv;
  24603. Suites clSuites;
  24604. word32 i = *inOutIdx;
  24605. word32 begin = i;
  24606. int ret = 0;
  24607. #ifdef WOLFSSL_DTLS
  24608. Hmac cookieHmac;
  24609. byte peerCookie[MAX_COOKIE_LEN];
  24610. byte peerCookieSz = 0;
  24611. byte cookieType;
  24612. byte cookieSz = 0;
  24613. XMEMSET(&cookieHmac, 0, sizeof(Hmac));
  24614. #endif /* WOLFSSL_DTLS */
  24615. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  24616. WOLFSSL_ENTER("DoClientHello");
  24617. #ifdef WOLFSSL_CALLBACKS
  24618. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  24619. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  24620. #endif
  24621. /* protocol version, random and session id length check */
  24622. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  24623. return BUFFER_ERROR;
  24624. /* protocol version */
  24625. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  24626. ssl->chVersion = pv; /* store */
  24627. #ifdef WOLFSSL_DTLS
  24628. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  24629. #if defined(NO_SHA) && defined(NO_SHA256)
  24630. #error "DTLS needs either SHA or SHA-256"
  24631. #endif /* NO_SHA && NO_SHA256 */
  24632. #if !defined(NO_SHA) && defined(NO_SHA256)
  24633. cookieType = WC_SHA;
  24634. cookieSz = WC_SHA_DIGEST_SIZE;
  24635. #endif /* NO_SHA */
  24636. #ifndef NO_SHA256
  24637. cookieType = WC_SHA256;
  24638. cookieSz = WC_SHA256_DIGEST_SIZE;
  24639. #endif /* NO_SHA256 */
  24640. ret = wc_HmacSetKey(&cookieHmac, cookieType,
  24641. ssl->buffers.dtlsCookieSecret.buffer,
  24642. ssl->buffers.dtlsCookieSecret.length);
  24643. if (ret != 0) goto out;
  24644. ret = wc_HmacUpdate(&cookieHmac,
  24645. (const byte*)ssl->buffers.dtlsCtx.peer.sa,
  24646. ssl->buffers.dtlsCtx.peer.sz);
  24647. if (ret != 0) goto out;
  24648. ret = wc_HmacUpdate(&cookieHmac, input + i, OPAQUE16_LEN);
  24649. if (ret != 0) goto out;
  24650. }
  24651. #endif /* WOLFSSL_DTLS */
  24652. i += OPAQUE16_LEN;
  24653. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  24654. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  24655. pv.minor = TLSv1_2_MINOR;
  24656. if ((!ssl->options.dtls && ssl->version.minor > pv.minor) ||
  24657. (ssl->options.dtls && ssl->version.minor != DTLS_MINOR
  24658. && ssl->version.minor != DTLSv1_2_MINOR && pv.minor != DTLS_MINOR
  24659. && pv.minor != DTLSv1_2_MINOR)) {
  24660. word16 haveRSA = 0;
  24661. word16 havePSK = 0;
  24662. int keySz = 0;
  24663. if (!ssl->options.downgrade) {
  24664. WOLFSSL_MSG("Client trying to connect with lesser version");
  24665. ret = VERSION_ERROR;
  24666. goto out;
  24667. }
  24668. if (pv.minor < ssl->options.minDowngrade) {
  24669. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  24670. ret = VERSION_ERROR;
  24671. goto out;
  24672. }
  24673. if (pv.minor == SSLv3_MINOR) {
  24674. /* turn off tls */
  24675. WOLFSSL_MSG("\tdowngrading to SSLv3");
  24676. ssl->options.tls = 0;
  24677. ssl->options.tls1_1 = 0;
  24678. ssl->version.minor = SSLv3_MINOR;
  24679. }
  24680. else if (pv.minor == TLSv1_MINOR) {
  24681. /* turn off tls 1.1+ */
  24682. WOLFSSL_MSG("\tdowngrading to TLSv1");
  24683. ssl->options.tls1_1 = 0;
  24684. ssl->version.minor = TLSv1_MINOR;
  24685. }
  24686. else if (pv.minor == TLSv1_1_MINOR) {
  24687. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  24688. ssl->version.minor = TLSv1_1_MINOR;
  24689. }
  24690. else if (pv.minor == TLSv1_2_MINOR) {
  24691. WOLFSSL_MSG(" downgrading to TLSv1.2");
  24692. ssl->version.minor = TLSv1_2_MINOR;
  24693. }
  24694. #ifndef NO_RSA
  24695. haveRSA = 1;
  24696. #endif
  24697. #ifndef NO_PSK
  24698. havePSK = ssl->options.havePSK;
  24699. #endif
  24700. #ifndef NO_CERTS
  24701. keySz = ssl->buffers.keySz;
  24702. #endif
  24703. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  24704. ssl->options.haveDH, ssl->options.haveNTRU,
  24705. ssl->options.haveECDSAsig, ssl->options.haveECC,
  24706. ssl->options.haveStaticECC, ssl->options.haveAnon,
  24707. ssl->options.side);
  24708. }
  24709. #ifdef OPENSSL_EXTRA
  24710. /* check if option is set to not allow the current version
  24711. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  24712. if (!ssl->options.dtls && ssl->options.downgrade &&
  24713. ssl->options.mask > 0) {
  24714. int reset = 0;
  24715. if (ssl->version.minor == TLSv1_2_MINOR &&
  24716. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  24717. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  24718. ssl->version.minor = TLSv1_1_MINOR;
  24719. reset = 1;
  24720. }
  24721. if (ssl->version.minor == TLSv1_1_MINOR &&
  24722. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  24723. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  24724. ssl->options.tls1_1 = 0;
  24725. ssl->version.minor = TLSv1_MINOR;
  24726. reset = 1;
  24727. }
  24728. if (ssl->version.minor == TLSv1_MINOR &&
  24729. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  24730. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  24731. ssl->options.tls = 0;
  24732. ssl->options.tls1_1 = 0;
  24733. ssl->version.minor = SSLv3_MINOR;
  24734. reset = 1;
  24735. }
  24736. if (ssl->version.minor == SSLv3_MINOR &&
  24737. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  24738. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  24739. ret = VERSION_ERROR;
  24740. goto out;
  24741. }
  24742. if (ssl->version.minor < ssl->options.minDowngrade) {
  24743. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  24744. ret = VERSION_ERROR;
  24745. goto out;
  24746. }
  24747. if (reset) {
  24748. word16 haveRSA = 0;
  24749. word16 havePSK = 0;
  24750. int keySz = 0;
  24751. #ifndef NO_RSA
  24752. haveRSA = 1;
  24753. #endif
  24754. #ifndef NO_PSK
  24755. havePSK = ssl->options.havePSK;
  24756. #endif
  24757. #ifndef NO_CERTS
  24758. keySz = ssl->buffers.keySz;
  24759. #endif
  24760. /* reset cipher suites to account for TLS version change */
  24761. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  24762. ssl->options.haveDH, ssl->options.haveNTRU,
  24763. ssl->options.haveECDSAsig, ssl->options.haveECC,
  24764. ssl->options.haveStaticECC, ssl->options.haveAnon,
  24765. ssl->options.side);
  24766. }
  24767. }
  24768. #endif
  24769. /* random */
  24770. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  24771. #ifdef WOLFSSL_DTLS
  24772. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  24773. ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN);
  24774. if (ret != 0) goto out;
  24775. }
  24776. #endif /* WOLFSSL_DTLS */
  24777. i += RAN_LEN;
  24778. #ifdef SHOW_SECRETS
  24779. {
  24780. int j;
  24781. printf("client random: ");
  24782. for (j = 0; j < RAN_LEN; j++)
  24783. printf("%02x", ssl->arrays->clientRandom[j]);
  24784. printf("\n");
  24785. }
  24786. #endif
  24787. /* session id */
  24788. b = input[i++];
  24789. #ifdef HAVE_SESSION_TICKET
  24790. if (b > 0 && b < ID_LEN) {
  24791. bogusID = 1;
  24792. WOLFSSL_MSG("Client sent bogus session id, let's allow for echo");
  24793. }
  24794. #endif
  24795. if (b == ID_LEN || bogusID) {
  24796. if ((i - begin) + b > helloSz) {
  24797. ret = BUFFER_ERROR;
  24798. goto out;
  24799. }
  24800. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  24801. #ifdef WOLFSSL_DTLS
  24802. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) &&
  24803. !ssl->options.resuming) {
  24804. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  24805. if (ret != 0) goto out;
  24806. }
  24807. #endif /* WOLFSSL_DTLS */
  24808. ssl->arrays->sessionIDSz = b;
  24809. i += b;
  24810. ssl->options.resuming = 1; /* client wants to resume */
  24811. WOLFSSL_MSG("Client wants to resume session");
  24812. }
  24813. else if (b) {
  24814. WOLFSSL_MSG("Invalid session ID size");
  24815. ret = BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
  24816. goto out;
  24817. }
  24818. #ifdef WOLFSSL_DTLS
  24819. /* cookie */
  24820. if (ssl->options.dtls) {
  24821. if ((i - begin) + OPAQUE8_LEN > helloSz) {
  24822. ret = BUFFER_ERROR;
  24823. goto out;
  24824. }
  24825. peerCookieSz = input[i++];
  24826. if (peerCookieSz) {
  24827. if (peerCookieSz > MAX_COOKIE_LEN) {
  24828. ret = BUFFER_ERROR;
  24829. goto out;
  24830. }
  24831. if ((i - begin) + peerCookieSz > helloSz) {
  24832. ret = BUFFER_ERROR;
  24833. goto out;
  24834. }
  24835. XMEMCPY(peerCookie, input + i, peerCookieSz);
  24836. i += peerCookieSz;
  24837. }
  24838. }
  24839. #endif
  24840. /* suites */
  24841. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  24842. ret = BUFFER_ERROR;
  24843. goto out;
  24844. }
  24845. ato16(&input[i], &clSuites.suiteSz);
  24846. i += OPAQUE16_LEN;
  24847. /* Cipher suite lists are always multiples of two in length. */
  24848. if (clSuites.suiteSz % 2 != 0) {
  24849. ret = BUFFER_ERROR;
  24850. goto out;
  24851. }
  24852. /* suites and compression length check */
  24853. if ((i - begin) + clSuites.suiteSz + OPAQUE8_LEN > helloSz) {
  24854. ret = BUFFER_ERROR;
  24855. goto out;
  24856. }
  24857. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ) {
  24858. ret = BUFFER_ERROR;
  24859. goto out;
  24860. }
  24861. XMEMCPY(clSuites.suites, input + i, clSuites.suiteSz);
  24862. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  24863. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  24864. if (FindSuite(&clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  24865. TLSX* extension;
  24866. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  24867. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  24868. if (ret != WOLFSSL_SUCCESS)
  24869. goto out;
  24870. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  24871. if (extension) {
  24872. ssl->secure_renegotiation =
  24873. (SecureRenegotiation*)extension->data;
  24874. ssl->secure_renegotiation->enabled = 1;
  24875. }
  24876. }
  24877. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  24878. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  24879. /* check for TLS_FALLBACK_SCSV suite */
  24880. if (FindSuite(&clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  24881. WOLFSSL_MSG("Found Fallback SCSV");
  24882. if (ssl->ctx->method->version.minor > pv.minor) {
  24883. WOLFSSL_MSG("Client trying to connect with lesser version");
  24884. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  24885. ret = VERSION_ERROR;
  24886. goto out;
  24887. }
  24888. }
  24889. #endif
  24890. #ifdef WOLFSSL_DTLS
  24891. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  24892. ret = wc_HmacUpdate(&cookieHmac,
  24893. input + i - OPAQUE16_LEN,
  24894. clSuites.suiteSz + OPAQUE16_LEN);
  24895. if (ret != 0) goto out;
  24896. }
  24897. #endif /* WOLFSSL_DTLS */
  24898. i += clSuites.suiteSz;
  24899. clSuites.hashSigAlgoSz = 0;
  24900. /* compression length */
  24901. b = input[i++];
  24902. if ((i - begin) + b > helloSz) {
  24903. ret = BUFFER_ERROR;
  24904. goto out;
  24905. }
  24906. if (b == 0) {
  24907. WOLFSSL_MSG("No compression types in list");
  24908. #ifdef WOLFSSL_EXTRA_ALERTS
  24909. SendAlert(ssl, alert_fatal, decode_error);
  24910. #endif
  24911. ret = COMPRESSION_ERROR;
  24912. goto out;
  24913. }
  24914. #ifdef WOLFSSL_DTLS
  24915. if (IsDtlsNotSctpMode(ssl)) {
  24916. if (!IsSCR(ssl) && !ssl->options.resuming) {
  24917. byte newCookie[MAX_COOKIE_LEN];
  24918. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  24919. if (ret != 0) goto out;
  24920. ret = wc_HmacFinal(&cookieHmac, newCookie);
  24921. if (ret != 0) goto out;
  24922. /* If a cookie callback is set, call it to overwrite the cookie.
  24923. * This should be deprecated. The code now calculates the cookie
  24924. * using an HMAC as expected. */
  24925. if (ssl->ctx->CBIOCookie != NULL &&
  24926. ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz,
  24927. ssl->IOCB_CookieCtx) != cookieSz) {
  24928. ret = COOKIE_ERROR;
  24929. goto out;
  24930. }
  24931. /* Check the cookie, see if we progress the state machine. */
  24932. if (peerCookieSz != cookieSz ||
  24933. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  24934. /* Send newCookie to client in a HelloVerifyRequest message
  24935. * and let the state machine alone. */
  24936. ssl->msgsReceived.got_client_hello = 0;
  24937. ssl->keys.dtls_handshake_number = 0;
  24938. ssl->keys.dtls_expected_peer_handshake_number = 0;
  24939. *inOutIdx += helloSz;
  24940. ret = SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  24941. goto out;
  24942. }
  24943. }
  24944. /* This was skipped in the DTLS case so we could handle the hello
  24945. * verify request. */
  24946. ret = HashInput(ssl, input + *inOutIdx, helloSz);
  24947. if (ret != 0) goto out;
  24948. }
  24949. #endif /* WOLFSSL_DTLS */
  24950. {
  24951. /* compression match types */
  24952. int matchNo = 0;
  24953. int matchZlib = 0;
  24954. while (b--) {
  24955. byte comp = input[i++];
  24956. if (comp == NO_COMPRESSION) {
  24957. matchNo = 1;
  24958. }
  24959. if (comp == ZLIB_COMPRESSION) {
  24960. matchZlib = 1;
  24961. }
  24962. }
  24963. if (ssl->options.usingCompression == 0 && matchNo) {
  24964. WOLFSSL_MSG("Matched No Compression");
  24965. } else if (ssl->options.usingCompression && matchZlib) {
  24966. WOLFSSL_MSG("Matched zlib Compression");
  24967. } else if (ssl->options.usingCompression && matchNo) {
  24968. WOLFSSL_MSG("Could only match no compression, turning off");
  24969. ssl->options.usingCompression = 0; /* turn off */
  24970. } else {
  24971. WOLFSSL_MSG("Could not match compression");
  24972. #ifdef WOLFSSL_EXTRA_ALERTS
  24973. SendAlert(ssl, alert_fatal, illegal_parameter);
  24974. #endif
  24975. ret = COMPRESSION_ERROR;
  24976. goto out;
  24977. }
  24978. }
  24979. *inOutIdx = i;
  24980. /* tls extensions */
  24981. if ((i - begin) < helloSz) {
  24982. #ifdef HAVE_TLS_EXTENSIONS
  24983. #ifdef HAVE_QSH
  24984. QSH_Init(ssl);
  24985. #endif
  24986. if (TLSX_SupportExtensions(ssl))
  24987. #else
  24988. if (IsAtLeastTLSv1_2(ssl))
  24989. #endif
  24990. {
  24991. /* Process the hello extension. Skip unsupported. */
  24992. word16 totalExtSz;
  24993. #ifdef HAVE_TLS_EXTENSIONS
  24994. /* auto populate extensions supported unless user defined */
  24995. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  24996. goto out;
  24997. #endif
  24998. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  24999. ret = BUFFER_ERROR;
  25000. goto out;
  25001. }
  25002. ato16(&input[i], &totalExtSz);
  25003. i += OPAQUE16_LEN;
  25004. if ((i - begin) + totalExtSz > helloSz) {
  25005. ret = BUFFER_ERROR;
  25006. goto out;
  25007. }
  25008. #ifdef HAVE_TLS_EXTENSIONS
  25009. /* tls extensions */
  25010. if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, client_hello,
  25011. &clSuites)))
  25012. goto out;
  25013. #ifdef WOLFSSL_TLS13
  25014. if (TLSX_Find(ssl->extensions,
  25015. TLSX_SUPPORTED_VERSIONS) != NULL) {
  25016. WOLFSSL_MSG(
  25017. "Client attempting to connect with higher version");
  25018. ret = VERSION_ERROR;
  25019. goto out;
  25020. }
  25021. #endif
  25022. #ifdef HAVE_SNI
  25023. if((ret=SNI_Callback(ssl)))
  25024. goto out;
  25025. ssl->options.side = WOLFSSL_SERVER_END;
  25026. #endif
  25027. i += totalExtSz;
  25028. #else
  25029. while (totalExtSz) {
  25030. word16 extId, extSz;
  25031. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
  25032. ret = BUFFER_ERROR;
  25033. goto out;
  25034. }
  25035. ato16(&input[i], &extId);
  25036. i += OPAQUE16_LEN;
  25037. ato16(&input[i], &extSz);
  25038. i += OPAQUE16_LEN;
  25039. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
  25040. ret = BUFFER_ERROR;
  25041. goto out;
  25042. }
  25043. if (extId == HELLO_EXT_SIG_ALGO) {
  25044. word16 hashSigAlgoSz;
  25045. ato16(&input[i], &hashSigAlgoSz);
  25046. i += OPAQUE16_LEN;
  25047. if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
  25048. ret = BUFFER_ERROR;
  25049. goto out;
  25050. }
  25051. if (hashSigAlgoSz % 2 != 0) {
  25052. ret = BUFFER_ERROR;
  25053. goto out;
  25054. }
  25055. clSuites.hashSigAlgoSz = hashSigAlgoSz;
  25056. if (clSuites.hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  25057. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  25058. "truncating");
  25059. clSuites.hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  25060. }
  25061. XMEMCPY(clSuites.hashSigAlgo, &input[i],
  25062. clSuites.hashSigAlgoSz);
  25063. i += hashSigAlgoSz;
  25064. }
  25065. #ifdef HAVE_EXTENDED_MASTER
  25066. else if (extId == HELLO_EXT_EXTMS)
  25067. ssl->options.haveEMS = 1;
  25068. #endif
  25069. else
  25070. i += extSz;
  25071. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  25072. }
  25073. #endif
  25074. *inOutIdx = i;
  25075. }
  25076. else
  25077. *inOutIdx = begin + helloSz; /* skip extensions */
  25078. }
  25079. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  25080. ssl->options.haveSessionId = 1;
  25081. /* ProcessOld uses same resume code */
  25082. if (ssl->options.resuming) {
  25083. ret = HandleTlsResumption(ssl, bogusID, &clSuites);
  25084. if (ret != 0)
  25085. goto out;
  25086. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  25087. WOLFSSL_LEAVE("DoClientHello", ret);
  25088. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  25089. goto out;
  25090. }
  25091. }
  25092. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
  25093. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  25094. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  25095. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  25096. * present and no matches in the server's list. */
  25097. ret = TLSX_SupportedFFDHE_Set(ssl);
  25098. if (ret != 0)
  25099. goto out;
  25100. }
  25101. #endif
  25102. #endif
  25103. ret = MatchSuite(ssl, &clSuites);
  25104. #ifdef WOLFSSL_EXTRA_ALERTS
  25105. if (ret == BUFFER_ERROR)
  25106. SendAlert(ssl, alert_fatal, decode_error);
  25107. else if (ret < 0)
  25108. SendAlert(ssl, alert_fatal, handshake_failure);
  25109. #endif
  25110. #ifdef WOLFSSL_DTLS
  25111. if (ret == 0 && ssl->options.dtls)
  25112. DtlsMsgPoolReset(ssl);
  25113. #endif
  25114. WOLFSSL_LEAVE("DoClientHello", ret);
  25115. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  25116. out:
  25117. #ifdef WOLFSSL_DTLS
  25118. wc_HmacFree(&cookieHmac);
  25119. #endif
  25120. return ret;
  25121. }
  25122. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  25123. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  25124. typedef struct DcvArgs {
  25125. byte* output; /* not allocated */
  25126. word32 sendSz;
  25127. word16 sz;
  25128. word32 sigSz;
  25129. word32 idx;
  25130. word32 begin;
  25131. byte hashAlgo;
  25132. byte sigAlgo;
  25133. } DcvArgs;
  25134. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  25135. {
  25136. DcvArgs* args = (DcvArgs*)pArgs;
  25137. (void)ssl;
  25138. (void)args;
  25139. }
  25140. /* handle processing of certificate_verify (15) */
  25141. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  25142. word32* inOutIdx, word32 size)
  25143. {
  25144. int ret = 0;
  25145. #ifdef WOLFSSL_ASYNC_CRYPT
  25146. DcvArgs* args = (DcvArgs*)ssl->async.args;
  25147. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  25148. (void)sizeof(args_test);
  25149. #else
  25150. DcvArgs args[1];
  25151. #endif
  25152. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  25153. WOLFSSL_ENTER("DoCertificateVerify");
  25154. #ifdef WOLFSSL_ASYNC_CRYPT
  25155. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  25156. if (ret != WC_NOT_PENDING_E) {
  25157. /* Check for error */
  25158. if (ret < 0)
  25159. goto exit_dcv;
  25160. }
  25161. else
  25162. #endif
  25163. {
  25164. /* Reset state */
  25165. ret = 0;
  25166. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  25167. XMEMSET(args, 0, sizeof(DcvArgs));
  25168. args->hashAlgo = sha_mac;
  25169. args->sigAlgo = anonymous_sa_algo;
  25170. args->idx = *inOutIdx;
  25171. args->begin = *inOutIdx;
  25172. #ifdef WOLFSSL_ASYNC_CRYPT
  25173. ssl->async.freeArgs = FreeDcvArgs;
  25174. #endif
  25175. }
  25176. switch(ssl->options.asyncState)
  25177. {
  25178. case TLS_ASYNC_BEGIN:
  25179. {
  25180. #ifdef WOLFSSL_CALLBACKS
  25181. if (ssl->hsInfoOn)
  25182. AddPacketName(ssl, "CertificateVerify");
  25183. if (ssl->toInfoOn)
  25184. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  25185. #endif
  25186. /* Advance state and proceed */
  25187. ssl->options.asyncState = TLS_ASYNC_BUILD;
  25188. } /* case TLS_ASYNC_BEGIN */
  25189. FALL_THROUGH;
  25190. case TLS_ASYNC_BUILD:
  25191. {
  25192. if (IsAtLeastTLSv1_2(ssl)) {
  25193. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  25194. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  25195. }
  25196. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  25197. &args->sigAlgo);
  25198. args->idx += 2;
  25199. }
  25200. #ifndef NO_RSA
  25201. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  25202. args->sigAlgo = rsa_sa_algo;
  25203. #endif
  25204. #ifdef HAVE_ECC
  25205. else if (ssl->peerEccDsaKeyPresent)
  25206. args->sigAlgo = ecc_dsa_sa_algo;
  25207. #endif
  25208. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  25209. else if (ssl->peerEd25519KeyPresent)
  25210. args->sigAlgo = ed25519_sa_algo;
  25211. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  25212. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  25213. else if (ssl->peerEd448KeyPresent)
  25214. args->sigAlgo = ed448_sa_algo;
  25215. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  25216. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25217. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  25218. }
  25219. ato16(input + args->idx, &args->sz);
  25220. args->idx += OPAQUE16_LEN;
  25221. if ((args->idx - args->begin) + args->sz > size ||
  25222. args->sz > ENCRYPT_LEN) {
  25223. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  25224. }
  25225. #ifdef HAVE_ECC
  25226. if (ssl->peerEccDsaKeyPresent) {
  25227. WOLFSSL_MSG("Doing ECC peer cert verify");
  25228. /* make sure a default is defined */
  25229. #if !defined(NO_SHA)
  25230. SetDigest(ssl, sha_mac);
  25231. #elif !defined(NO_SHA256)
  25232. SetDigest(ssl, sha256_mac);
  25233. #elif defined(WOLFSSL_SHA384)
  25234. SetDigest(ssl, sha384_mac);
  25235. #elif defined(WOLFSSL_SHA512)
  25236. SetDigest(ssl, sha512_mac);
  25237. #else
  25238. #error No digest enabled for ECC sig verify
  25239. #endif
  25240. if (IsAtLeastTLSv1_2(ssl)) {
  25241. if (args->sigAlgo != ecc_dsa_sa_algo) {
  25242. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  25243. }
  25244. SetDigest(ssl, args->hashAlgo);
  25245. }
  25246. }
  25247. #endif /* HAVE_ECC */
  25248. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  25249. if (ssl->peerEd25519KeyPresent) {
  25250. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  25251. if (IsAtLeastTLSv1_2(ssl) &&
  25252. args->sigAlgo != ed25519_sa_algo) {
  25253. WOLFSSL_MSG(
  25254. "Oops, peer sent ED25519 key but not in verify");
  25255. }
  25256. }
  25257. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  25258. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  25259. if (ssl->peerEd448KeyPresent) {
  25260. WOLFSSL_MSG("Doing ED448 peer cert verify");
  25261. if (IsAtLeastTLSv1_2(ssl) &&
  25262. args->sigAlgo != ed448_sa_algo) {
  25263. WOLFSSL_MSG(
  25264. "Oops, peer sent ED448 key but not in verify");
  25265. }
  25266. }
  25267. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  25268. /* Advance state and proceed */
  25269. ssl->options.asyncState = TLS_ASYNC_DO;
  25270. } /* case TLS_ASYNC_BUILD */
  25271. FALL_THROUGH;
  25272. case TLS_ASYNC_DO:
  25273. {
  25274. #ifndef NO_RSA
  25275. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  25276. WOLFSSL_MSG("Doing RSA peer cert verify");
  25277. ret = RsaVerify(ssl,
  25278. input + args->idx,
  25279. args->sz,
  25280. &args->output,
  25281. args->sigAlgo, args->hashAlgo,
  25282. ssl->peerRsaKey,
  25283. #ifdef HAVE_PK_CALLBACKS
  25284. &ssl->buffers.peerRsaKey
  25285. #else
  25286. NULL
  25287. #endif
  25288. );
  25289. if (ret >= 0) {
  25290. if (args->sigAlgo == rsa_sa_algo)
  25291. args->sendSz = ret;
  25292. else {
  25293. args->sigSz = ret;
  25294. args->sendSz = ssl->buffers.digest.length;
  25295. }
  25296. ret = 0;
  25297. }
  25298. }
  25299. #endif /* !NO_RSA */
  25300. #ifdef HAVE_ECC
  25301. if (ssl->peerEccDsaKeyPresent) {
  25302. WOLFSSL_MSG("Doing ECC peer cert verify");
  25303. ret = EccVerify(ssl,
  25304. input + args->idx, args->sz,
  25305. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  25306. ssl->peerEccDsaKey,
  25307. #ifdef HAVE_PK_CALLBACKS
  25308. &ssl->buffers.peerEccDsaKey
  25309. #else
  25310. NULL
  25311. #endif
  25312. );
  25313. }
  25314. #endif /* HAVE_ECC */
  25315. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  25316. if (ssl->peerEd25519KeyPresent) {
  25317. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  25318. ret = Ed25519Verify(ssl,
  25319. input + args->idx, args->sz,
  25320. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  25321. ssl->peerEd25519Key,
  25322. #ifdef HAVE_PK_CALLBACKS
  25323. &ssl->buffers.peerEd25519Key
  25324. #else
  25325. NULL
  25326. #endif
  25327. );
  25328. }
  25329. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  25330. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  25331. if (ssl->peerEd448KeyPresent) {
  25332. WOLFSSL_MSG("Doing Ed448 peer cert verify");
  25333. ret = Ed448Verify(ssl,
  25334. input + args->idx, args->sz,
  25335. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  25336. ssl->peerEd448Key,
  25337. #ifdef HAVE_PK_CALLBACKS
  25338. &ssl->buffers.peerEd448Key
  25339. #else
  25340. NULL
  25341. #endif
  25342. );
  25343. }
  25344. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  25345. #ifdef WOLFSSL_ASYNC_CRYPT
  25346. /* handle async pending */
  25347. if (ret == WC_PENDING_E)
  25348. goto exit_dcv;
  25349. #endif
  25350. /* Check for error */
  25351. if (ret != 0) {
  25352. ret = SIG_VERIFY_E;
  25353. goto exit_dcv;
  25354. }
  25355. /* Advance state and proceed */
  25356. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  25357. } /* case TLS_ASYNC_DO */
  25358. FALL_THROUGH;
  25359. case TLS_ASYNC_VERIFY:
  25360. {
  25361. #ifndef NO_RSA
  25362. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  25363. if (IsAtLeastTLSv1_2(ssl)) {
  25364. #ifdef WC_RSA_PSS
  25365. if (args->sigAlgo == rsa_pss_sa_algo) {
  25366. SetDigest(ssl, args->hashAlgo);
  25367. #ifdef HAVE_SELFTEST
  25368. ret = wc_RsaPSS_CheckPadding(
  25369. ssl->buffers.digest.buffer,
  25370. ssl->buffers.digest.length,
  25371. args->output, args->sigSz,
  25372. HashAlgoToType(args->hashAlgo));
  25373. #else
  25374. ret = wc_RsaPSS_CheckPadding_ex(
  25375. ssl->buffers.digest.buffer,
  25376. ssl->buffers.digest.length,
  25377. args->output, args->sigSz,
  25378. HashAlgoToType(args->hashAlgo), -1,
  25379. mp_count_bits(&ssl->peerRsaKey->n));
  25380. #endif
  25381. if (ret != 0) {
  25382. ret = SIG_VERIFY_E;
  25383. goto exit_dcv;
  25384. }
  25385. }
  25386. else
  25387. #endif
  25388. {
  25389. #ifdef WOLFSSL_SMALL_STACK
  25390. byte* encodedSig;
  25391. #else
  25392. byte encodedSig[MAX_ENCODED_SIG_SZ];
  25393. #endif
  25394. #ifdef WOLFSSL_SMALL_STACK
  25395. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  25396. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25397. if (encodedSig == NULL) {
  25398. ERROR_OUT(MEMORY_E, exit_dcv);
  25399. }
  25400. #endif
  25401. if (args->sigAlgo != rsa_sa_algo) {
  25402. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  25403. "in verify");
  25404. }
  25405. SetDigest(ssl, args->hashAlgo);
  25406. args->sigSz = wc_EncodeSignature(encodedSig,
  25407. ssl->buffers.digest.buffer,
  25408. ssl->buffers.digest.length,
  25409. TypeHash(args->hashAlgo));
  25410. if (args->sendSz != args->sigSz || !args->output ||
  25411. XMEMCMP(args->output, encodedSig,
  25412. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  25413. ret = VERIFY_CERT_ERROR;
  25414. }
  25415. #ifdef WOLFSSL_SMALL_STACK
  25416. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25417. #endif
  25418. }
  25419. }
  25420. else {
  25421. if (args->sendSz != FINISHED_SZ || !args->output ||
  25422. XMEMCMP(args->output,
  25423. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  25424. ret = VERIFY_CERT_ERROR;
  25425. }
  25426. }
  25427. }
  25428. #endif /* !NO_RSA */
  25429. /* Advance state and proceed */
  25430. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  25431. } /* case TLS_ASYNC_VERIFY */
  25432. FALL_THROUGH;
  25433. case TLS_ASYNC_FINALIZE:
  25434. {
  25435. if (IsEncryptionOn(ssl, 0)) {
  25436. args->idx += ssl->keys.padSz;
  25437. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  25438. if (ssl->options.startedETMRead)
  25439. args->idx += MacSize(ssl);
  25440. #endif
  25441. }
  25442. ssl->options.havePeerVerify = 1;
  25443. /* Set final index */
  25444. args->idx += args->sz;
  25445. *inOutIdx = args->idx;
  25446. /* Advance state and proceed */
  25447. ssl->options.asyncState = TLS_ASYNC_END;
  25448. } /* case TLS_ASYNC_FINALIZE */
  25449. FALL_THROUGH;
  25450. case TLS_ASYNC_END:
  25451. {
  25452. break;
  25453. }
  25454. default:
  25455. ret = INPUT_CASE_ERROR;
  25456. } /* switch(ssl->options.asyncState) */
  25457. exit_dcv:
  25458. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  25459. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  25460. #ifdef WOLFSSL_ASYNC_CRYPT
  25461. /* Handle async operation */
  25462. if (ret == WC_PENDING_E) {
  25463. /* Mark message as not received so it can process again */
  25464. ssl->msgsReceived.got_certificate_verify = 0;
  25465. return ret;
  25466. }
  25467. #endif /* WOLFSSL_ASYNC_CRYPT */
  25468. #ifdef WOLFSSL_EXTRA_ALERTS
  25469. if (ret == BUFFER_ERROR)
  25470. SendAlert(ssl, alert_fatal, decode_error);
  25471. else if (ret == SIG_VERIFY_E)
  25472. SendAlert(ssl, alert_fatal, decrypt_error);
  25473. else if (ret != 0)
  25474. SendAlert(ssl, alert_fatal, bad_certificate);
  25475. #endif
  25476. /* Digest is not allocated, so do this to prevent free */
  25477. ssl->buffers.digest.buffer = NULL;
  25478. ssl->buffers.digest.length = 0;
  25479. /* Final cleanup */
  25480. FreeDcvArgs(ssl, args);
  25481. FreeKeyExchange(ssl);
  25482. return ret;
  25483. }
  25484. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  25485. /* handle generation of server_hello_done (14) */
  25486. int SendServerHelloDone(WOLFSSL* ssl)
  25487. {
  25488. byte* output;
  25489. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  25490. int ret;
  25491. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  25492. WOLFSSL_ENTER("SendServerHelloDone");
  25493. #ifdef WOLFSSL_DTLS
  25494. if (ssl->options.dtls)
  25495. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25496. #endif
  25497. if (IsEncryptionOn(ssl, 1))
  25498. sendSz += MAX_MSG_EXTRA;
  25499. /* check for available size */
  25500. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  25501. return ret;
  25502. /* get output buffer */
  25503. output = ssl->buffers.outputBuffer.buffer +
  25504. ssl->buffers.outputBuffer.length;
  25505. AddHeaders(output, 0, server_hello_done, ssl);
  25506. if (IsEncryptionOn(ssl, 1)) {
  25507. byte* input;
  25508. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  25509. int recordHeaderSz = RECORD_HEADER_SZ;
  25510. if (ssl->options.dtls) {
  25511. recordHeaderSz += DTLS_RECORD_EXTRA;
  25512. inputSz += DTLS_HANDSHAKE_EXTRA;
  25513. }
  25514. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25515. if (input == NULL)
  25516. return MEMORY_E;
  25517. XMEMCPY(input, output + recordHeaderSz, inputSz);
  25518. #ifdef WOLFSSL_DTLS
  25519. if (IsDtlsNotSctpMode(ssl) &&
  25520. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
  25521. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25522. return ret;
  25523. }
  25524. #endif
  25525. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  25526. handshake, 1, 0, 0, CUR_ORDER);
  25527. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25528. if (sendSz < 0)
  25529. return sendSz;
  25530. } else {
  25531. #ifdef WOLFSSL_DTLS
  25532. if (IsDtlsNotSctpMode(ssl)) {
  25533. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
  25534. return ret;
  25535. }
  25536. if (ssl->options.dtls)
  25537. DtlsSEQIncrement(ssl, CUR_ORDER);
  25538. #endif
  25539. ret = HashOutput(ssl, output, sendSz, 0);
  25540. if (ret != 0)
  25541. return ret;
  25542. }
  25543. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  25544. if (ssl->hsInfoOn)
  25545. AddPacketName(ssl, "ServerHelloDone");
  25546. if (ssl->toInfoOn)
  25547. AddPacketInfo(ssl, "ServerHelloDone", handshake, output, sendSz,
  25548. WRITE_PROTO, ssl->heap);
  25549. #endif
  25550. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  25551. ssl->buffers.outputBuffer.length += sendSz;
  25552. ret = SendBuffered(ssl);
  25553. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  25554. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  25555. return ret;
  25556. }
  25557. #endif /* !WOLFSSL_NO_TLS12 */
  25558. #ifdef HAVE_SESSION_TICKET
  25559. #define WOLFSSL_TICKET_FIXED_SZ (WOLFSSL_TICKET_NAME_SZ + \
  25560. WOLFSSL_TICKET_IV_SZ + WOLFSSL_TICKET_MAC_SZ + LENGTH_SZ)
  25561. #define WOLFSSL_TICKET_ENC_SZ (SESSION_TICKET_LEN - WOLFSSL_TICKET_FIXED_SZ)
  25562. /* our ticket format */
  25563. typedef struct InternalTicket {
  25564. ProtocolVersion pv; /* version when ticket created */
  25565. byte suite[SUITE_LEN]; /* cipher suite when created */
  25566. byte msecret[SECRET_LEN]; /* master secret */
  25567. word32 timestamp; /* born on */
  25568. word16 haveEMS; /* have extended master secret */
  25569. #ifdef WOLFSSL_TLS13
  25570. word32 ageAdd; /* Obfuscation of age */
  25571. word16 namedGroup; /* Named group used */
  25572. TicketNonce ticketNonce; /* Ticket nonce */
  25573. #ifdef WOLFSSL_EARLY_DATA
  25574. word32 maxEarlyDataSz; /* Max size of early data */
  25575. #endif
  25576. #endif
  25577. } InternalTicket;
  25578. /* RFC 5077 defines this for session tickets */
  25579. /* fit within SESSION_TICKET_LEN */
  25580. typedef struct ExternalTicket {
  25581. byte key_name[WOLFSSL_TICKET_NAME_SZ]; /* key context name */
  25582. byte iv[WOLFSSL_TICKET_IV_SZ]; /* this ticket's iv */
  25583. byte enc_len[LENGTH_SZ]; /* encrypted length */
  25584. byte enc_ticket[WOLFSSL_TICKET_ENC_SZ]; /* encrypted internal ticket */
  25585. byte mac[WOLFSSL_TICKET_MAC_SZ]; /* total mac */
  25586. /* !! if add to structure, add to TICKET_FIXED_SZ !! */
  25587. } ExternalTicket;
  25588. /* create a new session ticket, 0 on success */
  25589. int CreateTicket(WOLFSSL* ssl)
  25590. {
  25591. InternalTicket it;
  25592. ExternalTicket* et = (ExternalTicket*)ssl->session.ticket;
  25593. int encLen;
  25594. int ret;
  25595. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  25596. XMEMSET(&it, 0, sizeof(it));
  25597. /* build internal */
  25598. it.pv.major = ssl->version.major;
  25599. it.pv.minor = ssl->version.minor;
  25600. it.suite[0] = ssl->options.cipherSuite0;
  25601. it.suite[1] = ssl->options.cipherSuite;
  25602. #ifdef WOLFSSL_EARLY_DATA
  25603. it.maxEarlyDataSz = ssl->options.maxEarlyDataSz;
  25604. #endif
  25605. if (!ssl->options.tls1_3) {
  25606. XMEMCPY(it.msecret, ssl->arrays->masterSecret, SECRET_LEN);
  25607. c32toa(LowResTimer(), (byte*)&it.timestamp);
  25608. it.haveEMS = ssl->options.haveEMS;
  25609. }
  25610. else {
  25611. #ifdef WOLFSSL_TLS13
  25612. /* Client adds to ticket age to obfuscate. */
  25613. ret = wc_RNG_GenerateBlock(ssl->rng, (byte*)&it.ageAdd,
  25614. sizeof(it.ageAdd));
  25615. if (ret != 0)
  25616. return BAD_TICKET_ENCRYPT;
  25617. ssl->session.ticketAdd = it.ageAdd;
  25618. it.namedGroup = ssl->session.namedGroup;
  25619. it.timestamp = TimeNowInMilliseconds();
  25620. /* Resumption master secret. */
  25621. XMEMCPY(it.msecret, ssl->session.masterSecret, SECRET_LEN);
  25622. XMEMCPY(&it.ticketNonce, &ssl->session.ticketNonce,
  25623. sizeof(TicketNonce));
  25624. #endif
  25625. }
  25626. /* encrypt */
  25627. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  25628. if (ssl->ctx->ticketEncCb == NULL) {
  25629. ret = WOLFSSL_TICKET_RET_FATAL;
  25630. }
  25631. else {
  25632. /* build external */
  25633. XMEMCPY(et->enc_ticket, &it, sizeof(InternalTicket));
  25634. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac, 1,
  25635. et->enc_ticket, sizeof(InternalTicket),
  25636. &encLen, ssl->ctx->ticketEncCtx);
  25637. if (ret != WOLFSSL_TICKET_RET_OK) {
  25638. ForceZero(et->enc_ticket, sizeof(it));
  25639. }
  25640. }
  25641. if (ret == WOLFSSL_TICKET_RET_OK) {
  25642. if (encLen < (int)sizeof(InternalTicket) ||
  25643. encLen > WOLFSSL_TICKET_ENC_SZ) {
  25644. ForceZero(&it, sizeof(it));
  25645. ForceZero(et->enc_ticket, sizeof(it));
  25646. WOLFSSL_MSG("Bad user ticket encrypt size");
  25647. return BAD_TICKET_KEY_CB_SZ;
  25648. }
  25649. /* sanity checks on encrypt callback */
  25650. /* internal ticket can't be the same if encrypted */
  25651. if (XMEMCMP(et->enc_ticket, &it, sizeof(InternalTicket)) == 0) {
  25652. ForceZero(&it, sizeof(it));
  25653. ForceZero(et->enc_ticket, sizeof(it));
  25654. WOLFSSL_MSG("User ticket encrypt didn't encrypt");
  25655. return BAD_TICKET_ENCRYPT;
  25656. }
  25657. ForceZero(&it, sizeof(it));
  25658. XMEMSET(zeros, 0, sizeof(zeros));
  25659. /* name */
  25660. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  25661. WOLFSSL_MSG("User ticket encrypt didn't set name");
  25662. return BAD_TICKET_ENCRYPT;
  25663. }
  25664. /* iv */
  25665. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  25666. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  25667. return BAD_TICKET_ENCRYPT;
  25668. }
  25669. /* mac */
  25670. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  25671. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  25672. return BAD_TICKET_ENCRYPT;
  25673. }
  25674. /* set size */
  25675. c16toa((word16)encLen, et->enc_len);
  25676. ssl->session.ticketLen = (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  25677. if (encLen < WOLFSSL_TICKET_ENC_SZ) {
  25678. /* move mac up since whole enc buffer not used */
  25679. XMEMMOVE(et->enc_ticket +encLen, et->mac,WOLFSSL_TICKET_MAC_SZ);
  25680. }
  25681. }
  25682. return ret;
  25683. }
  25684. /* Parse ticket sent by client, returns callback return value */
  25685. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  25686. {
  25687. ExternalTicket* et;
  25688. InternalTicket it;
  25689. int ret;
  25690. int outLen;
  25691. word16 inLen;
  25692. WOLFSSL_START(WC_FUNC_TICKET_DO);
  25693. WOLFSSL_ENTER("DoClientTicket");
  25694. if (len > SESSION_TICKET_LEN ||
  25695. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  25696. return BAD_TICKET_MSG_SZ;
  25697. }
  25698. et = (ExternalTicket*)input;
  25699. /* decrypt */
  25700. ato16(et->enc_len, &inLen);
  25701. if (inLen > (word16)(len - WOLFSSL_TICKET_FIXED_SZ)) {
  25702. return BAD_TICKET_MSG_SZ;
  25703. }
  25704. outLen = inLen; /* may be reduced by user padding */
  25705. if (ssl->ctx->ticketEncCb == NULL) {
  25706. ret = WOLFSSL_TICKET_RET_FATAL;
  25707. }
  25708. else {
  25709. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv,
  25710. et->enc_ticket + inLen, 0,
  25711. et->enc_ticket, inLen, &outLen,
  25712. ssl->ctx->ticketEncCtx);
  25713. }
  25714. if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) return ret;
  25715. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  25716. WOLFSSL_MSG("Bad user ticket decrypt len");
  25717. return BAD_TICKET_KEY_CB_SZ;
  25718. }
  25719. /* copy the decrypted ticket to avoid alignment issues */
  25720. XMEMCPY(&it, et->enc_ticket, sizeof(InternalTicket));
  25721. ForceZero(et->enc_ticket, sizeof(it));
  25722. /* get master secret */
  25723. if (ret == WOLFSSL_TICKET_RET_OK || ret == WOLFSSL_TICKET_RET_CREATE) {
  25724. if (ssl->version.minor < it.pv.minor) {
  25725. ForceZero(&it, sizeof(it));
  25726. WOLFSSL_MSG("Ticket has greater version");
  25727. return VERSION_ERROR;
  25728. }
  25729. else if (ssl->version.minor > it.pv.minor) {
  25730. if (IsAtLeastTLSv1_3(it.pv) != IsAtLeastTLSv1_3(ssl->version)) {
  25731. ForceZero(&it, sizeof(it));
  25732. WOLFSSL_MSG("Tickets cannot be shared between "
  25733. "TLS 1.3 and TLS 1.2 and lower");
  25734. return VERSION_ERROR;
  25735. }
  25736. if (!ssl->options.downgrade) {
  25737. ForceZero(&it, sizeof(it));
  25738. WOLFSSL_MSG("Ticket has lesser version");
  25739. return VERSION_ERROR;
  25740. }
  25741. WOLFSSL_MSG("Downgrading protocol due to ticket");
  25742. if (it.pv.minor < ssl->options.minDowngrade) {
  25743. ForceZero(&it, sizeof(it));
  25744. return VERSION_ERROR;
  25745. }
  25746. ssl->version.minor = it.pv.minor;
  25747. }
  25748. if (!IsAtLeastTLSv1_3(ssl->version)) {
  25749. XMEMCPY(ssl->arrays->masterSecret, it.msecret, SECRET_LEN);
  25750. /* Copy the haveExtendedMasterSecret property from the ticket to
  25751. * the saved session, so the property may be checked later. */
  25752. ssl->session.haveEMS = it.haveEMS;
  25753. #ifndef NO_RESUME_SUITE_CHECK
  25754. ssl->session.cipherSuite0 = it.suite[0];
  25755. ssl->session.cipherSuite = it.suite[1];
  25756. #endif
  25757. }
  25758. else {
  25759. #ifdef WOLFSSL_TLS13
  25760. /* Restore information to renegotiate. */
  25761. ssl->session.ticketSeen = it.timestamp;
  25762. ssl->session.ticketAdd = it.ageAdd;
  25763. ssl->session.cipherSuite0 = it.suite[0];
  25764. ssl->session.cipherSuite = it.suite[1];
  25765. #ifdef WOLFSSL_EARLY_DATA
  25766. ssl->session.maxEarlyDataSz = it.maxEarlyDataSz;
  25767. #endif
  25768. /* Resumption master secret. */
  25769. XMEMCPY(ssl->session.masterSecret, it.msecret, SECRET_LEN);
  25770. XMEMCPY(&ssl->session.ticketNonce, &it.ticketNonce,
  25771. sizeof(TicketNonce));
  25772. ssl->session.namedGroup = it.namedGroup;
  25773. #endif
  25774. }
  25775. }
  25776. ForceZero(&it, sizeof(it));
  25777. WOLFSSL_LEAVE("DoClientTicket", ret);
  25778. WOLFSSL_END(WC_FUNC_TICKET_DO);
  25779. return ret;
  25780. }
  25781. /* send Session Ticket */
  25782. int SendTicket(WOLFSSL* ssl)
  25783. {
  25784. byte* output;
  25785. int ret;
  25786. int sendSz;
  25787. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  25788. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  25789. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  25790. WOLFSSL_ENTER("SendTicket");
  25791. if (ssl->options.createTicket) {
  25792. ret = CreateTicket(ssl);
  25793. if (ret != 0) return ret;
  25794. }
  25795. length += ssl->session.ticketLen;
  25796. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  25797. if (!ssl->options.dtls) {
  25798. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  25799. sendSz += MAX_MSG_EXTRA;
  25800. }
  25801. else {
  25802. #ifdef WOLFSSL_DTLS
  25803. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25804. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25805. #endif
  25806. }
  25807. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  25808. sendSz += cipherExtraData(ssl);
  25809. /* check for available size */
  25810. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  25811. return ret;
  25812. /* get output buffer */
  25813. output = ssl->buffers.outputBuffer.buffer +
  25814. ssl->buffers.outputBuffer.length;
  25815. AddHeaders(output, length, session_ticket, ssl);
  25816. /* hint */
  25817. c32toa(ssl->ctx->ticketHint, output + idx);
  25818. idx += SESSION_HINT_SZ;
  25819. /* length */
  25820. c16toa(ssl->session.ticketLen, output + idx);
  25821. idx += LENGTH_SZ;
  25822. /* ticket */
  25823. XMEMCPY(output + idx, ssl->session.ticket, ssl->session.ticketLen);
  25824. idx += ssl->session.ticketLen;
  25825. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  25826. byte* input;
  25827. int inputSz = idx; /* build msg adds rec hdr */
  25828. int recordHeaderSz = RECORD_HEADER_SZ;
  25829. if (ssl->options.dtls)
  25830. recordHeaderSz += DTLS_RECORD_EXTRA;
  25831. inputSz -= recordHeaderSz;
  25832. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25833. if (input == NULL)
  25834. return MEMORY_E;
  25835. XMEMCPY(input, output + recordHeaderSz, inputSz);
  25836. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  25837. handshake, 1, 0, 0, CUR_ORDER);
  25838. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25839. if (sendSz < 0)
  25840. return sendSz;
  25841. }
  25842. else {
  25843. #ifdef WOLFSSL_DTLS
  25844. if (ssl->options.dtls) {
  25845. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
  25846. return ret;
  25847. DtlsSEQIncrement(ssl, CUR_ORDER);
  25848. }
  25849. #endif
  25850. ret = HashOutput(ssl, output, sendSz, 0);
  25851. if (ret != 0)
  25852. return ret;
  25853. }
  25854. ssl->buffers.outputBuffer.length += sendSz;
  25855. if (!ssl->options.groupMessages)
  25856. ret = SendBuffered(ssl);
  25857. WOLFSSL_LEAVE("SendTicket", ret);
  25858. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  25859. return ret;
  25860. }
  25861. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  25862. /* Initialize the context for session ticket encryption.
  25863. *
  25864. * @param [in] ctx SSL context.
  25865. * @param [in] keyCtx Context for session ticket encryption.
  25866. * @return 0 on success.
  25867. * @return BAD_MUTEX_E when initializing mutex fails.
  25868. */
  25869. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
  25870. {
  25871. int ret = 0;
  25872. XMEMSET(keyCtx, 0, sizeof(*keyCtx));
  25873. keyCtx->ctx = ctx;
  25874. #ifndef SINGLE_THREADED
  25875. ret = wc_InitMutex(&keyCtx->mutex);
  25876. #endif
  25877. return ret;
  25878. }
  25879. /* Setup the session ticket encryption context for this.
  25880. *
  25881. * Initialize RNG, generate name, generate primeary key and set primary key
  25882. * expirary.
  25883. *
  25884. * @param [in] keyCtx Context for session ticket encryption.
  25885. * @param [in] heap Dynamic memory allocation hint.
  25886. * @param [in] devId Device identifier.
  25887. * @return 0 on success.
  25888. * @return Other value when random number generator fails.
  25889. */
  25890. static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
  25891. {
  25892. int ret;
  25893. #ifndef SINGLE_THREADED
  25894. ret = 0;
  25895. /* Check that key wasn't set up while waiting. */
  25896. if (keyCtx->expirary[0] == 0)
  25897. #endif
  25898. {
  25899. ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
  25900. if (ret == 0) {
  25901. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
  25902. sizeof(keyCtx->name));
  25903. }
  25904. if (ret == 0) {
  25905. /* Mask of the bottom bit - used for index of key. */
  25906. keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
  25907. /* Generate initial primary key. */
  25908. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
  25909. WOLFSSL_TICKET_KEY_SZ);
  25910. }
  25911. if (ret == 0) {
  25912. keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
  25913. }
  25914. }
  25915. return ret;
  25916. }
  25917. /* Free the context for session ticket encryption.
  25918. *
  25919. * Zeroize keys and name.
  25920. *
  25921. * @param [in] keyCtx Context for session ticket encryption.
  25922. */
  25923. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
  25924. {
  25925. /* Zeroize sensitive data. */
  25926. ForceZero(keyCtx->name, sizeof(keyCtx->name));
  25927. ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
  25928. ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
  25929. #ifndef SINGLE_THREADED
  25930. wc_FreeMutex(&keyCtx->mutex);
  25931. #endif
  25932. wc_FreeRng(&keyCtx->rng);
  25933. }
  25934. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  25935. !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
  25936. !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
  25937. /* Ticket encryption/decryption implementation.
  25938. *
  25939. * @param [in] key Key for encryption/decryption.
  25940. * @param [in] keyLen Length of key in bytes.
  25941. * @param [in] iv IV/Nonce for encryption/decryption.
  25942. * @param [in] aad Additional authentication data.
  25943. * @param [in] aadSz Length of additional authentication data.
  25944. * @param [in] in Data to encrypt/decrypt.
  25945. * @param [in] inLen Length of encrypted data.
  25946. * @param [out] out Resulting data from encrypt/decrypt.
  25947. * @param [out] outLen Size of resulting data.
  25948. * @param [in] tag Authentication tag for encrypted data.
  25949. * @param [in] heap Dynamic memory allocation data hint.
  25950. * @param [in] enc 1 when encrypting, 0 when decrypting.
  25951. * @return 0 on success.
  25952. * @return Other value when encryption/decryption fails.
  25953. */
  25954. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  25955. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  25956. void* heap, int enc)
  25957. {
  25958. int ret;
  25959. (void)keyLen;
  25960. (void)heap;
  25961. if (enc) {
  25962. ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
  25963. tag);
  25964. }
  25965. else {
  25966. ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
  25967. out);
  25968. }
  25969. *outLen = inLen;
  25970. return ret;
  25971. }
  25972. #elif defined(HAVE_AESGCM)
  25973. /* Ticket encryption/decryption implementation.
  25974. *
  25975. * @param [in] key Key for encryption/decryption.
  25976. * @param [in] keyLen Length of key in bytes.
  25977. * @param [in] iv IV/Nonce for encryption/decryption.
  25978. * @param [in] aad Additional authentication data.
  25979. * @param [in] aadSz Length of additional authentication data.
  25980. * @param [in] in Data to encrypt/decrypt.
  25981. * @param [in] inLen Length of encrypted data.
  25982. * @param [out] out Resulting data from encrypt/decrypt.
  25983. * @param [out] outLen Size of resulting data.
  25984. * @param [in] tag Authentication tag for encrypted data.
  25985. * @param [in] heap Dynamic memory allocation data hint.
  25986. * @param [in] enc 1 when encrypting, 0 when decrypting.
  25987. * @return 0 on success.
  25988. * @return MEMORY_E when dynamic memory allocation fails.
  25989. * @return Other value when encryption/decryption fails.
  25990. */
  25991. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  25992. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  25993. void* heap, int enc)
  25994. {
  25995. int ret;
  25996. #ifdef WOLFSSL_SMALL_STACK
  25997. Aes* aes;
  25998. #else
  25999. Aes aes[1];
  26000. #endif
  26001. (void)heap;
  26002. #ifdef WOLFSSL_SMALL_STACK
  26003. aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
  26004. if (aes == NULL)
  26005. return MEMORY_E;
  26006. #endif
  26007. if (enc) {
  26008. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  26009. if (ret == 0) {
  26010. ret = wc_AesGcmSetKey(aes, key, keyLen);
  26011. }
  26012. if (ret == 0) {
  26013. ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  26014. tag, AES_BLOCK_SIZE, aad, aadSz);
  26015. }
  26016. wc_AesFree(aes);
  26017. }
  26018. else {
  26019. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  26020. if (ret == 0) {
  26021. ret = wc_AesGcmSetKey(aes, key, keyLen);
  26022. }
  26023. if (ret == 0) {
  26024. ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  26025. tag, AES_BLOCK_SIZE, aad, aadSz);
  26026. }
  26027. wc_AesFree(aes);
  26028. }
  26029. #ifdef WOLFSSL_SMALL_STACK
  26030. XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
  26031. #endif
  26032. *outLen = inLen;
  26033. return ret;
  26034. }
  26035. #else
  26036. #error "No encryption algorithm available for default ticket encryption."
  26037. #endif
  26038. /* Choose a key to use for encryption.
  26039. *
  26040. * Generate a new key if the current ones are expired.
  26041. * If the secondary key has not been used and the primary key has expired then
  26042. * generate a new primary key.
  26043. *
  26044. * @param [in] Ticket encryption callback context.
  26045. * @param [in] Session ticket lifetime.
  26046. * @param [out] Index of key to use for encryption.
  26047. * @return 0 on success.
  26048. * @return Other value when random number generation fails.
  26049. */
  26050. static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
  26051. int* keyIdx)
  26052. {
  26053. int ret = 0;
  26054. /* Get new current time as lock may have taken some time. */
  26055. word32 now = LowResTimer();
  26056. /* Check expirary of primary key for encrypt. */
  26057. if (keyCtx->expirary[0] >= now + ticketHint) {
  26058. *keyIdx = 0;
  26059. }
  26060. /* Check expirary of primary key for encrypt. */
  26061. else if (keyCtx->expirary[1] >= now + ticketHint) {
  26062. *keyIdx = 1;
  26063. }
  26064. /* No key available to use. */
  26065. else {
  26066. int genKey;
  26067. /* Generate which ever key is expired for decrypt - primary first. */
  26068. if (keyCtx->expirary[0] < now) {
  26069. genKey = 0;
  26070. }
  26071. else if (keyCtx->expirary[1] < now) {
  26072. genKey = 1;
  26073. }
  26074. /* Timeouts and expirary should not allow this to happen. */
  26075. else {
  26076. return BAD_STATE_E;
  26077. }
  26078. /* Generate the required key */
  26079. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
  26080. WOLFSSL_TICKET_KEY_SZ);
  26081. if (ret == 0) {
  26082. keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
  26083. *keyIdx = genKey;
  26084. }
  26085. }
  26086. return ret;
  26087. }
  26088. /* Default Session Ticket encryption/decryption callback.
  26089. *
  26090. * Use ChaCha20-Poly1305 or AES-GCM to encrypt/decrypt the ticket.
  26091. * Two keys are used:
  26092. * - When the first expires for encryption, then use the other.
  26093. * - Don't encrypt with key if the ticket lifetime will go beyond expirary.
  26094. * - Generate a new primary key when primary key expired for decrypt and
  26095. * no secondary key is activate for encryption.
  26096. * - Generate a new secondary key when expired and needed.
  26097. * - Calculate expirary starting from first encrypted ticket.
  26098. * - Key name has last bit set to indicate index of key.
  26099. * Keys expire for decryption after ticket key lifetime from the first encrypted
  26100. * ticket.
  26101. * Keys can only be use for encryption while the ticket hint does not exceed
  26102. * the key lifetime.
  26103. * Lifetime of a key must be greater than the lifetime of a ticket. This means
  26104. * that if one ticket is only valid for decryption, then the other will be
  26105. * valid for encryption.
  26106. * AAD = key_name | iv | ticket len (16-bits network order)
  26107. *
  26108. * @param [in] ssl SSL connection.
  26109. * @param [in,out] key_name Name of key from client.
  26110. * Encrypt: name of key returned.
  26111. * Decrypt: name from ticket message to check.
  26112. * @param [in] iv IV to use in encryption/decryption.
  26113. * @param [in] mac MAC for authentication of encrypted data.
  26114. * @param [in] enc 1 when encrypting ticket, 0 when decrypting.
  26115. * @param [in,out] ticket Encrypted/decrypted session ticket bytes.
  26116. * @param [in] inLen Length of incoming ticket.
  26117. * @param [out] outLen Length of outgoing ticket.
  26118. * @param [in] userCtx Context for encryption/decryption of ticket.
  26119. * @return WOLFSSL_TICKET_RET_OK when successful.
  26120. * @return WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
  26121. * be created for TLS 1.2 and below.
  26122. * @return WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
  26123. * decrypted ticket.
  26124. * @return WOLFSSL_TICKET_RET_FATAL when key name does not match.
  26125. */
  26126. static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
  26127. byte iv[WOLFSSL_TICKET_IV_SZ],
  26128. byte mac[WOLFSSL_TICKET_MAC_SZ],
  26129. int enc, byte* ticket, int inLen, int* outLen,
  26130. void* userCtx)
  26131. {
  26132. int ret;
  26133. TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
  26134. WOLFSSL_CTX* ctx = keyCtx->ctx;
  26135. word16 sLen = XHTONS(inLen);
  26136. byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
  26137. int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
  26138. byte* p = aad;
  26139. int keyIdx = 0;
  26140. /* Check we have setup the RNG, name and primary key. */
  26141. if (keyCtx->expirary[0] == 0) {
  26142. #ifndef SINGLE_THREADED
  26143. /* Lock around access to expirary and key - stop initial key being
  26144. * generated twice at the same time. */
  26145. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  26146. WOLFSSL_MSG("Couldn't lock key context mutex");
  26147. return WOLFSSL_TICKET_RET_REJECT;
  26148. }
  26149. #endif
  26150. /* Sets expirary of primary key in setup. */
  26151. ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
  26152. #ifndef SINGLE_THREADED
  26153. wc_UnLockMutex(&keyCtx->mutex);
  26154. #endif
  26155. if (ret != 0)
  26156. return ret;
  26157. }
  26158. if (enc) {
  26159. /* Return the name of the key - missing key index. */
  26160. XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  26161. /* Generate a new IV into buffer to be returned.
  26162. * Don't use the RNG in keyCtx as it's for generating private data. */
  26163. ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
  26164. if (ret != 0) {
  26165. return WOLFSSL_TICKET_RET_REJECT;
  26166. }
  26167. }
  26168. else {
  26169. /* Mask of last bit that is the key index. */
  26170. byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
  26171. /* For decryption, see if we know this key - check all but last byte. */
  26172. if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
  26173. return WOLFSSL_TICKET_RET_FATAL;
  26174. }
  26175. /* Ensure last byte without index bit matches too. */
  26176. if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
  26177. return WOLFSSL_TICKET_RET_FATAL;
  26178. }
  26179. }
  26180. /* Build AAD from: key name, iv, and length of ticket. */
  26181. XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  26182. p += WOLFSSL_TICKET_NAME_SZ;
  26183. XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
  26184. p += WOLFSSL_TICKET_IV_SZ;
  26185. XMEMCPY(p, &sLen, sizeof(sLen));
  26186. /* Encrypt ticket. */
  26187. if (enc) {
  26188. word32 now;
  26189. now = LowResTimer();
  26190. /* As long as encryption expirary isn't imminent - no lock. */
  26191. if (keyCtx->expirary[0] > now + ctx->ticketHint) {
  26192. keyIdx = 0;
  26193. }
  26194. else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
  26195. keyIdx = 1;
  26196. }
  26197. else {
  26198. #ifndef SINGLE_THREADED
  26199. /* Lock around access to expirary and key - stop key being generated
  26200. * twice at the same time. */
  26201. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  26202. WOLFSSL_MSG("Couldn't lock key context mutex");
  26203. return WOLFSSL_TICKET_RET_REJECT;
  26204. }
  26205. #endif
  26206. ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
  26207. #ifndef SINGLE_THREADED
  26208. wc_UnLockMutex(&keyCtx->mutex);
  26209. #endif
  26210. if (ret != 0) {
  26211. return WOLFSSL_TICKET_RET_REJECT;
  26212. }
  26213. }
  26214. /* Set the name of the key to the index chosen. */
  26215. key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  26216. /* Update AAD too. */
  26217. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  26218. /* Encrypt ticket data. */
  26219. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  26220. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  26221. 1);
  26222. if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
  26223. }
  26224. /* Decrypt ticket. */
  26225. else {
  26226. /* Get index of key from name. */
  26227. keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
  26228. /* Update AAD with index. */
  26229. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  26230. /* Check expirary */
  26231. if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
  26232. return WOLFSSL_TICKET_RET_REJECT;
  26233. }
  26234. /* Decrypt ticket data. */
  26235. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  26236. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  26237. 0);
  26238. if (ret != 0) {
  26239. return WOLFSSL_TICKET_RET_REJECT;
  26240. }
  26241. }
  26242. #ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
  26243. if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
  26244. return WOLFSSL_TICKET_RET_CREATE;
  26245. #endif
  26246. return WOLFSSL_TICKET_RET_OK;
  26247. }
  26248. #endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
  26249. #endif /* HAVE_SESSION_TICKET */
  26250. #ifndef WOLFSSL_NO_TLS12
  26251. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  26252. defined(HAVE_SERVER_RENEGOTIATION_INFO) && \
  26253. !defined(WOLFSSL_NO_SERVER)
  26254. /* handle generation of server's hello_request (0) */
  26255. int SendHelloRequest(WOLFSSL* ssl)
  26256. {
  26257. byte* output;
  26258. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  26259. int ret;
  26260. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  26261. WOLFSSL_ENTER("SendHelloRequest");
  26262. if (IsEncryptionOn(ssl, 1))
  26263. sendSz += MAX_MSG_EXTRA;
  26264. if (ssl->options.dtls)
  26265. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26266. /* check for available size */
  26267. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  26268. return ret;
  26269. /* get output buffer */
  26270. output = ssl->buffers.outputBuffer.buffer +
  26271. ssl->buffers.outputBuffer.length;
  26272. AddHeaders(output, 0, hello_request, ssl);
  26273. if (IsEncryptionOn(ssl, 1)) {
  26274. byte* input;
  26275. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  26276. int recordHeaderSz = RECORD_HEADER_SZ;
  26277. if (ssl->options.dtls) {
  26278. recordHeaderSz += DTLS_RECORD_EXTRA;
  26279. inputSz += DTLS_HANDSHAKE_EXTRA;
  26280. }
  26281. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26282. if (input == NULL)
  26283. return MEMORY_E;
  26284. XMEMCPY(input, output + recordHeaderSz, inputSz);
  26285. #ifdef WOLFSSL_DTLS
  26286. if (IsDtlsNotSctpMode(ssl) &&
  26287. (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
  26288. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26289. return ret;
  26290. }
  26291. #endif
  26292. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  26293. handshake, 0, 0, 0, CUR_ORDER);
  26294. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26295. if (sendSz < 0)
  26296. return sendSz;
  26297. }
  26298. ssl->buffers.outputBuffer.length += sendSz;
  26299. ret = SendBuffered(ssl);
  26300. WOLFSSL_LEAVE("SendHelloRequest", ret);
  26301. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  26302. return ret;
  26303. }
  26304. #endif /* HAVE_SECURE_RENEGOTIATION && HAVE_SERVER_RENEGOTIATION_INFO */
  26305. #ifdef WOLFSSL_DTLS
  26306. /* handle generation of DTLS hello_verify_request (3) */
  26307. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  26308. const byte* cookie, byte cookieSz)
  26309. {
  26310. byte* output;
  26311. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  26312. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  26313. int sendSz = length + idx;
  26314. int ret;
  26315. /* are we in scr */
  26316. if (IsEncryptionOn(ssl, 1)) {
  26317. sendSz += MAX_MSG_EXTRA;
  26318. }
  26319. /* check for available size */
  26320. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  26321. return ret;
  26322. /* get output buffer */
  26323. output = ssl->buffers.outputBuffer.buffer +
  26324. ssl->buffers.outputBuffer.length;
  26325. /* Hello Verify Request should use the same sequence number
  26326. * as the Client Hello unless we are in renegotiation then
  26327. * don't change numbers */
  26328. #ifdef HAVE_SECURE_RENEGOTIATION
  26329. if (!IsSCR(ssl))
  26330. #endif
  26331. {
  26332. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  26333. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  26334. }
  26335. AddHeaders(output, length, hello_verify_request, ssl);
  26336. #ifdef OPENSSL_EXTRA
  26337. output[idx++] = DTLS_MAJOR;
  26338. output[idx++] = DTLS_MINOR;
  26339. #else
  26340. output[idx++] = ssl->version.major;
  26341. output[idx++] = ssl->version.minor;
  26342. #endif
  26343. output[idx++] = cookieSz;
  26344. if (cookie == NULL || cookieSz == 0)
  26345. return COOKIE_ERROR;
  26346. XMEMCPY(output + idx, cookie, cookieSz);
  26347. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  26348. if (ssl->hsInfoOn)
  26349. AddPacketName(ssl, "HelloVerifyRequest");
  26350. if (ssl->toInfoOn)
  26351. AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  26352. sendSz, WRITE_PROTO, ssl->heap);
  26353. #endif
  26354. /* are we in scr */
  26355. if (IsEncryptionOn(ssl, 1)) {
  26356. byte* input;
  26357. int inputSz = DTLS_HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
  26358. int recordHeaderSz = DTLS_RECORD_HEADER_SZ;
  26359. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26360. if (input == NULL)
  26361. return MEMORY_E;
  26362. XMEMCPY(input, output + recordHeaderSz, inputSz);
  26363. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  26364. handshake, 0, 0, 0, CUR_ORDER);
  26365. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26366. if (sendSz < 0)
  26367. return sendSz;
  26368. }
  26369. ssl->buffers.outputBuffer.length += sendSz;
  26370. DtlsSEQIncrement(ssl, CUR_ORDER);
  26371. return SendBuffered(ssl);
  26372. }
  26373. #endif /* WOLFSSL_DTLS */
  26374. typedef struct DckeArgs {
  26375. byte* output; /* not allocated */
  26376. word32 length;
  26377. word32 idx;
  26378. word32 begin;
  26379. word32 sigSz;
  26380. #ifndef NO_RSA
  26381. int lastErr;
  26382. #endif
  26383. } DckeArgs;
  26384. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  26385. {
  26386. DckeArgs* args = (DckeArgs*)pArgs;
  26387. (void)ssl;
  26388. (void)args;
  26389. }
  26390. /* handle processing client_key_exchange (16) */
  26391. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  26392. word32 size)
  26393. {
  26394. int ret;
  26395. #ifdef WOLFSSL_ASYNC_CRYPT
  26396. DckeArgs* args = (DckeArgs*)ssl->async.args;
  26397. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  26398. (void)sizeof(args_test);
  26399. #else
  26400. DckeArgs args[1];
  26401. #endif
  26402. (void)size;
  26403. (void)input;
  26404. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  26405. WOLFSSL_ENTER("DoClientKeyExchange");
  26406. #ifdef WOLFSSL_ASYNC_CRYPT
  26407. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  26408. if (ret != WC_NOT_PENDING_E) {
  26409. /* Check for error */
  26410. if (ret < 0)
  26411. goto exit_dcke;
  26412. }
  26413. else
  26414. #endif /* WOLFSSL_ASYNC_CRYPT */
  26415. {
  26416. /* Reset state */
  26417. ret = 0;
  26418. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  26419. XMEMSET(args, 0, sizeof(DckeArgs));
  26420. args->idx = *inOutIdx;
  26421. args->begin = *inOutIdx;
  26422. #ifdef WOLFSSL_ASYNC_CRYPT
  26423. ssl->async.freeArgs = FreeDckeArgs;
  26424. #endif
  26425. }
  26426. /* Do Client Key Exchange State Machine */
  26427. switch(ssl->options.asyncState)
  26428. {
  26429. case TLS_ASYNC_BEGIN:
  26430. {
  26431. /* Sanity checks */
  26432. if (ssl->options.side != WOLFSSL_SERVER_END) {
  26433. WOLFSSL_MSG("Client received client keyexchange, attack?");
  26434. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  26435. ERROR_OUT(WOLFSSL_FATAL_ERROR, exit_dcke);
  26436. }
  26437. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  26438. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  26439. SendAlert(ssl, alert_fatal, unexpected_message);
  26440. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  26441. }
  26442. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  26443. if (ssl->options.verifyPeer && ssl->options.failNoCert) {
  26444. if (!ssl->options.havePeerCert) {
  26445. WOLFSSL_MSG("client didn't present peer cert");
  26446. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  26447. }
  26448. }
  26449. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  26450. if (!ssl->options.havePeerCert &&
  26451. !ssl->options.usingPSK_cipher) {
  26452. WOLFSSL_MSG("client didn't present peer cert");
  26453. return NO_PEER_CERT;
  26454. }
  26455. }
  26456. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  26457. #if defined(WOLFSSL_CALLBACKS)
  26458. if (ssl->hsInfoOn) {
  26459. AddPacketName(ssl, "ClientKeyExchange");
  26460. }
  26461. if (ssl->toInfoOn) {
  26462. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  26463. }
  26464. #endif
  26465. if (ssl->arrays->preMasterSecret == NULL) {
  26466. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  26467. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  26468. ssl->heap, DYNAMIC_TYPE_SECRET);
  26469. if (ssl->arrays->preMasterSecret == NULL) {
  26470. ERROR_OUT(MEMORY_E, exit_dcke);
  26471. }
  26472. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  26473. }
  26474. switch (ssl->specs.kea) {
  26475. #ifndef NO_RSA
  26476. case rsa_kea:
  26477. {
  26478. break;
  26479. } /* rsa_kea */
  26480. #endif /* !NO_RSA */
  26481. #ifndef NO_PSK
  26482. case psk_kea:
  26483. {
  26484. /* sanity check that PSK server callback has been set */
  26485. if (ssl->options.server_psk_cb == NULL) {
  26486. WOLFSSL_MSG("No server PSK callback set");
  26487. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  26488. }
  26489. break;
  26490. }
  26491. #endif /* !NO_PSK */
  26492. #ifdef HAVE_NTRU
  26493. case ntru_kea:
  26494. {
  26495. /* make sure private key exists */
  26496. if (ssl->buffers.key == NULL ||
  26497. ssl->buffers.key->buffer == NULL) {
  26498. ERROR_OUT(NO_PRIVATE_KEY, exit_dcke);
  26499. }
  26500. break;
  26501. }
  26502. #endif /* HAVE_NTRU */
  26503. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26504. defined(HAVE_CURVE448)
  26505. case ecc_diffie_hellman_kea:
  26506. {
  26507. break;
  26508. }
  26509. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26510. #ifndef NO_DH
  26511. case diffie_hellman_kea:
  26512. {
  26513. break;
  26514. }
  26515. #endif /* !NO_DH */
  26516. #if !defined(NO_DH) && !defined(NO_PSK)
  26517. case dhe_psk_kea:
  26518. {
  26519. /* sanity check that PSK server callback has been set */
  26520. if (ssl->options.server_psk_cb == NULL) {
  26521. WOLFSSL_MSG("No server PSK callback set");
  26522. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  26523. }
  26524. break;
  26525. }
  26526. #endif /* !NO_DH && !NO_PSK */
  26527. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26528. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26529. case ecdhe_psk_kea:
  26530. {
  26531. /* sanity check that PSK server callback has been set */
  26532. if (ssl->options.server_psk_cb == NULL) {
  26533. WOLFSSL_MSG("No server PSK callback set");
  26534. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  26535. }
  26536. break;
  26537. }
  26538. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  26539. default:
  26540. WOLFSSL_MSG("Bad kea type");
  26541. ret = BAD_KEA_TYPE_E;
  26542. } /* switch (ssl->specs.kea) */
  26543. /* Check for error */
  26544. if (ret != 0) {
  26545. goto exit_dcke;
  26546. }
  26547. /* Advance state and proceed */
  26548. ssl->options.asyncState = TLS_ASYNC_BUILD;
  26549. } /* TLS_ASYNC_BEGIN */
  26550. FALL_THROUGH;
  26551. case TLS_ASYNC_BUILD:
  26552. {
  26553. switch (ssl->specs.kea) {
  26554. #ifndef NO_RSA
  26555. case rsa_kea:
  26556. {
  26557. word16 keySz;
  26558. ssl->buffers.keyType = rsa_sa_algo;
  26559. ret = DecodePrivateKey(ssl, &keySz);
  26560. if (ret != 0) {
  26561. goto exit_dcke;
  26562. }
  26563. args->length = (word32)keySz;
  26564. ssl->arrays->preMasterSz = SECRET_LEN;
  26565. if (ssl->options.tls) {
  26566. word16 check;
  26567. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26568. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26569. }
  26570. ato16(input + args->idx, &check);
  26571. args->idx += OPAQUE16_LEN;
  26572. if ((word32)check != args->length) {
  26573. WOLFSSL_MSG("RSA explicit size doesn't match");
  26574. #ifdef WOLFSSL_EXTRA_ALERTS
  26575. SendAlert(ssl, alert_fatal, bad_record_mac);
  26576. #endif
  26577. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  26578. }
  26579. }
  26580. if ((args->idx - args->begin) + args->length > size) {
  26581. WOLFSSL_MSG("RSA message too big");
  26582. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26583. }
  26584. /* pre-load PreMasterSecret with RNG data */
  26585. ret = wc_RNG_GenerateBlock(ssl->rng,
  26586. &ssl->arrays->preMasterSecret[VERSION_SZ],
  26587. SECRET_LEN - VERSION_SZ);
  26588. if (ret != 0) {
  26589. goto exit_dcke;
  26590. }
  26591. args->output = NULL;
  26592. break;
  26593. } /* rsa_kea */
  26594. #endif /* !NO_RSA */
  26595. #ifndef NO_PSK
  26596. case psk_kea:
  26597. {
  26598. byte* pms = ssl->arrays->preMasterSecret;
  26599. word16 ci_sz;
  26600. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26601. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26602. }
  26603. ato16(input + args->idx, &ci_sz);
  26604. args->idx += OPAQUE16_LEN;
  26605. if (ci_sz > MAX_PSK_ID_LEN) {
  26606. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  26607. }
  26608. if ((args->idx - args->begin) + ci_sz > size) {
  26609. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26610. }
  26611. XMEMCPY(ssl->arrays->client_identity,
  26612. input + args->idx, ci_sz);
  26613. args->idx += ci_sz;
  26614. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  26615. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  26616. ssl->arrays->client_identity, ssl->arrays->psk_key,
  26617. MAX_PSK_KEY_LEN);
  26618. if (ssl->arrays->psk_keySz == 0 ||
  26619. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  26620. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  26621. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  26622. SendAlert(ssl, alert_fatal,
  26623. unknown_psk_identity);
  26624. #endif
  26625. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  26626. }
  26627. /* make psk pre master secret */
  26628. /* length of key + length 0s + length of key + key */
  26629. c16toa((word16) ssl->arrays->psk_keySz, pms);
  26630. pms += OPAQUE16_LEN;
  26631. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  26632. pms += ssl->arrays->psk_keySz;
  26633. c16toa((word16) ssl->arrays->psk_keySz, pms);
  26634. pms += OPAQUE16_LEN;
  26635. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  26636. ssl->arrays->preMasterSz =
  26637. (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
  26638. break;
  26639. }
  26640. #endif /* !NO_PSK */
  26641. #ifdef HAVE_NTRU
  26642. case ntru_kea:
  26643. {
  26644. word16 cipherLen;
  26645. word16 plainLen = ENCRYPT_LEN;
  26646. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26647. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26648. }
  26649. ato16(input + args->idx, &cipherLen);
  26650. args->idx += OPAQUE16_LEN;
  26651. if (cipherLen > MAX_NTRU_ENCRYPT_SZ) {
  26652. ERROR_OUT(NTRU_KEY_ERROR, exit_dcke);
  26653. }
  26654. if ((args->idx - args->begin) + cipherLen > size) {
  26655. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26656. }
  26657. if (NTRU_OK != ntru_crypto_ntru_decrypt(
  26658. (word16) ssl->buffers.key->length,
  26659. ssl->buffers.key->buffer, cipherLen,
  26660. input + args->idx, &plainLen,
  26661. ssl->arrays->preMasterSecret)) {
  26662. ERROR_OUT(NTRU_DECRYPT_ERROR, exit_dcke);
  26663. }
  26664. if (plainLen != SECRET_LEN) {
  26665. ERROR_OUT(NTRU_DECRYPT_ERROR, exit_dcke);
  26666. }
  26667. args->idx += cipherLen;
  26668. ssl->arrays->preMasterSz = plainLen;
  26669. break;
  26670. }
  26671. #endif /* HAVE_NTRU */
  26672. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26673. defined(HAVE_CURVE448)
  26674. case ecc_diffie_hellman_kea:
  26675. {
  26676. #ifdef HAVE_ECC
  26677. ecc_key* private_key = ssl->eccTempKey;
  26678. /* handle static private key */
  26679. if (ssl->specs.static_ecdh &&
  26680. ssl->ecdhCurveOID != ECC_X25519_OID &&
  26681. ssl->ecdhCurveOID != ECC_X448_OID) {
  26682. word16 keySz;
  26683. ssl->buffers.keyType = ecc_dsa_sa_algo;
  26684. ret = DecodePrivateKey(ssl, &keySz);
  26685. if (ret != 0) {
  26686. goto exit_dcke;
  26687. }
  26688. private_key = (ecc_key*)ssl->hsKey;
  26689. }
  26690. #endif
  26691. /* import peer ECC key */
  26692. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  26693. #ifdef WOLFSSL_EXTRA_ALERTS
  26694. SendAlert(ssl, alert_fatal, decode_error);
  26695. #endif
  26696. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26697. }
  26698. args->length = input[args->idx++];
  26699. if ((args->idx - args->begin) + args->length > size) {
  26700. #ifdef WOLFSSL_EXTRA_ALERTS
  26701. SendAlert(ssl, alert_fatal, decode_error);
  26702. #endif
  26703. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26704. }
  26705. #ifdef HAVE_CURVE25519
  26706. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26707. #ifdef HAVE_PK_CALLBACKS
  26708. /* if callback then use it for shared secret */
  26709. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  26710. break;
  26711. }
  26712. #endif
  26713. if (ssl->peerX25519Key == NULL) {
  26714. /* alloc/init on demand */
  26715. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26716. (void**)&ssl->peerX25519Key);
  26717. if (ret != 0) {
  26718. goto exit_dcke;
  26719. }
  26720. } else if (ssl->peerX25519KeyPresent) {
  26721. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26722. ssl->peerX25519Key);
  26723. ssl->peerX25519KeyPresent = 0;
  26724. if (ret != 0) {
  26725. goto exit_dcke;
  26726. }
  26727. }
  26728. if ((ret = wc_curve25519_check_public(
  26729. input + args->idx, args->length,
  26730. EC25519_LITTLE_ENDIAN)) != 0) {
  26731. #ifdef WOLFSSL_EXTRA_ALERTS
  26732. if (ret == BUFFER_E)
  26733. SendAlert(ssl, alert_fatal, decode_error);
  26734. else if (ret == ECC_OUT_OF_RANGE_E)
  26735. SendAlert(ssl, alert_fatal, bad_record_mac);
  26736. else {
  26737. SendAlert(ssl, alert_fatal,
  26738. illegal_parameter);
  26739. }
  26740. #endif
  26741. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26742. }
  26743. if (wc_curve25519_import_public_ex(
  26744. input + args->idx, args->length,
  26745. ssl->peerX25519Key,
  26746. EC25519_LITTLE_ENDIAN)) {
  26747. #ifdef WOLFSSL_EXTRA_ALERTS
  26748. SendAlert(ssl, alert_fatal, illegal_parameter);
  26749. #endif
  26750. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26751. }
  26752. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  26753. ssl->peerX25519KeyPresent = 1;
  26754. break;
  26755. }
  26756. #endif
  26757. #ifdef HAVE_CURVE448
  26758. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  26759. #ifdef HAVE_PK_CALLBACKS
  26760. /* if callback then use it for shared secret */
  26761. if (ssl->ctx->X448SharedSecretCb != NULL) {
  26762. break;
  26763. }
  26764. #endif
  26765. if (ssl->peerX448Key == NULL) {
  26766. /* alloc/init on demand */
  26767. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  26768. (void**)&ssl->peerX448Key);
  26769. if (ret != 0) {
  26770. goto exit_dcke;
  26771. }
  26772. } else if (ssl->peerX448KeyPresent) {
  26773. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  26774. ssl->peerX448Key);
  26775. ssl->peerX448KeyPresent = 0;
  26776. if (ret != 0) {
  26777. goto exit_dcke;
  26778. }
  26779. }
  26780. if ((ret = wc_curve448_check_public(
  26781. input + args->idx, args->length,
  26782. EC448_LITTLE_ENDIAN)) != 0) {
  26783. #ifdef WOLFSSL_EXTRA_ALERTS
  26784. if (ret == BUFFER_E)
  26785. SendAlert(ssl, alert_fatal, decode_error);
  26786. else if (ret == ECC_OUT_OF_RANGE_E)
  26787. SendAlert(ssl, alert_fatal, bad_record_mac);
  26788. else {
  26789. SendAlert(ssl, alert_fatal,
  26790. illegal_parameter);
  26791. }
  26792. #endif
  26793. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26794. }
  26795. if (wc_curve448_import_public_ex(
  26796. input + args->idx, args->length,
  26797. ssl->peerX448Key,
  26798. EC448_LITTLE_ENDIAN)) {
  26799. #ifdef WOLFSSL_EXTRA_ALERTS
  26800. SendAlert(ssl, alert_fatal, illegal_parameter);
  26801. #endif
  26802. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26803. }
  26804. ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
  26805. ssl->peerX448KeyPresent = 1;
  26806. break;
  26807. }
  26808. #endif
  26809. #ifdef HAVE_ECC
  26810. #ifdef HAVE_PK_CALLBACKS
  26811. /* if callback then use it for shared secret */
  26812. if (ssl->ctx->EccSharedSecretCb != NULL) {
  26813. break;
  26814. }
  26815. #endif
  26816. if (!ssl->specs.static_ecdh &&
  26817. ssl->eccTempKeyPresent == 0) {
  26818. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  26819. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  26820. }
  26821. if (ssl->peerEccKey == NULL) {
  26822. /* alloc/init on demand */
  26823. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  26824. (void**)&ssl->peerEccKey);
  26825. if (ret != 0) {
  26826. goto exit_dcke;
  26827. }
  26828. } else if (ssl->peerEccKeyPresent) {
  26829. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  26830. ssl->peerEccKey);
  26831. ssl->peerEccKeyPresent = 0;
  26832. if (ret != 0) {
  26833. goto exit_dcke;
  26834. }
  26835. }
  26836. if (wc_ecc_import_x963_ex(input + args->idx,
  26837. args->length, ssl->peerEccKey,
  26838. private_key->dp->id)) {
  26839. #ifdef WOLFSSL_EXTRA_ALERTS
  26840. SendAlert(ssl, alert_fatal, illegal_parameter);
  26841. #endif
  26842. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26843. }
  26844. ssl->arrays->preMasterSz = private_key->dp->size;
  26845. ssl->peerEccKeyPresent = 1;
  26846. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  26847. /* client_hello may have sent FFEDH2048, which sets namedGroup,
  26848. but that is not being used, so clear it */
  26849. /* resolves issue with server side wolfSSL_get_curve_name */
  26850. ssl->namedGroup = 0;
  26851. #endif
  26852. #endif /* HAVE_ECC */
  26853. break;
  26854. }
  26855. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26856. #ifndef NO_DH
  26857. case diffie_hellman_kea:
  26858. {
  26859. word16 clientPubSz;
  26860. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26861. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26862. }
  26863. ato16(input + args->idx, &clientPubSz);
  26864. args->idx += OPAQUE16_LEN;
  26865. if ((args->idx - args->begin) + clientPubSz > size) {
  26866. #ifdef WOLFSSL_EXTRA_ALERTS
  26867. SendAlert(ssl, alert_fatal, decode_error);
  26868. #endif
  26869. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26870. }
  26871. args->sigSz = clientPubSz;
  26872. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  26873. (void**)&ssl->buffers.serverDH_Key);
  26874. if (ret != 0) {
  26875. goto exit_dcke;
  26876. }
  26877. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  26878. ssl->buffers.serverDH_P.buffer,
  26879. ssl->buffers.serverDH_P.length,
  26880. ssl->buffers.serverDH_G.buffer,
  26881. ssl->buffers.serverDH_G.length);
  26882. /* set the max agree result size */
  26883. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  26884. break;
  26885. }
  26886. #endif /* !NO_DH */
  26887. #if !defined(NO_DH) && !defined(NO_PSK)
  26888. case dhe_psk_kea:
  26889. {
  26890. word16 clientSz;
  26891. /* Read in the PSK hint */
  26892. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26893. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26894. }
  26895. ato16(input + args->idx, &clientSz);
  26896. args->idx += OPAQUE16_LEN;
  26897. if (clientSz > MAX_PSK_ID_LEN) {
  26898. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  26899. }
  26900. if ((args->idx - args->begin) + clientSz > size) {
  26901. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26902. }
  26903. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  26904. clientSz);
  26905. args->idx += clientSz;
  26906. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  26907. /* Read in the DHE business */
  26908. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26909. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26910. }
  26911. ato16(input + args->idx, &clientSz);
  26912. args->idx += OPAQUE16_LEN;
  26913. if ((args->idx - args->begin) + clientSz > size) {
  26914. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26915. }
  26916. args->sigSz = clientSz;
  26917. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  26918. (void**)&ssl->buffers.serverDH_Key);
  26919. if (ret != 0) {
  26920. goto exit_dcke;
  26921. }
  26922. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  26923. ssl->buffers.serverDH_P.buffer,
  26924. ssl->buffers.serverDH_P.length,
  26925. ssl->buffers.serverDH_G.buffer,
  26926. ssl->buffers.serverDH_G.length);
  26927. break;
  26928. }
  26929. #endif /* !NO_DH && !NO_PSK */
  26930. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26931. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26932. case ecdhe_psk_kea:
  26933. {
  26934. word16 clientSz;
  26935. /* Read in the PSK hint */
  26936. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26937. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26938. }
  26939. ato16(input + args->idx, &clientSz);
  26940. args->idx += OPAQUE16_LEN;
  26941. if (clientSz > MAX_PSK_ID_LEN) {
  26942. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  26943. }
  26944. if ((args->idx - args->begin) + clientSz > size) {
  26945. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26946. }
  26947. XMEMCPY(ssl->arrays->client_identity,
  26948. input + args->idx, clientSz);
  26949. args->idx += clientSz;
  26950. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  26951. /* import peer ECC key */
  26952. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  26953. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26954. }
  26955. args->length = input[args->idx++];
  26956. if ((args->idx - args->begin) + args->length > size) {
  26957. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26958. }
  26959. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  26960. #ifdef HAVE_CURVE25519
  26961. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26962. #ifdef HAVE_PK_CALLBACKS
  26963. /* if callback then use it for shared secret */
  26964. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  26965. break;
  26966. }
  26967. #endif
  26968. if (ssl->eccTempKeyPresent == 0) {
  26969. WOLFSSL_MSG(
  26970. "X25519 ephemeral key not made correctly");
  26971. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  26972. }
  26973. if (ssl->peerX25519Key == NULL) {
  26974. /* alloc/init on demand */
  26975. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26976. (void**)&ssl->peerX25519Key);
  26977. if (ret != 0) {
  26978. goto exit_dcke;
  26979. }
  26980. } else if (ssl->peerX25519KeyPresent) {
  26981. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26982. ssl->peerX25519Key);
  26983. ssl->peerX25519KeyPresent = 0;
  26984. if (ret != 0) {
  26985. goto exit_dcke;
  26986. }
  26987. }
  26988. if ((ret = wc_curve25519_check_public(
  26989. input + args->idx, args->length,
  26990. EC25519_LITTLE_ENDIAN)) != 0) {
  26991. #ifdef WOLFSSL_EXTRA_ALERTS
  26992. if (ret == BUFFER_E)
  26993. SendAlert(ssl, alert_fatal, decode_error);
  26994. else if (ret == ECC_OUT_OF_RANGE_E)
  26995. SendAlert(ssl, alert_fatal, bad_record_mac);
  26996. else {
  26997. SendAlert(ssl, alert_fatal,
  26998. illegal_parameter);
  26999. }
  27000. #endif
  27001. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27002. }
  27003. if (wc_curve25519_import_public_ex(
  27004. input + args->idx, args->length,
  27005. ssl->peerX25519Key,
  27006. EC25519_LITTLE_ENDIAN)) {
  27007. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27008. }
  27009. ssl->peerX25519KeyPresent = 1;
  27010. break;
  27011. }
  27012. #endif
  27013. #ifdef HAVE_CURVE448
  27014. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27015. #ifdef HAVE_PK_CALLBACKS
  27016. /* if callback then use it for shared secret */
  27017. if (ssl->ctx->X448SharedSecretCb != NULL) {
  27018. break;
  27019. }
  27020. #endif
  27021. if (ssl->eccTempKeyPresent == 0) {
  27022. WOLFSSL_MSG(
  27023. "X448 ephemeral key not made correctly");
  27024. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  27025. }
  27026. if (ssl->peerX448Key == NULL) {
  27027. /* alloc/init on demand */
  27028. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  27029. (void**)&ssl->peerX448Key);
  27030. if (ret != 0) {
  27031. goto exit_dcke;
  27032. }
  27033. } else if (ssl->peerX448KeyPresent) {
  27034. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  27035. ssl->peerX448Key);
  27036. ssl->peerX448KeyPresent = 0;
  27037. if (ret != 0) {
  27038. goto exit_dcke;
  27039. }
  27040. }
  27041. if ((ret = wc_curve448_check_public(
  27042. input + args->idx, args->length,
  27043. EC448_LITTLE_ENDIAN)) != 0) {
  27044. #ifdef WOLFSSL_EXTRA_ALERTS
  27045. if (ret == BUFFER_E)
  27046. SendAlert(ssl, alert_fatal, decode_error);
  27047. else if (ret == ECC_OUT_OF_RANGE_E)
  27048. SendAlert(ssl, alert_fatal, bad_record_mac);
  27049. else {
  27050. SendAlert(ssl, alert_fatal,
  27051. illegal_parameter);
  27052. }
  27053. #endif
  27054. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27055. }
  27056. if (wc_curve448_import_public_ex(
  27057. input + args->idx, args->length,
  27058. ssl->peerX448Key,
  27059. EC448_LITTLE_ENDIAN)) {
  27060. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27061. }
  27062. ssl->peerX448KeyPresent = 1;
  27063. break;
  27064. }
  27065. #endif
  27066. #ifdef HAVE_PK_CALLBACKS
  27067. /* if callback then use it for shared secret */
  27068. if (ssl->ctx->EccSharedSecretCb != NULL) {
  27069. break;
  27070. }
  27071. #endif
  27072. if (ssl->eccTempKeyPresent == 0) {
  27073. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  27074. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  27075. }
  27076. if (ssl->peerEccKey == NULL) {
  27077. /* alloc/init on demand */
  27078. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  27079. (void**)&ssl->peerEccKey);
  27080. if (ret != 0) {
  27081. goto exit_dcke;
  27082. }
  27083. }
  27084. else if (ssl->peerEccKeyPresent) {
  27085. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  27086. ssl->peerEccKey);
  27087. ssl->peerEccKeyPresent = 0;
  27088. if (ret != 0) {
  27089. goto exit_dcke;
  27090. }
  27091. }
  27092. if (wc_ecc_import_x963_ex(input + args->idx,
  27093. args->length, ssl->peerEccKey,
  27094. ssl->eccTempKey->dp->id)) {
  27095. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27096. }
  27097. ssl->peerEccKeyPresent = 1;
  27098. break;
  27099. }
  27100. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27101. default:
  27102. ret = BAD_KEA_TYPE_E;
  27103. } /* switch (ssl->specs.kea) */
  27104. /* Check for error */
  27105. if (ret != 0) {
  27106. goto exit_dcke;
  27107. }
  27108. /* Advance state and proceed */
  27109. ssl->options.asyncState = TLS_ASYNC_DO;
  27110. } /* TLS_ASYNC_BUILD */
  27111. FALL_THROUGH;
  27112. case TLS_ASYNC_DO:
  27113. {
  27114. switch (ssl->specs.kea) {
  27115. #ifndef NO_RSA
  27116. case rsa_kea:
  27117. {
  27118. RsaKey* key = (RsaKey*)ssl->hsKey;
  27119. ret = RsaDec(ssl,
  27120. input + args->idx,
  27121. args->length,
  27122. &args->output,
  27123. &args->sigSz,
  27124. key,
  27125. #ifdef HAVE_PK_CALLBACKS
  27126. ssl->buffers.key
  27127. #else
  27128. NULL
  27129. #endif
  27130. );
  27131. /* Errors that can occur here that should be
  27132. * indistinguishable:
  27133. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  27134. */
  27135. #ifdef WOLFSSL_ASYNC_CRYPT
  27136. if (ret == WC_PENDING_E)
  27137. goto exit_dcke;
  27138. #endif
  27139. if (ret == BAD_FUNC_ARG)
  27140. goto exit_dcke;
  27141. args->lastErr = ret - (SECRET_LEN - args->sigSz);
  27142. ret = 0;
  27143. break;
  27144. } /* rsa_kea */
  27145. #endif /* !NO_RSA */
  27146. #ifndef NO_PSK
  27147. case psk_kea:
  27148. {
  27149. break;
  27150. }
  27151. #endif /* !NO_PSK */
  27152. #ifdef HAVE_NTRU
  27153. case ntru_kea:
  27154. {
  27155. break;
  27156. }
  27157. #endif /* HAVE_NTRU */
  27158. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27159. defined(HAVE_CURVE448)
  27160. case ecc_diffie_hellman_kea:
  27161. {
  27162. void* private_key = ssl->eccTempKey;
  27163. (void)private_key;
  27164. #ifdef HAVE_CURVE25519
  27165. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27166. ret = X25519SharedSecret(ssl,
  27167. (curve25519_key*)private_key,
  27168. ssl->peerX25519Key,
  27169. input + args->idx, &args->length,
  27170. ssl->arrays->preMasterSecret,
  27171. &ssl->arrays->preMasterSz,
  27172. WOLFSSL_SERVER_END
  27173. );
  27174. break;
  27175. }
  27176. #endif
  27177. #ifdef HAVE_CURVE448
  27178. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27179. ret = X448SharedSecret(ssl,
  27180. (curve448_key*)private_key,
  27181. ssl->peerX448Key,
  27182. input + args->idx, &args->length,
  27183. ssl->arrays->preMasterSecret,
  27184. &ssl->arrays->preMasterSz,
  27185. WOLFSSL_SERVER_END
  27186. );
  27187. break;
  27188. }
  27189. #endif
  27190. #ifdef HAVE_ECC
  27191. if (ssl->specs.static_ecdh) {
  27192. private_key = ssl->hsKey;
  27193. }
  27194. /* Generate shared secret */
  27195. ret = EccSharedSecret(ssl,
  27196. (ecc_key*)private_key, ssl->peerEccKey,
  27197. input + args->idx, &args->length,
  27198. ssl->arrays->preMasterSecret,
  27199. &ssl->arrays->preMasterSz,
  27200. WOLFSSL_SERVER_END
  27201. );
  27202. #ifdef WOLFSSL_ASYNC_CRYPT
  27203. if (ret != WC_PENDING_E)
  27204. #endif
  27205. {
  27206. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  27207. (void**)&ssl->peerEccKey);
  27208. ssl->peerEccKeyPresent = 0;
  27209. }
  27210. #endif
  27211. break;
  27212. }
  27213. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27214. #ifndef NO_DH
  27215. case diffie_hellman_kea:
  27216. {
  27217. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  27218. ssl->buffers.serverDH_Priv.buffer,
  27219. ssl->buffers.serverDH_Priv.length,
  27220. input + args->idx,
  27221. (word16)args->sigSz,
  27222. ssl->arrays->preMasterSecret,
  27223. &ssl->arrays->preMasterSz);
  27224. break;
  27225. }
  27226. #endif /* !NO_DH */
  27227. #if !defined(NO_DH) && !defined(NO_PSK)
  27228. case dhe_psk_kea:
  27229. {
  27230. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  27231. ssl->buffers.serverDH_Priv.buffer,
  27232. ssl->buffers.serverDH_Priv.length,
  27233. input + args->idx,
  27234. (word16)args->sigSz,
  27235. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  27236. &ssl->arrays->preMasterSz);
  27237. break;
  27238. }
  27239. #endif /* !NO_DH && !NO_PSK */
  27240. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27241. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27242. case ecdhe_psk_kea:
  27243. {
  27244. #ifdef HAVE_CURVE25519
  27245. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27246. ret = X25519SharedSecret(ssl,
  27247. (curve25519_key*)ssl->eccTempKey,
  27248. ssl->peerX25519Key,
  27249. input + args->idx, &args->length,
  27250. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  27251. &args->sigSz,
  27252. WOLFSSL_SERVER_END
  27253. );
  27254. #ifdef WOLFSSL_ASYNC_CRYPT
  27255. if (ret != WC_PENDING_E)
  27256. #endif
  27257. {
  27258. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27259. (void**)&ssl->peerX25519Key);
  27260. ssl->peerX25519KeyPresent = 0;
  27261. }
  27262. break;
  27263. }
  27264. #endif
  27265. #ifdef HAVE_CURVE448
  27266. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27267. ret = X448SharedSecret(ssl,
  27268. (curve448_key*)ssl->eccTempKey,
  27269. ssl->peerX448Key,
  27270. input + args->idx, &args->length,
  27271. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  27272. &args->sigSz,
  27273. WOLFSSL_SERVER_END
  27274. );
  27275. #ifdef WOLFSSL_ASYNC_CRYPT
  27276. if (ret != WC_PENDING_E)
  27277. #endif
  27278. {
  27279. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  27280. (void**)&ssl->peerX448Key);
  27281. ssl->peerX448KeyPresent = 0;
  27282. }
  27283. break;
  27284. }
  27285. #endif
  27286. /* Generate shared secret */
  27287. ret = EccSharedSecret(ssl,
  27288. ssl->eccTempKey, ssl->peerEccKey,
  27289. input + args->idx, &args->length,
  27290. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  27291. &args->sigSz,
  27292. WOLFSSL_SERVER_END
  27293. );
  27294. if (!ssl->specs.static_ecdh
  27295. #ifdef WOLFSSL_ASYNC_CRYPT
  27296. && ret != WC_PENDING_E
  27297. #endif
  27298. ) {
  27299. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  27300. (void**)&ssl->peerEccKey);
  27301. ssl->peerEccKeyPresent = 0;
  27302. }
  27303. break;
  27304. }
  27305. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27306. default:
  27307. ret = BAD_KEA_TYPE_E;
  27308. } /* switch (ssl->specs.kea) */
  27309. /* Check for error */
  27310. if (ret != 0) {
  27311. goto exit_dcke;
  27312. }
  27313. /* Advance state and proceed */
  27314. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  27315. } /* TLS_ASYNC_DO */
  27316. FALL_THROUGH;
  27317. case TLS_ASYNC_VERIFY:
  27318. {
  27319. switch (ssl->specs.kea) {
  27320. #ifndef NO_RSA
  27321. case rsa_kea:
  27322. {
  27323. byte mask;
  27324. int i;
  27325. /* Add the signature length to idx */
  27326. args->idx += args->length;
  27327. #ifdef DEBUG_WOLFSSL
  27328. /* check version (debug warning message only) */
  27329. if (args->output != NULL) {
  27330. if (args->output[0] != ssl->chVersion.major ||
  27331. args->output[1] != ssl->chVersion.minor) {
  27332. WOLFSSL_MSG("preMasterSecret version mismatch");
  27333. }
  27334. }
  27335. #endif
  27336. /* RFC5246 7.4.7.1:
  27337. * Treat incorrectly formatted message blocks and/or
  27338. * mismatched version numbers in a manner
  27339. * indistinguishable from correctly formatted RSA blocks
  27340. */
  27341. ret = args->lastErr;
  27342. args->lastErr = 0; /* reset */
  27343. /* On error 'ret' will be negative - top bit set */
  27344. mask = ((unsigned int)ret >>
  27345. ((sizeof(ret) * 8) - 1)) - 1;
  27346. /* build PreMasterSecret */
  27347. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  27348. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  27349. if (args->output != NULL) {
  27350. /* Use random secret on error */
  27351. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  27352. ssl->arrays->preMasterSecret[i] =
  27353. ctMaskSel(mask, args->output[i],
  27354. ssl->arrays->preMasterSecret[i]);
  27355. }
  27356. }
  27357. /* preMasterSecret has RNG and version set
  27358. * return proper length and ignore error
  27359. * error will be caught as decryption error
  27360. */
  27361. args->sigSz = SECRET_LEN;
  27362. ret = 0;
  27363. break;
  27364. } /* rsa_kea */
  27365. #endif /* !NO_RSA */
  27366. #ifndef NO_PSK
  27367. case psk_kea:
  27368. {
  27369. break;
  27370. }
  27371. #endif /* !NO_PSK */
  27372. #ifdef HAVE_NTRU
  27373. case ntru_kea:
  27374. {
  27375. break;
  27376. }
  27377. #endif /* HAVE_NTRU */
  27378. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27379. defined(HAVE_CURVE448)
  27380. case ecc_diffie_hellman_kea:
  27381. {
  27382. /* skip past the imported peer key */
  27383. args->idx += args->length;
  27384. break;
  27385. }
  27386. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27387. #ifndef NO_DH
  27388. case diffie_hellman_kea:
  27389. {
  27390. args->idx += (word16)args->sigSz;
  27391. break;
  27392. }
  27393. #endif /* !NO_DH */
  27394. #if !defined(NO_DH) && !defined(NO_PSK)
  27395. case dhe_psk_kea:
  27396. {
  27397. byte* pms = ssl->arrays->preMasterSecret;
  27398. word16 clientSz = (word16)args->sigSz;
  27399. args->idx += clientSz;
  27400. c16toa((word16)ssl->arrays->preMasterSz, pms);
  27401. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  27402. pms += ssl->arrays->preMasterSz;
  27403. /* Use the PSK hint to look up the PSK and add it to the
  27404. * preMasterSecret here. */
  27405. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  27406. ssl->arrays->client_identity, ssl->arrays->psk_key,
  27407. MAX_PSK_KEY_LEN);
  27408. if (ssl->arrays->psk_keySz == 0 ||
  27409. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  27410. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  27411. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  27412. SendAlert(ssl, alert_fatal,
  27413. unknown_psk_identity);
  27414. #endif
  27415. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  27416. }
  27417. c16toa((word16) ssl->arrays->psk_keySz, pms);
  27418. pms += OPAQUE16_LEN;
  27419. XMEMCPY(pms, ssl->arrays->psk_key,
  27420. ssl->arrays->psk_keySz);
  27421. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
  27422. OPAQUE16_LEN;
  27423. break;
  27424. }
  27425. #endif /* !NO_DH && !NO_PSK */
  27426. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27427. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27428. case ecdhe_psk_kea:
  27429. {
  27430. byte* pms = ssl->arrays->preMasterSecret;
  27431. word16 clientSz = (word16)args->sigSz;
  27432. /* skip past the imported peer key */
  27433. args->idx += args->length;
  27434. /* Add preMasterSecret */
  27435. c16toa(clientSz, pms);
  27436. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  27437. pms += ssl->arrays->preMasterSz;
  27438. /* Use the PSK hint to look up the PSK and add it to the
  27439. * preMasterSecret here. */
  27440. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  27441. ssl->arrays->client_identity, ssl->arrays->psk_key,
  27442. MAX_PSK_KEY_LEN);
  27443. if (ssl->arrays->psk_keySz == 0 ||
  27444. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  27445. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  27446. }
  27447. c16toa((word16) ssl->arrays->psk_keySz, pms);
  27448. pms += OPAQUE16_LEN;
  27449. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  27450. ssl->arrays->preMasterSz +=
  27451. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  27452. break;
  27453. }
  27454. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27455. default:
  27456. ret = BAD_KEA_TYPE_E;
  27457. } /* switch (ssl->specs.kea) */
  27458. /* Check for error */
  27459. if (ret != 0) {
  27460. goto exit_dcke;
  27461. }
  27462. /* Advance state and proceed */
  27463. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  27464. } /* TLS_ASYNC_VERIFY */
  27465. FALL_THROUGH;
  27466. case TLS_ASYNC_FINALIZE:
  27467. {
  27468. if (IsEncryptionOn(ssl, 0)) {
  27469. args->idx += ssl->keys.padSz;
  27470. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  27471. if (ssl->options.startedETMRead)
  27472. args->idx += MacSize(ssl);
  27473. #endif
  27474. }
  27475. #ifdef HAVE_QSH
  27476. word16 name;
  27477. if (ssl->options.haveQSH) {
  27478. /* extension name */
  27479. ato16(input + args->idx, &name);
  27480. args->idx += OPAQUE16_LEN;
  27481. if (name == TLSX_QUANTUM_SAFE_HYBRID) {
  27482. int qshSz;
  27483. /* if qshSz is larger than 0 it is the
  27484. length of buffer used */
  27485. if ((qshSz = TLSX_QSHCipher_Parse(ssl,
  27486. input + args->idx,
  27487. size - args->idx + args->begin, 1)) < 0) {
  27488. ERROR_OUT(qshSz, exit_dcke);
  27489. }
  27490. args->idx += qshSz;
  27491. }
  27492. else {
  27493. /* unknown extension sent client ignored handshake */
  27494. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27495. }
  27496. }
  27497. #endif /* HAVE_QSH */
  27498. ret = MakeMasterSecret(ssl);
  27499. /* Check for error */
  27500. if (ret != 0) {
  27501. goto exit_dcke;
  27502. }
  27503. /* Advance state and proceed */
  27504. ssl->options.asyncState = TLS_ASYNC_END;
  27505. } /* TLS_ASYNC_FINALIZE */
  27506. FALL_THROUGH;
  27507. case TLS_ASYNC_END:
  27508. {
  27509. /* Set final index */
  27510. *inOutIdx = args->idx;
  27511. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  27512. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  27513. if (ssl->options.verifyPeer) {
  27514. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  27515. }
  27516. #endif
  27517. break;
  27518. } /* TLS_ASYNC_END */
  27519. default:
  27520. ret = INPUT_CASE_ERROR;
  27521. } /* switch(ssl->options.asyncState) */
  27522. exit_dcke:
  27523. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  27524. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  27525. #ifdef WOLFSSL_ASYNC_CRYPT
  27526. /* Handle async operation */
  27527. if (ret == WC_PENDING_E) {
  27528. /* Mark message as not received so it can process again */
  27529. ssl->msgsReceived.got_client_key_exchange = 0;
  27530. return ret;
  27531. }
  27532. #endif /* WOLFSSL_ASYNC_CRYPT */
  27533. /* Cleanup PMS */
  27534. if (ssl->arrays->preMasterSecret != NULL) {
  27535. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  27536. }
  27537. ssl->arrays->preMasterSz = 0;
  27538. /* Final cleanup */
  27539. FreeDckeArgs(ssl, args);
  27540. FreeKeyExchange(ssl);
  27541. return ret;
  27542. }
  27543. #endif /* !WOLFSSL_NO_TLS12 */
  27544. #ifdef HAVE_SNI
  27545. int SNI_Callback(WOLFSSL* ssl)
  27546. {
  27547. int ad = 0;
  27548. int sniRet = 0;
  27549. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  27550. * when SNI is received. Call it now if exists */
  27551. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  27552. WOLFSSL_MSG("Calling custom sni callback");
  27553. sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg);
  27554. if (sniRet == alert_fatal) {
  27555. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  27556. SendAlert(ssl, alert_fatal, ad);
  27557. return FATAL_ERROR;
  27558. }
  27559. else if (sniRet == alert_warning) {
  27560. WOLFSSL_MSG("Error in custom sni callback. Warning alert");
  27561. SendAlert(ssl, alert_warning, ad);
  27562. }
  27563. }
  27564. return 0;
  27565. }
  27566. #endif /* HAVE_SNI */
  27567. #endif /* NO_WOLFSSL_SERVER */
  27568. #ifdef WOLFSSL_ASYNC_CRYPT
  27569. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  27570. {
  27571. int ret = 0;
  27572. WC_ASYNC_DEV* asyncDev;
  27573. WOLF_EVENT* event;
  27574. if (ssl == NULL) {
  27575. return BAD_FUNC_ARG;
  27576. }
  27577. /* check for pending async */
  27578. asyncDev = ssl->async.dev;
  27579. if (asyncDev) {
  27580. /* grab event pointer */
  27581. event = &asyncDev->event;
  27582. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  27583. if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) {
  27584. /* advance key share state if doesn't need called again */
  27585. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  27586. (*state)++;
  27587. }
  27588. /* clear event */
  27589. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  27590. /* clear async dev */
  27591. ssl->async.dev = NULL;
  27592. }
  27593. }
  27594. else {
  27595. ret = WC_NOT_PENDING_E;
  27596. }
  27597. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  27598. return ret;
  27599. }
  27600. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  27601. {
  27602. int ret;
  27603. WOLF_EVENT* event;
  27604. if (ssl == NULL || asyncDev == NULL) {
  27605. return BAD_FUNC_ARG;
  27606. }
  27607. /* grab event pointer */
  27608. event = &asyncDev->event;
  27609. /* init event */
  27610. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  27611. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  27612. return ret;
  27613. }
  27614. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  27615. {
  27616. int ret;
  27617. WOLF_EVENT* event;
  27618. if (ssl == NULL || asyncDev == NULL) {
  27619. return BAD_FUNC_ARG;
  27620. }
  27621. /* grab event pointer */
  27622. event = &asyncDev->event;
  27623. /* store reference to active async operation */
  27624. ssl->async.dev = asyncDev;
  27625. /* place event into queue */
  27626. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  27627. /* success means return WC_PENDING_E */
  27628. if (ret == 0) {
  27629. ret = WC_PENDING_E;
  27630. }
  27631. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  27632. return ret;
  27633. }
  27634. #endif /* WOLFSSL_ASYNC_CRYPT */
  27635. /* return the max record size */
  27636. int wolfSSL_GetMaxRecordSize(WOLFSSL* ssl, int maxFragment)
  27637. {
  27638. (void) ssl; /* Avoid compiler warnings */
  27639. if (maxFragment > MAX_RECORD_SIZE) {
  27640. maxFragment = MAX_RECORD_SIZE;
  27641. }
  27642. #ifdef HAVE_MAX_FRAGMENT
  27643. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  27644. maxFragment = ssl->max_fragment;
  27645. }
  27646. #endif /* HAVE_MAX_FRAGMENT */
  27647. #ifdef WOLFSSL_DTLS
  27648. if (IsDtlsNotSctpMode(ssl)) {
  27649. int cipherExtra = IsEncryptionOn(ssl, 1) ? cipherExtraData(ssl) : 0;
  27650. if (maxFragment > MAX_UDP_SIZE) {
  27651. maxFragment = MAX_UDP_SIZE;
  27652. }
  27653. if (maxFragment > MAX_MTU - COMP_EXTRA - DTLS_RECORD_HEADER_SZ -
  27654. DTLS_HANDSHAKE_HEADER_SZ - cipherExtra) {
  27655. maxFragment = MAX_MTU - COMP_EXTRA - DTLS_RECORD_HEADER_SZ -
  27656. DTLS_HANDSHAKE_HEADER_SZ - cipherExtra;
  27657. }
  27658. #if defined(WOLFSSL_DTLS_MTU)
  27659. {
  27660. int overheadSz = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ +
  27661. COMP_EXTRA + cipherExtra;
  27662. if (maxFragment > ssl->dtlsMtuSz - overheadSz) {
  27663. maxFragment = ssl->dtlsMtuSz - overheadSz;
  27664. }
  27665. }
  27666. #endif
  27667. }
  27668. #endif
  27669. return maxFragment;
  27670. }
  27671. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  27672. /* create an instance of WOLFSSL_BY_DIR_HASH structure */
  27673. WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void)
  27674. {
  27675. WOLFSSL_BY_DIR_HASH* dir_hash;
  27676. WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new");
  27677. dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL,
  27678. DYNAMIC_TYPE_OPENSSL);
  27679. if (dir_hash) {
  27680. XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH));
  27681. }
  27682. return dir_hash;
  27683. }
  27684. /* release a WOLFSSL_BY_DIR_HASH resource */
  27685. void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash)
  27686. {
  27687. if (dir_hash == NULL)
  27688. return;
  27689. XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL);
  27690. }
  27691. /* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */
  27692. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void)
  27693. {
  27694. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  27695. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null");
  27696. if (sk) {
  27697. sk->type = STACK_TYPE_BY_DIR_hash;
  27698. }
  27699. return sk;
  27700. }
  27701. /* returns value less than 0 on fail to match
  27702. * On a successful match the priority level found is returned
  27703. */
  27704. int wolfSSL_sk_BY_DIR_HASH_find(
  27705. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind)
  27706. {
  27707. WOLFSSL_STACK* next;
  27708. int i, sz;
  27709. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find");
  27710. if (sk == NULL || toFind == NULL) {
  27711. return WOLFSSL_FAILURE;
  27712. }
  27713. sz = wolfSSL_sk_BY_DIR_HASH_num(sk);
  27714. next = sk;
  27715. for (i = 0; i < sz && next != NULL; i++) {
  27716. if (next->data.dir_hash->hash_value == toFind->hash_value) {
  27717. return sz - i; /* reverse because stack pushed highest on first */
  27718. }
  27719. next = next->next;
  27720. }
  27721. return -1;
  27722. }
  27723. /* return a number of WOLFSSL_BY_DIR_HASH in stack */
  27724. int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  27725. {
  27726. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num");
  27727. if (sk == NULL)
  27728. return -1;
  27729. return (int)sk->num;
  27730. }
  27731. /* return WOLFSSL_BY_DIR_HASH instance at i */
  27732. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value(
  27733. const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i)
  27734. {
  27735. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value");
  27736. for (; sk != NULL && i > 0; i--)
  27737. sk = sk->next;
  27738. if (i != 0 || sk == NULL)
  27739. return NULL;
  27740. return sk->data.dir_hash;
  27741. }
  27742. /* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */
  27743. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop(
  27744. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk)
  27745. {
  27746. WOLFSSL_STACK* node;
  27747. WOLFSSL_BY_DIR_HASH* hash;
  27748. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop");
  27749. if (sk == NULL) {
  27750. return NULL;
  27751. }
  27752. node = sk->next;
  27753. hash = sk->data.dir_hash;
  27754. if (node != NULL) { /* update sk and remove node from stack */
  27755. sk->data.dir_hash = node->data.dir_hash;
  27756. sk->next = node->next;
  27757. wolfSSL_sk_free_node(node);
  27758. }
  27759. else { /* last x509 in stack */
  27760. sk->data.dir_hash = NULL;
  27761. }
  27762. if (sk->num > 0) {
  27763. sk->num -= 1;
  27764. }
  27765. return hash;
  27766. }
  27767. /* release all contents in stack, and then release stack itself. */
  27768. /* Second argument is a function pointer to release resouces. */
  27769. /* It calls the function to release resouces when t is passed */
  27770. /* instead of wolfSSL_BY_DIR_HASH_free(). */
  27771. void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk,
  27772. void (*f) (WOLFSSL_BY_DIR_HASH*))
  27773. {
  27774. WOLFSSL_STACK* node;
  27775. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free");
  27776. if (sk == NULL) {
  27777. return;
  27778. }
  27779. /* parse through stack freeing each node */
  27780. node = sk->next;
  27781. while (node && sk->num > 1) {
  27782. WOLFSSL_STACK* tmp = node;
  27783. node = node->next;
  27784. if (f)
  27785. f(tmp->data.dir_hash);
  27786. else
  27787. wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash);
  27788. tmp->data.dir_hash = NULL;
  27789. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  27790. sk->num -= 1;
  27791. }
  27792. /* free head of stack */
  27793. if (sk->num == 1) {
  27794. if (f)
  27795. f(sk->data.dir_hash);
  27796. else
  27797. wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash);
  27798. sk->data.dir_hash = NULL;
  27799. }
  27800. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  27801. }
  27802. /* release all contents in stack, and then release stack itself */
  27803. void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  27804. {
  27805. wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL);
  27806. }
  27807. /* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and
  27808. * tries to free it when the stack is free'd.
  27809. *
  27810. * return 1 on success 0 on fail
  27811. */
  27812. int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk,
  27813. WOLFSSL_BY_DIR_HASH* in)
  27814. {
  27815. WOLFSSL_STACK* node;
  27816. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push");
  27817. if (sk == NULL || in == NULL) {
  27818. return WOLFSSL_FAILURE;
  27819. }
  27820. /* no previous values in stack */
  27821. if (sk->data.dir_hash == NULL) {
  27822. sk->data.dir_hash = in;
  27823. sk->num += 1;
  27824. return WOLFSSL_SUCCESS;
  27825. }
  27826. /* stack already has value(s) create a new node and add more */
  27827. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  27828. DYNAMIC_TYPE_OPENSSL);
  27829. if (node == NULL) {
  27830. WOLFSSL_MSG("Memory error");
  27831. return WOLFSSL_FAILURE;
  27832. }
  27833. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  27834. /* push new obj onto head of stack */
  27835. node->data.dir_hash = sk->data.dir_hash;
  27836. node->next = sk->next;
  27837. node->type = sk->type;
  27838. sk->next = node;
  27839. sk->data.dir_hash = in;
  27840. sk->num += 1;
  27841. return WOLFSSL_SUCCESS;
  27842. }
  27843. /* create an instance of WOLFSSL_BY_DIR_entry structure */
  27844. WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void)
  27845. {
  27846. WOLFSSL_BY_DIR_entry* entry;
  27847. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new");
  27848. entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL,
  27849. DYNAMIC_TYPE_OPENSSL);
  27850. if (entry) {
  27851. XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry));
  27852. }
  27853. return entry;
  27854. }
  27855. /* release a WOLFSSL_BY_DIR_entry resource */
  27856. void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry)
  27857. {
  27858. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free");
  27859. if (entry == NULL)
  27860. return;
  27861. if (entry->hashes) {
  27862. wolfSSL_sk_BY_DIR_HASH_free(entry->hashes);
  27863. }
  27864. if (entry->dir_name != NULL) {
  27865. XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL);
  27866. }
  27867. XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL);
  27868. }
  27869. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void)
  27870. {
  27871. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  27872. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null");
  27873. if (sk) {
  27874. sk->type = STACK_TYPE_BY_DIR_entry;
  27875. }
  27876. return sk;
  27877. }
  27878. /* return a number of WOLFSSL_BY_DIR_entry in stack */
  27879. int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk)
  27880. {
  27881. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num");
  27882. if (sk == NULL)
  27883. return -1;
  27884. return (int)sk->num;
  27885. }
  27886. /* return WOLFSSL_BY_DIR_entry instance at i */
  27887. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value(
  27888. const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i)
  27889. {
  27890. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value");
  27891. for (; sk != NULL && i > 0; i--)
  27892. sk = sk->next;
  27893. if (i != 0 || sk == NULL)
  27894. return NULL;
  27895. return sk->data.dir_entry;
  27896. }
  27897. /* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */
  27898. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop(
  27899. WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk)
  27900. {
  27901. WOLFSSL_STACK* node;
  27902. WOLFSSL_BY_DIR_entry* entry;
  27903. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop");
  27904. if (sk == NULL) {
  27905. return NULL;
  27906. }
  27907. node = sk->next;
  27908. entry = sk->data.dir_entry;
  27909. if (node != NULL) { /* update sk and remove node from stack */
  27910. sk->data.dir_entry = node->data.dir_entry;
  27911. sk->next = node->next;
  27912. wolfSSL_sk_free_node(node);
  27913. }
  27914. else { /* last x509 in stack */
  27915. sk->data.dir_entry = NULL;
  27916. }
  27917. if (sk->num > 0) {
  27918. sk->num -= 1;
  27919. }
  27920. return entry;
  27921. }
  27922. /* release all contents in stack, and then release stack itself. */
  27923. /* Second argument is a function pointer to release resouces. */
  27924. /* It calls the function to release resouces when t is passed */
  27925. /* instead of wolfSSL_BY_DIR_entry_free(). */
  27926. void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  27927. void (*f) (WOLFSSL_BY_DIR_entry*))
  27928. {
  27929. WOLFSSL_STACK* node;
  27930. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free");
  27931. if (sk == NULL) {
  27932. return;
  27933. }
  27934. /* parse through stack freeing each node */
  27935. node = sk->next;
  27936. while (node && sk->num > 1) {
  27937. WOLFSSL_STACK* tmp = node;
  27938. node = node->next;
  27939. if (f)
  27940. f(tmp->data.dir_entry);
  27941. else
  27942. wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry);
  27943. tmp->data.dir_entry = NULL;
  27944. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  27945. sk->num -= 1;
  27946. }
  27947. /* free head of stack */
  27948. if (sk->num == 1) {
  27949. if (f)
  27950. f(sk->data.dir_entry);
  27951. else
  27952. wolfSSL_BY_DIR_entry_free(sk->data.dir_entry);
  27953. sk->data.dir_entry = NULL;
  27954. }
  27955. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  27956. }
  27957. /* release all contents in stack, and then release stack itself */
  27958. void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk)
  27959. {
  27960. wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL);
  27961. }
  27962. /* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and
  27963. * tries to free it when the stack is free'd.
  27964. *
  27965. * return 1 on success 0 on fail
  27966. */
  27967. int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  27968. WOLFSSL_BY_DIR_entry* in)
  27969. {
  27970. WOLFSSL_STACK* node;
  27971. if (sk == NULL || in == NULL) {
  27972. return WOLFSSL_FAILURE;
  27973. }
  27974. /* no previous values in stack */
  27975. if (sk->data.dir_entry == NULL) {
  27976. sk->data.dir_entry = in;
  27977. sk->num += 1;
  27978. return WOLFSSL_SUCCESS;
  27979. }
  27980. /* stack already has value(s) create a new node and add more */
  27981. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  27982. DYNAMIC_TYPE_OPENSSL);
  27983. if (node == NULL) {
  27984. WOLFSSL_MSG("Memory error");
  27985. return WOLFSSL_FAILURE;
  27986. }
  27987. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  27988. /* push new obj onto head of stack */
  27989. node->data.dir_entry = sk->data.dir_entry;
  27990. node->next = sk->next;
  27991. node->type = sk->type;
  27992. sk->next = node;
  27993. sk->data.dir_entry = in;
  27994. sk->num += 1;
  27995. return WOLFSSL_SUCCESS;
  27996. }
  27997. #endif /* OPENSSL_ALL */
  27998. #undef ERROR_OUT
  27999. #endif /* WOLFCRYPT_ONLY */