internal.c 1.1 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896
  1. /* internal.c
  2. *
  3. * Copyright (C) 2006-2021 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. /*
  26. * WOLFSSL_SMALL_CERT_VERIFY:
  27. * Verify the certificate signature without using DecodedCert. Doubles up
  28. * on some code but allows smaller peak heap memory usage.
  29. * Cannot be used with WOLFSSL_NONBLOCK_OCSP.
  30. * WOLFSSL_ALT_CERT_CHAINS:
  31. * Allows CA's to be presented by peer, but not part of a valid chain.
  32. * Default wolfSSL behavior is to require validation of all presented peer
  33. * certificates. This also allows loading intermediate CA's as trusted
  34. * and ignoring no signer failures for CA's up the chain to root.
  35. * WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT:
  36. * Enable resending the previous DTLS handshake flight only on a network
  37. * read timeout. By default we resend in two more cases, when we receive:
  38. * - an out of order last msg of the peer's flight
  39. * - a duplicate of the first msg from the peer's flight
  40. * WOLFSSL_NO_DEF_TICKET_ENC_CB:
  41. * No default ticket encryption callback.
  42. * Server only.
  43. * Application must set its own callback to use session tickets.
  44. * WOLFSSL_TICKET_ENC_CHACHA20_POLY1305
  45. * Use ChaCha20-Poly1305 to encrypt/decrypt session tickets in default
  46. * callback. Default algorithm if none defined and algorithms compiled in.
  47. * Server only.
  48. * WOLFSSL_TICKET_ENC_AES128_GCM
  49. * Use AES128-GCM to encrypt/decrypt session tickets in default callback.
  50. * Server only. Default algorithm if ChaCha20/Poly1305 not compiled in.
  51. * WOLFSSL_TICKET_ENC_AES256_GCM
  52. * Use AES256-GCM to encrypt/decrypt session tickets in default callback.
  53. * Server only.
  54. * WOLFSSL_TICKET_DECRYPT_NO_CREATE
  55. * Default callback will not request creation of new ticket on successful
  56. * decryption.
  57. * Server only.
  58. * WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
  59. * Once a normal TLS 1.3 handshake is complete, a session ticket message
  60. * may be received by a client. To support detecting this, peek will
  61. * return WOLFSSL_ERROR_WANT_READ.
  62. * This define turns off this behaviour.
  63. */
  64. #ifdef EXTERNAL_OPTS_OPENVPN
  65. #error EXTERNAL_OPTS_OPENVPN should not be defined\
  66. when building wolfSSL
  67. #endif
  68. #ifndef WOLFCRYPT_ONLY
  69. #include <wolfssl/internal.h>
  70. #include <wolfssl/error-ssl.h>
  71. #include <wolfssl/wolfcrypt/asn.h>
  72. #include <wolfssl/wolfcrypt/dh.h>
  73. #ifdef NO_INLINE
  74. #include <wolfssl/wolfcrypt/misc.h>
  75. #else
  76. #define WOLFSSL_MISC_INCLUDED
  77. #include <wolfcrypt/src/misc.c>
  78. #endif
  79. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
  80. #include <wolfssl/wolfcrypt/srp.h>
  81. #endif
  82. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  83. #include <wolfssl/wolfcrypt/coding.h>
  84. #endif
  85. #ifdef HAVE_LIBZ
  86. #include "zlib.h"
  87. #endif
  88. #ifdef WOLFSSL_QNX_CAAM
  89. /* included to get CAAM devId value */
  90. #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
  91. #endif
  92. #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
  93. defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
  94. #ifndef NO_STDIO_FILESYSTEM
  95. #ifdef FUSION_RTOS
  96. #include <fclstdio.h>
  97. #else
  98. #include <stdio.h>
  99. #endif
  100. #endif
  101. #endif
  102. #ifdef __sun
  103. #include <sys/filio.h>
  104. #endif
  105. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  106. #ifdef _MSC_VER
  107. /* disable for while(0) cases at the .c level for now */
  108. #pragma warning(disable:4127)
  109. #endif
  110. #if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
  111. #error \
  112. WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
  113. #endif
  114. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
  115. #error Cannot use both secure-renegotiation and renegotiation-indication
  116. #endif
  117. #ifndef WOLFSSL_NO_TLS12
  118. #ifndef NO_WOLFSSL_CLIENT
  119. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32*,
  120. word32);
  121. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input, word32*,
  122. word32);
  123. #ifndef NO_CERTS
  124. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*,
  125. word32);
  126. #endif
  127. #ifdef HAVE_SESSION_TICKET
  128. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32*,
  129. word32);
  130. #endif
  131. #endif
  132. #ifndef NO_WOLFSSL_SERVER
  133. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32*, word32);
  134. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  135. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  136. static int DoCertificateVerify(WOLFSSL* ssl, byte*, word32*, word32);
  137. #endif
  138. #ifdef WOLFSSL_DTLS
  139. static int SendHelloVerifyRequest(WOLFSSL*, const byte*, byte);
  140. #endif /* WOLFSSL_DTLS */
  141. #endif /* !NO_WOLFSSL_SERVER */
  142. #endif /* !WOLFSSL_NO_TLS12 */
  143. #ifndef NO_WOLFSSL_SERVER
  144. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  145. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx,
  146. TicketEncCbCtx* keyCtx);
  147. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx);
  148. static int DefTicketEncCb(WOLFSSL* ssl,
  149. byte key_name[WOLFSSL_TICKET_NAME_SZ],
  150. byte iv[WOLFSSL_TICKET_IV_SZ],
  151. byte mac[WOLFSSL_TICKET_MAC_SZ],
  152. int enc, byte* ticket, int inLen, int* outLen,
  153. void* userCtx);
  154. #endif
  155. #endif
  156. static int cipherExtraData(WOLFSSL* ssl);
  157. #ifdef WOLFSSL_DTLS
  158. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl);
  159. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl);
  160. #endif
  161. enum processReply {
  162. doProcessInit = 0,
  163. #ifndef NO_WOLFSSL_SERVER
  164. runProcessOldClientHello,
  165. #endif
  166. getRecordLayerHeader,
  167. getData,
  168. verifyEncryptedMessage,
  169. decryptMessage,
  170. verifyMessage,
  171. runProcessingOneMessage
  172. };
  173. #ifndef WOLFSSL_NO_TLS12
  174. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  175. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  176. static const byte tls13Downgrade[7] = {
  177. 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
  178. };
  179. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  180. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  181. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  182. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  183. int padSz, int content, int verify, int epochOrder);
  184. #endif
  185. #endif /* !WOLFSSL_NO_TLS12 */
  186. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  187. int tsip_useable(const WOLFSSL *ssl);
  188. int tsip_generatePremasterSecret();
  189. int tsip_generateEncryptPreMasterSecret(WOLFSSL *ssl, byte *out, word32 *outSz);
  190. #endif
  191. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  192. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  193. int* secretSz, void* ctx);
  194. #ifdef WOLFSSL_TLS13
  195. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  196. const unsigned char* secret, int secretSz, void* ctx);
  197. #endif
  198. /*
  199. * This function builds up string for key-logging then call user's
  200. * key-log-callback to pass the string for TLS1.2 and older.
  201. * The user's key-logging callback has been set via
  202. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  203. * "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  204. * parameter
  205. * - ssl: WOLFSSL object
  206. * - secret: pointer to the buffer holding master-secret
  207. * - secretSz: size of secret
  208. * - ctx: not used
  209. * returns 0 on success, negative value on failure.
  210. */
  211. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  212. int* secretSz, void* ctx)
  213. {
  214. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  215. int msSz;
  216. int hasVal;
  217. int i;
  218. const char* label = "CLIENT_RANDOM";
  219. int labelSz = sizeof("CLIENT_RANDOM");
  220. int buffSz;
  221. byte* log = NULL;
  222. word32 outSz;
  223. int idx;
  224. int ret;
  225. (void)ctx;
  226. if (ssl == NULL || secret == NULL || *secretSz == 0)
  227. return BAD_FUNC_ARG;
  228. if (ssl->arrays == NULL)
  229. return BAD_FUNC_ARG;
  230. /* get the user-callback func from CTX*/
  231. logCb = ssl->ctx->keyLogCb;
  232. if (logCb == NULL)
  233. return 0;
  234. /* need to make sure the given master-secret has a meaningful value */
  235. msSz = *secretSz;
  236. hasVal = 0;
  237. for (i = 0; i < msSz; i++) {
  238. if (*((byte*)secret) != 0) {
  239. hasVal = 1;
  240. break;
  241. }
  242. }
  243. if (hasVal == 0)
  244. return 0; /* master-secret looks invalid */
  245. /* build up a hex-decoded keylog string
  246. "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  247. note that each keylog string does not have LF.
  248. */
  249. buffSz = labelSz + (RAN_LEN * 2) + 1 + ((*secretSz) * 2) + 1;
  250. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  251. if (log == NULL)
  252. return MEMORY_E;
  253. XMEMSET(log, 0, buffSz);
  254. XMEMCPY(log, label, labelSz -1); /* put label w/o terminator */
  255. XMEMSET(log + labelSz - 1, ' ', 1); /* '\0' -> ' ' */
  256. idx = labelSz;
  257. outSz = buffSz - idx;
  258. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  259. log + idx, &outSz)) == 0) {
  260. idx += (outSz - 1); /* reduce terminator byte */
  261. outSz = buffSz - idx;
  262. if (outSz > 1) {
  263. XMEMSET(log + idx, ' ', 1); /* add space*/
  264. idx++;
  265. outSz = buffSz - idx;
  266. if ((ret = Base16_Encode((byte*)secret, *secretSz,
  267. log + idx, &outSz)) == 0) {
  268. /* pass the log to the client callback*/
  269. logCb(ssl, (char*)log);
  270. ret = 0;
  271. }
  272. }
  273. else
  274. ret = MEMORY_E;
  275. }
  276. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  277. return ret;
  278. }
  279. #if defined(WOLFSSL_TLS13)
  280. /*
  281. * This function builds up string for key-logging then call user's
  282. * key-log-callback to pass the string for TLS1.3.
  283. * The user's key-logging callback has been set via
  284. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  285. * "<Lable> <hex-encoded client random> <hex-encoded secret>"
  286. *
  287. * parameter
  288. * - ssl: WOLFSSL object
  289. * - id: type of secret for logging
  290. * - secret: pointer to the buffer holding secret
  291. * - secretSz: size of secret
  292. * - ctx: not used
  293. * returns 0 on success, negative value on failure.
  294. */
  295. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  296. const unsigned char* secret, int secretSz, void* ctx)
  297. {
  298. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  299. char label[50];
  300. int labelSz = 0;
  301. int buffSz = 0;
  302. byte* log = NULL;
  303. word32 outSz;
  304. int idx;
  305. int ret;
  306. (void)ctx;
  307. if (ssl == NULL || secret == NULL || secretSz == 0)
  308. return BAD_FUNC_ARG;
  309. if (ssl->arrays == NULL)
  310. return BAD_FUNC_ARG;
  311. /* get the user-callback func from CTX*/
  312. logCb = ssl->ctx->keyLogCb;
  313. if (logCb == NULL)
  314. return 0;
  315. switch (id) {
  316. case CLIENT_EARLY_TRAFFIC_SECRET:
  317. labelSz = sizeof("CLIENT_EARLY_TRAFFIC_SECRET");
  318. XSTRNCPY(label,"CLIENT_EARLY_TRAFFIC_SECRET", labelSz);
  319. break;
  320. case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
  321. labelSz = sizeof("CLIENT_HANDSHAKE_TRAFFIC_SECRET");
  322. XSTRNCPY(label, "CLIENT_HANDSHAKE_TRAFFIC_SECRET", labelSz);
  323. break;
  324. case SERVER_HANDSHAKE_TRAFFIC_SECRET:
  325. labelSz = sizeof("SERVER_HANDSHAKE_TRAFFIC_SECRET");
  326. XSTRNCPY(label, "SERVER_HANDSHAKE_TRAFFIC_SECRET", labelSz);
  327. break;
  328. case CLIENT_TRAFFIC_SECRET:
  329. labelSz = sizeof("CLIENT_TRAFFIC_SECRET_0");
  330. XSTRNCPY(label, "CLIENT_TRAFFIC_SECRET_0", labelSz);
  331. break;
  332. case SERVER_TRAFFIC_SECRET:
  333. labelSz = sizeof("SERVER_TRAFFIC_SECRET_0");
  334. XSTRNCPY(label, "SERVER_TRAFFIC_SECRET_0", labelSz);
  335. break;
  336. case EARLY_EXPORTER_SECRET:
  337. labelSz = sizeof("EARLY_EXPORTER_SECRET");
  338. XSTRNCPY(label, "EARLY_EXPORTER_SECRET", labelSz);
  339. break;
  340. case EXPORTER_SECRET:
  341. labelSz = sizeof("EXPORTER_SECRET");
  342. XSTRNCPY(label, "EXPORTER_SECRET", labelSz);
  343. break;
  344. default:
  345. return BAD_FUNC_ARG;
  346. }
  347. /* prepare a log string for passing user callback */
  348. buffSz = labelSz + (RAN_LEN * 2) + 1 + secretSz * 2 + 1;
  349. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  350. if (log == NULL)
  351. return MEMORY_E;
  352. XMEMSET(log, 0, buffSz);
  353. XMEMCPY(log, label, labelSz - 1); /* put label w/o terminator */
  354. XMEMSET(log + labelSz - 1, ' ', 1); /* '\0' -> ' ' */
  355. idx = labelSz;
  356. outSz = buffSz - idx;
  357. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  358. log + idx, &outSz)) == 0) {
  359. idx += (outSz -1); /* reduce terminator byte */
  360. outSz = buffSz - idx;
  361. if (outSz >1) {
  362. XMEMSET(log + idx, ' ', 1); /* add space*/
  363. idx++;
  364. outSz = buffSz - idx;
  365. if ((ret = Base16_Encode((byte*)secret, secretSz,
  366. log + idx, &outSz)) == 0) {
  367. logCb(ssl, (char*)log);
  368. ret = 0;
  369. }
  370. }
  371. else
  372. ret = MEMORY_E;
  373. }
  374. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  375. return ret;
  376. }
  377. #endif /* WOLFSSL_TLS13*/
  378. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK*/
  379. int IsTLS(const WOLFSSL* ssl)
  380. {
  381. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  382. return 1;
  383. return 0;
  384. }
  385. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  386. {
  387. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  388. return 1;
  389. #ifdef WOLFSSL_DTLS
  390. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  391. return 1;
  392. #endif
  393. return 0;
  394. }
  395. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  396. {
  397. return (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  398. }
  399. static WC_INLINE int IsEncryptionOn(WOLFSSL* ssl, int isSend)
  400. {
  401. #ifdef WOLFSSL_DTLS
  402. /* For DTLS, epoch 0 is always not encrypted. */
  403. if (ssl->options.dtls && !isSend && ssl->keys.curEpoch == 0)
  404. return 0;
  405. #endif /* WOLFSSL_DTLS */
  406. return ssl->keys.encryptionOn &&
  407. (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
  408. }
  409. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  410. /* If SCTP is not enabled returns the state of the dtls option.
  411. * If SCTP is enabled returns dtls && !sctp. */
  412. static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl)
  413. {
  414. #ifdef WOLFSSL_SCTP
  415. return ssl->options.dtls && !ssl->options.dtlsSctp;
  416. #else
  417. return ssl->options.dtls;
  418. #endif
  419. }
  420. #endif /* DTLS || !WOLFSSL_NO_TLS12 */
  421. #ifdef HAVE_LIBZ
  422. /* alloc user allocs to work with zlib */
  423. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  424. {
  425. (void)opaque;
  426. return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  427. }
  428. static void myFree(void* opaque, void* memory)
  429. {
  430. (void)opaque;
  431. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  432. }
  433. /* init zlib comp/decomp streams, 0 on success */
  434. static int InitStreams(WOLFSSL* ssl)
  435. {
  436. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  437. ssl->c_stream.zfree = (free_func)myFree;
  438. ssl->c_stream.opaque = (voidpf)ssl->heap;
  439. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  440. return ZLIB_INIT_ERROR;
  441. ssl->didStreamInit = 1;
  442. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  443. ssl->d_stream.zfree = (free_func)myFree;
  444. ssl->d_stream.opaque = (voidpf)ssl->heap;
  445. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  446. return 0;
  447. }
  448. static void FreeStreams(WOLFSSL* ssl)
  449. {
  450. if (ssl->didStreamInit) {
  451. deflateEnd(&ssl->c_stream);
  452. inflateEnd(&ssl->d_stream);
  453. }
  454. }
  455. /* compress in to out, return out size or error */
  456. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  457. {
  458. int err;
  459. int currTotal = (int)ssl->c_stream.total_out;
  460. ssl->c_stream.next_in = in;
  461. ssl->c_stream.avail_in = inSz;
  462. ssl->c_stream.next_out = out;
  463. ssl->c_stream.avail_out = outSz;
  464. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  465. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  466. return (int)ssl->c_stream.total_out - currTotal;
  467. }
  468. /* decompress in to out, return out size or error */
  469. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  470. {
  471. int err;
  472. int currTotal = (int)ssl->d_stream.total_out;
  473. ssl->d_stream.next_in = in;
  474. ssl->d_stream.avail_in = inSz;
  475. ssl->d_stream.next_out = out;
  476. ssl->d_stream.avail_out = outSz;
  477. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  478. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  479. return (int)ssl->d_stream.total_out - currTotal;
  480. }
  481. #endif /* HAVE_LIBZ */
  482. #ifdef WOLFSSL_SESSION_EXPORT
  483. /**
  484. * serializes the cipher specs struct for exporting
  485. * @return the amount written to 'exp' buffer
  486. */
  487. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  488. int type)
  489. {
  490. word32 idx = 0;
  491. CipherSpecs* specs;
  492. WOLFSSL_ENTER("ExportCipherSpecState");
  493. if (exp == NULL || ssl == NULL) {
  494. return BAD_FUNC_ARG;
  495. }
  496. specs = &ssl->specs;
  497. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  498. return BUFFER_E;
  499. }
  500. XMEMSET(exp, 0, WOLFSSL_EXPORT_SPC_SZ);
  501. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  502. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  503. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  504. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  505. exp[idx++] = specs->bulk_cipher_algorithm;
  506. exp[idx++] = specs->cipher_type;
  507. exp[idx++] = specs->mac_algorithm;
  508. exp[idx++] = specs->kea;
  509. exp[idx++] = specs->sig_algo;
  510. exp[idx++] = specs->hash_size;
  511. exp[idx++] = specs->pad_size;
  512. exp[idx++] = specs->static_ecdh;
  513. if (idx != WOLFSSL_EXPORT_SPC_SZ) {
  514. WOLFSSL_MSG("WOLFSSL_EXPORT_SPC_SZ needs updated and export version");
  515. return DTLS_EXPORT_VER_E;
  516. }
  517. /* send over state of AES too */
  518. if (type == WOLFSSL_EXPORT_TLS &&
  519. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  520. byte *pt = (byte*)ssl->encrypt.aes->reg;
  521. if ((idx + 2*AES_BLOCK_SIZE) > len) {
  522. WOLFSSL_MSG("Can not fit AES state into buffer\n");
  523. return BUFFER_E;
  524. }
  525. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  526. idx += AES_BLOCK_SIZE;
  527. pt = (byte*)ssl->decrypt.aes->reg;
  528. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  529. idx += AES_BLOCK_SIZE;
  530. }
  531. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  532. (void)ver;
  533. return idx;
  534. }
  535. /* serializes the key struct for exporting */
  536. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  537. byte small, int type)
  538. {
  539. word32 idx = 0;
  540. byte sz;
  541. Keys* keys;
  542. WOLFSSL_ENTER("ExportKeyState");
  543. if (exp == NULL || ssl == NULL) {
  544. return BAD_FUNC_ARG;
  545. }
  546. keys = &(ssl->keys);
  547. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  548. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  549. return BUFFER_E;
  550. }
  551. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  552. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  553. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  554. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  555. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  556. #if defined(WOLFSSL_DTLS)
  557. if (type == WOLFSSL_EXPORT_DTLS) {
  558. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  559. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  560. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  561. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  562. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  563. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  564. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  565. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  566. c16toa(keys->dtls_peer_handshake_number, exp + idx);
  567. idx += OPAQUE16_LEN;
  568. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  569. idx += OPAQUE16_LEN;
  570. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  571. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  572. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx);
  573. idx += OPAQUE16_LEN;
  574. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx);
  575. idx += OPAQUE32_LEN;
  576. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  577. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  578. }
  579. #endif
  580. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  581. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  582. exp[idx++] = keys->encryptionOn;
  583. exp[idx++] = keys->decryptedCur;
  584. /* from here on the buffer needs checked because is variable length that
  585. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  586. #ifdef WOLFSSL_DTLS
  587. if (type == WOLFSSL_EXPORT_DTLS) {
  588. word32 i;
  589. if ((OPAQUE16_LEN * 2) + idx +
  590. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  591. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  592. return BUFFER_E;
  593. }
  594. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  595. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  596. c32toa(keys->peerSeq[0].window[i], exp + idx);
  597. idx += OPAQUE32_LEN;
  598. }
  599. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  600. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  601. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  602. idx += OPAQUE32_LEN;
  603. }
  604. }
  605. #endif
  606. if (idx >= len) {
  607. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  608. return BUFFER_E;
  609. }
  610. #ifdef HAVE_TRUNCATED_HMAC
  611. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  612. exp[idx++] = ssl->truncated_hmac;
  613. #else
  614. sz = ssl->specs.hash_size;
  615. exp[idx++] = 0; /* no truncated hmac */
  616. #endif
  617. sz = (small)? 0: sz;
  618. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  619. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  620. return BUFFER_E;
  621. }
  622. exp[idx++] = sz;
  623. if (sz > 0) {
  624. #ifndef WOLFSSL_AEAD_ONLY
  625. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  626. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  627. #else
  628. XMEMSET(exp + idx, 0, sz); idx += sz;
  629. XMEMSET(exp + idx, 0, sz); idx += sz;
  630. #endif
  631. }
  632. sz = (small)? 0: ssl->specs.key_size;
  633. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  634. WOLFSSL_MSG("Buffer not large enough for write key");
  635. return BUFFER_E;
  636. }
  637. exp[idx++] = sz;
  638. if (sz > 0) {
  639. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  640. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  641. }
  642. sz = (small)? 0: ssl->specs.iv_size;
  643. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  644. WOLFSSL_MSG("Buffer not large enough for IVs");
  645. return BUFFER_E;
  646. }
  647. exp[idx++] = sz;
  648. if (sz > 0) {
  649. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  650. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  651. }
  652. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  653. idx += AEAD_MAX_EXP_SZ;
  654. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  655. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  656. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  657. return BUFFER_E;
  658. }
  659. exp[idx++] = sz;
  660. if (sz > 0) {
  661. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  662. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  663. }
  664. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  665. if (idx > DTLS_EXPORT_KEY_SZ) {
  666. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  667. return DTLS_EXPORT_VER_E;
  668. }
  669. WOLFSSL_LEAVE("ExportKeyState", idx);
  670. (void)ver;
  671. (void)type;
  672. return idx;
  673. }
  674. /**
  675. * Imports the buffer 'exp' into the 'ssl' CipherSpec structure.
  676. * @param ssl WOLFSSL structure to import into
  677. * @param exp input buffer to read from
  678. * @param len length of exp buffer
  679. * @param ver version of import buffer found
  680. * @param type flag for importing a TLS session or DTLS
  681. *
  682. * @return size of exp buffer consumed on success and negative value on fail
  683. */
  684. static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len,
  685. byte ver, int type)
  686. {
  687. word32 idx = 0;
  688. CipherSpecs* specs;
  689. word32 tmp_seq_peer_lo;
  690. word32 tmp_seq_peer_hi;
  691. word32 tmp_seq_lo;
  692. word32 tmp_seq_hi;
  693. WOLFSSL_ENTER("ImportCipherSpecState");
  694. if (exp == NULL || ssl == NULL) {
  695. return BAD_FUNC_ARG;
  696. }
  697. specs= &(ssl->specs);
  698. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  699. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  700. return BUFFER_E;
  701. }
  702. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  703. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  704. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  705. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  706. specs->bulk_cipher_algorithm = exp[idx++];
  707. specs->cipher_type = exp[idx++];
  708. specs->mac_algorithm = exp[idx++];
  709. specs->kea = exp[idx++];
  710. specs->sig_algo = exp[idx++];
  711. specs->hash_size = exp[idx++];
  712. specs->pad_size = exp[idx++];
  713. specs->static_ecdh = exp[idx++];
  714. if (specs->pad_size != PAD_MD5 && specs->pad_size != PAD_SHA) {
  715. WOLFSSL_MSG("Importing bad or unknown pad size");
  716. return BAD_STATE_E;
  717. }
  718. /* temporarily save the sequence numbers */
  719. tmp_seq_peer_lo = ssl->keys.peer_sequence_number_lo;
  720. tmp_seq_peer_hi = ssl->keys.peer_sequence_number_hi;
  721. tmp_seq_lo = ssl->keys.sequence_number_lo;
  722. tmp_seq_hi = ssl->keys.sequence_number_hi;
  723. SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  724. /* reset sequence numbers after setting keys */
  725. ssl->keys.peer_sequence_number_lo = tmp_seq_peer_lo;
  726. ssl->keys.peer_sequence_number_hi = tmp_seq_peer_hi;
  727. ssl->keys.sequence_number_lo = tmp_seq_lo;
  728. ssl->keys.sequence_number_hi = tmp_seq_hi;
  729. if (type == WOLFSSL_EXPORT_TLS &&
  730. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  731. byte *pt = (byte*)ssl->encrypt.aes->reg;
  732. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  733. idx += AES_BLOCK_SIZE;
  734. pt = (byte*)ssl->decrypt.aes->reg;
  735. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  736. idx += AES_BLOCK_SIZE;
  737. }
  738. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  739. (void)ver;
  740. return idx;
  741. }
  742. /**
  743. * Import the Key structure
  744. *
  745. * @param ssl WOLFSSL structure to import into
  746. * @param exp buffer to read Key values from
  747. * @param len max length of buffer 'exp'
  748. * @param ver version of import buffer found
  749. * @param type flag for TLS vs DTLS
  750. *
  751. * @return amount of data read from exp on success or negative on fail
  752. */
  753. static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  754. int type)
  755. {
  756. word32 idx = 0;
  757. byte sz;
  758. Keys *keys;
  759. WOLFSSL_ENTER("ImportKeyState");
  760. if (exp == NULL || ssl == NULL) {
  761. return BAD_FUNC_ARG;
  762. }
  763. keys = &(ssl->keys);
  764. /* check minimum length -- includes byte used for size indicators */
  765. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  766. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  767. return BUFFER_E;
  768. }
  769. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  770. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  771. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  772. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  773. #if defined(WOLFSSL_DTLS)
  774. if (type == WOLFSSL_EXPORT_DTLS) {
  775. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  776. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  777. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  778. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  779. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  780. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  781. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  782. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  783. ato16(exp + idx, &keys->dtls_peer_handshake_number);
  784. idx += OPAQUE16_LEN;
  785. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  786. idx += OPAQUE16_LEN;
  787. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  788. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  789. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi);
  790. idx += OPAQUE16_LEN;
  791. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo);
  792. idx += OPAQUE32_LEN;
  793. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  794. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  795. }
  796. #endif
  797. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  798. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  799. keys->encryptionOn = exp[idx++];
  800. keys->decryptedCur = exp[idx++];
  801. #if defined(WOLFSSL_DTLS)
  802. if (type == WOLFSSL_EXPORT_DTLS) {
  803. word16 i, wordCount, wordAdj = 0;
  804. /* do window */
  805. ato16(exp + idx, &wordCount);
  806. idx += OPAQUE16_LEN;
  807. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  808. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  809. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  810. }
  811. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  812. for (i = 0; i < wordCount; i++) {
  813. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  814. idx += OPAQUE32_LEN;
  815. }
  816. idx += wordAdj;
  817. /* do prevWindow */
  818. ato16(exp + idx, &wordCount);
  819. idx += OPAQUE16_LEN;
  820. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  821. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  822. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  823. }
  824. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  825. for (i = 0; i < wordCount; i++) {
  826. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  827. idx += OPAQUE32_LEN;
  828. }
  829. idx += wordAdj;
  830. }
  831. #endif
  832. #ifdef HAVE_TRUNCATED_HMAC
  833. ssl->truncated_hmac = exp[idx++];
  834. #else
  835. idx++; /* no truncated hmac */
  836. #endif
  837. sz = exp[idx++];
  838. #ifndef WOLFSSL_AEAD_ONLY
  839. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  840. WOLFSSL_MSG("Buffer not large enough for MAC import");
  841. return BUFFER_E;
  842. }
  843. if (sz > 0) {
  844. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  845. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  846. }
  847. #else
  848. if (sz + idx > len) {
  849. return BUFFER_E;
  850. }
  851. idx += sz; idx += sz;
  852. #endif
  853. sz = exp[idx++];
  854. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  855. WOLFSSL_MSG("Buffer not large enough for key import");
  856. return BUFFER_E;
  857. }
  858. if (sz > 0) {
  859. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  860. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  861. }
  862. sz = exp[idx++];
  863. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  864. WOLFSSL_MSG("Buffer not large enough for write IV import");
  865. return BUFFER_E;
  866. }
  867. if (sz > 0) {
  868. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  869. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  870. }
  871. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  872. idx += AEAD_MAX_EXP_SZ;
  873. sz = exp[idx++];
  874. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  875. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  876. return BUFFER_E;
  877. }
  878. if (sz > 0) {
  879. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  880. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  881. }
  882. WOLFSSL_LEAVE("ImportKeyState", idx);
  883. (void)ver;
  884. (void)type;
  885. return idx;
  886. }
  887. /* copy over necessary information from Options struct to buffer
  888. * On success returns size of buffer used on failure returns a negative value */
  889. static int ExportOptions(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  890. int type)
  891. {
  892. int idx = 0;
  893. word16 zero = 0;
  894. Options *options;
  895. WOLFSSL_ENTER("ExportOptions");
  896. if (ssl == NULL || exp == NULL || len < DTLS_EXPORT_OPT_SZ) {
  897. return BAD_FUNC_ARG;
  898. }
  899. options = &ssl->options;
  900. if (options == NULL) {
  901. return BAD_FUNC_ARG;
  902. }
  903. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  904. /* these options are kept and sent to indicate verify status and strength
  905. * of handshake */
  906. exp[idx++] = options->sendVerify;
  907. exp[idx++] = options->verifyPeer;
  908. exp[idx++] = options->verifyNone;
  909. exp[idx++] = options->downgrade;
  910. #ifndef NO_DH
  911. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  912. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  913. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  914. #else
  915. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  916. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  917. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  918. #endif
  919. #ifndef NO_RSA
  920. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  921. #else
  922. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  923. #endif
  924. #ifdef HAVE_ECC
  925. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  926. #else
  927. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  928. #endif
  929. /* these options are kept to indicate state and behavior */
  930. #ifndef NO_PSK
  931. exp[idx++] = options->havePSK;
  932. #else
  933. exp[idx++] = 0;
  934. #endif
  935. exp[idx++] = options->sessionCacheOff;
  936. exp[idx++] = options->sessionCacheFlushOff;
  937. exp[idx++] = options->side;
  938. exp[idx++] = options->resuming;
  939. exp[idx++] = options->haveSessionId;
  940. exp[idx++] = options->tls;
  941. exp[idx++] = options->tls1_1;
  942. exp[idx++] = options->dtls;
  943. exp[idx++] = options->connReset;
  944. exp[idx++] = options->isClosed;
  945. exp[idx++] = options->closeNotify;
  946. exp[idx++] = options->sentNotify;
  947. exp[idx++] = options->usingCompression;
  948. exp[idx++] = options->haveRSA;
  949. exp[idx++] = options->haveECC;
  950. exp[idx++] = options->haveDH;
  951. exp[idx++] = 0; /* Historical: haveNTRU */
  952. exp[idx++] = 0; /* Historical: haveQSH */
  953. exp[idx++] = options->haveECDSAsig;
  954. exp[idx++] = options->haveStaticECC;
  955. exp[idx++] = options->havePeerVerify;
  956. exp[idx++] = options->usingPSK_cipher;
  957. exp[idx++] = options->usingAnon_cipher;
  958. exp[idx++] = options->sendAlertState;
  959. exp[idx++] = options->partialWrite;
  960. exp[idx++] = options->quietShutdown;
  961. exp[idx++] = options->groupMessages;
  962. #ifdef HAVE_POLY1305
  963. exp[idx++] = options->oldPoly;
  964. #else
  965. exp[idx++] = 0;
  966. #endif
  967. #ifdef HAVE_ANON
  968. exp[idx++] = options->haveAnon;
  969. #else
  970. exp[idx++] = 0;
  971. #endif
  972. #ifdef HAVE_SESSION_TICKET
  973. exp[idx++] = options->createTicket;
  974. exp[idx++] = options->useTicket;
  975. exp[idx++] = options->noTicketTls12;
  976. #ifdef WOLFSSL_TLS13
  977. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  978. exp[idx++] = options->noTicketTls13;
  979. }
  980. #else
  981. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  982. exp[idx++] = 0;
  983. }
  984. #endif
  985. #else
  986. exp[idx++] = 0;
  987. exp[idx++] = 0;
  988. exp[idx++] = 0;
  989. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  990. exp[idx++] = 0;
  991. }
  992. #endif
  993. exp[idx++] = options->processReply;
  994. exp[idx++] = options->cipherSuite0;
  995. exp[idx++] = options->cipherSuite;
  996. exp[idx++] = options->serverState;
  997. exp[idx++] = options->clientState;
  998. exp[idx++] = options->handShakeState;
  999. exp[idx++] = options->handShakeDone;
  1000. exp[idx++] = options->minDowngrade;
  1001. exp[idx++] = options->connectState;
  1002. exp[idx++] = options->acceptState;
  1003. exp[idx++] = options->asyncState;
  1004. if (type == WOLFSSL_EXPORT_TLS) {
  1005. exp[idx++] = options->disallowEncThenMac;
  1006. exp[idx++] = options->encThenMac;
  1007. exp[idx++] = options->startedETMRead;
  1008. exp[idx++] = options->startedETMWrite;
  1009. }
  1010. /* version of connection */
  1011. exp[idx++] = ssl->version.major;
  1012. exp[idx++] = ssl->version.minor;
  1013. (void)zero;
  1014. /* check if changes were made and notify of need to update export version */
  1015. switch (ver) {
  1016. case WOLFSSL_EXPORT_VERSION_3:
  1017. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  1018. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1019. return DTLS_EXPORT_VER_E;
  1020. }
  1021. break;
  1022. case WOLFSSL_EXPORT_VERSION:
  1023. if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) {
  1024. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1025. return DTLS_EXPORT_VER_E;
  1026. }
  1027. break;
  1028. default:
  1029. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  1030. return DTLS_EXPORT_VER_E;
  1031. }
  1032. WOLFSSL_LEAVE("ExportOptions", idx);
  1033. (void)type;
  1034. return idx;
  1035. }
  1036. /* copy items from Export struct to Options struct
  1037. * On success returns size of buffer used on failure returns a negative value */
  1038. static int ImportOptions(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  1039. int type)
  1040. {
  1041. int idx = 0;
  1042. Options* options = &ssl->options;
  1043. switch (ver) {
  1044. case WOLFSSL_EXPORT_VERSION:
  1045. if (len < DTLS_EXPORT_OPT_SZ) {
  1046. WOLFSSL_MSG("Sanity check on buffer size failed");
  1047. return BAD_FUNC_ARG;
  1048. }
  1049. break;
  1050. case WOLFSSL_EXPORT_VERSION_3:
  1051. if (len < DTLS_EXPORT_OPT_SZ_3) {
  1052. WOLFSSL_MSG("Sanity check on buffer size failed");
  1053. return BAD_FUNC_ARG;
  1054. }
  1055. break;
  1056. default:
  1057. WOLFSSL_MSG("Export version not supported");
  1058. return BAD_FUNC_ARG;
  1059. }
  1060. if (exp == NULL || options == NULL) {
  1061. return BAD_FUNC_ARG;
  1062. }
  1063. /* these options are kept and sent to indicate verify status and strength
  1064. * of handshake */
  1065. options->sendVerify = exp[idx++];
  1066. options->verifyPeer = exp[idx++];
  1067. options->verifyNone = exp[idx++];
  1068. options->downgrade = exp[idx++];
  1069. #ifndef NO_DH
  1070. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  1071. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  1072. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  1073. #else
  1074. idx += OPAQUE16_LEN;
  1075. idx += OPAQUE16_LEN;
  1076. idx += OPAQUE16_LEN;
  1077. #endif
  1078. #ifndef NO_RSA
  1079. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  1080. #else
  1081. idx += OPAQUE16_LEN;
  1082. #endif
  1083. #ifdef HAVE_ECC
  1084. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  1085. #else
  1086. idx += OPAQUE16_LEN;
  1087. #endif
  1088. /* these options are kept to indicate state and behavior */
  1089. #ifndef NO_PSK
  1090. options->havePSK = exp[idx++];
  1091. #else
  1092. idx++;
  1093. #endif
  1094. options->sessionCacheOff = exp[idx++];
  1095. options->sessionCacheFlushOff = exp[idx++];
  1096. options->side = exp[idx++];
  1097. options->resuming = exp[idx++];
  1098. options->haveSessionId = exp[idx++];
  1099. options->tls = exp[idx++];
  1100. options->tls1_1 = exp[idx++];
  1101. options->dtls = exp[idx++];
  1102. options->connReset = exp[idx++];
  1103. options->isClosed = exp[idx++];
  1104. options->closeNotify = exp[idx++];
  1105. options->sentNotify = exp[idx++];
  1106. options->usingCompression = exp[idx++];
  1107. options->haveRSA = exp[idx++];
  1108. options->haveECC = exp[idx++];
  1109. options->haveDH = exp[idx++];
  1110. idx++; /* Historical: haveNTRU */
  1111. idx++; /* Historical: haveQSH */
  1112. options->haveECDSAsig = exp[idx++];
  1113. options->haveStaticECC = exp[idx++];
  1114. options->havePeerVerify = exp[idx++];
  1115. options->usingPSK_cipher = exp[idx++];
  1116. options->usingAnon_cipher = exp[idx++];
  1117. options->sendAlertState = exp[idx++];
  1118. options->partialWrite = exp[idx++];
  1119. options->quietShutdown = exp[idx++];
  1120. options->groupMessages = exp[idx++];
  1121. #ifdef HAVE_POLY1305
  1122. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  1123. #else
  1124. idx++;
  1125. #endif
  1126. #ifdef HAVE_ANON
  1127. options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */
  1128. #else
  1129. idx++;
  1130. #endif
  1131. #ifdef HAVE_SESSION_TICKET
  1132. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  1133. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  1134. options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
  1135. #ifdef WOLFSSL_TLS13
  1136. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1137. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  1138. }
  1139. #else
  1140. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1141. idx++;
  1142. }
  1143. #endif
  1144. #else
  1145. idx++;
  1146. idx++;
  1147. idx++;
  1148. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1149. idx++;
  1150. }
  1151. #endif
  1152. options->processReply = exp[idx++];
  1153. options->cipherSuite0 = exp[idx++];
  1154. options->cipherSuite = exp[idx++];
  1155. options->serverState = exp[idx++];
  1156. options->clientState = exp[idx++];
  1157. options->handShakeState = exp[idx++];
  1158. options->handShakeDone = exp[idx++];
  1159. options->minDowngrade = exp[idx++];
  1160. options->connectState = exp[idx++];
  1161. options->acceptState = exp[idx++];
  1162. options->asyncState = exp[idx++];
  1163. if (type == WOLFSSL_EXPORT_TLS) {
  1164. options->disallowEncThenMac = exp[idx++];
  1165. options->encThenMac = exp[idx++];
  1166. options->startedETMRead = exp[idx++];
  1167. options->startedETMWrite = exp[idx++];
  1168. }
  1169. /* version of connection */
  1170. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  1171. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  1172. return VERSION_ERROR;
  1173. }
  1174. /* set TLS 1.3 flag in options if this was a TLS 1.3 connection */
  1175. if (ssl->version.major == SSLv3_MAJOR &&
  1176. ssl->version.minor == TLSv1_3_MINOR) {
  1177. options->tls1_3 = 1;
  1178. }
  1179. return idx;
  1180. }
  1181. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  1182. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  1183. {
  1184. int idx = 0;
  1185. int ipSz = MAX_EXPORT_IP; /* start as max size */
  1186. int fam = 0;
  1187. word16 port = 0;
  1188. char ip[MAX_EXPORT_IP];
  1189. if (ver != WOLFSSL_EXPORT_VERSION) {
  1190. WOLFSSL_MSG("Export version not supported");
  1191. return BAD_FUNC_ARG;
  1192. }
  1193. if (ssl == NULL || exp == NULL ||
  1194. len < (sizeof(ip) + 3 * WOLFSSL_EXPORT_LEN)) {
  1195. return BAD_FUNC_ARG;
  1196. }
  1197. if (ssl->ctx->CBGetPeer == NULL) {
  1198. WOLFSSL_MSG("No get peer call back set");
  1199. return BAD_FUNC_ARG;
  1200. }
  1201. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  1202. WOLFSSL_MSG("Get peer callback error");
  1203. return SOCKET_ERROR_E;
  1204. }
  1205. /* check that ipSz/fam is not negative or too large since user can set cb */
  1206. if (ipSz < 0 || ipSz > MAX_EXPORT_IP || fam < 0) {
  1207. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  1208. return SOCKET_ERROR_E;
  1209. }
  1210. c16toa((word16)fam, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1211. c16toa((word16)ipSz, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1212. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  1213. c16toa(port, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1214. return idx;
  1215. }
  1216. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  1217. static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
  1218. {
  1219. word16 idx = 0;
  1220. word16 ipSz;
  1221. word16 fam;
  1222. word16 port;
  1223. char ip[MAX_EXPORT_IP];
  1224. if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_3) {
  1225. WOLFSSL_MSG("Export version not supported");
  1226. return BAD_FUNC_ARG;
  1227. }
  1228. if (len == 0) {
  1229. WOLFSSL_MSG("No peer info sent");
  1230. return 0;
  1231. }
  1232. if (ssl == NULL || buf == NULL || len < 3 * WOLFSSL_EXPORT_LEN) {
  1233. return BAD_FUNC_ARG;
  1234. }
  1235. /* import sin family */
  1236. ato16(buf + idx, &fam); idx += WOLFSSL_EXPORT_LEN;
  1237. /* import ip address idx, and ipSz are unsigned but cast for enum */
  1238. ato16(buf + idx, &ipSz); idx += WOLFSSL_EXPORT_LEN;
  1239. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + WOLFSSL_EXPORT_LEN) > len) {
  1240. return BUFFER_E;
  1241. }
  1242. XMEMSET(ip, 0, sizeof(ip));
  1243. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  1244. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  1245. ato16(buf + idx, &port); idx += WOLFSSL_EXPORT_LEN;
  1246. /* sanity check for a function to call, then use it to import peer info */
  1247. if (ssl->ctx->CBSetPeer == NULL) {
  1248. WOLFSSL_MSG("No set peer function");
  1249. return BAD_FUNC_ARG;
  1250. }
  1251. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  1252. WOLFSSL_MSG("Error setting peer info");
  1253. return SOCKET_ERROR_E;
  1254. }
  1255. return idx;
  1256. }
  1257. #ifdef WOLFSSL_DTLS
  1258. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1259. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1260. * passed in.
  1261. * On success returns the size of serialized session state.*/
  1262. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1263. {
  1264. int ret;
  1265. word32 idx = 0;
  1266. word32 totalLen = 0;
  1267. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1268. if (buf == NULL || ssl == NULL) {
  1269. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1270. return BAD_FUNC_ARG;
  1271. }
  1272. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1273. /* each of the following have a 2 byte length before data */
  1274. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1275. if (totalLen > sz) {
  1276. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1277. return BUFFER_E;
  1278. }
  1279. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1280. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1281. ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1282. idx += WOLFSSL_EXPORT_LEN; /* leave room for total length */
  1283. /* export keys struct and dtls state -- variable length stored in ret */
  1284. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1285. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1286. WOLFSSL_EXPORT_VERSION, 1, WOLFSSL_EXPORT_DTLS)) < 0) {
  1287. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1288. return ret;
  1289. }
  1290. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1291. /* place total length of exported buffer minus 2 bytes protocol/version */
  1292. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1293. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1294. /* if compiled with debug options then print the version, protocol, size */
  1295. {
  1296. char debug[256];
  1297. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1298. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1299. , (int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1300. WOLFSSL_MSG(debug);
  1301. }
  1302. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1303. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1304. return idx;
  1305. }
  1306. /* On success return amount of buffer consumed */
  1307. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1308. {
  1309. word32 idx = 0;
  1310. word16 length = 0;
  1311. int version;
  1312. int ret;
  1313. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1314. /* check at least enough room for protocol and length */
  1315. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1316. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1317. return BAD_FUNC_ARG;
  1318. }
  1319. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1320. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1321. WOLFSSL_MSG("Incorrect protocol");
  1322. return BAD_FUNC_ARG;
  1323. }
  1324. version = buf[idx++] & 0x0F;
  1325. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1326. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1327. WOLFSSL_MSG("Buffer size sanity check failed");
  1328. return BUFFER_E;
  1329. }
  1330. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1331. /* if compiled with debug options then print the version, protocol, size */
  1332. {
  1333. char debug[256];
  1334. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1335. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1336. , (int)version, buf[0], (buf[1] >> 4), length);
  1337. WOLFSSL_MSG(debug);
  1338. }
  1339. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1340. /* perform sanity checks and extract Options information used */
  1341. switch (version) {
  1342. case WOLFSSL_EXPORT_VERSION:
  1343. break;
  1344. default:
  1345. WOLFSSL_MSG("Bad export state version");
  1346. return BAD_FUNC_ARG;
  1347. }
  1348. /* perform sanity checks and extract Keys struct */
  1349. if (WOLFSSL_EXPORT_LEN + idx > sz) {
  1350. WOLFSSL_MSG("Import Key struct error");
  1351. return BUFFER_E;
  1352. }
  1353. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1354. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1355. WOLFSSL_MSG("Import Key struct error");
  1356. return BUFFER_E;
  1357. }
  1358. if ((ret = ImportKeyState(ssl, buf + idx, length, version,
  1359. WOLFSSL_EXPORT_DTLS)) < 0) {
  1360. WOLFSSL_MSG("Import Key struct error");
  1361. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1362. return ret;
  1363. }
  1364. idx += ret;
  1365. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1366. return idx;
  1367. }
  1368. #endif /* WOLFSSL_DTLS */
  1369. /**
  1370. * Imports a serialized buffer (both TLS and DTLS)
  1371. *
  1372. * @param ssl WOLFSSL structure to import into
  1373. * @param buf buffer containing serialized session
  1374. * @param sz size of buffer 'buf'
  1375. * @param type flag for TLS or DTLS
  1376. *
  1377. * @return the size of serialized buffer on success
  1378. */
  1379. int wolfSSL_session_import_internal(WOLFSSL* ssl, const unsigned char* buf,
  1380. unsigned int sz, int type)
  1381. {
  1382. word32 idx = 0;
  1383. word16 length = 0;
  1384. int version = 0;
  1385. int ret = 0;
  1386. int optSz;
  1387. int rc;
  1388. byte validProto = 0; /* did we find a valid protocol */
  1389. WOLFSSL_ENTER("wolfSSL_session_import_internal");
  1390. /* check at least enough room for protocol and length */
  1391. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1392. ret = BAD_FUNC_ARG;
  1393. }
  1394. /* Check if is TLS export protocol */
  1395. if (ret == 0) {
  1396. if (buf[idx] == (byte)TLS_EXPORT_PRO &&
  1397. (buf[idx + 1] & 0xF0) == ((byte)TLS_EXPORT_PRO & 0xF0)) {
  1398. validProto = 1;
  1399. }
  1400. /* Check if is DTLS export protocol */
  1401. if (buf[idx] == (byte)DTLS_EXPORT_PRO &&
  1402. (buf[idx + 1] & 0xF0) == ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1403. validProto = 1;
  1404. }
  1405. if (validProto == 0) {
  1406. #ifdef WOLFSSL_DTLS
  1407. /* check if importing state only */
  1408. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1409. #else
  1410. WOLFSSL_MSG("Invalid serialized session protocol value");
  1411. ret = BAD_FUNC_ARG;
  1412. #endif
  1413. }
  1414. idx += 1;
  1415. }
  1416. if (ret == 0) {
  1417. version = buf[idx++] & 0x0F;
  1418. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1419. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1420. ret = BUFFER_E;
  1421. }
  1422. }
  1423. /* if compiled with debug options then print the version, protocol, size */
  1424. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1425. {
  1426. char debug[256];
  1427. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1428. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1429. , (int)version, buf[0], (buf[1] >> 4), length);
  1430. WOLFSSL_MSG(debug);
  1431. }
  1432. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1433. /* perform sanity checks and extract Options information used */
  1434. if (ret == 0) {
  1435. switch (version) {
  1436. case WOLFSSL_EXPORT_VERSION:
  1437. if (type == WOLFSSL_EXPORT_DTLS) {
  1438. optSz = DTLS_EXPORT_OPT_SZ;
  1439. }
  1440. else {
  1441. optSz = TLS_EXPORT_OPT_SZ;
  1442. }
  1443. break;
  1444. case WOLFSSL_EXPORT_VERSION_3:
  1445. WOLFSSL_MSG("Importing older version 3");
  1446. optSz = DTLS_EXPORT_OPT_SZ_3;
  1447. break;
  1448. default:
  1449. WOLFSSL_MSG("Bad export version");
  1450. ret = BAD_FUNC_ARG;
  1451. }
  1452. }
  1453. if (ret == 0 && (WOLFSSL_EXPORT_LEN + optSz + idx > sz)) {
  1454. WOLFSSL_MSG("Import Options struct error");
  1455. ret = BUFFER_E;
  1456. }
  1457. if (ret == 0) {
  1458. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1459. if (length != optSz) {
  1460. WOLFSSL_MSG("Import Options struct error");
  1461. ret = BUFFER_E;
  1462. }
  1463. }
  1464. if (ret == 0) {
  1465. rc = ImportOptions(ssl, buf + idx, length, version, type);
  1466. if (rc < 0) {
  1467. WOLFSSL_MSG("Import Options struct error");
  1468. ret = rc;
  1469. }
  1470. else {
  1471. idx += length;
  1472. }
  1473. }
  1474. /* perform sanity checks and extract Keys struct */
  1475. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1476. WOLFSSL_MSG("Import Key struct error");
  1477. ret = BUFFER_E;
  1478. }
  1479. if (ret == 0) {
  1480. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1481. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1482. WOLFSSL_MSG("Import Key struct error");
  1483. ret = BUFFER_E;
  1484. }
  1485. }
  1486. if (ret == 0) {
  1487. rc = ImportKeyState(ssl, buf + idx, length, version, type);
  1488. if (rc < 0) {
  1489. WOLFSSL_MSG("Import Key struct error");
  1490. ret = rc;
  1491. }
  1492. else {
  1493. idx += rc;
  1494. }
  1495. }
  1496. /* perform sanity checks and extract CipherSpecs struct */
  1497. if (ret == 0 && (WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ + idx > sz)) {
  1498. WOLFSSL_MSG("Import CipherSpecs struct error");
  1499. ret = BUFFER_E;
  1500. }
  1501. if (ret == 0) {
  1502. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1503. if (length != WOLFSSL_EXPORT_SPC_SZ) {
  1504. WOLFSSL_MSG("Import CipherSpecs struct error");
  1505. ret = BUFFER_E;
  1506. }
  1507. }
  1508. if (ret == 0) {
  1509. rc = ImportCipherSpecState(ssl, buf + idx, length, version, type);
  1510. if (rc < 0) {
  1511. WOLFSSL_MSG("Import CipherSpecs struct error");
  1512. ret = rc;
  1513. }
  1514. else {
  1515. idx += rc;
  1516. }
  1517. }
  1518. /* perform sanity checks and extract DTLS peer info */
  1519. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1520. WOLFSSL_MSG("Import DTLS peer info error");
  1521. ret = BUFFER_E;
  1522. }
  1523. if (ret == 0) {
  1524. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1525. if (idx + length > sz) {
  1526. WOLFSSL_MSG("Import DTLS peer info error");
  1527. ret = BUFFER_E;
  1528. }
  1529. }
  1530. if (ret == 0) {
  1531. rc = ImportPeerInfo(ssl, buf + idx, length, version);
  1532. if (rc < 0) {
  1533. WOLFSSL_MSG("Import Peer Addr error");
  1534. ret = rc;
  1535. }
  1536. else {
  1537. idx += rc;
  1538. }
  1539. }
  1540. /* make sure is a valid suite used */
  1541. if (ret == 0 && wolfSSL_get_cipher(ssl) == NULL) {
  1542. WOLFSSL_MSG("Can not match cipher suite imported");
  1543. ret = MATCH_SUITE_ERROR;
  1544. }
  1545. #ifndef WOLFSSL_AEAD_ONLY
  1546. /* set hmac function to use when verifying */
  1547. if (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1548. ssl->options.dtls == 1) {
  1549. ssl->hmac = TLS_hmac;
  1550. }
  1551. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1552. if (ret == 0 && ssl->specs.cipher_type == stream &&
  1553. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1554. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1555. ret = SANITY_CIPHER_E;
  1556. }
  1557. #endif /* !WOLFSSL_AEAD_ONLY */
  1558. if (ret != 0) {
  1559. idx = ret;
  1560. }
  1561. WOLFSSL_LEAVE("wolfSSL_session_import_internal", idx);
  1562. return idx;
  1563. }
  1564. /**
  1565. * Handles serializing the session information.
  1566. *
  1567. * @param ssl WOLFSSL structure to serialize session from
  1568. * @param buf output buffer to hold serialized session
  1569. * @param sz the size of buffer 'buf', if too small then gets updated
  1570. * @param type if the input WOLFSSL structure is expected to be TLS or DTLS
  1571. * 1 for yes is TLS and 0 for no is DTLS
  1572. *
  1573. * @return the size of serialized buffer on success and negative values on fail
  1574. */
  1575. int wolfSSL_session_export_internal(WOLFSSL* ssl, byte* buf, word32* sz,
  1576. int type)
  1577. {
  1578. int ret = 0;
  1579. word32 idx = 0;
  1580. word32 totalLen = 0;
  1581. WOLFSSL_ENTER("wolfSSL_session_export_internal");
  1582. if (ssl == NULL) {
  1583. WOLFSSL_MSG("unexpected null argument");
  1584. ret = BAD_FUNC_ARG;
  1585. }
  1586. if (ret == 0) {
  1587. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1588. /* each of the following have a 2 byte length before data */
  1589. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1590. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1591. totalLen += WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ;
  1592. #ifdef WOLFSSL_DTLS
  1593. if (type == WOLFSSL_EXPORT_DTLS) {
  1594. totalLen += WOLFSSL_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1595. }
  1596. #endif
  1597. }
  1598. /* check is at least the minimum size needed, TLS cipher states add more */
  1599. if (ret == 0 && (totalLen > *sz || buf == NULL)) {
  1600. WOLFSSL_MSG("export buffer was too small or null");
  1601. *sz = totalLen;
  1602. /* possible AES state needed */
  1603. if (type == WOLFSSL_EXPORT_TLS) {
  1604. *sz += AES_BLOCK_SIZE*2;
  1605. }
  1606. ret = LENGTH_ONLY_E;
  1607. }
  1608. if (ret == 0) {
  1609. buf[idx++] = (byte)(type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1610. DTLS_EXPORT_PRO;
  1611. buf[idx++] = ((byte)((type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1612. DTLS_EXPORT_PRO) & 0xF0)
  1613. | ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1614. idx += WOLFSSL_EXPORT_LEN; /* leave spot for length of total buffer */
  1615. idx += WOLFSSL_EXPORT_LEN;
  1616. ret = ExportOptions(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1617. type);
  1618. if (ret >= 0) {
  1619. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1620. idx += ret;
  1621. ret = 0;
  1622. }
  1623. }
  1624. /* export keys struct and dtls state -- variable length stored in ret */
  1625. if (ret == 0) {
  1626. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1627. ret = ExportKeyState(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1628. 0, type);
  1629. if (ret >= 0) {
  1630. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1631. ret = 0;
  1632. }
  1633. }
  1634. /* export of cipher specs struct */
  1635. if (ret == 0) {
  1636. c16toa((word16)WOLFSSL_EXPORT_SPC_SZ, buf + idx);
  1637. idx += WOLFSSL_EXPORT_LEN;
  1638. ret = ExportCipherSpecState(ssl, buf + idx, *sz - idx,
  1639. WOLFSSL_EXPORT_VERSION, type);
  1640. if (ret >= 0) {
  1641. idx += ret;
  1642. ret = 0;
  1643. }
  1644. }
  1645. /* export of peer information */
  1646. if (ret == 0) {
  1647. idx += WOLFSSL_EXPORT_LEN;
  1648. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1649. ret = 0; /* not saving peer port/ip information */
  1650. #else
  1651. ret = ExportPeerInfo(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION);
  1652. #endif
  1653. if (ret >= 0) {
  1654. c16toa(ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1655. idx += ret;
  1656. ret = 0;
  1657. }
  1658. }
  1659. if (ret != 0 && buf != NULL) {
  1660. /*in a fail case clear the buffer which could contain partial key info*/
  1661. XMEMSET(buf, 0, *sz);
  1662. }
  1663. /* place total length of exported buffer minus 2 bytes protocol/version */
  1664. if (ret == 0) {
  1665. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1666. ret = idx;
  1667. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1668. {
  1669. char debug[256];
  1670. XSNPRINTF(debug, sizeof(debug), "Exporting TLS session\n"
  1671. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1672. ,(int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1673. WOLFSSL_MSG(debug);
  1674. }
  1675. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1676. }
  1677. if (ret >= 0) {
  1678. *sz = ret;
  1679. }
  1680. WOLFSSL_LEAVE("wolfSSL_session_export_internal", ret);
  1681. return ret;
  1682. }
  1683. #endif /* WOLFSSL_SESSION_EXPORT */
  1684. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1685. {
  1686. method->version = pv;
  1687. method->side = WOLFSSL_CLIENT_END;
  1688. method->downgrade = 0;
  1689. }
  1690. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) || \
  1691. defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  1692. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1693. {
  1694. if (ssl == NULL)
  1695. return BAD_FUNC_ARG;
  1696. /* set side */
  1697. ssl->options.side = side;
  1698. /* reset options that are side specific */
  1699. #ifdef HAVE_ECC
  1700. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1701. ssl->options.haveECDSAsig = 1; /* always on client side */
  1702. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1703. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1704. }
  1705. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1706. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1707. ssl->options.haveECDSAsig = 1; /* always on client side */
  1708. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1709. }
  1710. #endif
  1711. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1712. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1713. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1714. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1715. ssl->options.haveEMS = 1;
  1716. }
  1717. #ifdef WOLFSSL_DTLS
  1718. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1719. ssl->options.haveEMS = 1;
  1720. #endif /* WOLFSSL_DTLS */
  1721. }
  1722. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1723. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  1724. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  1725. int ret;
  1726. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  1727. if (ret != 0) {
  1728. WOLFSSL_MSG("DTLS Cookie Secret error");
  1729. return ret;
  1730. }
  1731. }
  1732. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  1733. return InitSSL_Suites(ssl);
  1734. }
  1735. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1736. /* Initialize SSL context, return 0 on success */
  1737. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1738. {
  1739. int ret = 0;
  1740. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1741. ctx->method = method;
  1742. ctx->refCount = 1; /* so either CTX_free or SSL_free can release */
  1743. ctx->heap = ctx; /* defaults to self */
  1744. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1745. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE; /* current default: TLSv1_MINOR */
  1746. if (wc_InitMutex(&ctx->countMutex) < 0) {
  1747. WOLFSSL_MSG("Mutex error on CTX init");
  1748. ctx->err = CTX_INIT_MUTEX_E;
  1749. return BAD_MUTEX_E;
  1750. }
  1751. #ifndef NO_CERTS
  1752. ctx->privateKeyDevId = INVALID_DEVID;
  1753. #endif
  1754. #ifndef NO_DH
  1755. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1756. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1757. #endif
  1758. #ifndef NO_RSA
  1759. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1760. #endif
  1761. #ifdef HAVE_ECC
  1762. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1763. ctx->eccTempKeySz = ECDHE_SIZE;
  1764. #endif
  1765. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1766. #ifdef OPENSSL_EXTRA
  1767. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1768. #endif
  1769. #ifndef WOLFSSL_USER_IO
  1770. #ifdef MICRIUM
  1771. ctx->CBIORecv = MicriumReceive;
  1772. ctx->CBIOSend = MicriumSend;
  1773. #ifdef WOLFSSL_DTLS
  1774. if (method->version.major == DTLS_MAJOR) {
  1775. ctx->CBIORecv = MicriumReceiveFrom;
  1776. ctx->CBIOSend = MicriumSendTo;
  1777. }
  1778. #ifdef WOLFSSL_SESSION_EXPORT
  1779. #error Micrium port does not support DTLS session export yet
  1780. #endif
  1781. #endif
  1782. #elif defined WOLFSSL_UIP
  1783. ctx->CBIORecv = uIPReceive;
  1784. ctx->CBIOSend = uIPSend;
  1785. #ifdef WOLFSSL_DTLS
  1786. if (method->version.major == DTLS_MAJOR) {
  1787. ctx->CBIOSendTo = uIPSendTo;
  1788. ctx->CBIORecvFrom = uIPRecvFrom;
  1789. }
  1790. #endif
  1791. #else
  1792. ctx->CBIORecv = EmbedReceive;
  1793. ctx->CBIOSend = EmbedSend;
  1794. #ifdef WOLFSSL_SESSION_EXPORT
  1795. ctx->CBGetPeer = EmbedGetPeer;
  1796. ctx->CBSetPeer = EmbedSetPeer;
  1797. #endif
  1798. #ifdef WOLFSSL_DTLS
  1799. if (method->version.major == DTLS_MAJOR) {
  1800. ctx->CBIORecv = EmbedReceiveFrom;
  1801. ctx->CBIOSend = EmbedSendTo;
  1802. }
  1803. #endif
  1804. #endif /* MICRIUM */
  1805. #endif /* WOLFSSL_USER_IO */
  1806. #ifdef HAVE_NETX
  1807. ctx->CBIORecv = NetX_Receive;
  1808. ctx->CBIOSend = NetX_Send;
  1809. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1810. ctx->CBIORecv = Mynewt_Receive;
  1811. ctx->CBIOSend = Mynewt_Send;
  1812. #elif defined(WOLFSSL_GNRC)
  1813. ctx->CBIORecv = GNRC_ReceiveFrom;
  1814. ctx->CBIOSend = GNRC_SendTo;
  1815. #endif
  1816. #ifdef HAVE_ECC
  1817. if (method->side == WOLFSSL_CLIENT_END) {
  1818. ctx->haveECDSAsig = 1; /* always on client side */
  1819. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1820. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  1821. }
  1822. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1823. if (method->side == WOLFSSL_CLIENT_END) {
  1824. ctx->haveECDSAsig = 1; /* always on client side */
  1825. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1826. }
  1827. #endif
  1828. #ifdef WOLFSSL_QNX_CAAM
  1829. /* default to try using CAAM when built */
  1830. ctx->devId = WOLFSSL_CAAM_DEVID;
  1831. #else
  1832. ctx->devId = INVALID_DEVID;
  1833. #endif
  1834. #if defined(WOLFSSL_DTLS)
  1835. #ifdef WOLFSSL_SCTP
  1836. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  1837. #elif defined(WOLFSSL_DTLS_MTU)
  1838. ctx->dtlsMtuSz = MAX_MTU;
  1839. #endif
  1840. #endif
  1841. #ifndef NO_CERTS
  1842. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  1843. if (ctx->cm == NULL) {
  1844. WOLFSSL_MSG("Bad Cert Manager New");
  1845. return BAD_CERT_MANAGER_ERROR;
  1846. }
  1847. #ifdef OPENSSL_EXTRA
  1848. /* setup WOLFSSL_X509_STORE */
  1849. ctx->x509_store.cm = ctx->cm;
  1850. /* set pointer back to x509 store */
  1851. ctx->cm->x509_store_p = &ctx->x509_store;
  1852. /* WOLFSSL_X509_VERIFY_PARAM */
  1853. if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  1854. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  1855. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  1856. WOLFSSL_MSG("ctx->param memory error");
  1857. return MEMORY_E;
  1858. }
  1859. XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  1860. /* WOLFSSL_X509_LOOKUP */
  1861. if ((ctx->x509_store.lookup.dirs =
  1862. (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR),
  1863. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  1864. WOLFSSL_MSG("ctx-x509_store.lookup.dir memory allocation error");
  1865. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  1866. ctx->param = NULL;
  1867. return MEMORY_E;
  1868. }
  1869. XMEMSET(ctx->x509_store.lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
  1870. if (wc_InitMutex(&ctx->x509_store.lookup.dirs->lock) != 0) {
  1871. WOLFSSL_MSG("Bad mutex init");
  1872. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  1873. ctx->param = NULL;
  1874. XFREE(ctx->x509_store.lookup.dirs, heap, DYNAMIC_TYPE_OPENSSL);
  1875. ctx->x509_store.lookup.dirs = NULL;
  1876. return BAD_MUTEX_E;
  1877. }
  1878. #endif
  1879. #endif
  1880. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1881. if (method->side == WOLFSSL_CLIENT_END) {
  1882. if ((method->version.major == SSLv3_MAJOR) &&
  1883. (method->version.minor >= TLSv1_MINOR)) {
  1884. ctx->haveEMS = 1;
  1885. }
  1886. #ifdef WOLFSSL_DTLS
  1887. if (method->version.major == DTLS_MAJOR)
  1888. ctx->haveEMS = 1;
  1889. #endif /* WOLFSSL_DTLS */
  1890. }
  1891. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1892. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  1893. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  1894. ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
  1895. if (ret != 0) return ret;
  1896. ctx->ticketEncCb = DefTicketEncCb;
  1897. ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
  1898. #endif
  1899. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  1900. #if defined(WOLFSSL_TLS13)
  1901. ctx->maxTicketTls13 = 1; /* default to sending a session ticket if compiled
  1902. in */
  1903. #endif
  1904. #endif
  1905. #ifdef WOLFSSL_EARLY_DATA
  1906. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  1907. #endif
  1908. #if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
  1909. ctx->noPskDheKe = 1;
  1910. #endif
  1911. #if defined(WOLFSSL_QT) && !defined(NO_PSK)
  1912. /* Qt retrieves supported cipher list at initialization
  1913. * from get_cipher_compat().
  1914. * Qt doesn't allow to use a cipher if it is not in the supported list.
  1915. * Therefore, we need to enable PSK cipher at the beginning.
  1916. */
  1917. ctx->havePSK = 1;
  1918. #endif
  1919. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  1920. #ifdef HAVE_WOLF_EVENT
  1921. ret = wolfEventQueue_Init(&ctx->event_queue);
  1922. #endif /* HAVE_WOLF_EVENT */
  1923. return ret;
  1924. }
  1925. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  1926. void wolfSSL_CRYPTO_cleanup_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data)
  1927. {
  1928. int n_ex_data = (int)(sizeof ex_data->ex_data / sizeof ex_data->ex_data[0]);
  1929. for (--n_ex_data; n_ex_data >= 0; --n_ex_data) {
  1930. if (ex_data->ex_data[n_ex_data] != NULL)
  1931. (void)wolfSSL_CRYPTO_set_ex_data_with_cleanup(ex_data, n_ex_data,
  1932. NULL, NULL);
  1933. }
  1934. }
  1935. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  1936. /* In case contexts are held in array and don't want to free actual ctx. */
  1937. /* The allocations done in InitSSL_Ctx must be free'd with ctx->onHeapHint
  1938. * logic. A WOLFSSL_CTX can be assigned a static memory heap hint using
  1939. * wolfSSL_CTX_load_static_memory after CTX creation, which means variables
  1940. * allocated in InitSSL_Ctx were allocated from heap and should be free'd with
  1941. * a NULL heap hint. */
  1942. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  1943. {
  1944. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
  1945. defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
  1946. int i;
  1947. #endif
  1948. void* heapAtCTXInit = ctx->heap;
  1949. #ifdef WOLFSSL_STATIC_MEMORY
  1950. if (ctx->onHeapHint == 0) {
  1951. heapAtCTXInit = NULL;
  1952. }
  1953. #endif
  1954. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  1955. wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
  1956. #endif
  1957. #ifdef HAVE_WOLF_EVENT
  1958. wolfEventQueue_Free(&ctx->event_queue);
  1959. #endif /* HAVE_WOLF_EVENT */
  1960. XFREE(ctx->method, heapAtCTXInit, DYNAMIC_TYPE_METHOD);
  1961. ctx->method = NULL;
  1962. if (ctx->suites) {
  1963. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  1964. ctx->suites = NULL;
  1965. }
  1966. #ifndef NO_DH
  1967. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1968. ctx->serverDH_G.buffer = NULL;
  1969. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1970. ctx->serverDH_P.buffer = NULL;
  1971. #endif /* !NO_DH */
  1972. #ifdef SINGLE_THREADED
  1973. if (ctx->rng) {
  1974. wc_FreeRng(ctx->rng);
  1975. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  1976. ctx->rng = NULL;
  1977. }
  1978. #endif /* SINGLE_THREADED */
  1979. #ifndef NO_CERTS
  1980. FreeDer(&ctx->privateKey);
  1981. #ifdef OPENSSL_ALL
  1982. wolfSSL_EVP_PKEY_free(ctx->privateKeyPKey);
  1983. #endif
  1984. FreeDer(&ctx->certificate);
  1985. #ifdef KEEP_OUR_CERT
  1986. if (ctx->ourCert && ctx->ownOurCert) {
  1987. wolfSSL_X509_free(ctx->ourCert);
  1988. ctx->ourCert = NULL;
  1989. }
  1990. #endif /* KEEP_OUR_CERT */
  1991. FreeDer(&ctx->certChain);
  1992. wolfSSL_CertManagerFree(ctx->cm);
  1993. ctx->cm = NULL;
  1994. #ifdef OPENSSL_ALL
  1995. if (ctx->x509_store.objs != NULL) {
  1996. wolfSSL_sk_X509_OBJECT_free(ctx->x509_store.objs);
  1997. ctx->x509_store.objs = NULL;
  1998. }
  1999. #endif
  2000. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
  2001. defined(WOLFSSL_WPAS_SMALL)
  2002. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  2003. #endif
  2004. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  2005. wolfSSL_sk_X509_NAME_pop_free(ctx->ca_names, NULL);
  2006. ctx->ca_names = NULL;
  2007. #endif
  2008. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  2009. if (ctx->x509Chain) {
  2010. wolfSSL_sk_X509_free(ctx->x509Chain);
  2011. ctx->x509Chain = NULL;
  2012. }
  2013. #endif
  2014. #endif /* !NO_CERTS */
  2015. #ifdef HAVE_TLS_EXTENSIONS
  2016. TLSX_FreeAll(ctx->extensions, ctx->heap);
  2017. #ifndef NO_WOLFSSL_SERVER
  2018. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  2019. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  2020. if (ctx->certOcspRequest) {
  2021. FreeOcspRequest(ctx->certOcspRequest);
  2022. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2023. }
  2024. #endif
  2025. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2026. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  2027. if (ctx->chainOcspRequest[i]) {
  2028. FreeOcspRequest(ctx->chainOcspRequest[i]);
  2029. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2030. ctx->chainOcspRequest[i] = NULL;
  2031. }
  2032. }
  2033. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2034. #endif /* !NO_WOLFSSL_SERVER */
  2035. #endif /* HAVE_TLS_EXTENSIONS */
  2036. #ifdef OPENSSL_EXTRA
  2037. if (ctx->alpn_cli_protos) {
  2038. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  2039. ctx->alpn_cli_protos = NULL;
  2040. }
  2041. if (ctx->param) {
  2042. XFREE(ctx->param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2043. ctx->param = NULL;
  2044. }
  2045. if (ctx->x509_store.lookup.dirs) {
  2046. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  2047. if (ctx->x509_store.lookup.dirs->dir_entry) {
  2048. wolfSSL_sk_BY_DIR_entry_free(ctx->x509_store.lookup.dirs->dir_entry);
  2049. }
  2050. #endif
  2051. wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
  2052. XFREE(ctx->x509_store.lookup.dirs, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2053. }
  2054. #endif
  2055. #ifdef WOLFSSL_STATIC_EPHEMERAL
  2056. #ifndef NO_DH
  2057. if (ctx->staticKE.dhKey && ctx->staticKE.weOwnDH)
  2058. FreeDer(&ctx->staticKE.dhKey);
  2059. #endif
  2060. #ifdef HAVE_ECC
  2061. if (ctx->staticKE.ecKey && ctx->staticKE.weOwnEC)
  2062. FreeDer(&ctx->staticKE.ecKey);
  2063. #endif
  2064. #ifdef HAVE_CURVE25519
  2065. if (ctx->staticKE.x25519Key && ctx->staticKE.weOwnX25519)
  2066. FreeDer(&ctx->staticKE.x25519Key);
  2067. #endif
  2068. #endif
  2069. (void)heapAtCTXInit;
  2070. }
  2071. #ifdef WOLFSSL_STATIC_MEMORY
  2072. static void SSL_CtxResourceFreeStaticMem(void* heap)
  2073. {
  2074. if (heap != NULL
  2075. #ifdef WOLFSSL_HEAP_TEST
  2076. /* avoid dereferencing a test value */
  2077. && heap != (void*)WOLFSSL_HEAP_TEST
  2078. #endif
  2079. ) {
  2080. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)heap;
  2081. WOLFSSL_HEAP* mem = hint->memory;
  2082. wc_FreeMutex(&mem->memory_mutex);
  2083. }
  2084. }
  2085. #endif /* WOLFSSL_STATIC_MEMORY */
  2086. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  2087. {
  2088. int refCount;
  2089. void* heap = ctx->heap;
  2090. #ifdef WOLFSSL_STATIC_MEMORY
  2091. if (ctx->onHeapHint == 0) {
  2092. heap = NULL;
  2093. }
  2094. #endif
  2095. /* decrement CTX reference count */
  2096. if ((refCount = SSL_CTX_RefCount(ctx, -1)) < 0) {
  2097. /* check error state, if mutex error code then mutex init failed but
  2098. * CTX was still malloc'd */
  2099. if (ctx->err == CTX_INIT_MUTEX_E) {
  2100. SSL_CtxResourceFree(ctx);
  2101. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2102. #ifdef WOLFSSL_STATIC_MEMORY
  2103. SSL_CtxResourceFreeStaticMem(heap);
  2104. #endif
  2105. }
  2106. return;
  2107. }
  2108. if (refCount == 0) {
  2109. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  2110. SSL_CtxResourceFree(ctx);
  2111. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  2112. !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  2113. TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
  2114. #endif
  2115. wc_FreeMutex(&ctx->countMutex);
  2116. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2117. #ifdef WOLFSSL_STATIC_MEMORY
  2118. SSL_CtxResourceFreeStaticMem(heap);
  2119. #endif
  2120. }
  2121. else {
  2122. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  2123. }
  2124. (void)heap; /* not used in some builds */
  2125. }
  2126. /* Set cipher pointers to null */
  2127. void InitCiphers(WOLFSSL* ssl)
  2128. {
  2129. #ifdef BUILD_ARC4
  2130. ssl->encrypt.arc4 = NULL;
  2131. ssl->decrypt.arc4 = NULL;
  2132. #endif
  2133. #ifdef BUILD_DES3
  2134. ssl->encrypt.des3 = NULL;
  2135. ssl->decrypt.des3 = NULL;
  2136. #endif
  2137. #ifdef BUILD_AES
  2138. ssl->encrypt.aes = NULL;
  2139. ssl->decrypt.aes = NULL;
  2140. #endif
  2141. #ifdef HAVE_CAMELLIA
  2142. ssl->encrypt.cam = NULL;
  2143. ssl->decrypt.cam = NULL;
  2144. #endif
  2145. #ifdef HAVE_HC128
  2146. ssl->encrypt.hc128 = NULL;
  2147. ssl->decrypt.hc128 = NULL;
  2148. #endif
  2149. #ifdef BUILD_RABBIT
  2150. ssl->encrypt.rabbit = NULL;
  2151. ssl->decrypt.rabbit = NULL;
  2152. #endif
  2153. #ifdef HAVE_CHACHA
  2154. ssl->encrypt.chacha = NULL;
  2155. ssl->decrypt.chacha = NULL;
  2156. #endif
  2157. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2158. ssl->auth.poly1305 = NULL;
  2159. #endif
  2160. ssl->encrypt.setup = 0;
  2161. ssl->decrypt.setup = 0;
  2162. #ifdef HAVE_ONE_TIME_AUTH
  2163. ssl->auth.setup = 0;
  2164. #endif
  2165. #ifdef HAVE_IDEA
  2166. ssl->encrypt.idea = NULL;
  2167. ssl->decrypt.idea = NULL;
  2168. #endif
  2169. }
  2170. /* Free ciphers */
  2171. void FreeCiphers(WOLFSSL* ssl)
  2172. {
  2173. (void)ssl;
  2174. #ifdef BUILD_ARC4
  2175. wc_Arc4Free(ssl->encrypt.arc4);
  2176. wc_Arc4Free(ssl->decrypt.arc4);
  2177. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2178. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2179. #endif
  2180. #ifdef BUILD_DES3
  2181. wc_Des3Free(ssl->encrypt.des3);
  2182. wc_Des3Free(ssl->decrypt.des3);
  2183. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2184. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2185. #endif
  2186. #if defined(BUILD_AES) || defined(BUILD_AESGCM) /* See: InitKeys() in keys.c
  2187. * on addition of BUILD_AESGCM
  2188. * check (enc->aes, dec->aes) */
  2189. wc_AesFree(ssl->encrypt.aes);
  2190. wc_AesFree(ssl->decrypt.aes);
  2191. #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \
  2192. !defined(WOLFSSL_NO_TLS12)
  2193. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2194. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2195. #endif
  2196. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2197. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2198. #endif
  2199. #ifdef CIPHER_NONCE
  2200. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2201. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2202. #endif
  2203. #ifdef HAVE_CAMELLIA
  2204. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2205. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2206. #endif
  2207. #ifdef HAVE_HC128
  2208. XFREE(ssl->encrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2209. XFREE(ssl->decrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2210. #endif
  2211. #ifdef BUILD_RABBIT
  2212. XFREE(ssl->encrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2213. XFREE(ssl->decrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2214. #endif
  2215. #ifdef HAVE_CHACHA
  2216. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2217. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2218. #endif
  2219. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2220. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2221. #endif
  2222. #ifdef HAVE_IDEA
  2223. XFREE(ssl->encrypt.idea, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2224. XFREE(ssl->decrypt.idea, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2225. #endif
  2226. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  2227. wc_HmacFree(ssl->encrypt.hmac);
  2228. wc_HmacFree(ssl->decrypt.hmac);
  2229. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2230. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2231. #endif
  2232. }
  2233. void InitCipherSpecs(CipherSpecs* cs)
  2234. {
  2235. XMEMSET(cs, 0, sizeof(CipherSpecs));
  2236. cs->bulk_cipher_algorithm = INVALID_BYTE;
  2237. cs->cipher_type = INVALID_BYTE;
  2238. cs->mac_algorithm = INVALID_BYTE;
  2239. cs->kea = INVALID_BYTE;
  2240. cs->sig_algo = INVALID_BYTE;
  2241. }
  2242. #if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
  2243. defined(HAVE_ECC))
  2244. static int GetMacDigestSize(byte macAlgo)
  2245. {
  2246. switch (macAlgo) {
  2247. #ifndef NO_SHA
  2248. case sha_mac:
  2249. return WC_SHA_DIGEST_SIZE;
  2250. #endif
  2251. #ifndef NO_SHA256
  2252. case sha256_mac:
  2253. return WC_SHA256_DIGEST_SIZE;
  2254. #endif
  2255. #ifdef WOLFSSL_SHA384
  2256. case sha384_mac:
  2257. return WC_SHA384_DIGEST_SIZE;
  2258. #endif
  2259. #ifdef WOLFSSL_SHA512
  2260. case sha512_mac:
  2261. return WC_SHA512_DIGEST_SIZE;
  2262. #endif
  2263. default:
  2264. break;
  2265. }
  2266. return NOT_COMPILED_IN;
  2267. }
  2268. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2269. static WC_INLINE void AddSuiteHashSigAlgo(Suites* suites, byte macAlgo,
  2270. byte sigAlgo, int keySz, word16* inOutIdx)
  2271. {
  2272. int addSigAlgo = 1;
  2273. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  2274. if (sigAlgo == ecc_dsa_sa_algo) {
  2275. int digestSz = GetMacDigestSize(macAlgo);
  2276. /* do not add sig/algos with digest size larger than key size */
  2277. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  2278. addSigAlgo = 0;
  2279. }
  2280. }
  2281. #else
  2282. (void)keySz;
  2283. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2284. if (addSigAlgo) {
  2285. #ifdef HAVE_ED25519
  2286. if (sigAlgo == ed25519_sa_algo) {
  2287. suites->hashSigAlgo[*inOutIdx] = ED25519_SA_MAJOR;
  2288. *inOutIdx += 1;
  2289. suites->hashSigAlgo[*inOutIdx] = ED25519_SA_MINOR;
  2290. *inOutIdx += 1;
  2291. }
  2292. else
  2293. #endif
  2294. #ifdef HAVE_ED448
  2295. if (sigAlgo == ed448_sa_algo) {
  2296. suites->hashSigAlgo[*inOutIdx] = ED448_SA_MAJOR;
  2297. *inOutIdx += 1;
  2298. suites->hashSigAlgo[*inOutIdx] = ED448_SA_MINOR;
  2299. *inOutIdx += 1;
  2300. }
  2301. else
  2302. #endif
  2303. #ifdef WC_RSA_PSS
  2304. if (sigAlgo == rsa_pss_sa_algo) {
  2305. /* RSA PSS is sig then mac */
  2306. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2307. *inOutIdx += 1;
  2308. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  2309. *inOutIdx += 1;
  2310. #ifdef WOLFSSL_TLS13
  2311. /* Add the certificate algorithm as well */
  2312. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2313. *inOutIdx += 1;
  2314. suites->hashSigAlgo[*inOutIdx] = PSS_RSAE_TO_PSS_PSS(macAlgo);
  2315. *inOutIdx += 1;
  2316. #endif
  2317. }
  2318. else
  2319. #endif
  2320. {
  2321. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  2322. *inOutIdx += 1;
  2323. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2324. *inOutIdx += 1;
  2325. }
  2326. }
  2327. }
  2328. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  2329. int haveAnon, int tls1_2, int keySz)
  2330. {
  2331. word16 idx = 0;
  2332. (void)tls1_2;
  2333. (void)keySz;
  2334. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  2335. if (haveECDSAsig) {
  2336. #ifdef HAVE_ECC
  2337. #ifdef WOLFSSL_SHA512
  2338. AddSuiteHashSigAlgo(suites, sha512_mac, ecc_dsa_sa_algo, keySz, &idx);
  2339. #endif
  2340. #ifdef WOLFSSL_SHA384
  2341. AddSuiteHashSigAlgo(suites, sha384_mac, ecc_dsa_sa_algo, keySz, &idx);
  2342. #endif
  2343. #ifndef NO_SHA256
  2344. AddSuiteHashSigAlgo(suites, sha256_mac, ecc_dsa_sa_algo, keySz, &idx);
  2345. #endif
  2346. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2347. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2348. AddSuiteHashSigAlgo(suites, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  2349. #endif
  2350. #endif
  2351. #ifdef HAVE_ED25519
  2352. AddSuiteHashSigAlgo(suites, no_mac, ed25519_sa_algo, keySz, &idx);
  2353. #endif
  2354. #ifdef HAVE_ED448
  2355. AddSuiteHashSigAlgo(suites, no_mac, ed448_sa_algo, keySz, &idx);
  2356. #endif
  2357. }
  2358. #endif /* HAVE_ECC || HAVE_ED25519 || defined(HAVE_ED448 */
  2359. if (haveRSAsig) {
  2360. #ifdef WC_RSA_PSS
  2361. if (tls1_2) {
  2362. #ifdef WOLFSSL_SHA512
  2363. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_pss_sa_algo, keySz,
  2364. &idx);
  2365. #endif
  2366. #ifdef WOLFSSL_SHA384
  2367. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_pss_sa_algo, keySz,
  2368. &idx);
  2369. #endif
  2370. #ifndef NO_SHA256
  2371. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_pss_sa_algo, keySz,
  2372. &idx);
  2373. #endif
  2374. }
  2375. #endif
  2376. #ifdef WOLFSSL_SHA512
  2377. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_sa_algo, keySz, &idx);
  2378. #endif
  2379. #ifdef WOLFSSL_SHA384
  2380. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_sa_algo, keySz, &idx);
  2381. #endif
  2382. #ifndef NO_SHA256
  2383. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_sa_algo, keySz, &idx);
  2384. #endif
  2385. #ifdef WOLFSSL_SHA224
  2386. AddSuiteHashSigAlgo(suites, sha224_mac, rsa_sa_algo, keySz, &idx);
  2387. #endif
  2388. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2389. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2390. AddSuiteHashSigAlgo(suites, sha_mac, rsa_sa_algo, keySz, &idx);
  2391. #endif
  2392. }
  2393. #ifdef HAVE_ANON
  2394. if (haveAnon) {
  2395. AddSuiteHashSigAlgo(suites, sha_mac, anonymous_sa_algo, keySz, &idx);
  2396. }
  2397. #endif
  2398. (void)haveAnon;
  2399. (void)haveECDSAsig;
  2400. suites->hashSigAlgoSz = idx;
  2401. }
  2402. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  2403. word16 havePSK, word16 haveDH, word16 haveECDSAsig,
  2404. word16 haveECC, word16 haveStaticECC, word16 haveAnon,
  2405. int side)
  2406. {
  2407. word16 idx = 0;
  2408. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  2409. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  2410. #ifdef WOLFSSL_TLS13
  2411. int tls1_3 = IsAtLeastTLSv1_3(pv);
  2412. #endif
  2413. int dtls = 0;
  2414. int haveRSAsig = 1;
  2415. (void)tls; /* shut up compiler */
  2416. (void)tls1_2;
  2417. (void)dtls;
  2418. (void)haveDH;
  2419. (void)havePSK;
  2420. (void)haveStaticECC;
  2421. (void)haveECC;
  2422. (void)side;
  2423. (void)haveRSA; /* some builds won't read */
  2424. (void)haveRSAsig; /* non ecc builds won't read */
  2425. (void)haveAnon; /* anon ciphers optional */
  2426. if (suites == NULL) {
  2427. WOLFSSL_MSG("InitSuites pointer error");
  2428. return;
  2429. }
  2430. if (suites->setSuites)
  2431. return; /* trust user settings, don't override */
  2432. #ifdef WOLFSSL_TLS13
  2433. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  2434. if (tls1_3) {
  2435. suites->suites[idx++] = TLS13_BYTE;
  2436. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  2437. }
  2438. #endif
  2439. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  2440. if (tls1_3) {
  2441. suites->suites[idx++] = TLS13_BYTE;
  2442. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  2443. }
  2444. #endif
  2445. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  2446. if (tls1_3) {
  2447. suites->suites[idx++] = TLS13_BYTE;
  2448. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  2449. }
  2450. #endif
  2451. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  2452. if (tls1_3) {
  2453. suites->suites[idx++] = TLS13_BYTE;
  2454. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  2455. }
  2456. #endif
  2457. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  2458. if (tls1_3) {
  2459. suites->suites[idx++] = TLS13_BYTE;
  2460. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  2461. }
  2462. #endif
  2463. #ifdef HAVE_NULL_CIPHER
  2464. #ifdef BUILD_TLS_SHA256_SHA256
  2465. if (tls1_3) {
  2466. suites->suites[idx++] = ECC_BYTE;
  2467. suites->suites[idx++] = TLS_SHA256_SHA256;
  2468. }
  2469. #endif
  2470. #ifdef BUILD_TLS_SHA384_SHA384
  2471. if (tls1_3) {
  2472. suites->suites[idx++] = ECC_BYTE;
  2473. suites->suites[idx++] = TLS_SHA384_SHA384;
  2474. }
  2475. #endif
  2476. #endif
  2477. #endif /* WOLFSSL_TLS13 */
  2478. #ifndef WOLFSSL_NO_TLS12
  2479. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  2480. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  2481. haveRSA = 0; /* can't do RSA with ECDSA key */
  2482. }
  2483. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  2484. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  2485. }
  2486. #endif /* !NO_WOLFSSL_SERVER */
  2487. #ifdef WOLFSSL_DTLS
  2488. if (pv.major == DTLS_MAJOR) {
  2489. dtls = 1;
  2490. tls = 1;
  2491. /* May be dead assignments dependent upon configuration */
  2492. (void) dtls;
  2493. (void) tls;
  2494. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  2495. }
  2496. #endif
  2497. #ifdef HAVE_RENEGOTIATION_INDICATION
  2498. if (side == WOLFSSL_CLIENT_END) {
  2499. suites->suites[idx++] = CIPHER_BYTE;
  2500. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  2501. }
  2502. #endif
  2503. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2504. if (tls1_2 && haveECC) {
  2505. suites->suites[idx++] = ECC_BYTE;
  2506. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2507. }
  2508. #endif
  2509. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2510. if (tls1_2 && haveECC) {
  2511. suites->suites[idx++] = ECC_BYTE;
  2512. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2513. }
  2514. #endif
  2515. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2516. if (tls1_2 && haveRSA) {
  2517. suites->suites[idx++] = ECC_BYTE;
  2518. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2519. }
  2520. #endif
  2521. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2522. if (tls1_2 && haveRSA) {
  2523. suites->suites[idx++] = ECC_BYTE;
  2524. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2525. }
  2526. #endif
  2527. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2528. if (tls1_2 && haveDH && haveRSA) {
  2529. suites->suites[idx++] = CIPHER_BYTE;
  2530. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2531. }
  2532. #endif
  2533. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2534. if (tls1_2 && haveDH && haveRSA) {
  2535. suites->suites[idx++] = CIPHER_BYTE;
  2536. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2537. }
  2538. #endif
  2539. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  2540. if (tls1_2 && haveRSA) {
  2541. suites->suites[idx++] = CIPHER_BYTE;
  2542. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  2543. }
  2544. #endif
  2545. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  2546. if (tls1_2 && haveRSA) {
  2547. suites->suites[idx++] = CIPHER_BYTE;
  2548. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  2549. }
  2550. #endif
  2551. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  2552. if (tls1_2 && haveECC && haveStaticECC) {
  2553. suites->suites[idx++] = ECC_BYTE;
  2554. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  2555. }
  2556. #endif
  2557. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  2558. if (tls1_2 && haveECC && haveStaticECC) {
  2559. suites->suites[idx++] = ECC_BYTE;
  2560. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  2561. }
  2562. #endif
  2563. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  2564. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2565. suites->suites[idx++] = ECC_BYTE;
  2566. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  2567. }
  2568. #endif
  2569. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  2570. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2571. suites->suites[idx++] = ECC_BYTE;
  2572. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  2573. }
  2574. #endif
  2575. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  2576. if (tls1_2 && haveDH && havePSK) {
  2577. suites->suites[idx++] = CIPHER_BYTE;
  2578. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  2579. }
  2580. #endif
  2581. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  2582. if (tls1_2 && haveDH && haveAnon) {
  2583. suites->suites[idx++] = CIPHER_BYTE;
  2584. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  2585. }
  2586. #endif
  2587. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  2588. if (tls1_2 && haveDH && haveAnon) {
  2589. suites->suites[idx++] = CIPHER_BYTE;
  2590. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  2591. }
  2592. #endif
  2593. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  2594. if (tls1_2 && haveDH && havePSK) {
  2595. suites->suites[idx++] = CIPHER_BYTE;
  2596. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  2597. }
  2598. #endif
  2599. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  2600. if (tls1_2 && havePSK) {
  2601. suites->suites[idx++] = CIPHER_BYTE;
  2602. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  2603. }
  2604. #endif
  2605. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  2606. if (tls1_2 && havePSK) {
  2607. suites->suites[idx++] = CIPHER_BYTE;
  2608. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  2609. }
  2610. #endif
  2611. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  2612. if (tls1_2 && haveECC) {
  2613. suites->suites[idx++] = CHACHA_BYTE;
  2614. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  2615. }
  2616. #endif
  2617. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2618. if (tls1_2 && haveRSA) {
  2619. suites->suites[idx++] = CHACHA_BYTE;
  2620. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2621. }
  2622. #endif
  2623. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2624. if (tls1_2 && haveRSA) {
  2625. suites->suites[idx++] = CHACHA_BYTE;
  2626. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2627. }
  2628. #endif
  2629. /* Place as higher priority for MYSQL */
  2630. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  2631. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2632. if (tls && haveDH && haveRSA) {
  2633. suites->suites[idx++] = CIPHER_BYTE;
  2634. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2635. }
  2636. #endif
  2637. #endif
  2638. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  2639. if (tls1_2 && haveRSA) {
  2640. suites->suites[idx++] = ECC_BYTE;
  2641. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  2642. }
  2643. #endif
  2644. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  2645. if (tls1_2 && haveECC) {
  2646. suites->suites[idx++] = ECC_BYTE;
  2647. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  2648. }
  2649. #endif
  2650. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  2651. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2652. suites->suites[idx++] = ECC_BYTE;
  2653. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  2654. }
  2655. #endif
  2656. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  2657. if (tls1_2 && haveECC && haveStaticECC) {
  2658. suites->suites[idx++] = ECC_BYTE;
  2659. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  2660. }
  2661. #endif
  2662. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  2663. if (tls1_2 && haveRSA) {
  2664. suites->suites[idx++] = ECC_BYTE;
  2665. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  2666. }
  2667. #endif
  2668. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2669. if (tls1_2 && haveECC) {
  2670. suites->suites[idx++] = ECC_BYTE;
  2671. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  2672. }
  2673. #endif
  2674. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  2675. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2676. suites->suites[idx++] = ECC_BYTE;
  2677. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  2678. }
  2679. #endif
  2680. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  2681. if (tls1_2 && haveECC && haveStaticECC) {
  2682. suites->suites[idx++] = ECC_BYTE;
  2683. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  2684. }
  2685. #endif
  2686. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  2687. if (tls && haveECC) {
  2688. suites->suites[idx++] = ECC_BYTE;
  2689. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  2690. }
  2691. #endif
  2692. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  2693. if (tls && haveECC && haveStaticECC) {
  2694. suites->suites[idx++] = ECC_BYTE;
  2695. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  2696. }
  2697. #endif
  2698. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  2699. if (tls && haveECC) {
  2700. suites->suites[idx++] = ECC_BYTE;
  2701. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  2702. }
  2703. #endif
  2704. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  2705. if (tls && haveECC && haveStaticECC) {
  2706. suites->suites[idx++] = ECC_BYTE;
  2707. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  2708. }
  2709. #endif
  2710. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  2711. if (!dtls && tls && haveECC) {
  2712. suites->suites[idx++] = ECC_BYTE;
  2713. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  2714. }
  2715. #endif
  2716. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  2717. if (!dtls && tls && haveECC && haveStaticECC) {
  2718. suites->suites[idx++] = ECC_BYTE;
  2719. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  2720. }
  2721. #endif
  2722. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  2723. if (tls && haveECC) {
  2724. suites->suites[idx++] = ECC_BYTE;
  2725. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2726. }
  2727. #endif
  2728. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  2729. if (tls && haveECC && haveStaticECC) {
  2730. suites->suites[idx++] = ECC_BYTE;
  2731. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2732. }
  2733. #endif
  2734. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  2735. if (tls && haveRSA) {
  2736. suites->suites[idx++] = ECC_BYTE;
  2737. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  2738. }
  2739. #endif
  2740. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  2741. if (tls && haveRSAsig && haveStaticECC) {
  2742. suites->suites[idx++] = ECC_BYTE;
  2743. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  2744. }
  2745. #endif
  2746. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  2747. if (tls && haveRSA) {
  2748. suites->suites[idx++] = ECC_BYTE;
  2749. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  2750. }
  2751. #endif
  2752. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  2753. if (tls && haveRSAsig && haveStaticECC) {
  2754. suites->suites[idx++] = ECC_BYTE;
  2755. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  2756. }
  2757. #endif
  2758. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  2759. if (!dtls && tls && haveRSA) {
  2760. suites->suites[idx++] = ECC_BYTE;
  2761. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  2762. }
  2763. #endif
  2764. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  2765. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  2766. suites->suites[idx++] = ECC_BYTE;
  2767. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  2768. }
  2769. #endif
  2770. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  2771. if (tls && haveRSA) {
  2772. suites->suites[idx++] = ECC_BYTE;
  2773. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2774. }
  2775. #endif
  2776. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  2777. if (tls && haveRSAsig && haveStaticECC) {
  2778. suites->suites[idx++] = ECC_BYTE;
  2779. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  2780. }
  2781. #endif
  2782. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  2783. if (tls1_2 && haveECC) {
  2784. suites->suites[idx++] = ECC_BYTE;
  2785. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  2786. }
  2787. #endif
  2788. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  2789. if (tls1_2 && haveECC) {
  2790. suites->suites[idx++] = ECC_BYTE;
  2791. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  2792. }
  2793. #endif
  2794. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  2795. if (tls1_2 && haveECC) {
  2796. suites->suites[idx++] = ECC_BYTE;
  2797. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  2798. }
  2799. #endif
  2800. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  2801. if (tls1_2 && haveRSA) {
  2802. suites->suites[idx++] = ECC_BYTE;
  2803. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  2804. }
  2805. #endif
  2806. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  2807. if (tls1_2 && haveRSA) {
  2808. suites->suites[idx++] = ECC_BYTE;
  2809. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  2810. }
  2811. #endif
  2812. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  2813. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2814. if (tls1_2 && haveDH && haveRSA)
  2815. #else
  2816. if (tls && haveDH && haveRSA)
  2817. #endif
  2818. {
  2819. suites->suites[idx++] = CIPHER_BYTE;
  2820. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  2821. }
  2822. #endif
  2823. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  2824. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2825. if (tls1_2 && haveDH && haveRSA)
  2826. #else
  2827. if (tls && haveDH && haveRSA)
  2828. #endif
  2829. {
  2830. suites->suites[idx++] = CIPHER_BYTE;
  2831. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  2832. }
  2833. #endif
  2834. /* Place as higher priority for MYSQL testing */
  2835. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  2836. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2837. if (tls && haveDH && haveRSA) {
  2838. suites->suites[idx++] = CIPHER_BYTE;
  2839. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2840. }
  2841. #endif
  2842. #endif
  2843. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  2844. if (tls && haveDH && haveRSA) {
  2845. suites->suites[idx++] = CIPHER_BYTE;
  2846. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  2847. }
  2848. #endif
  2849. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  2850. if (tls && haveDH && haveRSA) {
  2851. suites->suites[idx++] = CIPHER_BYTE;
  2852. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2853. }
  2854. #endif
  2855. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  2856. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2857. if (tls1_2 && haveRSA)
  2858. #else
  2859. if (tls && haveRSA)
  2860. #endif
  2861. {
  2862. suites->suites[idx++] = CIPHER_BYTE;
  2863. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  2864. }
  2865. #endif
  2866. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  2867. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2868. if (tls1_2 && haveRSA)
  2869. #else
  2870. if (tls && haveRSA)
  2871. #endif
  2872. {
  2873. suites->suites[idx++] = CIPHER_BYTE;
  2874. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  2875. }
  2876. #endif
  2877. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  2878. if (tls && haveRSA) {
  2879. suites->suites[idx++] = CIPHER_BYTE;
  2880. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  2881. }
  2882. #endif
  2883. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  2884. if (tls && haveRSA) {
  2885. suites->suites[idx++] = CIPHER_BYTE;
  2886. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  2887. }
  2888. #endif
  2889. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2890. if (tls1_2 && haveECC) {
  2891. suites->suites[idx++] = CHACHA_BYTE;
  2892. suites->suites[idx++] =
  2893. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2894. }
  2895. #endif
  2896. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2897. if (tls1_2 && haveRSA) {
  2898. suites->suites[idx++] = CHACHA_BYTE;
  2899. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2900. }
  2901. #endif
  2902. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2903. if (tls1_2 && haveRSA) {
  2904. suites->suites[idx++] = CHACHA_BYTE;
  2905. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2906. }
  2907. #endif
  2908. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  2909. if (tls && haveECC) {
  2910. suites->suites[idx++] = ECC_BYTE;
  2911. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  2912. }
  2913. #endif
  2914. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  2915. if (tls && haveRSA) {
  2916. suites->suites[idx++] = CIPHER_BYTE;
  2917. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  2918. }
  2919. #endif
  2920. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  2921. if (tls && haveRSA) {
  2922. suites->suites[idx++] = CIPHER_BYTE;
  2923. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  2924. }
  2925. #endif
  2926. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  2927. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2928. if (tls1_2 && haveRSA)
  2929. #else
  2930. if (tls && haveRSA)
  2931. #endif
  2932. {
  2933. suites->suites[idx++] = CIPHER_BYTE;
  2934. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  2935. }
  2936. #endif
  2937. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  2938. if (tls && havePSK) {
  2939. suites->suites[idx++] = CIPHER_BYTE;
  2940. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  2941. }
  2942. #endif
  2943. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  2944. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2945. if (tls1_2 && haveDH && havePSK)
  2946. #else
  2947. if (tls && haveDH && havePSK)
  2948. #endif
  2949. {
  2950. suites->suites[idx++] = CIPHER_BYTE;
  2951. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  2952. }
  2953. #endif
  2954. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  2955. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2956. if (tls1_2 && havePSK)
  2957. #else
  2958. if (tls && havePSK)
  2959. #endif
  2960. {
  2961. suites->suites[idx++] = CIPHER_BYTE;
  2962. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  2963. }
  2964. #endif
  2965. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  2966. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2967. if (tls1_2 && haveDH && havePSK)
  2968. #else
  2969. if (tls && haveDH && havePSK)
  2970. #endif
  2971. {
  2972. suites->suites[idx++] = CIPHER_BYTE;
  2973. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  2974. }
  2975. #endif
  2976. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  2977. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2978. if (tls1_2 && havePSK)
  2979. #else
  2980. if (tls1 && havePSK)
  2981. #endif
  2982. {
  2983. suites->suites[idx++] = CIPHER_BYTE;
  2984. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  2985. }
  2986. #endif
  2987. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  2988. if (tls && havePSK) {
  2989. suites->suites[idx++] = CIPHER_BYTE;
  2990. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  2991. }
  2992. #endif
  2993. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  2994. if (tls && haveDH && havePSK) {
  2995. suites->suites[idx++] = ECC_BYTE;
  2996. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  2997. }
  2998. #endif
  2999. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  3000. if (tls && haveDH && havePSK) {
  3001. suites->suites[idx++] = ECC_BYTE;
  3002. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  3003. }
  3004. #endif
  3005. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  3006. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3007. if (tls1_2 && havePSK)
  3008. #else
  3009. if (tls && havePSK)
  3010. #endif
  3011. {
  3012. suites->suites[idx++] = CHACHA_BYTE;
  3013. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3014. }
  3015. #endif
  3016. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3017. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3018. if (tls1_2 && havePSK)
  3019. #else
  3020. if (tls && havePSK)
  3021. #endif
  3022. {
  3023. suites->suites[idx++] = CHACHA_BYTE;
  3024. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3025. }
  3026. #endif
  3027. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3028. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3029. if (tls1_2 && havePSK)
  3030. #else
  3031. if (tls && havePSK)
  3032. #endif
  3033. {
  3034. suites->suites[idx++] = CHACHA_BYTE;
  3035. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3036. }
  3037. #endif
  3038. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  3039. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3040. if (tls1_2 && havePSK)
  3041. #else
  3042. if (tls && havePSK)
  3043. #endif
  3044. {
  3045. suites->suites[idx++] = ECC_BYTE;
  3046. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  3047. }
  3048. #endif
  3049. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  3050. if (tls && havePSK) {
  3051. suites->suites[idx++] = ECC_BYTE;
  3052. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  3053. }
  3054. #endif
  3055. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  3056. if (tls && havePSK) {
  3057. suites->suites[idx++] = ECC_BYTE;
  3058. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  3059. }
  3060. #endif
  3061. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  3062. if (tls && havePSK) {
  3063. suites->suites[idx++] = ECC_BYTE;
  3064. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  3065. }
  3066. #endif
  3067. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  3068. if (tls && havePSK) {
  3069. suites->suites[idx++] = ECC_BYTE;
  3070. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  3071. }
  3072. #endif
  3073. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  3074. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3075. if (tls1_2 && haveDH && havePSK)
  3076. #else
  3077. if (tls && haveDH && havePSK)
  3078. #endif
  3079. {
  3080. suites->suites[idx++] = CIPHER_BYTE;
  3081. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  3082. }
  3083. #endif
  3084. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  3085. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3086. if (tls1_2 && havePSK)
  3087. #else
  3088. if (tls && havePSK)
  3089. #endif
  3090. {
  3091. suites->suites[idx++] = CIPHER_BYTE;
  3092. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  3093. }
  3094. #endif
  3095. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  3096. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3097. if (tls1_2 && havePSK)
  3098. #else
  3099. if (tls && havePSK)
  3100. #endif
  3101. {
  3102. suites->suites[idx++] = ECC_BYTE;
  3103. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  3104. }
  3105. #endif
  3106. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  3107. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3108. if (tls1_2 && haveDH && havePSK)
  3109. #else
  3110. if (tls && haveDH && havePSK)
  3111. #endif
  3112. {
  3113. suites->suites[idx++] = CIPHER_BYTE;
  3114. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  3115. }
  3116. #endif
  3117. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  3118. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3119. if (tls1_2 && havePSK)
  3120. #else
  3121. if (tls && havePSK)
  3122. #endif
  3123. {
  3124. suites->suites[idx++] = CIPHER_BYTE;
  3125. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  3126. }
  3127. #endif
  3128. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  3129. if (tls && havePSK) {
  3130. suites->suites[idx++] = CIPHER_BYTE;
  3131. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  3132. }
  3133. #endif
  3134. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  3135. if (!dtls && haveRSA) {
  3136. suites->suites[idx++] = CIPHER_BYTE;
  3137. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  3138. }
  3139. #endif
  3140. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  3141. if (!dtls && haveRSA) {
  3142. suites->suites[idx++] = CIPHER_BYTE;
  3143. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  3144. }
  3145. #endif
  3146. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  3147. if (haveRSA ) {
  3148. suites->suites[idx++] = CIPHER_BYTE;
  3149. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  3150. }
  3151. #endif
  3152. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  3153. if (!dtls && tls && haveRSA) {
  3154. suites->suites[idx++] = CIPHER_BYTE;
  3155. suites->suites[idx++] = TLS_RSA_WITH_HC_128_MD5;
  3156. }
  3157. #endif
  3158. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  3159. if (!dtls && tls && haveRSA) {
  3160. suites->suites[idx++] = CIPHER_BYTE;
  3161. suites->suites[idx++] = TLS_RSA_WITH_HC_128_SHA;
  3162. }
  3163. #endif
  3164. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  3165. if (!dtls && tls && haveRSA) {
  3166. suites->suites[idx++] = CIPHER_BYTE;
  3167. suites->suites[idx++] = TLS_RSA_WITH_RABBIT_SHA;
  3168. }
  3169. #endif
  3170. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  3171. if (tls && haveRSA) {
  3172. suites->suites[idx++] = CIPHER_BYTE;
  3173. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3174. }
  3175. #endif
  3176. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  3177. if (tls && haveDH && haveRSA) {
  3178. suites->suites[idx++] = CIPHER_BYTE;
  3179. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3180. }
  3181. #endif
  3182. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  3183. if (tls && haveRSA) {
  3184. suites->suites[idx++] = CIPHER_BYTE;
  3185. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3186. }
  3187. #endif
  3188. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  3189. if (tls && haveDH && haveRSA) {
  3190. suites->suites[idx++] = CIPHER_BYTE;
  3191. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3192. }
  3193. #endif
  3194. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3195. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3196. if (tls1_2 && haveRSA)
  3197. #else
  3198. if (tls && haveRSA)
  3199. #endif
  3200. {
  3201. suites->suites[idx++] = CIPHER_BYTE;
  3202. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3203. }
  3204. #endif
  3205. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3206. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3207. if (tls1_2 && haveDH && haveRSA)
  3208. #else
  3209. if (tls && haveDH && haveRSA)
  3210. #endif
  3211. {
  3212. suites->suites[idx++] = CIPHER_BYTE;
  3213. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3214. }
  3215. #endif
  3216. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3217. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3218. if (tls1_2 && haveRSA)
  3219. #else
  3220. if (tls && haveRSA)
  3221. #endif
  3222. {
  3223. suites->suites[idx++] = CIPHER_BYTE;
  3224. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3225. }
  3226. #endif
  3227. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3228. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3229. if (tls1_2 && haveDH && haveRSA)
  3230. #else
  3231. if (tls && haveDH && haveRSA)
  3232. #endif
  3233. {
  3234. suites->suites[idx++] = CIPHER_BYTE;
  3235. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3236. }
  3237. #endif
  3238. #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA
  3239. if (haveRSA) {
  3240. suites->suites[idx++] = CIPHER_BYTE;
  3241. suites->suites[idx++] = SSL_RSA_WITH_IDEA_CBC_SHA;
  3242. }
  3243. #endif
  3244. #endif /* !WOLFSSL_NO_TLS12 */
  3245. suites->suiteSz = idx;
  3246. if (suites->hashSigAlgoSz == 0) {
  3247. InitSuitesHashSigAlgo(suites, haveECDSAsig | haveECC,
  3248. haveRSAsig | haveRSA, 0, tls1_2, keySz);
  3249. }
  3250. }
  3251. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  3252. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  3253. /* Decode the signature algorithm.
  3254. *
  3255. * input The encoded signature algorithm.
  3256. * hashalgo The hash algorithm.
  3257. * hsType The signature type.
  3258. */
  3259. static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  3260. {
  3261. switch (input[0]) {
  3262. case NEW_SA_MAJOR:
  3263. #ifdef HAVE_ED25519
  3264. /* ED25519: 0x0807 */
  3265. if (input[1] == ED25519_SA_MINOR) {
  3266. *hsType = ed25519_sa_algo;
  3267. /* Hash performed as part of sign/verify operation. */
  3268. *hashAlgo = sha512_mac;
  3269. }
  3270. else
  3271. #endif
  3272. #ifdef HAVE_ED448
  3273. /* ED448: 0x0808 */
  3274. if (input[1] == ED448_SA_MINOR) {
  3275. *hsType = ed448_sa_algo;
  3276. /* Hash performed as part of sign/verify operation. */
  3277. *hashAlgo = sha512_mac;
  3278. }
  3279. else
  3280. #endif
  3281. #ifdef WC_RSA_PSS
  3282. /* PSS PSS signatures: 0x080[9-b] */
  3283. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  3284. *hsType = rsa_pss_pss_algo;
  3285. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  3286. }
  3287. else
  3288. #endif
  3289. {
  3290. *hsType = input[0];
  3291. *hashAlgo = input[1];
  3292. }
  3293. break;
  3294. default:
  3295. *hashAlgo = input[0];
  3296. *hsType = input[1];
  3297. break;
  3298. }
  3299. }
  3300. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  3301. #ifndef WOLFSSL_NO_TLS12
  3302. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3303. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  3304. defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
  3305. static enum wc_HashType HashAlgoToType(int hashAlgo)
  3306. {
  3307. switch (hashAlgo) {
  3308. #ifdef WOLFSSL_SHA512
  3309. case sha512_mac:
  3310. return WC_HASH_TYPE_SHA512;
  3311. #endif
  3312. #ifdef WOLFSSL_SHA384
  3313. case sha384_mac:
  3314. return WC_HASH_TYPE_SHA384;
  3315. #endif
  3316. #ifndef NO_SHA256
  3317. case sha256_mac:
  3318. return WC_HASH_TYPE_SHA256;
  3319. #endif
  3320. #ifdef WOLFSSL_SHA224
  3321. case sha224_mac:
  3322. return WC_HASH_TYPE_SHA224;
  3323. #endif
  3324. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  3325. defined(WOLFSSL_ALLOW_TLS_SHA1))
  3326. case sha_mac:
  3327. return WC_HASH_TYPE_SHA;
  3328. #endif
  3329. default:
  3330. WOLFSSL_MSG("Bad hash sig algo");
  3331. break;
  3332. }
  3333. return WC_HASH_TYPE_NONE;
  3334. }
  3335. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  3336. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3337. #endif /* !WOLFSSL_NO_TLS12 */
  3338. #ifndef NO_CERTS
  3339. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
  3340. {
  3341. (void)dynamicFlag;
  3342. (void)heap;
  3343. if (name != NULL) {
  3344. XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME));
  3345. name->name = name->staticName;
  3346. name->heap = heap;
  3347. }
  3348. }
  3349. void FreeX509Name(WOLFSSL_X509_NAME* name)
  3350. {
  3351. if (name != NULL) {
  3352. if (name->dynamicName) {
  3353. XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
  3354. name->name = NULL;
  3355. }
  3356. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3357. {
  3358. int i;
  3359. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  3360. if (name->entry[i].set) {
  3361. wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
  3362. wolfSSL_ASN1_STRING_free(name->entry[i].value);
  3363. }
  3364. }
  3365. }
  3366. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3367. }
  3368. }
  3369. /* Initialize wolfSSL X509 type */
  3370. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  3371. {
  3372. if (x509 == NULL) {
  3373. WOLFSSL_MSG("Null parameter passed in!");
  3374. return;
  3375. }
  3376. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  3377. x509->heap = heap;
  3378. InitX509Name(&x509->issuer, 0, heap);
  3379. InitX509Name(&x509->subject, 0, heap);
  3380. x509->dynamicMemory = (byte)dynamicFlag;
  3381. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  3382. x509->refCount = 1;
  3383. #ifndef SINGLE_THREADED
  3384. (void)wc_InitMutex(&x509->refMutex);
  3385. #endif
  3386. #endif
  3387. }
  3388. /* Free wolfSSL X509 type */
  3389. void FreeX509(WOLFSSL_X509* x509)
  3390. {
  3391. if (x509 == NULL)
  3392. return;
  3393. FreeX509Name(&x509->issuer);
  3394. FreeX509Name(&x509->subject);
  3395. if (x509->pubKey.buffer) {
  3396. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  3397. x509->pubKey.buffer = NULL;
  3398. }
  3399. FreeDer(&x509->derCert);
  3400. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  3401. x509->sig.buffer = NULL;
  3402. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3403. if (x509->authKeyIdSrc != NULL) {
  3404. XFREE(x509->authKeyIdSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3405. }
  3406. else {
  3407. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3408. }
  3409. x509->authKeyIdSrc = NULL;
  3410. x509->authKeyId = NULL;
  3411. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3412. x509->subjKeyId = NULL;
  3413. if (x509->authInfo != NULL) {
  3414. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3415. x509->authInfo = NULL;
  3416. }
  3417. if (x509->rawCRLInfo != NULL) {
  3418. XFREE(x509->rawCRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3419. x509->rawCRLInfo = NULL;
  3420. }
  3421. if (x509->CRLInfo != NULL) {
  3422. XFREE(x509->CRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3423. x509->CRLInfo = NULL;
  3424. }
  3425. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  3426. if (x509->authInfoCaIssuer != NULL) {
  3427. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3428. }
  3429. if (x509->ext_sk != NULL) {
  3430. wolfSSL_sk_X509_EXTENSION_free(x509->ext_sk);
  3431. }
  3432. if (x509->ext_sk_full != NULL) {
  3433. wolfSSL_sk_X509_EXTENSION_free(x509->ext_sk_full);
  3434. }
  3435. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  3436. #ifdef OPENSSL_EXTRA
  3437. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  3438. if (x509->serialNumber != NULL) {
  3439. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  3440. }
  3441. #endif
  3442. if (x509->extKeyUsageSrc != NULL) {
  3443. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3444. x509->extKeyUsageSrc= NULL;
  3445. }
  3446. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3447. #if defined(OPENSSL_ALL)
  3448. if (x509->algor.algorithm) {
  3449. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  3450. x509->algor.algorithm = NULL;
  3451. }
  3452. if (x509->key.algor) {
  3453. wolfSSL_X509_ALGOR_free(x509->key.algor);
  3454. x509->key.algor = NULL;
  3455. }
  3456. if (x509->key.pkey) {
  3457. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  3458. x509->key.pkey = NULL;
  3459. }
  3460. if (x509->subjAltNameSrc != NULL) {
  3461. XFREE(x509->subjAltNameSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3462. x509->subjAltNameSrc= NULL;
  3463. }
  3464. #endif /* OPENSSL_ALL */
  3465. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
  3466. if (x509->challengePwAttr) {
  3467. wolfSSL_X509_ATTRIBUTE_free(x509->challengePwAttr);
  3468. }
  3469. #endif /* WOLFSSL_CERT_REQ */
  3470. if (x509->altNames) {
  3471. FreeAltNames(x509->altNames, x509->heap);
  3472. x509->altNames = NULL;
  3473. }
  3474. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3475. #ifndef SINGLE_THREADED
  3476. wc_FreeMutex(&x509->refMutex);
  3477. #endif
  3478. #endif
  3479. }
  3480. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3481. #if !defined(WOLFSSL_NO_TLS12)
  3482. /* Encode the signature algorithm into buffer.
  3483. *
  3484. * hashalgo The hash algorithm.
  3485. * hsType The signature type.
  3486. * output The buffer to encode into.
  3487. */
  3488. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  3489. {
  3490. switch (hsType) {
  3491. #ifdef HAVE_ECC
  3492. case ecc_dsa_sa_algo:
  3493. output[0] = hashAlgo;
  3494. output[1] = ecc_dsa_sa_algo;
  3495. break;
  3496. #endif
  3497. #ifdef HAVE_ED25519
  3498. case ed25519_sa_algo:
  3499. output[0] = ED25519_SA_MAJOR;
  3500. output[1] = ED25519_SA_MINOR;
  3501. (void)hashAlgo;
  3502. break;
  3503. #endif
  3504. #ifdef HAVE_ED448
  3505. case ed448_sa_algo:
  3506. output[0] = ED448_SA_MAJOR;
  3507. output[1] = ED448_SA_MINOR;
  3508. (void)hashAlgo;
  3509. break;
  3510. #endif
  3511. #ifndef NO_RSA
  3512. case rsa_sa_algo:
  3513. output[0] = hashAlgo;
  3514. output[1] = rsa_sa_algo;
  3515. break;
  3516. #ifdef WC_RSA_PSS
  3517. /* PSS signatures: 0x080[4-6] */
  3518. case rsa_pss_sa_algo:
  3519. output[0] = rsa_pss_sa_algo;
  3520. output[1] = hashAlgo;
  3521. break;
  3522. #endif
  3523. #endif
  3524. default:
  3525. break;
  3526. }
  3527. (void)hashAlgo;
  3528. (void)output;
  3529. }
  3530. #endif
  3531. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  3532. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  3533. {
  3534. switch (hashAlgo) {
  3535. #ifndef NO_SHA
  3536. case sha_mac:
  3537. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  3538. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  3539. break;
  3540. #endif /* !NO_SHA */
  3541. #ifndef NO_SHA256
  3542. case sha256_mac:
  3543. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  3544. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  3545. break;
  3546. #endif /* !NO_SHA256 */
  3547. #ifdef WOLFSSL_SHA384
  3548. case sha384_mac:
  3549. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  3550. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  3551. break;
  3552. #endif /* WOLFSSL_SHA384 */
  3553. #ifdef WOLFSSL_SHA512
  3554. case sha512_mac:
  3555. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  3556. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  3557. break;
  3558. #endif /* WOLFSSL_SHA512 */
  3559. default:
  3560. break;
  3561. } /* switch */
  3562. }
  3563. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  3564. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3565. #endif /* !NO_CERTS */
  3566. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3567. static word32 MacSize(WOLFSSL* ssl)
  3568. {
  3569. #ifdef HAVE_TRUNCATED_HMAC
  3570. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  3571. : ssl->specs.hash_size;
  3572. #else
  3573. word32 digestSz = ssl->specs.hash_size;
  3574. #endif
  3575. return digestSz;
  3576. }
  3577. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  3578. #ifndef NO_RSA
  3579. #if !defined(WOLFSSL_NO_TLS12) || \
  3580. (defined(WC_RSA_PSS) && defined(HAVE_PK_CALLBACKS))
  3581. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3582. static int TypeHash(int hashAlgo)
  3583. {
  3584. switch (hashAlgo) {
  3585. #ifdef WOLFSSL_SHA512
  3586. case sha512_mac:
  3587. return SHA512h;
  3588. #endif
  3589. #ifdef WOLFSSL_SHA384
  3590. case sha384_mac:
  3591. return SHA384h;
  3592. #endif
  3593. #ifndef NO_SHA256
  3594. case sha256_mac:
  3595. return SHA256h;
  3596. #endif
  3597. #ifdef WOLFSSL_SHA224
  3598. case sha224_mac:
  3599. return SHA224h;
  3600. #endif
  3601. #ifndef NO_SHA
  3602. case sha_mac:
  3603. return SHAh;
  3604. #endif
  3605. default:
  3606. break;
  3607. }
  3608. return 0;
  3609. }
  3610. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  3611. #endif /* !WOLFSSL_NO_TLS12 */
  3612. #if defined(WC_RSA_PSS)
  3613. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  3614. {
  3615. switch (hashAlgo) {
  3616. #ifdef WOLFSSL_SHA512
  3617. case sha512_mac:
  3618. *hashType = WC_HASH_TYPE_SHA512;
  3619. if (mgf != NULL)
  3620. *mgf = WC_MGF1SHA512;
  3621. break;
  3622. #endif
  3623. #ifdef WOLFSSL_SHA384
  3624. case sha384_mac:
  3625. *hashType = WC_HASH_TYPE_SHA384;
  3626. if (mgf != NULL)
  3627. *mgf = WC_MGF1SHA384;
  3628. break;
  3629. #endif
  3630. #ifndef NO_SHA256
  3631. case sha256_mac:
  3632. *hashType = WC_HASH_TYPE_SHA256;
  3633. if (mgf != NULL)
  3634. *mgf = WC_MGF1SHA256;
  3635. break;
  3636. #endif
  3637. default:
  3638. return BAD_FUNC_ARG;
  3639. }
  3640. return 0;
  3641. }
  3642. #endif
  3643. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3644. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3645. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3646. DerBuffer* keyBufInfo)
  3647. {
  3648. int ret;
  3649. #ifdef HAVE_PK_CALLBACKS
  3650. const byte* keyBuf = NULL;
  3651. word32 keySz = 0;
  3652. if (keyBufInfo) {
  3653. keyBuf = keyBufInfo->buffer;
  3654. keySz = keyBufInfo->length;
  3655. }
  3656. #endif
  3657. (void)ssl;
  3658. (void)keyBufInfo;
  3659. (void)sigAlgo;
  3660. (void)hashAlgo;
  3661. WOLFSSL_ENTER("RsaSign");
  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(WC_RSA_PSS)
  3671. if (sigAlgo == rsa_pss_sa_algo) {
  3672. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3673. int mgf = 0;
  3674. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3675. if (ret != 0)
  3676. return ret;
  3677. #if defined(HAVE_PK_CALLBACKS)
  3678. if (ssl->ctx->RsaPssSignCb) {
  3679. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3680. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  3681. TypeHash(hashAlgo), mgf,
  3682. keyBuf, keySz, ctx);
  3683. }
  3684. else
  3685. #endif
  3686. {
  3687. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  3688. ssl->rng);
  3689. }
  3690. }
  3691. else
  3692. #endif
  3693. #if defined(HAVE_PK_CALLBACKS)
  3694. if (ssl->ctx->RsaSignCb) {
  3695. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3696. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3697. ctx);
  3698. }
  3699. else
  3700. #endif /*HAVE_PK_CALLBACKS */
  3701. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  3702. /* Handle async pending response */
  3703. #ifdef WOLFSSL_ASYNC_CRYPT
  3704. if (key && ret == WC_PENDING_E) {
  3705. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3706. }
  3707. #endif /* WOLFSSL_ASYNC_CRYPT */
  3708. /* For positive response return in outSz */
  3709. if (ret > 0) {
  3710. *outSz = ret;
  3711. ret = 0;
  3712. }
  3713. WOLFSSL_LEAVE("RsaSign", ret);
  3714. return ret;
  3715. }
  3716. #endif
  3717. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  3718. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  3719. {
  3720. int ret;
  3721. #ifdef HAVE_PK_CALLBACKS
  3722. const byte* keyBuf = NULL;
  3723. word32 keySz = 0;
  3724. if (keyBufInfo) {
  3725. keyBuf = keyBufInfo->buffer;
  3726. keySz = keyBufInfo->length;
  3727. }
  3728. #endif
  3729. (void)ssl;
  3730. (void)keyBufInfo;
  3731. (void)sigAlgo;
  3732. (void)hashAlgo;
  3733. WOLFSSL_ENTER("RsaVerify");
  3734. #ifdef WOLFSSL_ASYNC_CRYPT
  3735. /* initialize event */
  3736. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3737. if (ret != 0)
  3738. return ret;
  3739. #endif
  3740. #if defined(WC_RSA_PSS)
  3741. if (sigAlgo == rsa_pss_sa_algo) {
  3742. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3743. int mgf = 0;
  3744. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3745. if (ret != 0)
  3746. return ret;
  3747. #ifdef HAVE_PK_CALLBACKS
  3748. if (ssl->ctx->RsaPssVerifyCb) {
  3749. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  3750. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  3751. TypeHash(hashAlgo), mgf,
  3752. keyBuf, keySz, ctx);
  3753. }
  3754. else
  3755. #endif /*HAVE_PK_CALLBACKS */
  3756. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  3757. }
  3758. else
  3759. #endif
  3760. #ifdef HAVE_PK_CALLBACKS
  3761. if (ssl->ctx->RsaVerifyCb) {
  3762. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  3763. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3764. }
  3765. else
  3766. #endif /*HAVE_PK_CALLBACKS */
  3767. {
  3768. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  3769. }
  3770. /* Handle async pending response */
  3771. #ifdef WOLFSSL_ASYNC_CRYPT
  3772. if (ret == WC_PENDING_E) {
  3773. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3774. }
  3775. #endif /* WOLFSSL_ASYNC_CRYPT */
  3776. WOLFSSL_LEAVE("RsaVerify", ret);
  3777. return ret;
  3778. }
  3779. /* Verify RSA signature, 0 on success */
  3780. /* This function is used to check the sign result */
  3781. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  3782. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3783. DerBuffer* keyBufInfo)
  3784. {
  3785. byte* out = NULL; /* inline result */
  3786. int ret;
  3787. #ifdef HAVE_PK_CALLBACKS
  3788. const byte* keyBuf = NULL;
  3789. word32 keySz = 0;
  3790. if (keyBufInfo) {
  3791. keyBuf = keyBufInfo->buffer;
  3792. keySz = keyBufInfo->length;
  3793. }
  3794. #endif
  3795. (void)ssl;
  3796. (void)keyBufInfo;
  3797. (void)sigAlgo;
  3798. (void)hashAlgo;
  3799. WOLFSSL_ENTER("VerifyRsaSign");
  3800. if (verifySig == NULL || plain == NULL) {
  3801. return BAD_FUNC_ARG;
  3802. }
  3803. if (sigSz > ENCRYPT_LEN) {
  3804. WOLFSSL_MSG("Signature buffer too big");
  3805. return BUFFER_E;
  3806. }
  3807. #ifdef WOLFSSL_ASYNC_CRYPT
  3808. /* initialize event */
  3809. if (key) {
  3810. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3811. if (ret != 0)
  3812. return ret;
  3813. }
  3814. #endif
  3815. #if defined(WC_RSA_PSS)
  3816. if (sigAlgo == rsa_pss_sa_algo) {
  3817. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3818. int mgf = 0;
  3819. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3820. if (ret != 0)
  3821. return ret;
  3822. #ifdef HAVE_PK_CALLBACKS
  3823. if (ssl->ctx->RsaPssSignCheckCb) {
  3824. /* The key buffer includes private/public portion,
  3825. but only public is used */
  3826. /* If HSM hardware is checking the signature result you can
  3827. optionally skip the sign check and return 0 */
  3828. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3829. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3830. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  3831. TypeHash(hashAlgo), mgf,
  3832. keyBuf, keySz, ctx);
  3833. if (ret > 0) {
  3834. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  3835. hashType);
  3836. if (ret != 0)
  3837. ret = VERIFY_CERT_ERROR;
  3838. }
  3839. }
  3840. else
  3841. #endif /* HAVE_PK_CALLBACKS */
  3842. {
  3843. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  3844. key);
  3845. if (ret > 0) {
  3846. #ifdef HAVE_SELFTEST
  3847. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  3848. hashType);
  3849. #else
  3850. ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret,
  3851. hashType, -1,
  3852. mp_count_bits(&key->n));
  3853. #endif
  3854. if (ret != 0)
  3855. ret = VERIFY_CERT_ERROR;
  3856. }
  3857. }
  3858. }
  3859. else
  3860. #endif /* WC_RSA_PSS */
  3861. {
  3862. #ifdef HAVE_PK_CALLBACKS
  3863. if (ssl->ctx->RsaSignCheckCb) {
  3864. /* The key buffer includes private/public portion,
  3865. but only public is used */
  3866. /* If HSM hardware is checking the signature result you can
  3867. optionally skip the sign check and return 0 */
  3868. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3869. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3870. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  3871. keyBuf, keySz, ctx);
  3872. }
  3873. else
  3874. #endif /* HAVE_PK_CALLBACKS */
  3875. {
  3876. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  3877. }
  3878. if (ret > 0) {
  3879. if (ret != (int)plainSz || !out ||
  3880. XMEMCMP(plain, out, plainSz) != 0) {
  3881. WOLFSSL_MSG("RSA Signature verification failed");
  3882. ret = RSA_SIGN_FAULT;
  3883. } else {
  3884. ret = 0; /* RSA reset */
  3885. }
  3886. }
  3887. }
  3888. /* Handle async pending response */
  3889. #ifdef WOLFSSL_ASYNC_CRYPT
  3890. if (key && ret == WC_PENDING_E) {
  3891. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3892. }
  3893. #endif /* WOLFSSL_ASYNC_CRYPT */
  3894. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  3895. return ret;
  3896. }
  3897. #ifndef WOLFSSL_NO_TLS12
  3898. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3899. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  3900. RsaKey* key, DerBuffer* keyBufInfo)
  3901. {
  3902. int ret;
  3903. #ifdef HAVE_PK_CALLBACKS
  3904. const byte* keyBuf = NULL;
  3905. word32 keySz = 0;
  3906. if (keyBufInfo) {
  3907. keyBuf = keyBufInfo->buffer;
  3908. keySz = keyBufInfo->length;
  3909. }
  3910. #endif
  3911. (void)ssl;
  3912. (void)keyBufInfo;
  3913. WOLFSSL_ENTER("RsaDec");
  3914. #ifdef WOLFSSL_ASYNC_CRYPT
  3915. /* initialize event */
  3916. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3917. if (ret != 0)
  3918. return ret;
  3919. #endif
  3920. #ifdef HAVE_PK_CALLBACKS
  3921. if (ssl->ctx->RsaDecCb) {
  3922. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  3923. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3924. }
  3925. else
  3926. #endif /* HAVE_PK_CALLBACKS */
  3927. {
  3928. #ifdef WC_RSA_BLINDING
  3929. ret = wc_RsaSetRNG(key, ssl->rng);
  3930. if (ret != 0)
  3931. return ret;
  3932. #endif
  3933. ret = wc_RsaPrivateDecryptInline(in, inSz, out, key);
  3934. }
  3935. /* Handle async pending response */
  3936. #ifdef WOLFSSL_ASYNC_CRYPT
  3937. if (ret == WC_PENDING_E) {
  3938. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3939. }
  3940. #endif /* WOLFSSL_ASYNC_CRYPT */
  3941. /* For positive response return in outSz */
  3942. if (ret > 0) {
  3943. *outSz = ret;
  3944. ret = 0;
  3945. }
  3946. WOLFSSL_LEAVE("RsaDec", ret);
  3947. return ret;
  3948. }
  3949. #endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
  3950. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  3951. RsaKey* key, buffer* keyBufInfo)
  3952. {
  3953. int ret;
  3954. #ifdef HAVE_PK_CALLBACKS
  3955. const byte* keyBuf = NULL;
  3956. word32 keySz = 0;
  3957. if (keyBufInfo) {
  3958. keyBuf = keyBufInfo->buffer;
  3959. keySz = keyBufInfo->length;
  3960. }
  3961. #endif
  3962. (void)ssl;
  3963. (void)keyBufInfo;
  3964. WOLFSSL_ENTER("RsaEnc");
  3965. #ifdef WOLFSSL_ASYNC_CRYPT
  3966. /* initialize event */
  3967. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3968. if (ret != 0)
  3969. return ret;
  3970. #endif
  3971. #ifdef HAVE_PK_CALLBACKS
  3972. if (ssl->ctx->RsaEncCb) {
  3973. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  3974. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  3975. }
  3976. else
  3977. #endif /* HAVE_PK_CALLBACKS */
  3978. {
  3979. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  3980. }
  3981. /* Handle async pending response */
  3982. #ifdef WOLFSSL_ASYNC_CRYPT
  3983. if (ret == WC_PENDING_E) {
  3984. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3985. }
  3986. #endif /* WOLFSSL_ASYNC_CRYPT */
  3987. /* For positive response return in outSz */
  3988. if (ret > 0) {
  3989. *outSz = ret;
  3990. ret = 0;
  3991. }
  3992. WOLFSSL_LEAVE("RsaEnc", ret);
  3993. return ret;
  3994. }
  3995. #endif /* !WOLFSSL_NO_TLS12 */
  3996. #endif /* NO_RSA */
  3997. #ifdef HAVE_ECC
  3998. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3999. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  4000. {
  4001. int ret;
  4002. #ifdef HAVE_PK_CALLBACKS
  4003. const byte* keyBuf = NULL;
  4004. word32 keySz = 0;
  4005. if (keyBufInfo) {
  4006. keyBuf = keyBufInfo->buffer;
  4007. keySz = keyBufInfo->length;
  4008. }
  4009. #endif
  4010. (void)ssl;
  4011. (void)keyBufInfo;
  4012. WOLFSSL_ENTER("EccSign");
  4013. #ifdef WOLFSSL_ASYNC_CRYPT
  4014. /* initialize event */
  4015. if (key) {
  4016. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4017. if (ret != 0)
  4018. return ret;
  4019. }
  4020. #endif
  4021. #if defined(HAVE_PK_CALLBACKS)
  4022. if (ssl->ctx->EccSignCb) {
  4023. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  4024. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  4025. keySz, ctx);
  4026. }
  4027. else
  4028. #endif /* HAVE_PK_CALLBACKS */
  4029. {
  4030. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4031. }
  4032. /* Handle async pending response */
  4033. #ifdef WOLFSSL_ASYNC_CRYPT
  4034. if (key && ret == WC_PENDING_E) {
  4035. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4036. }
  4037. #endif /* WOLFSSL_ASYNC_CRYPT */
  4038. WOLFSSL_LEAVE("EccSign", ret);
  4039. return ret;
  4040. }
  4041. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  4042. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  4043. {
  4044. int ret;
  4045. #ifdef HAVE_PK_CALLBACKS
  4046. const byte* keyBuf = NULL;
  4047. word32 keySz = 0;
  4048. if (keyBufInfo) {
  4049. keyBuf = keyBufInfo->buffer;
  4050. keySz = keyBufInfo->length;
  4051. }
  4052. #endif
  4053. (void)ssl;
  4054. (void)keyBufInfo;
  4055. WOLFSSL_ENTER("EccVerify");
  4056. #ifdef WOLFSSL_ASYNC_CRYPT
  4057. /* initialize event */
  4058. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4059. if (ret != 0)
  4060. return ret;
  4061. #endif
  4062. #ifdef HAVE_PK_CALLBACKS
  4063. if (ssl->ctx->EccVerifyCb) {
  4064. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  4065. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4066. &ssl->eccVerifyRes, ctx);
  4067. }
  4068. else
  4069. #endif /* HAVE_PK_CALLBACKS */
  4070. {
  4071. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  4072. }
  4073. /* Handle async pending response */
  4074. #ifdef WOLFSSL_ASYNC_CRYPT
  4075. if (ret == WC_PENDING_E) {
  4076. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4077. }
  4078. else
  4079. #endif /* WOLFSSL_ASYNC_CRYPT */
  4080. {
  4081. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4082. }
  4083. WOLFSSL_LEAVE("EccVerify", ret);
  4084. return ret;
  4085. }
  4086. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  4087. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  4088. int side)
  4089. {
  4090. int ret;
  4091. #ifdef WOLFSSL_ASYNC_CRYPT
  4092. WC_ASYNC_DEV* asyncDev = NULL;
  4093. #endif
  4094. (void)ssl;
  4095. (void)pubKeyDer;
  4096. (void)pubKeySz;
  4097. (void)side;
  4098. WOLFSSL_ENTER("EccSharedSecret");
  4099. #ifdef WOLFSSL_ASYNC_CRYPT
  4100. /* initialize event */
  4101. if (priv_key != NULL) {
  4102. asyncDev = &priv_key->asyncDev;
  4103. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4104. if (ret != 0)
  4105. return ret;
  4106. }
  4107. #endif
  4108. #ifdef HAVE_PK_CALLBACKS
  4109. if (ssl->ctx->EccSharedSecretCb) {
  4110. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  4111. ecc_key* otherKey = (side == WOLFSSL_CLIENT_END) ? pub_key : priv_key;
  4112. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  4113. pubKeySz, out, outlen, side, ctx);
  4114. }
  4115. else
  4116. #endif
  4117. {
  4118. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  4119. !defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2)) && \
  4120. !defined(HAVE_SELFTEST)
  4121. ret = wc_ecc_set_rng(priv_key, ssl->rng);
  4122. if (ret == 0)
  4123. #endif
  4124. {
  4125. PRIVATE_KEY_UNLOCK();
  4126. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  4127. PRIVATE_KEY_LOCK();
  4128. }
  4129. }
  4130. /* Handle async pending response */
  4131. #ifdef WOLFSSL_ASYNC_CRYPT
  4132. if (ret == WC_PENDING_E) {
  4133. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  4134. }
  4135. #endif /* WOLFSSL_ASYNC_CRYPT */
  4136. WOLFSSL_LEAVE("EccSharedSecret", ret);
  4137. return ret;
  4138. }
  4139. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  4140. {
  4141. int ret = 0;
  4142. int keySz = 0;
  4143. int ecc_curve = ECC_CURVE_DEF;
  4144. WOLFSSL_ENTER("EccMakeKey");
  4145. #ifdef WOLFSSL_ASYNC_CRYPT
  4146. /* initialize event */
  4147. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4148. if (ret != 0)
  4149. return ret;
  4150. #endif
  4151. /* get key size */
  4152. if (peer == NULL || peer->dp == NULL) {
  4153. keySz = ssl->eccTempKeySz;
  4154. /* get curve type */
  4155. if (ssl->ecdhCurveOID > 0) {
  4156. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  4157. }
  4158. }
  4159. else {
  4160. keySz = peer->dp->size;
  4161. ecc_curve = peer->dp->id;
  4162. }
  4163. #ifdef HAVE_PK_CALLBACKS
  4164. if (ssl->ctx->EccKeyGenCb) {
  4165. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  4166. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  4167. }
  4168. else
  4169. #endif
  4170. {
  4171. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  4172. }
  4173. /* make sure the curve is set for TLS */
  4174. if (ret == 0 && key->dp) {
  4175. ssl->ecdhCurveOID = key->dp->oidSum;
  4176. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4177. ssl->namedGroup = 0;
  4178. #endif
  4179. }
  4180. /* Handle async pending response */
  4181. #ifdef WOLFSSL_ASYNC_CRYPT
  4182. if (ret == WC_PENDING_E) {
  4183. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4184. }
  4185. #endif /* WOLFSSL_ASYNC_CRYPT */
  4186. WOLFSSL_LEAVE("EccMakeKey", ret);
  4187. return ret;
  4188. }
  4189. #endif /* HAVE_ECC */
  4190. #ifdef HAVE_ED25519
  4191. /* Check whether the key contains a public key.
  4192. * If not then pull it out of the leaf certificate.
  4193. *
  4194. * ssl SSL/TLS object.
  4195. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4196. * 0 on success.
  4197. */
  4198. int Ed25519CheckPubKey(WOLFSSL* ssl)
  4199. {
  4200. #ifndef HAVE_ED25519_KEY_IMPORT
  4201. (void)ssl;
  4202. return NOT_COMPILED_IN;
  4203. #else /* HAVE_ED25519_KEY_IMPORT */
  4204. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  4205. int ret = 0;
  4206. /* Public key required for signing. */
  4207. if (!key->pubKeySet) {
  4208. DerBuffer* leaf = ssl->buffers.certificate;
  4209. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert),
  4210. ssl->heap, DYNAMIC_TYPE_DCERT);
  4211. if (cert == NULL)
  4212. ret = MEMORY_E;
  4213. if (ret == 0) {
  4214. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4215. ret = DecodeToKey(cert, 0);
  4216. }
  4217. if (ret == 0) {
  4218. ret = wc_ed25519_import_public(cert->publicKey, cert->pubKeySize,
  4219. key);
  4220. }
  4221. if (cert != NULL) {
  4222. FreeDecodedCert(cert);
  4223. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4224. }
  4225. }
  4226. return ret;
  4227. #endif /* HAVE_ED25519_KEY_IMPORT */
  4228. }
  4229. /* Sign the data using EdDSA and key using Ed25519.
  4230. *
  4231. * ssl SSL object.
  4232. * in Data or message to sign.
  4233. * inSz Length of the data.
  4234. * out Buffer to hold signature.
  4235. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4236. * key The private Ed25519 key data.
  4237. * keySz The length of the private key data in bytes.
  4238. * ctx The callback context.
  4239. * returns 0 on success, otherwise the value is an error.
  4240. */
  4241. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4242. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  4243. {
  4244. #ifndef HAVE_ED25519_SIGN
  4245. (void)ssl;
  4246. (void)in;
  4247. (void)inSz;
  4248. (void)out;
  4249. (void)outSz;
  4250. (void)key;
  4251. (void)keyBufInfo;
  4252. return NOT_COMPILED_IN;
  4253. #else /* HAVE_ED25519_SIGN */
  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("Ed25519Sign");
  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. #if defined(HAVE_PK_CALLBACKS)
  4273. if (ssl->ctx->Ed25519SignCb) {
  4274. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  4275. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  4276. keySz, ctx);
  4277. }
  4278. else
  4279. #endif /* HAVE_PK_CALLBACKS */
  4280. {
  4281. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  4282. }
  4283. /* Handle async pending response */
  4284. #ifdef WOLFSSL_ASYNC_CRYPT
  4285. if (ret == WC_PENDING_E) {
  4286. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4287. }
  4288. #endif /* WOLFSSL_ASYNC_CRYPT */
  4289. WOLFSSL_LEAVE("Ed25519Sign", ret);
  4290. return ret;
  4291. #endif /* HAVE_ED25519_SIGN */
  4292. }
  4293. /* Verify the data using EdDSA and key using Ed25519.
  4294. *
  4295. * ssl SSL object.
  4296. * in Signature data.
  4297. * inSz Length of the signature data in bytes.
  4298. * msg Message to verify.
  4299. * outSz Length of message in bytes.
  4300. * key The public Ed25519 key data.
  4301. * keySz The length of the private key data in bytes.
  4302. * ctx The callback context.
  4303. * returns 0 on success, otherwise the value is an error.
  4304. */
  4305. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4306. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  4307. {
  4308. #ifndef HAVE_ED25519_VERIFY
  4309. (void)ssl;
  4310. (void)in;
  4311. (void)inSz;
  4312. (void)msg;
  4313. (void)msgSz;
  4314. (void)key;
  4315. (void)keyBufInfo;
  4316. return NOT_COMPILED_IN;
  4317. #else /* HAVE_ED25519_VERIFY */
  4318. int ret;
  4319. #ifdef HAVE_PK_CALLBACKS
  4320. const byte* keyBuf = NULL;
  4321. word32 keySz = 0;
  4322. if (keyBufInfo) {
  4323. keyBuf = keyBufInfo->buffer;
  4324. keySz = keyBufInfo->length;
  4325. }
  4326. #endif
  4327. (void)ssl;
  4328. (void)keyBufInfo;
  4329. WOLFSSL_ENTER("Ed25519Verify");
  4330. #ifdef WOLFSSL_ASYNC_CRYPT
  4331. /* initialize event */
  4332. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4333. if (ret != 0)
  4334. return ret;
  4335. #endif
  4336. #ifdef HAVE_PK_CALLBACKS
  4337. if (ssl->ctx->Ed25519VerifyCb) {
  4338. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  4339. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  4340. keySz, &ssl->eccVerifyRes, ctx);
  4341. }
  4342. else
  4343. #endif /* HAVE_PK_CALLBACKS */
  4344. {
  4345. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  4346. &ssl->eccVerifyRes, key);
  4347. }
  4348. /* Handle async pending response */
  4349. #ifdef WOLFSSL_ASYNC_CRYPT
  4350. if (ret == WC_PENDING_E) {
  4351. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4352. }
  4353. else
  4354. #endif /* WOLFSSL_ASYNC_CRYPT */
  4355. {
  4356. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4357. }
  4358. WOLFSSL_LEAVE("Ed25519Verify", ret);
  4359. return ret;
  4360. #endif /* HAVE_ED25519_VERIFY */
  4361. }
  4362. #endif /* HAVE_ED25519 */
  4363. #ifndef WOLFSSL_NO_TLS12
  4364. #ifdef HAVE_CURVE25519
  4365. #ifdef HAVE_PK_CALLBACKS
  4366. /* Gets X25519 key for shared secret callback testing
  4367. * Client side: returns peer key
  4368. * Server side: returns private key
  4369. */
  4370. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  4371. {
  4372. int ret = NO_PEER_KEY;
  4373. struct curve25519_key* tmpKey = NULL;
  4374. if (ssl == NULL || otherKey == NULL) {
  4375. return BAD_FUNC_ARG;
  4376. }
  4377. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4378. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  4379. !ssl->peerX25519Key->dp) {
  4380. return NO_PEER_KEY;
  4381. }
  4382. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  4383. }
  4384. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4385. if (!ssl->eccTempKeyPresent) {
  4386. return NO_PRIVATE_KEY;
  4387. }
  4388. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  4389. }
  4390. if (tmpKey) {
  4391. *otherKey = (curve25519_key *)tmpKey;
  4392. ret = 0;
  4393. }
  4394. return ret;
  4395. }
  4396. #endif /* HAVE_PK_CALLBACKS */
  4397. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  4398. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  4399. byte* out, word32* outlen, int side)
  4400. {
  4401. int ret;
  4402. (void)ssl;
  4403. (void)pubKeyDer;
  4404. (void)pubKeySz;
  4405. (void)side;
  4406. WOLFSSL_ENTER("X25519SharedSecret");
  4407. #ifdef WOLFSSL_ASYNC_CRYPT
  4408. /* initialize event */
  4409. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4410. if (ret != 0)
  4411. return ret;
  4412. #endif
  4413. #ifdef HAVE_PK_CALLBACKS
  4414. if (ssl->ctx->X25519SharedSecretCb) {
  4415. curve25519_key* otherKey = NULL;
  4416. ret = X25519GetKey(ssl, &otherKey);
  4417. if (ret == 0) {
  4418. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  4419. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  4420. pubKeySz, out, outlen, side, ctx);
  4421. }
  4422. }
  4423. else
  4424. #endif
  4425. {
  4426. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  4427. EC25519_LITTLE_ENDIAN);
  4428. }
  4429. /* Handle async pending response */
  4430. #ifdef WOLFSSL_ASYNC_CRYPT
  4431. if (ret == WC_PENDING_E) {
  4432. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4433. }
  4434. #endif /* WOLFSSL_ASYNC_CRYPT */
  4435. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  4436. return ret;
  4437. }
  4438. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  4439. curve25519_key* peer)
  4440. {
  4441. int ret = 0;
  4442. (void)peer;
  4443. WOLFSSL_ENTER("X25519MakeKey");
  4444. #ifdef WOLFSSL_ASYNC_CRYPT
  4445. /* initialize event */
  4446. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4447. if (ret != 0)
  4448. return ret;
  4449. #endif
  4450. #ifdef HAVE_PK_CALLBACKS
  4451. if (ssl->ctx->X25519KeyGenCb) {
  4452. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  4453. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  4454. }
  4455. else
  4456. #endif
  4457. {
  4458. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  4459. }
  4460. if (ret == 0) {
  4461. ssl->ecdhCurveOID = ECC_X25519_OID;
  4462. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4463. ssl->namedGroup = 0;
  4464. #endif
  4465. }
  4466. /* Handle async pending response */
  4467. #ifdef WOLFSSL_ASYNC_CRYPT
  4468. if (ret == WC_PENDING_E) {
  4469. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4470. }
  4471. #endif /* WOLFSSL_ASYNC_CRYPT */
  4472. WOLFSSL_LEAVE("X25519MakeKey", ret);
  4473. return ret;
  4474. }
  4475. #endif /* HAVE_CURVE25519 */
  4476. #endif /* !WOLFSSL_NO_TLS12 */
  4477. #ifdef HAVE_ED448
  4478. /* Check whether the key contains a public key.
  4479. * If not then pull it out of the leaf certificate.
  4480. *
  4481. * ssl SSL/TLS object.
  4482. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4483. * 0 on success.
  4484. */
  4485. int Ed448CheckPubKey(WOLFSSL* ssl)
  4486. {
  4487. #ifndef HAVE_ED448_KEY_IMPORT
  4488. (void)ssl;
  4489. return NOT_COMPILED_IN;
  4490. #else /* HAVE_ED448_KEY_IMPORT */
  4491. ed448_key* key = (ed448_key*)ssl->hsKey;
  4492. int ret = 0;
  4493. /* Public key required for signing. */
  4494. if (!key->pubKeySet) {
  4495. DerBuffer* leaf = ssl->buffers.certificate;
  4496. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert), ssl->heap,
  4497. DYNAMIC_TYPE_DCERT);
  4498. if (cert == NULL)
  4499. ret = MEMORY_E;
  4500. if (ret == 0) {
  4501. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4502. ret = DecodeToKey(cert, 0);
  4503. }
  4504. if (ret == 0) {
  4505. ret = wc_ed448_import_public(cert->publicKey, cert->pubKeySize,
  4506. key);
  4507. }
  4508. if (cert != NULL) {
  4509. FreeDecodedCert(cert);
  4510. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4511. }
  4512. }
  4513. return ret;
  4514. #endif /* HAVE_ED448_KEY_IMPORT */
  4515. }
  4516. /* Sign the data using EdDSA and key using Ed448.
  4517. *
  4518. * ssl SSL object.
  4519. * in Data or message to sign.
  4520. * inSz Length of the data.
  4521. * out Buffer to hold signature.
  4522. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4523. * key The private Ed448 key data.
  4524. * keySz The length of the private key data in bytes.
  4525. * ctx The callback context.
  4526. * returns 0 on success, otherwise the value is an error.
  4527. */
  4528. int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4529. word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
  4530. {
  4531. #ifndef HAVE_ED448_SIGN
  4532. (void)ssl;
  4533. (void)in;
  4534. (void)inSz;
  4535. (void)out;
  4536. (void)outSz;
  4537. (void)key;
  4538. (void)keyBufInfo;
  4539. return NOT_COMPILED_IN;
  4540. #else /* HAVE_ED448_SIGN */
  4541. int ret;
  4542. #ifdef HAVE_PK_CALLBACKS
  4543. const byte* keyBuf = NULL;
  4544. word32 keySz = 0;
  4545. if (keyBufInfo) {
  4546. keyBuf = keyBufInfo->buffer;
  4547. keySz = keyBufInfo->length;
  4548. }
  4549. #endif
  4550. (void)ssl;
  4551. (void)keyBufInfo;
  4552. WOLFSSL_ENTER("Ed448Sign");
  4553. #ifdef WOLFSSL_ASYNC_CRYPT
  4554. /* initialize event */
  4555. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4556. if (ret != 0)
  4557. return ret;
  4558. #endif
  4559. #if defined(HAVE_PK_CALLBACKS)
  4560. if (ssl->ctx->Ed448SignCb) {
  4561. void* ctx = wolfSSL_GetEd448SignCtx(ssl);
  4562. ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4563. ctx);
  4564. }
  4565. else
  4566. #endif /* HAVE_PK_CALLBACKS */
  4567. {
  4568. ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
  4569. }
  4570. /* Handle async pending response */
  4571. #ifdef WOLFSSL_ASYNC_CRYPT
  4572. if (ret == WC_PENDING_E) {
  4573. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4574. }
  4575. #endif /* WOLFSSL_ASYNC_CRYPT */
  4576. WOLFSSL_LEAVE("Ed448Sign", ret);
  4577. return ret;
  4578. #endif /* HAVE_ED448_SIGN */
  4579. }
  4580. /* Verify the data using EdDSA and key using Ed448.
  4581. *
  4582. * ssl SSL object.
  4583. * in Signature data.
  4584. * inSz Length of the signature data in bytes.
  4585. * msg Message to verify.
  4586. * outSz Length of message in bytes.
  4587. * key The public Ed448 key data.
  4588. * keySz The length of the private key data in bytes.
  4589. * ctx The callback context.
  4590. * returns 0 on success, otherwise the value is an error.
  4591. */
  4592. int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4593. word32 msgSz, ed448_key* key, buffer* keyBufInfo)
  4594. {
  4595. #ifndef HAVE_ED448_VERIFY
  4596. (void)ssl;
  4597. (void)in;
  4598. (void)inSz;
  4599. (void)msg;
  4600. (void)msgSz;
  4601. (void)key;
  4602. (void)keyBufInfo;
  4603. return NOT_COMPILED_IN;
  4604. #else /* HAVE_ED448_VERIFY */
  4605. int ret;
  4606. #ifdef HAVE_PK_CALLBACKS
  4607. const byte* keyBuf = NULL;
  4608. word32 keySz = 0;
  4609. if (keyBufInfo) {
  4610. keyBuf = keyBufInfo->buffer;
  4611. keySz = keyBufInfo->length;
  4612. }
  4613. #endif
  4614. (void)ssl;
  4615. (void)keyBufInfo;
  4616. WOLFSSL_ENTER("Ed448Verify");
  4617. #ifdef WOLFSSL_ASYNC_CRYPT
  4618. /* initialize event */
  4619. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4620. if (ret != 0)
  4621. return ret;
  4622. #endif
  4623. #ifdef HAVE_PK_CALLBACKS
  4624. if (ssl->ctx->Ed448VerifyCb) {
  4625. void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
  4626. ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
  4627. &ssl->eccVerifyRes, ctx);
  4628. }
  4629. else
  4630. #endif /* HAVE_PK_CALLBACKS */
  4631. {
  4632. ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
  4633. NULL, 0);
  4634. }
  4635. /* Handle async pending response */
  4636. #ifdef WOLFSSL_ASYNC_CRYPT
  4637. if (ret == WC_PENDING_E) {
  4638. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4639. }
  4640. else
  4641. #endif /* WOLFSSL_ASYNC_CRYPT */
  4642. {
  4643. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4644. }
  4645. WOLFSSL_LEAVE("Ed448Verify", ret);
  4646. return ret;
  4647. #endif /* HAVE_ED448_VERIFY */
  4648. }
  4649. #endif /* HAVE_ED448 */
  4650. #ifndef WOLFSSL_NO_TLS12
  4651. #ifdef HAVE_CURVE448
  4652. #ifdef HAVE_PK_CALLBACKS
  4653. /* Gets X448 key for shared secret callback testing
  4654. * Client side: returns peer key
  4655. * Server side: returns private key
  4656. */
  4657. static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
  4658. {
  4659. int ret = NO_PEER_KEY;
  4660. struct curve448_key* tmpKey = NULL;
  4661. if (ssl == NULL || otherKey == NULL) {
  4662. return BAD_FUNC_ARG;
  4663. }
  4664. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4665. if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
  4666. return NO_PEER_KEY;
  4667. }
  4668. tmpKey = (struct curve448_key*)ssl->peerX448Key;
  4669. }
  4670. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4671. if (!ssl->eccTempKeyPresent) {
  4672. return NO_PRIVATE_KEY;
  4673. }
  4674. tmpKey = (struct curve448_key*)ssl->eccTempKey;
  4675. }
  4676. if (tmpKey) {
  4677. *otherKey = (curve448_key *)tmpKey;
  4678. ret = 0;
  4679. }
  4680. return ret;
  4681. }
  4682. #endif /* HAVE_PK_CALLBACKS */
  4683. static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
  4684. curve448_key* pub_key, byte* pubKeyDer,
  4685. word32* pubKeySz, byte* out, word32* outlen,
  4686. int side)
  4687. {
  4688. int ret;
  4689. (void)ssl;
  4690. (void)pubKeyDer;
  4691. (void)pubKeySz;
  4692. (void)side;
  4693. WOLFSSL_ENTER("X448SharedSecret");
  4694. #ifdef WOLFSSL_ASYNC_CRYPT
  4695. /* initialize event */
  4696. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4697. if (ret != 0)
  4698. return ret;
  4699. #endif
  4700. #ifdef HAVE_PK_CALLBACKS
  4701. if (ssl->ctx->X448SharedSecretCb) {
  4702. curve448_key* otherKey = NULL;
  4703. ret = X448GetKey(ssl, &otherKey);
  4704. if (ret == 0) {
  4705. void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
  4706. ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
  4707. pubKeySz, out, outlen, side, ctx);
  4708. }
  4709. }
  4710. else
  4711. #endif
  4712. {
  4713. ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
  4714. EC448_LITTLE_ENDIAN);
  4715. }
  4716. /* Handle async pending response */
  4717. #ifdef WOLFSSL_ASYNC_CRYPT
  4718. if (ret == WC_PENDING_E) {
  4719. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4720. }
  4721. #endif /* WOLFSSL_ASYNC_CRYPT */
  4722. WOLFSSL_LEAVE("X448SharedSecret", ret);
  4723. return ret;
  4724. }
  4725. static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
  4726. {
  4727. int ret = 0;
  4728. (void)peer;
  4729. WOLFSSL_ENTER("X448MakeKey");
  4730. #ifdef WOLFSSL_ASYNC_CRYPT
  4731. /* initialize event */
  4732. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4733. if (ret != 0)
  4734. return ret;
  4735. #endif
  4736. #ifdef HAVE_PK_CALLBACKS
  4737. if (ssl->ctx->X448KeyGenCb) {
  4738. void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
  4739. ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
  4740. }
  4741. else
  4742. #endif
  4743. {
  4744. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  4745. }
  4746. if (ret == 0) {
  4747. ssl->ecdhCurveOID = ECC_X448_OID;
  4748. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4749. ssl->namedGroup = 0;
  4750. #endif
  4751. }
  4752. /* Handle async pending response */
  4753. #ifdef WOLFSSL_ASYNC_CRYPT
  4754. if (ret == WC_PENDING_E) {
  4755. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4756. }
  4757. #endif /* WOLFSSL_ASYNC_CRYPT */
  4758. WOLFSSL_LEAVE("X448MakeKey", ret);
  4759. return ret;
  4760. }
  4761. #endif /* HAVE_CURVE448 */
  4762. #endif /* !WOLFSSL_NO_TLS12 */
  4763. #if !defined(NO_CERTS) || !defined(NO_PSK)
  4764. #if !defined(NO_DH)
  4765. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  4766. byte* priv, word32* privSz,
  4767. byte* pub, word32* pubSz)
  4768. {
  4769. int ret;
  4770. WOLFSSL_ENTER("DhGenKeyPair");
  4771. #ifdef WOLFSSL_ASYNC_CRYPT
  4772. /* initialize event */
  4773. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4774. if (ret != 0)
  4775. return ret;
  4776. #endif
  4777. PRIVATE_KEY_UNLOCK();
  4778. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  4779. PRIVATE_KEY_LOCK();
  4780. /* Handle async pending response */
  4781. #ifdef WOLFSSL_ASYNC_CRYPT
  4782. if (ret == WC_PENDING_E) {
  4783. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  4784. }
  4785. #endif /* WOLFSSL_ASYNC_CRYPT */
  4786. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  4787. return ret;
  4788. }
  4789. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  4790. const byte* priv, word32 privSz,
  4791. const byte* otherPub, word32 otherPubSz,
  4792. byte* agree, word32* agreeSz,
  4793. const byte* prime, word32 primeSz)
  4794. {
  4795. int ret;
  4796. (void)ssl;
  4797. WOLFSSL_ENTER("DhAgree");
  4798. #ifdef WOLFSSL_ASYNC_CRYPT
  4799. /* initialize event */
  4800. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4801. if (ret != 0)
  4802. return ret;
  4803. #endif
  4804. #ifdef HAVE_PK_CALLBACKS
  4805. if (ssl->ctx->DhAgreeCb) {
  4806. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  4807. WOLFSSL_MSG("Calling DhAgree Callback Function");
  4808. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  4809. otherPub, otherPubSz, agree, agreeSz, ctx);
  4810. }
  4811. else
  4812. #endif
  4813. {
  4814. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  4815. /* check the public key has valid number */
  4816. if (dhKey != NULL && (prime == NULL || primeSz == 0)) {
  4817. /* wc_DhCheckPubKey does not do exponentiation */
  4818. ret = wc_DhCheckPubKey(dhKey, otherPub, otherPubSz);
  4819. }
  4820. else {
  4821. ret = wc_DhCheckPubValue(prime, primeSz, otherPub, otherPubSz);
  4822. }
  4823. if (ret != 0) {
  4824. /* translate to valid error (wc_DhCheckPubValue returns MP_VAL -1) */
  4825. ret = PEER_KEY_ERROR;
  4826. #ifdef OPENSSL_EXTRA
  4827. SendAlert(ssl, alert_fatal, illegal_parameter);
  4828. #endif
  4829. }
  4830. else
  4831. #endif
  4832. {
  4833. PRIVATE_KEY_UNLOCK();
  4834. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  4835. otherPubSz);
  4836. PRIVATE_KEY_LOCK();
  4837. }
  4838. }
  4839. /* Handle async pending response */
  4840. #ifdef WOLFSSL_ASYNC_CRYPT
  4841. if (ret == WC_PENDING_E) {
  4842. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  4843. }
  4844. #endif /* WOLFSSL_ASYNC_CRYPT */
  4845. WOLFSSL_LEAVE("DhAgree", ret);
  4846. (void)prime;
  4847. (void)primeSz;
  4848. return ret;
  4849. }
  4850. #endif /* !NO_DH */
  4851. #endif /* !NO_CERTS || !NO_PSK */
  4852. #ifdef HAVE_PK_CALLBACKS
  4853. int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
  4854. {
  4855. int pkcbset = 0;
  4856. (void)ssl;
  4857. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  4858. !defined(NO_RSA)
  4859. if (0
  4860. #ifdef HAVE_ECC
  4861. || (ssl->ctx->EccSignCb != NULL &&
  4862. ssl->buffers.keyType == ecc_dsa_sa_algo)
  4863. #endif
  4864. #ifdef HAVE_ED25519
  4865. || (ssl->ctx->Ed25519SignCb != NULL &&
  4866. ssl->buffers.keyType == ed25519_sa_algo)
  4867. #endif
  4868. #ifdef HAVE_ED448
  4869. || (ssl->ctx->Ed448SignCb != NULL &&
  4870. ssl->buffers.keyType == ed448_sa_algo)
  4871. #endif
  4872. #ifndef NO_RSA
  4873. || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
  4874. || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
  4875. #ifdef WC_RSA_PSS
  4876. || (ssl->ctx->RsaPssSignCb != NULL &&
  4877. ssl->buffers.keyType == rsa_pss_sa_algo)
  4878. #endif
  4879. #endif
  4880. ) {
  4881. pkcbset = 1;
  4882. }
  4883. #endif
  4884. return pkcbset;
  4885. }
  4886. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  4887. {
  4888. int pkcbset = 0;
  4889. (void)ctx;
  4890. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  4891. !defined(NO_RSA)
  4892. if (0
  4893. #ifdef HAVE_ECC
  4894. || ctx->EccSignCb != NULL
  4895. #endif
  4896. #ifdef HAVE_ED25519
  4897. || ctx->Ed25519SignCb != NULL
  4898. #endif
  4899. #ifdef HAVE_ED448
  4900. || ctx->Ed448SignCb != NULL
  4901. #endif
  4902. #ifndef NO_RSA
  4903. || ctx->RsaSignCb != NULL
  4904. || ctx->RsaDecCb != NULL
  4905. #ifdef WC_RSA_PSS
  4906. || ctx->RsaPssSignCb != NULL
  4907. #endif
  4908. #endif
  4909. ) {
  4910. pkcbset = 1;
  4911. }
  4912. #endif
  4913. return pkcbset;
  4914. }
  4915. #endif /* HAVE_PK_CALLBACKS */
  4916. int InitSSL_Suites(WOLFSSL* ssl)
  4917. {
  4918. int keySz = 0;
  4919. byte havePSK = 0;
  4920. byte haveAnon = 0;
  4921. byte haveRSA = 0;
  4922. byte haveMcast = 0;
  4923. (void)haveAnon; /* Squash unused var warnings */
  4924. (void)haveMcast;
  4925. if (!ssl)
  4926. return BAD_FUNC_ARG;
  4927. #ifndef NO_RSA
  4928. haveRSA = 1;
  4929. #endif
  4930. #ifndef NO_PSK
  4931. havePSK = (byte)ssl->options.havePSK;
  4932. #endif /* NO_PSK */
  4933. #ifdef HAVE_ANON
  4934. haveAnon = (byte)ssl->options.haveAnon;
  4935. #endif /* HAVE_ANON*/
  4936. #ifdef WOLFSSL_MULTICAST
  4937. haveMcast = (byte)ssl->options.haveMcast;
  4938. #endif /* WOLFSSL_MULTICAST */
  4939. #ifdef WOLFSSL_EARLY_DATA
  4940. if (ssl->options.side == WOLFSSL_SERVER_END)
  4941. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  4942. #endif
  4943. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  4944. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  4945. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  4946. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  4947. ssl->buffers.keyType == ed25519_sa_algo ||
  4948. ssl->buffers.keyType == ed448_sa_algo;
  4949. #endif
  4950. #ifndef NO_CERTS
  4951. keySz = ssl->buffers.keySz;
  4952. #endif
  4953. /* make sure server has DH parms, and add PSK if there */
  4954. if (ssl->options.side == WOLFSSL_SERVER_END) {
  4955. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  4956. ssl->options.haveDH, ssl->options.haveECDSAsig,
  4957. ssl->options.haveECC, ssl->options.haveStaticECC,
  4958. ssl->options.haveAnon, ssl->options.side);
  4959. }
  4960. else {
  4961. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, TRUE,
  4962. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4963. ssl->options.haveStaticECC, ssl->options.haveAnon,
  4964. ssl->options.side);
  4965. }
  4966. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  4967. /* make sure server has cert and key unless using PSK, Anon, or
  4968. * Multicast. This should be true even if just switching ssl ctx */
  4969. if (ssl->options.side == WOLFSSL_SERVER_END &&
  4970. !havePSK && !haveAnon && !haveMcast) {
  4971. /* server certificate must be loaded */
  4972. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  4973. WOLFSSL_MSG("Server missing certificate");
  4974. return NO_PRIVATE_KEY;
  4975. }
  4976. /* allow no private key if using PK callbacks and CB is set */
  4977. #ifdef HAVE_PK_CALLBACKS
  4978. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  4979. WOLFSSL_MSG("Using PK for server private key");
  4980. }
  4981. else
  4982. #endif
  4983. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  4984. WOLFSSL_MSG("Server missing private key");
  4985. return NO_PRIVATE_KEY;
  4986. }
  4987. }
  4988. #endif
  4989. return WOLFSSL_SUCCESS;
  4990. }
  4991. /* returns new reference count. Arg incr positive=up or negative=down */
  4992. int SSL_CTX_RefCount(WOLFSSL_CTX* ctx, int incr)
  4993. {
  4994. int refCount;
  4995. if (ctx == NULL) {
  4996. return BAD_FUNC_ARG;
  4997. }
  4998. if (wc_LockMutex(&ctx->countMutex) != 0) {
  4999. WOLFSSL_MSG("Couldn't lock CTX count mutex");
  5000. return BAD_MUTEX_E;
  5001. }
  5002. ctx->refCount += incr;
  5003. /* make sure refCount is never negative */
  5004. if (ctx->refCount < 0) {
  5005. ctx->refCount = 0;
  5006. }
  5007. refCount = ctx->refCount;
  5008. wc_UnLockMutex(&ctx->countMutex);
  5009. return refCount;
  5010. }
  5011. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  5012. It is used during initialization and to switch an ssl's CTX with
  5013. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  5014. unless writeDup is on.
  5015. ssl object to initialize
  5016. ctx parent factory
  5017. writeDup flag indicating this is a write dup only
  5018. WOLFSSL_SUCCESS return value on success */
  5019. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5020. {
  5021. int ret;
  5022. byte newSSL;
  5023. if (!ssl || !ctx)
  5024. return BAD_FUNC_ARG;
  5025. #ifndef SINGLE_THREADED
  5026. if (ssl->suites == NULL && !writeDup)
  5027. return BAD_FUNC_ARG;
  5028. #endif
  5029. newSSL = ssl->ctx == NULL; /* Assign after null check */
  5030. #ifndef NO_PSK
  5031. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  5032. return BAD_FUNC_ARG; /* needed for copy below */
  5033. }
  5034. #endif
  5035. /* decrement previous CTX reference count if exists.
  5036. * This should only happen if switching ctxs!*/
  5037. if (!newSSL) {
  5038. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  5039. wolfSSL_CTX_free(ssl->ctx);
  5040. }
  5041. /* increment CTX reference count */
  5042. if ((ret = SSL_CTX_RefCount(ctx, 1)) < 0) {
  5043. return ret;
  5044. }
  5045. ret = WOLFSSL_SUCCESS; /* set default ret */
  5046. ssl->ctx = ctx; /* only for passing to calls, options could change */
  5047. ssl->version = ctx->method->version;
  5048. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  5049. ssl->options.mask = ctx->mask;
  5050. #endif
  5051. #ifdef OPENSSL_EXTRA
  5052. #ifdef WOLFSSL_TLS13
  5053. if (ssl->version.minor == TLSv1_3_MINOR &&
  5054. (ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  5055. if (!ctx->method->downgrade) {
  5056. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
  5057. "allowed and downgrading disabled.");
  5058. return VERSION_ERROR;
  5059. }
  5060. WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
  5061. ssl->version.minor = TLSv1_2_MINOR;
  5062. }
  5063. #endif
  5064. if (ssl->version.minor == TLSv1_2_MINOR &&
  5065. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  5066. if (!ctx->method->downgrade) {
  5067. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
  5068. "allowed and downgrading disabled.");
  5069. return VERSION_ERROR;
  5070. }
  5071. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  5072. ssl->version.minor = TLSv1_1_MINOR;
  5073. }
  5074. if (ssl->version.minor == TLSv1_1_MINOR &&
  5075. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  5076. if (!ctx->method->downgrade) {
  5077. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
  5078. "allowed and downgrading disabled.");
  5079. return VERSION_ERROR;
  5080. }
  5081. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  5082. ssl->options.tls1_1 = 0;
  5083. ssl->version.minor = TLSv1_MINOR;
  5084. }
  5085. if (ssl->version.minor == TLSv1_MINOR &&
  5086. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  5087. if (!ctx->method->downgrade) {
  5088. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
  5089. "allowed and downgrading disabled.");
  5090. return VERSION_ERROR;
  5091. }
  5092. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  5093. ssl->options.tls = 0;
  5094. ssl->options.tls1_1 = 0;
  5095. ssl->version.minor = SSLv3_MINOR;
  5096. }
  5097. if (ssl->version.minor == SSLv3_MINOR &&
  5098. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  5099. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  5100. return VERSION_ERROR;
  5101. }
  5102. if (ssl->version.minor < ssl->options.minDowngrade) {
  5103. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  5104. return VERSION_ERROR;
  5105. }
  5106. #endif
  5107. #ifdef HAVE_ECC
  5108. ssl->eccTempKeySz = ctx->eccTempKeySz;
  5109. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  5110. #endif
  5111. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  5112. ssl->pkCurveOID = ctx->pkCurveOID;
  5113. #endif
  5114. #ifdef OPENSSL_EXTRA
  5115. ssl->CBIS = ctx->CBIS;
  5116. #endif
  5117. ssl->timeout = ctx->timeout;
  5118. ssl->verifyCallback = ctx->verifyCallback;
  5119. ssl->options.side = ctx->method->side;
  5120. ssl->options.downgrade = ctx->method->downgrade;
  5121. ssl->options.minDowngrade = ctx->minDowngrade;
  5122. ssl->options.haveDH = ctx->haveDH;
  5123. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  5124. ssl->options.haveECC = ctx->haveECC;
  5125. ssl->options.haveStaticECC = ctx->haveStaticECC;
  5126. #ifndef NO_PSK
  5127. ssl->options.havePSK = ctx->havePSK;
  5128. ssl->options.client_psk_cb = ctx->client_psk_cb;
  5129. ssl->options.server_psk_cb = ctx->server_psk_cb;
  5130. ssl->options.psk_ctx = ctx->psk_ctx;
  5131. #ifdef WOLFSSL_TLS13
  5132. ssl->options.client_psk_cs_cb = ctx->client_psk_cs_cb;
  5133. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  5134. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  5135. #endif
  5136. #endif /* NO_PSK */
  5137. #ifdef WOLFSSL_EARLY_DATA
  5138. if (ssl->options.side == WOLFSSL_SERVER_END)
  5139. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  5140. #endif
  5141. #ifdef HAVE_ANON
  5142. ssl->options.haveAnon = ctx->haveAnon;
  5143. #endif
  5144. #ifndef NO_DH
  5145. ssl->options.minDhKeySz = ctx->minDhKeySz;
  5146. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  5147. #endif
  5148. #ifndef NO_RSA
  5149. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  5150. #endif
  5151. #ifdef HAVE_ECC
  5152. ssl->options.minEccKeySz = ctx->minEccKeySz;
  5153. #endif
  5154. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  5155. ssl->options.verifyDepth = ctx->verifyDepth;
  5156. #endif
  5157. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  5158. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  5159. #ifdef HAVE_EXT_CACHE
  5160. ssl->options.internalCacheOff = ctx->internalCacheOff;
  5161. #endif
  5162. ssl->options.verifyPeer = ctx->verifyPeer;
  5163. ssl->options.verifyNone = ctx->verifyNone;
  5164. ssl->options.failNoCert = ctx->failNoCert;
  5165. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  5166. ssl->options.sendVerify = ctx->sendVerify;
  5167. ssl->options.partialWrite = ctx->partialWrite;
  5168. ssl->options.quietShutdown = ctx->quietShutdown;
  5169. ssl->options.groupMessages = ctx->groupMessages;
  5170. #ifndef NO_DH
  5171. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5172. !defined(HAVE_SELFTEST)
  5173. ssl->options.dhKeyTested = ctx->dhKeyTested;
  5174. #endif
  5175. ssl->buffers.serverDH_P = ctx->serverDH_P;
  5176. ssl->buffers.serverDH_G = ctx->serverDH_G;
  5177. #endif
  5178. #ifndef NO_CERTS
  5179. /* ctx still owns certificate, certChain, key, dh, and cm */
  5180. ssl->buffers.certificate = ctx->certificate;
  5181. ssl->buffers.certChain = ctx->certChain;
  5182. #ifdef WOLFSSL_TLS13
  5183. ssl->buffers.certChainCnt = ctx->certChainCnt;
  5184. #endif
  5185. ssl->buffers.key = ctx->privateKey;
  5186. ssl->buffers.keyType = ctx->privateKeyType;
  5187. ssl->buffers.keyId = ctx->privateKeyId;
  5188. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  5189. ssl->buffers.keySz = ctx->privateKeySz;
  5190. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  5191. #endif
  5192. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5193. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5194. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5195. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5196. ssl->buffers.keyType == ed25519_sa_algo ||
  5197. ssl->buffers.keyType == ed448_sa_algo;
  5198. #endif
  5199. #ifdef WOLFSSL_ASYNC_CRYPT
  5200. ssl->devId = ctx->devId;
  5201. #endif
  5202. if (writeDup == 0) {
  5203. #ifndef NO_PSK
  5204. if (ctx->server_hint[0]) { /* set in CTX */
  5205. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  5206. sizeof(ssl->arrays->server_hint));
  5207. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  5208. }
  5209. #endif /* NO_PSK */
  5210. if (ctx->suites) {
  5211. #ifndef SINGLE_THREADED
  5212. *ssl->suites = *ctx->suites;
  5213. #else
  5214. ssl->suites = ctx->suites;
  5215. #endif
  5216. }
  5217. else {
  5218. XMEMSET(ssl->suites, 0, sizeof(Suites));
  5219. }
  5220. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  5221. /* Defer initializing suites until accept or connect */
  5222. ret = InitSSL_Suites(ssl);
  5223. }
  5224. } /* writeDup check */
  5225. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  5226. if (ctx->mask != 0 && wolfSSL_set_options(ssl, ctx->mask) == 0) {
  5227. WOLFSSL_MSG("wolfSSL_set_options error");
  5228. return BAD_FUNC_ARG;
  5229. }
  5230. #endif
  5231. #ifdef WOLFSSL_SESSION_EXPORT
  5232. #ifdef WOLFSSL_DTLS
  5233. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  5234. #endif
  5235. #endif
  5236. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  5237. ssl->AcceptFilter = ctx->AcceptFilter;
  5238. ssl->AcceptFilter_arg = ctx->AcceptFilter_arg;
  5239. ssl->ConnectFilter = ctx->ConnectFilter;
  5240. ssl->ConnectFilter_arg = ctx->ConnectFilter_arg;
  5241. #endif
  5242. #ifdef OPENSSL_EXTRA
  5243. ssl->readAhead = ctx->readAhead;
  5244. #endif
  5245. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5246. /* Don't change recv callback if currently using BIO's */
  5247. if (ssl->CBIORecv != BioReceive)
  5248. #endif
  5249. ssl->CBIORecv = ctx->CBIORecv;
  5250. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5251. /* Don't change send callback if currently using BIO's */
  5252. if (ssl->CBIOSend != BioSend)
  5253. #endif
  5254. ssl->CBIOSend = ctx->CBIOSend;
  5255. ssl->verifyDepth = ctx->verifyDepth;
  5256. return ret;
  5257. }
  5258. int InitHandshakeHashes(WOLFSSL* ssl)
  5259. {
  5260. int ret;
  5261. /* make sure existing handshake hashes are free'd */
  5262. if (ssl->hsHashes != NULL) {
  5263. FreeHandshakeHashes(ssl);
  5264. }
  5265. /* allocate handshake hashes */
  5266. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  5267. DYNAMIC_TYPE_HASHES);
  5268. if (ssl->hsHashes == NULL) {
  5269. WOLFSSL_MSG("HS_Hashes Memory error");
  5270. return MEMORY_E;
  5271. }
  5272. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  5273. #ifndef NO_OLD_TLS
  5274. #ifndef NO_MD5
  5275. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  5276. if (ret != 0)
  5277. return ret;
  5278. #ifdef WOLFSSL_HASH_FLAGS
  5279. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  5280. #endif
  5281. #endif
  5282. #ifndef NO_SHA
  5283. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  5284. if (ret != 0)
  5285. return ret;
  5286. #ifdef WOLFSSL_HASH_FLAGS
  5287. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  5288. #endif
  5289. #endif
  5290. #endif /* !NO_OLD_TLS */
  5291. #ifndef NO_SHA256
  5292. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  5293. if (ret != 0)
  5294. return ret;
  5295. #ifdef WOLFSSL_HASH_FLAGS
  5296. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  5297. #endif
  5298. #endif
  5299. #ifdef WOLFSSL_SHA384
  5300. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  5301. if (ret != 0)
  5302. return ret;
  5303. #ifdef WOLFSSL_HASH_FLAGS
  5304. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  5305. #endif
  5306. #endif
  5307. #ifdef WOLFSSL_SHA512
  5308. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  5309. if (ret != 0)
  5310. return ret;
  5311. #ifdef WOLFSSL_HASH_FLAGS
  5312. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  5313. #endif
  5314. #endif
  5315. return ret;
  5316. }
  5317. void FreeHandshakeHashes(WOLFSSL* ssl)
  5318. {
  5319. if (ssl->hsHashes) {
  5320. #ifndef NO_OLD_TLS
  5321. #ifndef NO_MD5
  5322. wc_Md5Free(&ssl->hsHashes->hashMd5);
  5323. #endif
  5324. #ifndef NO_SHA
  5325. wc_ShaFree(&ssl->hsHashes->hashSha);
  5326. #endif
  5327. #endif /* !NO_OLD_TLS */
  5328. #ifndef NO_SHA256
  5329. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  5330. #endif
  5331. #ifdef WOLFSSL_SHA384
  5332. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  5333. #endif
  5334. #ifdef WOLFSSL_SHA512
  5335. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  5336. #endif
  5337. #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \
  5338. !defined(WOLFSSL_NO_CLIENT_AUTH)
  5339. if (ssl->hsHashes->messages != NULL) {
  5340. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  5341. ssl->hsHashes->messages = NULL;
  5342. }
  5343. #endif
  5344. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  5345. ssl->hsHashes = NULL;
  5346. }
  5347. }
  5348. /* init everything to 0, NULL, default values before calling anything that may
  5349. fail so that destructor has a "good" state to cleanup
  5350. ssl object to initialize
  5351. ctx parent factory
  5352. writeDup flag indicating this is a write dup only
  5353. 0 on success */
  5354. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5355. {
  5356. int ret;
  5357. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  5358. #if defined(WOLFSSL_STATIC_MEMORY)
  5359. if (ctx->heap != NULL) {
  5360. WOLFSSL_HEAP_HINT* ssl_hint;
  5361. WOLFSSL_HEAP_HINT* ctx_hint;
  5362. /* avoid dereferencing a test value */
  5363. #ifdef WOLFSSL_HEAP_TEST
  5364. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  5365. ssl->heap = ctx->heap;
  5366. }
  5367. else {
  5368. #endif
  5369. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  5370. ctx->heap, DYNAMIC_TYPE_SSL);
  5371. if (ssl->heap == NULL) {
  5372. return MEMORY_E;
  5373. }
  5374. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  5375. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  5376. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  5377. /* lock and check IO count / handshake count */
  5378. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5379. WOLFSSL_MSG("Bad memory_mutex lock");
  5380. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5381. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5382. return BAD_MUTEX_E;
  5383. }
  5384. if (ctx_hint->memory->maxHa > 0 &&
  5385. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  5386. WOLFSSL_MSG("At max number of handshakes for static memory");
  5387. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5388. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5389. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5390. return MEMORY_E;
  5391. }
  5392. if (ctx_hint->memory->maxIO > 0 &&
  5393. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  5394. WOLFSSL_MSG("At max number of IO allowed for static memory");
  5395. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5396. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5397. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5398. return MEMORY_E;
  5399. }
  5400. ctx_hint->memory->curIO++;
  5401. ctx_hint->memory->curHa++;
  5402. ssl_hint->memory = ctx_hint->memory;
  5403. ssl_hint->haFlag = 1;
  5404. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5405. /* check if tracking stats */
  5406. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  5407. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  5408. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  5409. if (ssl_hint->stats == NULL) {
  5410. return MEMORY_E;
  5411. }
  5412. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  5413. }
  5414. /* check if using fixed IO buffers */
  5415. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  5416. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5417. WOLFSSL_MSG("Bad memory_mutex lock");
  5418. return BAD_MUTEX_E;
  5419. }
  5420. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  5421. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5422. return MEMORY_E;
  5423. }
  5424. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  5425. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5426. return MEMORY_E;
  5427. }
  5428. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  5429. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  5430. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5431. return MEMORY_E;
  5432. }
  5433. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5434. }
  5435. #ifdef WOLFSSL_HEAP_TEST
  5436. }
  5437. #endif
  5438. }
  5439. else {
  5440. ssl->heap = ctx->heap;
  5441. }
  5442. #else
  5443. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  5444. #endif /* WOLFSSL_STATIC_MEMORY */
  5445. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  5446. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5447. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  5448. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5449. #ifdef KEEP_PEER_CERT
  5450. InitX509(&ssl->peerCert, 0, ssl->heap);
  5451. #endif
  5452. ssl->rfd = -1; /* set to invalid descriptor */
  5453. ssl->wfd = -1;
  5454. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  5455. #ifdef HAVE_NETX
  5456. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  5457. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  5458. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  5459. ssl->mnCtx = mynewt_ctx_new();
  5460. if(!ssl->mnCtx) {
  5461. return MEMORY_E;
  5462. }
  5463. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  5464. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  5465. #elif defined (WOLFSSL_GNRC)
  5466. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  5467. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  5468. #else
  5469. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  5470. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  5471. #endif
  5472. /* initialize states */
  5473. ssl->options.serverState = NULL_STATE;
  5474. ssl->options.clientState = NULL_STATE;
  5475. ssl->options.connectState = CONNECT_BEGIN;
  5476. ssl->options.acceptState = ACCEPT_BEGIN;
  5477. ssl->options.handShakeState = NULL_STATE;
  5478. ssl->options.processReply = doProcessInit;
  5479. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  5480. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  5481. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  5482. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  5483. #ifndef NO_DH
  5484. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5485. !defined(HAVE_SELFTEST)
  5486. ssl->options.dhDoKeyTest = 1;
  5487. #endif
  5488. #endif
  5489. #ifdef WOLFSSL_DTLS
  5490. #ifdef WOLFSSL_SCTP
  5491. ssl->options.dtlsSctp = ctx->dtlsSctp;
  5492. #endif
  5493. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  5494. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  5495. /* Add some bytes so that we can operate with slight difference
  5496. * in set MTU size on each peer */
  5497. ssl->dtls_expected_rx = ssl->dtlsMtuSz +
  5498. DTLS_MTU_ADDITIONAL_READ_BUFFER;
  5499. #else
  5500. ssl->dtls_expected_rx = MAX_MTU;
  5501. #endif
  5502. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  5503. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  5504. ssl->dtls_timeout = ssl->dtls_timeout_init;
  5505. ssl->buffers.dtlsCtx.rfd = -1;
  5506. ssl->buffers.dtlsCtx.wfd = -1;
  5507. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx; /* prevent invalid pointer access if not */
  5508. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx; /* correctly set */
  5509. #endif
  5510. #ifndef WOLFSSL_AEAD_ONLY
  5511. #ifndef NO_OLD_TLS
  5512. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  5513. #elif !defined(WOLFSSL_NO_TLS12)
  5514. ssl->hmac = TLS_hmac;
  5515. #endif
  5516. #endif
  5517. #if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
  5518. /* Save arrays by default for OpenVPN */
  5519. ssl->options.saveArrays = 1;
  5520. #endif
  5521. ssl->cipher.ssl = ssl;
  5522. #ifdef HAVE_EXTENDED_MASTER
  5523. ssl->options.haveEMS = ctx->haveEMS;
  5524. #endif
  5525. ssl->options.useClientOrder = ctx->useClientOrder;
  5526. ssl->options.mutualAuth = ctx->mutualAuth;
  5527. #ifdef WOLFSSL_STATIC_EPHEMERAL
  5528. XMEMCPY(&ssl->staticKE, &ctx->staticKE, sizeof(StaticKeyExchangeInfo_t));
  5529. #ifdef HAVE_ECC
  5530. ssl->staticKE.weOwnEC = 0;
  5531. #endif
  5532. #ifndef NO_DH
  5533. ssl->staticKE.weOwnDH = 0;
  5534. #endif
  5535. #ifdef HAVE_CURVE25519
  5536. ssl->staticKE.weOwnX25519 = 0;
  5537. #endif
  5538. #endif
  5539. #ifdef WOLFSSL_TLS13
  5540. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  5541. ssl->options.maxTicketTls13 = ctx->maxTicketTls13;
  5542. #endif
  5543. #ifdef HAVE_SESSION_TICKET
  5544. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  5545. #endif
  5546. ssl->options.noPskDheKe = ctx->noPskDheKe;
  5547. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5548. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  5549. ssl->options.verifyPostHandshake = ctx->verifyPostHandshake;
  5550. #endif
  5551. if (ctx->numGroups > 0) {
  5552. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  5553. ssl->numGroups = ctx->numGroups;
  5554. }
  5555. #endif
  5556. #ifdef HAVE_TLS_EXTENSIONS
  5557. #ifdef HAVE_MAX_FRAGMENT
  5558. ssl->max_fragment = MAX_RECORD_SIZE;
  5559. #endif
  5560. #ifdef HAVE_ALPN
  5561. ssl->alpn_client_list = NULL;
  5562. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  5563. ssl->alpnSelect = ctx->alpnSelect;
  5564. ssl->alpnSelectArg = ctx->alpnSelectArg;
  5565. #endif
  5566. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  5567. if (ctx->alpn_cli_protos != NULL && ctx->alpn_cli_protos_len > 0) {
  5568. ret = wolfSSL_set_alpn_protos(ssl, ctx->alpn_cli_protos,
  5569. ctx->alpn_cli_protos_len);
  5570. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  5571. if (ret) {
  5572. #else
  5573. if (!ret) {
  5574. #endif
  5575. WOLFSSL_MSG("failed to set alpn protos to ssl object");
  5576. return ret;
  5577. }
  5578. }
  5579. #endif
  5580. #endif
  5581. #ifdef HAVE_SUPPORTED_CURVES
  5582. ssl->options.userCurves = ctx->userCurves;
  5583. #endif
  5584. #endif /* HAVE_TLS_EXTENSIONS */
  5585. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  5586. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  5587. #endif
  5588. /* default alert state (none) */
  5589. ssl->alert_history.last_rx.code = -1;
  5590. ssl->alert_history.last_rx.level = -1;
  5591. ssl->alert_history.last_tx.code = -1;
  5592. ssl->alert_history.last_tx.level = -1;
  5593. #ifdef OPENSSL_EXTRA
  5594. /* copy over application session context ID */
  5595. ssl->sessionCtxSz = ctx->sessionCtxSz;
  5596. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  5597. ssl->cbioFlag = ctx->cbioFlag;
  5598. ssl->protoMsgCb = ctx->protoMsgCb;
  5599. ssl->protoMsgCtx = ctx->protoMsgCtx;
  5600. /* follow default behavior of setting toInfoOn similar to
  5601. * wolfSSL_set_msg_callback when the callback is set */
  5602. if (ctx->protoMsgCb != NULL) {
  5603. ssl->toInfoOn = 1;
  5604. }
  5605. #endif
  5606. InitCiphers(ssl);
  5607. InitCipherSpecs(&ssl->specs);
  5608. /* all done with init, now can return errors, call other stuff */
  5609. if (!writeDup) {
  5610. /* arrays */
  5611. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  5612. DYNAMIC_TYPE_ARRAYS);
  5613. if (ssl->arrays == NULL) {
  5614. WOLFSSL_MSG("Arrays Memory error");
  5615. return MEMORY_E;
  5616. }
  5617. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  5618. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  5619. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  5620. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  5621. DYNAMIC_TYPE_SECRET);
  5622. if (ssl->arrays->preMasterSecret == NULL) {
  5623. return MEMORY_E;
  5624. }
  5625. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  5626. #endif
  5627. #ifdef OPENSSL_EXTRA
  5628. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  5629. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  5630. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  5631. WOLFSSL_MSG("ssl->param memory error");
  5632. return MEMORY_E;
  5633. }
  5634. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  5635. #endif
  5636. #ifdef SINGLE_THREADED
  5637. if (ctx->suites == NULL)
  5638. #endif
  5639. {
  5640. /* suites */
  5641. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  5642. DYNAMIC_TYPE_SUITES);
  5643. if (ssl->suites == NULL) {
  5644. WOLFSSL_MSG("Suites Memory error");
  5645. return MEMORY_E;
  5646. }
  5647. #ifdef OPENSSL_ALL
  5648. ssl->suites->stack = NULL;
  5649. #endif
  5650. #ifdef SINGLE_THREADED
  5651. ssl->options.ownSuites = 1;
  5652. #endif
  5653. }
  5654. #ifdef SINGLE_THREADED
  5655. else {
  5656. ssl->options.ownSuites = 0;
  5657. }
  5658. #endif
  5659. }
  5660. /* Initialize SSL with the appropriate fields from it's ctx */
  5661. /* requires valid arrays and suites unless writeDup ing */
  5662. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS)
  5663. return ret;
  5664. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  5665. #ifdef SINGLE_THREADED
  5666. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  5667. #endif
  5668. if (ssl->rng == NULL) {
  5669. /* RNG */
  5670. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  5671. if (ssl->rng == NULL) {
  5672. WOLFSSL_MSG("RNG Memory error");
  5673. return MEMORY_E;
  5674. }
  5675. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  5676. ssl->options.weOwnRng = 1;
  5677. /* FIPS RNG API does not accept a heap hint */
  5678. #ifndef HAVE_FIPS
  5679. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  5680. WOLFSSL_MSG("RNG Init error");
  5681. return ret;
  5682. }
  5683. #else
  5684. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  5685. WOLFSSL_MSG("RNG Init error");
  5686. return ret;
  5687. }
  5688. #endif
  5689. }
  5690. #ifdef HAVE_WRITE_DUP
  5691. if (writeDup) {
  5692. /* all done */
  5693. return 0;
  5694. }
  5695. #endif
  5696. /* hsHashes */
  5697. ret = InitHandshakeHashes(ssl);
  5698. if (ret != 0)
  5699. return ret;
  5700. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  5701. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  5702. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  5703. if (ret != 0) {
  5704. WOLFSSL_MSG("DTLS Cookie Secret error");
  5705. return ret;
  5706. }
  5707. }
  5708. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  5709. #ifdef HAVE_SECRET_CALLBACK
  5710. ssl->sessionSecretCb = NULL;
  5711. ssl->sessionSecretCtx = NULL;
  5712. #ifdef WOLFSSL_TLS13
  5713. ssl->tls13SecretCb = NULL;
  5714. ssl->tls13SecretCtx = NULL;
  5715. #endif
  5716. #endif
  5717. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  5718. if (ctx->keyLogCb != NULL) {
  5719. ssl->keyLogCb = SessionSecret_callback;
  5720. #if defined(WOLFSSL_TLS13)
  5721. ssl->tls13KeyLogCb = SessionSecret_callback_Tls13;
  5722. #endif /*WOLFSSL_TLS13*/
  5723. }
  5724. #endif /*OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  5725. #ifdef HAVE_SESSION_TICKET
  5726. ssl->options.noTicketTls12 = ctx->noTicketTls12;
  5727. ssl->session.ticket = ssl->session.staticTicket;
  5728. #endif
  5729. #ifdef WOLFSSL_MULTICAST
  5730. if (ctx->haveMcast) {
  5731. int i;
  5732. ssl->options.haveMcast = 1;
  5733. ssl->options.mcastID = ctx->mcastID;
  5734. /* Force the state to look like handshake has completed. */
  5735. /* Keying material is supplied externally. */
  5736. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  5737. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  5738. ssl->options.connectState = SECOND_REPLY_DONE;
  5739. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  5740. ssl->options.handShakeState = HANDSHAKE_DONE;
  5741. ssl->options.handShakeDone = 1;
  5742. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  5743. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  5744. }
  5745. #endif
  5746. #ifdef HAVE_SECURE_RENEGOTIATION
  5747. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5748. int useSecureReneg = ssl->ctx->useSecureReneg;
  5749. /* use secure renegotiation by default (not recommend) */
  5750. #ifdef WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT
  5751. useSecureReneg = 1;
  5752. #endif
  5753. if (useSecureReneg) {
  5754. ret = wolfSSL_UseSecureRenegotiation(ssl);
  5755. if (ret != WOLFSSL_SUCCESS)
  5756. return ret;
  5757. }
  5758. }
  5759. #endif /* HAVE_SECURE_RENEGOTIATION */
  5760. return 0;
  5761. }
  5762. /* free use of temporary arrays */
  5763. void FreeArrays(WOLFSSL* ssl, int keep)
  5764. {
  5765. if (ssl->arrays) {
  5766. if (keep) {
  5767. /* keeps session id for user retrieval */
  5768. XMEMCPY(ssl->session.sessionID, ssl->arrays->sessionID, ID_LEN);
  5769. ssl->session.sessionIDSz = ssl->arrays->sessionIDSz;
  5770. }
  5771. if (ssl->arrays->preMasterSecret) {
  5772. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  5773. ssl->arrays->preMasterSecret = NULL;
  5774. }
  5775. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  5776. ssl->arrays->pendingMsg = NULL;
  5777. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  5778. }
  5779. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  5780. ssl->arrays = NULL;
  5781. }
  5782. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  5783. {
  5784. if (ssl && pKey && *pKey) {
  5785. switch (type) {
  5786. #ifndef NO_RSA
  5787. case DYNAMIC_TYPE_RSA:
  5788. wc_FreeRsaKey((RsaKey*)*pKey);
  5789. break;
  5790. #endif /* ! NO_RSA */
  5791. #ifdef HAVE_ECC
  5792. case DYNAMIC_TYPE_ECC:
  5793. wc_ecc_free((ecc_key*)*pKey);
  5794. break;
  5795. #endif /* HAVE_ECC */
  5796. #ifdef HAVE_ED25519
  5797. case DYNAMIC_TYPE_ED25519:
  5798. wc_ed25519_free((ed25519_key*)*pKey);
  5799. break;
  5800. #endif /* HAVE_ED25519 */
  5801. #ifdef HAVE_CURVE25519
  5802. case DYNAMIC_TYPE_CURVE25519:
  5803. wc_curve25519_free((curve25519_key*)*pKey);
  5804. break;
  5805. #endif /* HAVE_CURVE25519 */
  5806. #ifdef HAVE_ED448
  5807. case DYNAMIC_TYPE_ED448:
  5808. wc_ed448_free((ed448_key*)*pKey);
  5809. break;
  5810. #endif /* HAVE_ED448 */
  5811. #ifdef HAVE_CURVE448
  5812. case DYNAMIC_TYPE_CURVE448:
  5813. wc_curve448_free((curve448_key*)*pKey);
  5814. break;
  5815. #endif /* HAVE_CURVE448 */
  5816. #ifndef NO_DH
  5817. case DYNAMIC_TYPE_DH:
  5818. wc_FreeDhKey((DhKey*)*pKey);
  5819. break;
  5820. #endif /* !NO_DH */
  5821. default:
  5822. break;
  5823. }
  5824. XFREE(*pKey, ssl->heap, type);
  5825. /* Reset pointer */
  5826. *pKey = NULL;
  5827. }
  5828. }
  5829. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  5830. {
  5831. int ret = BAD_FUNC_ARG;
  5832. int sz = 0;
  5833. if (ssl == NULL || pKey == NULL) {
  5834. return BAD_FUNC_ARG;
  5835. }
  5836. /* Sanity check key destination */
  5837. if (*pKey != NULL) {
  5838. WOLFSSL_MSG("Key already present!");
  5839. return BAD_STATE_E;
  5840. }
  5841. /* Determine size */
  5842. switch (type) {
  5843. #ifndef NO_RSA
  5844. case DYNAMIC_TYPE_RSA:
  5845. sz = sizeof(RsaKey);
  5846. break;
  5847. #endif /* ! NO_RSA */
  5848. #ifdef HAVE_ECC
  5849. case DYNAMIC_TYPE_ECC:
  5850. sz = sizeof(ecc_key);
  5851. break;
  5852. #endif /* HAVE_ECC */
  5853. #ifdef HAVE_ED25519
  5854. case DYNAMIC_TYPE_ED25519:
  5855. sz = sizeof(ed25519_key);
  5856. break;
  5857. #endif /* HAVE_ED25519 */
  5858. #ifdef HAVE_CURVE25519
  5859. case DYNAMIC_TYPE_CURVE25519:
  5860. sz = sizeof(curve25519_key);
  5861. break;
  5862. #endif /* HAVE_CURVE25519 */
  5863. #ifdef HAVE_ED448
  5864. case DYNAMIC_TYPE_ED448:
  5865. sz = sizeof(ed448_key);
  5866. break;
  5867. #endif /* HAVE_ED448 */
  5868. #ifdef HAVE_CURVE448
  5869. case DYNAMIC_TYPE_CURVE448:
  5870. sz = sizeof(curve448_key);
  5871. break;
  5872. #endif /* HAVE_CURVE448 */
  5873. #ifndef NO_DH
  5874. case DYNAMIC_TYPE_DH:
  5875. sz = sizeof(DhKey);
  5876. break;
  5877. #endif /* !NO_DH */
  5878. default:
  5879. return BAD_FUNC_ARG;
  5880. }
  5881. /* Allocate memory for key */
  5882. *pKey = (void *)XMALLOC(sz, ssl->heap, type);
  5883. if (*pKey == NULL) {
  5884. return MEMORY_E;
  5885. }
  5886. /* Initialize key */
  5887. switch (type) {
  5888. #ifndef NO_RSA
  5889. case DYNAMIC_TYPE_RSA:
  5890. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  5891. break;
  5892. #endif /* ! NO_RSA */
  5893. #ifdef HAVE_ECC
  5894. case DYNAMIC_TYPE_ECC:
  5895. ret = wc_ecc_init_ex((ecc_key*)*pKey, ssl->heap, ssl->devId);
  5896. break;
  5897. #endif /* HAVE_ECC */
  5898. #ifdef HAVE_ED25519
  5899. case DYNAMIC_TYPE_ED25519:
  5900. wc_ed25519_init_ex((ed25519_key*)*pKey, ssl->heap, ssl->devId);
  5901. ret = 0;
  5902. break;
  5903. #endif /* HAVE_CURVE25519 */
  5904. #ifdef HAVE_CURVE25519
  5905. case DYNAMIC_TYPE_CURVE25519:
  5906. wc_curve25519_init_ex((curve25519_key*)*pKey, ssl->heap, ssl->devId);
  5907. ret = 0;
  5908. break;
  5909. #endif /* HAVE_CURVE25519 */
  5910. #ifdef HAVE_ED448
  5911. case DYNAMIC_TYPE_ED448:
  5912. wc_ed448_init_ex((ed448_key*)*pKey, ssl->heap, ssl->devId);
  5913. ret = 0;
  5914. break;
  5915. #endif /* HAVE_CURVE448 */
  5916. #ifdef HAVE_CURVE448
  5917. case DYNAMIC_TYPE_CURVE448:
  5918. wc_curve448_init((curve448_key*)*pKey);
  5919. ret = 0;
  5920. break;
  5921. #endif /* HAVE_CURVE448 */
  5922. #ifndef NO_DH
  5923. case DYNAMIC_TYPE_DH:
  5924. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  5925. break;
  5926. #endif /* !NO_DH */
  5927. default:
  5928. return BAD_FUNC_ARG;
  5929. }
  5930. /* On error free handshake key */
  5931. if (ret != 0) {
  5932. FreeKey(ssl, type, pKey);
  5933. }
  5934. return ret;
  5935. }
  5936. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  5937. defined(HAVE_CURVE25519) || defined(HAVE_ED448) || defined(HAVE_CURVE448)
  5938. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  5939. {
  5940. int ret = 0;
  5941. (void)ssl;
  5942. switch (type) {
  5943. #ifndef NO_RSA
  5944. case DYNAMIC_TYPE_RSA:
  5945. wc_FreeRsaKey((RsaKey*)pKey);
  5946. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  5947. break;
  5948. #endif /* ! NO_RSA */
  5949. #ifdef HAVE_ECC
  5950. case DYNAMIC_TYPE_ECC:
  5951. wc_ecc_free((ecc_key*)pKey);
  5952. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  5953. break;
  5954. #endif /* HAVE_ECC */
  5955. #ifdef HAVE_ED25519
  5956. case DYNAMIC_TYPE_ED25519:
  5957. wc_ed25519_free((ed25519_key*)pKey);
  5958. ret = wc_ed25519_init_ex((ed25519_key*)pKey, ssl->heap,
  5959. ssl->devId);
  5960. break;
  5961. #endif /* HAVE_CURVE25519 */
  5962. #ifdef HAVE_CURVE25519
  5963. case DYNAMIC_TYPE_CURVE25519:
  5964. wc_curve25519_free((curve25519_key*)pKey);
  5965. ret = wc_curve25519_init_ex((curve25519_key*)pKey, ssl->heap,
  5966. ssl->devId);
  5967. break;
  5968. #endif /* HAVE_CURVE25519 */
  5969. #ifdef HAVE_ED448
  5970. case DYNAMIC_TYPE_ED448:
  5971. wc_ed448_free((ed448_key*)pKey);
  5972. ret = wc_ed448_init_ex((ed448_key*)pKey, ssl->heap, ssl->devId);
  5973. break;
  5974. #endif /* HAVE_CURVE448 */
  5975. #ifdef HAVE_CURVE448
  5976. case DYNAMIC_TYPE_CURVE448:
  5977. wc_curve448_free((curve448_key*)pKey);
  5978. ret = wc_curve448_init((curve448_key*)pKey);
  5979. break;
  5980. #endif /* HAVE_CURVE448 */
  5981. #ifndef NO_DH
  5982. case DYNAMIC_TYPE_DH:
  5983. wc_FreeDhKey((DhKey*)pKey);
  5984. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  5985. break;
  5986. #endif /* !NO_DH */
  5987. default:
  5988. return BAD_FUNC_ARG;
  5989. }
  5990. return ret;
  5991. }
  5992. #endif
  5993. void FreeKeyExchange(WOLFSSL* ssl)
  5994. {
  5995. /* Cleanup signature buffer */
  5996. if (ssl->buffers.sig.buffer) {
  5997. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  5998. ssl->buffers.sig.buffer = NULL;
  5999. ssl->buffers.sig.length = 0;
  6000. }
  6001. /* Cleanup digest buffer */
  6002. if (ssl->buffers.digest.buffer) {
  6003. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  6004. ssl->buffers.digest.buffer = NULL;
  6005. ssl->buffers.digest.length = 0;
  6006. }
  6007. /* Free handshake key */
  6008. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  6009. #ifndef NO_DH
  6010. /* Free temp DH key */
  6011. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  6012. #endif
  6013. /* Cleanup async */
  6014. #ifdef WOLFSSL_ASYNC_CRYPT
  6015. if (ssl->async.freeArgs) {
  6016. ssl->async.freeArgs(ssl, ssl->async.args);
  6017. ssl->async.freeArgs = NULL;
  6018. }
  6019. FreeBuildMsgArgs(ssl, &ssl->async.buildArgs);
  6020. #endif
  6021. }
  6022. /* Free up all memory used by Suites structure from WOLFSSL */
  6023. void FreeSuites(WOLFSSL* ssl)
  6024. {
  6025. #ifdef SINGLE_THREADED
  6026. if (ssl->options.ownSuites)
  6027. #endif
  6028. {
  6029. #ifdef OPENSSL_ALL
  6030. if (ssl->suites != NULL) {
  6031. wolfSSL_sk_SSL_CIPHER_free(ssl->suites->stack);
  6032. }
  6033. #endif
  6034. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  6035. }
  6036. ssl->suites = NULL;
  6037. }
  6038. /* In case holding SSL object in array and don't want to free actual ssl */
  6039. void SSL_ResourceFree(WOLFSSL* ssl)
  6040. {
  6041. /* Note: any resources used during the handshake should be released in the
  6042. * function FreeHandshakeResources(). Be careful with the special cases
  6043. * like the RNG which may optionally be kept for the whole session. (For
  6044. * example with the RNG, it isn't used beyond the handshake except when
  6045. * using stream ciphers where it is retained. */
  6046. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  6047. wolfSSL_CRYPTO_cleanup_ex_data(&ssl->ex_data);
  6048. #endif
  6049. FreeCiphers(ssl);
  6050. FreeArrays(ssl, 0);
  6051. FreeKeyExchange(ssl);
  6052. if (ssl->options.weOwnRng) {
  6053. wc_FreeRng(ssl->rng);
  6054. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  6055. }
  6056. FreeSuites(ssl);
  6057. FreeHandshakeHashes(ssl);
  6058. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  6059. /* clear keys struct after session */
  6060. ForceZero(&ssl->keys, sizeof(Keys));
  6061. #ifdef WOLFSSL_TLS13
  6062. if (ssl->options.tls1_3) {
  6063. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  6064. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  6065. }
  6066. #endif
  6067. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  6068. ForceZero(&ssl->clientFinished, TLS_FINISHED_SZ_MAX);
  6069. ForceZero(&ssl->serverFinished, TLS_FINISHED_SZ_MAX);
  6070. ssl->serverFinished_len = 0;
  6071. ssl->clientFinished_len = 0;
  6072. #endif
  6073. #ifndef NO_DH
  6074. if (ssl->buffers.serverDH_Priv.buffer) {
  6075. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  6076. ssl->buffers.serverDH_Priv.length);
  6077. }
  6078. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6079. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6080. /* parameters (p,g) may be owned by ctx */
  6081. if (ssl->buffers.weOwnDH) {
  6082. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6083. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6084. }
  6085. #endif /* !NO_DH */
  6086. #ifndef NO_CERTS
  6087. ssl->keepCert = 0; /* make sure certificate is free'd */
  6088. wolfSSL_UnloadCertsKeys(ssl);
  6089. #endif
  6090. #ifndef NO_RSA
  6091. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  6092. ssl->peerRsaKeyPresent = 0;
  6093. #endif
  6094. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  6095. XFREE(ssl->peerTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
  6096. #endif
  6097. if (ssl->buffers.inputBuffer.dynamicFlag)
  6098. ShrinkInputBuffer(ssl, FORCED_FREE);
  6099. if (ssl->buffers.outputBuffer.dynamicFlag)
  6100. ShrinkOutputBuffer(ssl);
  6101. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  6102. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  6103. DYNAMIC_TYPE_COOKIE_PWD);
  6104. #endif
  6105. #ifdef WOLFSSL_DTLS
  6106. DtlsMsgPoolReset(ssl);
  6107. if (ssl->dtls_rx_msg_list != NULL) {
  6108. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  6109. ssl->dtls_rx_msg_list = NULL;
  6110. ssl->dtls_rx_msg_list_sz = 0;
  6111. }
  6112. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  6113. ssl->buffers.dtlsCtx.peer.sa = NULL;
  6114. #ifndef NO_WOLFSSL_SERVER
  6115. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  6116. DYNAMIC_TYPE_COOKIE_PWD);
  6117. #endif
  6118. #endif /* WOLFSSL_DTLS */
  6119. #ifdef OPENSSL_EXTRA
  6120. #ifndef NO_BIO
  6121. /* Don't free if there was/is a previous element in the chain.
  6122. * This means that this BIO was part of a chain that will be
  6123. * free'd separately. */
  6124. if (ssl->biord != ssl->biowr) /* only free write if different */
  6125. if (ssl->biowr != NULL && ssl->biowr->prev == NULL)
  6126. wolfSSL_BIO_free(ssl->biowr);
  6127. if (ssl->biord != NULL && ssl->biord->prev == NULL)
  6128. wolfSSL_BIO_free(ssl->biord);
  6129. ssl->biowr = NULL;
  6130. ssl->biord = NULL;
  6131. #endif
  6132. #endif
  6133. #ifdef HAVE_LIBZ
  6134. FreeStreams(ssl);
  6135. #endif
  6136. #ifdef HAVE_ECC
  6137. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  6138. ssl->peerEccKeyPresent = 0;
  6139. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  6140. ssl->peerEccDsaKeyPresent = 0;
  6141. #endif
  6142. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
  6143. {
  6144. int dtype = 0;
  6145. #ifdef HAVE_ECC
  6146. dtype = DYNAMIC_TYPE_ECC;
  6147. #endif
  6148. #ifdef HAVE_CURVE25519
  6149. if (ssl->peerX25519KeyPresent
  6150. #ifdef HAVE_ECC
  6151. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
  6152. #endif /* HAVE_ECC */
  6153. )
  6154. {
  6155. dtype = DYNAMIC_TYPE_CURVE25519;
  6156. }
  6157. #endif /* HAVE_CURVE25519 */
  6158. #ifdef HAVE_CURVE448
  6159. if (ssl->peerX448KeyPresent
  6160. #ifdef HAVE_ECC
  6161. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
  6162. #endif /* HAVE_ECC */
  6163. )
  6164. {
  6165. dtype = DYNAMIC_TYPE_CURVE448;
  6166. }
  6167. #endif /* HAVE_CURVE448 */
  6168. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  6169. ssl->eccTempKeyPresent = 0;
  6170. }
  6171. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  6172. #ifdef HAVE_CURVE25519
  6173. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  6174. ssl->peerX25519KeyPresent = 0;
  6175. #endif
  6176. #ifdef HAVE_ED25519
  6177. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  6178. ssl->peerEd25519KeyPresent = 0;
  6179. #ifdef HAVE_PK_CALLBACKS
  6180. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  6181. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  6182. DYNAMIC_TYPE_ED25519);
  6183. ssl->buffers.peerEd25519Key.buffer = NULL;
  6184. }
  6185. #endif
  6186. #endif
  6187. #ifdef HAVE_CURVE448
  6188. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  6189. ssl->peerX448KeyPresent = 0;
  6190. #endif
  6191. #ifdef HAVE_ED448
  6192. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  6193. ssl->peerEd448KeyPresent = 0;
  6194. #ifdef HAVE_PK_CALLBACKS
  6195. if (ssl->buffers.peerEd448Key.buffer != NULL) {
  6196. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
  6197. DYNAMIC_TYPE_ED448);
  6198. ssl->buffers.peerEd448Key.buffer = NULL;
  6199. }
  6200. #endif
  6201. #endif
  6202. #ifdef HAVE_PK_CALLBACKS
  6203. #ifdef HAVE_ECC
  6204. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  6205. #endif /* HAVE_ECC */
  6206. #ifndef NO_RSA
  6207. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  6208. #endif /* NO_RSA */
  6209. #endif /* HAVE_PK_CALLBACKS */
  6210. #ifdef HAVE_TLS_EXTENSIONS
  6211. TLSX_FreeAll(ssl->extensions, ssl->heap);
  6212. #ifdef HAVE_ALPN
  6213. if (ssl->alpn_client_list != NULL) {
  6214. XFREE(ssl->alpn_client_list, ssl->heap, DYNAMIC_TYPE_ALPN);
  6215. ssl->alpn_client_list = NULL;
  6216. }
  6217. #endif
  6218. #endif /* HAVE_TLS_EXTENSIONS */
  6219. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  6220. if (ssl->mnCtx) {
  6221. mynewt_ctx_clear(ssl->mnCtx);
  6222. ssl->mnCtx = NULL;
  6223. }
  6224. #endif
  6225. #ifdef HAVE_NETX
  6226. if (ssl->nxCtx.nxPacket)
  6227. nx_packet_release(ssl->nxCtx.nxPacket);
  6228. #endif
  6229. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  6230. if (ssl->x509_store_pt)
  6231. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  6232. #endif
  6233. #ifdef KEEP_PEER_CERT
  6234. FreeX509(&ssl->peerCert);
  6235. #endif
  6236. #ifdef HAVE_SESSION_TICKET
  6237. if (ssl->session.isDynamic) {
  6238. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  6239. ssl->session.ticket = ssl->session.staticTicket;
  6240. ssl->session.isDynamic = 0;
  6241. ssl->session.ticketLen = 0;
  6242. }
  6243. #endif
  6244. #ifdef HAVE_EXT_CACHE
  6245. wolfSSL_SESSION_free(ssl->extSession);
  6246. #endif
  6247. #ifdef HAVE_WRITE_DUP
  6248. if (ssl->dupWrite) {
  6249. FreeWriteDup(ssl);
  6250. }
  6251. #endif
  6252. #ifdef OPENSSL_EXTRA
  6253. if (ssl->param) {
  6254. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  6255. }
  6256. #endif
  6257. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6258. while (ssl->certReqCtx != NULL) {
  6259. CertReqCtx* curr = ssl->certReqCtx;
  6260. ssl->certReqCtx = curr->next;
  6261. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6262. }
  6263. #endif
  6264. #ifdef WOLFSSL_STATIC_EPHEMERAL
  6265. #ifndef NO_DH
  6266. if (ssl->staticKE.dhKey && ssl->staticKE.weOwnDH)
  6267. FreeDer(&ssl->staticKE.dhKey);
  6268. #endif
  6269. #ifdef HAVE_ECC
  6270. if (ssl->staticKE.ecKey && ssl->staticKE.weOwnEC)
  6271. FreeDer(&ssl->staticKE.ecKey);
  6272. #endif
  6273. #ifdef HAVE_CURVE25519
  6274. if (ssl->staticKE.x25519Key && ssl->staticKE.weOwnX25519)
  6275. FreeDer(&ssl->staticKE.x25519Key);
  6276. #endif
  6277. #endif
  6278. #ifdef WOLFSSL_STATIC_MEMORY
  6279. /* check if using fixed io buffers and free them */
  6280. if (ssl->heap != NULL) {
  6281. #ifdef WOLFSSL_HEAP_TEST
  6282. /* avoid dereferencing a test value */
  6283. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  6284. #endif
  6285. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  6286. WOLFSSL_HEAP* ctx_heap;
  6287. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  6288. ctx_heap = ssl_hint->memory;
  6289. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  6290. WOLFSSL_MSG("Bad memory_mutex lock");
  6291. }
  6292. ctx_heap->curIO--;
  6293. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  6294. WOLFSSL_MSG("Error freeing fixed output buffer");
  6295. }
  6296. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  6297. WOLFSSL_MSG("Error freeing fixed output buffer");
  6298. }
  6299. if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/
  6300. ctx_heap->curHa--;
  6301. }
  6302. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  6303. /* check if tracking stats */
  6304. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  6305. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  6306. }
  6307. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  6308. #ifdef WOLFSSL_HEAP_TEST
  6309. }
  6310. #endif
  6311. }
  6312. #endif /* WOLFSSL_STATIC_MEMORY */
  6313. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  6314. wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
  6315. wolfSSL_sk_X509_free(ssl->peerCertChain);
  6316. #ifdef KEEP_OUR_CERT
  6317. wolfSSL_sk_X509_free(ssl->ourCertChain);
  6318. #endif
  6319. #endif
  6320. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  6321. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  6322. ssl->ca_names = NULL;
  6323. #endif
  6324. }
  6325. /* Free any handshake resources no longer needed */
  6326. void FreeHandshakeResources(WOLFSSL* ssl)
  6327. {
  6328. WOLFSSL_ENTER("FreeHandshakeResources");
  6329. #ifdef WOLFSSL_DTLS
  6330. /* DTLS_POOL */
  6331. if (ssl->options.dtls) {
  6332. DtlsMsgPoolReset(ssl);
  6333. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  6334. ssl->dtls_rx_msg_list = NULL;
  6335. ssl->dtls_rx_msg_list_sz = 0;
  6336. }
  6337. #endif
  6338. #ifdef HAVE_SECURE_RENEGOTIATION
  6339. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  6340. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  6341. return;
  6342. }
  6343. #endif
  6344. /* input buffer */
  6345. if (ssl->buffers.inputBuffer.dynamicFlag)
  6346. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  6347. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6348. if (!ssl->options.tls1_3)
  6349. #endif
  6350. {
  6351. #ifndef OPENSSL_EXTRA
  6352. /* free suites unless using compatibility layer */
  6353. FreeSuites(ssl);
  6354. #endif
  6355. /* hsHashes */
  6356. FreeHandshakeHashes(ssl);
  6357. }
  6358. /* RNG */
  6359. if (ssl->options.tls1_1 == 0
  6360. #ifndef WOLFSSL_AEAD_ONLY
  6361. || ssl->specs.cipher_type == stream
  6362. #endif
  6363. #if defined(WOLFSSL_TLS13)
  6364. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6365. || ssl->options.tls1_3
  6366. #elif !defined(HAVE_SESSION_TICKET)
  6367. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  6368. #endif
  6369. #endif
  6370. ) {
  6371. if (ssl->options.weOwnRng) {
  6372. wc_FreeRng(ssl->rng);
  6373. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  6374. ssl->rng = NULL;
  6375. ssl->options.weOwnRng = 0;
  6376. }
  6377. }
  6378. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  6379. defined(HAVE_SESSION_TICKET)
  6380. if (!ssl->options.tls1_3)
  6381. #endif
  6382. /* arrays */
  6383. if (ssl->options.saveArrays == 0)
  6384. FreeArrays(ssl, 1);
  6385. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6386. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  6387. #endif
  6388. {
  6389. #ifndef NO_RSA
  6390. /* peerRsaKey */
  6391. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  6392. ssl->peerRsaKeyPresent = 0;
  6393. #endif
  6394. #ifdef HAVE_ECC
  6395. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  6396. ssl->peerEccDsaKeyPresent = 0;
  6397. #endif /* HAVE_ECC */
  6398. #ifdef HAVE_ED25519
  6399. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  6400. ssl->peerEd25519KeyPresent = 0;
  6401. #endif /* HAVE_ED25519 */
  6402. #ifdef HAVE_ED448
  6403. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  6404. ssl->peerEd448KeyPresent = 0;
  6405. #endif /* HAVE_ED448 */
  6406. }
  6407. #ifdef HAVE_ECC
  6408. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  6409. ssl->peerEccKeyPresent = 0;
  6410. #endif
  6411. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  6412. {
  6413. int dtype;
  6414. #ifdef HAVE_ECC
  6415. dtype = DYNAMIC_TYPE_ECC;
  6416. #elif defined(HAVE_CURVE25519)
  6417. dtype = DYNAMIC_TYPE_CURVE25519;
  6418. #else
  6419. dtype = DYNAMIC_TYPE_CURVE448;
  6420. #endif
  6421. #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
  6422. if (ssl->peerX25519KeyPresent ||
  6423. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  6424. {
  6425. dtype = DYNAMIC_TYPE_CURVE25519;
  6426. }
  6427. #endif
  6428. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  6429. defined(HAVE_CURVE448)
  6430. if (ssl->peerX448KeyPresent ||
  6431. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
  6432. {
  6433. dtype = DYNAMIC_TYPE_CURVE448;
  6434. }
  6435. #endif
  6436. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  6437. ssl->eccTempKeyPresent = 0;
  6438. }
  6439. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  6440. #ifdef HAVE_CURVE25519
  6441. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  6442. ssl->peerX25519KeyPresent = 0;
  6443. #endif
  6444. #ifdef HAVE_CURVE448
  6445. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  6446. ssl->peerX448KeyPresent = 0;
  6447. #endif
  6448. #ifndef NO_DH
  6449. if (ssl->buffers.serverDH_Priv.buffer) {
  6450. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  6451. ssl->buffers.serverDH_Priv.length);
  6452. }
  6453. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6454. ssl->buffers.serverDH_Priv.buffer = NULL;
  6455. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6456. ssl->buffers.serverDH_Pub.buffer = NULL;
  6457. /* parameters (p,g) may be owned by ctx */
  6458. if (ssl->buffers.weOwnDH) {
  6459. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6460. ssl->buffers.serverDH_G.buffer = NULL;
  6461. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6462. ssl->buffers.serverDH_P.buffer = NULL;
  6463. }
  6464. #endif /* !NO_DH */
  6465. #ifndef NO_CERTS
  6466. wolfSSL_UnloadCertsKeys(ssl);
  6467. #endif
  6468. #ifdef HAVE_PK_CALLBACKS
  6469. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6470. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  6471. #endif
  6472. {
  6473. #ifdef HAVE_ECC
  6474. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  6475. ssl->buffers.peerEccDsaKey.buffer = NULL;
  6476. #endif /* HAVE_ECC */
  6477. #ifndef NO_RSA
  6478. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  6479. ssl->buffers.peerRsaKey.buffer = NULL;
  6480. #endif /* NO_RSA */
  6481. #ifdef HAVE_ED25519
  6482. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  6483. DYNAMIC_TYPE_ED25519);
  6484. ssl->buffers.peerEd25519Key.buffer = NULL;
  6485. #endif
  6486. #ifdef HAVE_ED448
  6487. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
  6488. ssl->buffers.peerEd448Key.buffer = NULL;
  6489. #endif
  6490. }
  6491. #endif /* HAVE_PK_CALLBACKS */
  6492. #ifdef HAVE_SESSION_TICKET
  6493. if (ssl->session.isDynamic) {
  6494. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  6495. ssl->session.ticket = ssl->session.staticTicket;
  6496. ssl->session.isDynamic = 0;
  6497. ssl->session.ticketLen = 0;
  6498. }
  6499. #endif
  6500. #if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \
  6501. !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6502. /* Some extensions need to be kept for post-handshake querying. */
  6503. TLSX_FreeAll(ssl->extensions, ssl->heap);
  6504. ssl->extensions = NULL;
  6505. #endif
  6506. #ifdef WOLFSSL_STATIC_MEMORY
  6507. /* when done with handshake decrement current handshake count */
  6508. if (ssl->heap != NULL) {
  6509. #ifdef WOLFSSL_HEAP_TEST
  6510. /* avoid dereferencing a test value */
  6511. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  6512. #endif
  6513. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  6514. WOLFSSL_HEAP* ctx_heap;
  6515. ctx_heap = ssl_hint->memory;
  6516. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  6517. WOLFSSL_MSG("Bad memory_mutex lock");
  6518. }
  6519. ctx_heap->curHa--;
  6520. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  6521. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  6522. #ifdef WOLFSSL_HEAP_TEST
  6523. }
  6524. #endif
  6525. }
  6526. #endif /* WOLFSSL_STATIC_MEMORY */
  6527. }
  6528. /* heap argument is the heap hint used when creating SSL */
  6529. void FreeSSL(WOLFSSL* ssl, void* heap)
  6530. {
  6531. if (ssl->ctx) {
  6532. FreeSSL_Ctx(ssl->ctx); /* will decrement and free underlying CTX if 0 */
  6533. }
  6534. SSL_ResourceFree(ssl);
  6535. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  6536. (void)heap;
  6537. }
  6538. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  6539. !defined(WOLFSSL_NO_TLS12) || \
  6540. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \
  6541. && defined(HAVE_AEAD))
  6542. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  6543. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  6544. {
  6545. if (verify) {
  6546. seq[0] = ssl->keys.peer_sequence_number_hi;
  6547. seq[1] = ssl->keys.peer_sequence_number_lo++;
  6548. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  6549. /* handle rollover */
  6550. ssl->keys.peer_sequence_number_hi++;
  6551. }
  6552. }
  6553. else {
  6554. seq[0] = ssl->keys.sequence_number_hi;
  6555. seq[1] = ssl->keys.sequence_number_lo++;
  6556. if (seq[1] > ssl->keys.sequence_number_lo) {
  6557. /* handle rollover */
  6558. ssl->keys.sequence_number_hi++;
  6559. }
  6560. }
  6561. }
  6562. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  6563. #ifdef WOLFSSL_DTLS
  6564. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  6565. {
  6566. #ifdef HAVE_SECURE_RENEGOTIATION
  6567. order = DtlsCheckOrder(ssl, order);
  6568. #endif
  6569. if (order == PREV_ORDER) {
  6570. /* Previous epoch case */
  6571. if (ssl->options.haveMcast) {
  6572. #ifdef WOLFSSL_MULTICAST
  6573. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  6574. (ssl->options.mcastID << 8) |
  6575. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  6576. #endif
  6577. }
  6578. else
  6579. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  6580. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  6581. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  6582. }
  6583. else if (order == PEER_ORDER) {
  6584. if (ssl->options.haveMcast) {
  6585. #ifdef WOLFSSL_MULTICAST
  6586. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  6587. (ssl->keys.curPeerId << 8) |
  6588. (ssl->keys.curSeq_hi & 0xFF);
  6589. #endif
  6590. }
  6591. else
  6592. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  6593. (ssl->keys.curSeq_hi & 0xFFFF);
  6594. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  6595. }
  6596. else {
  6597. if (ssl->options.haveMcast) {
  6598. #ifdef WOLFSSL_MULTICAST
  6599. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  6600. (ssl->options.mcastID << 8) |
  6601. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  6602. #endif
  6603. }
  6604. else
  6605. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  6606. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  6607. seq[1] = ssl->keys.dtls_sequence_number_lo;
  6608. }
  6609. }
  6610. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  6611. {
  6612. word32 seq;
  6613. #ifdef HAVE_SECURE_RENEGOTIATION
  6614. order = DtlsCheckOrder(ssl, order);
  6615. #endif
  6616. if (order == PREV_ORDER) {
  6617. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  6618. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  6619. /* handle rollover */
  6620. ssl->keys.dtls_prev_sequence_number_hi++;
  6621. }
  6622. }
  6623. else if (order == PEER_ORDER) {
  6624. seq = ssl->keys.peer_sequence_number_lo++;
  6625. if (seq > ssl->keys.peer_sequence_number_lo) {
  6626. /* handle rollover */
  6627. ssl->keys.peer_sequence_number_hi++;
  6628. }
  6629. }
  6630. else {
  6631. seq = ssl->keys.dtls_sequence_number_lo++;
  6632. if (seq > ssl->keys.dtls_sequence_number_lo) {
  6633. /* handle rollover */
  6634. ssl->keys.dtls_sequence_number_hi++;
  6635. }
  6636. }
  6637. }
  6638. #endif /* WOLFSSL_DTLS */
  6639. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  6640. void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  6641. {
  6642. word32 seq[2] = {0, 0};
  6643. if (!ssl->options.dtls) {
  6644. GetSEQIncrement(ssl, verifyOrder, seq);
  6645. }
  6646. else {
  6647. #ifdef WOLFSSL_DTLS
  6648. DtlsGetSEQ(ssl, verifyOrder, seq);
  6649. #endif
  6650. }
  6651. c32toa(seq[0], out);
  6652. c32toa(seq[1], out + OPAQUE32_LEN);
  6653. }
  6654. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  6655. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
  6656. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */
  6657. #ifdef WOLFSSL_DTLS
  6658. /* functions for managing DTLS datagram reordering */
  6659. /* Need to allocate space for the handshake message header. The hashing
  6660. * routines assume the message pointer is still within the buffer that
  6661. * has the headers, and will include those headers in the hash. The store
  6662. * routines need to take that into account as well. New will allocate
  6663. * extra space for the headers. */
  6664. DtlsMsg* DtlsMsgNew(word32 sz, void* heap)
  6665. {
  6666. DtlsMsg* msg;
  6667. WOLFSSL_ENTER("DtlsMsgNew()");
  6668. (void)heap;
  6669. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  6670. if (msg != NULL) {
  6671. XMEMSET(msg, 0, sizeof(DtlsMsg));
  6672. msg->buf = (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ,
  6673. heap, DYNAMIC_TYPE_DTLS_BUFFER);
  6674. if (msg->buf != NULL) {
  6675. msg->sz = sz;
  6676. msg->type = no_shake;
  6677. msg->msg = msg->buf + DTLS_HANDSHAKE_HEADER_SZ;
  6678. }
  6679. else {
  6680. XFREE(msg, heap, DYNAMIC_TYPE_DTLS_MSG);
  6681. msg = NULL;
  6682. }
  6683. }
  6684. return msg;
  6685. }
  6686. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  6687. {
  6688. (void)heap;
  6689. WOLFSSL_ENTER("DtlsMsgDelete()");
  6690. if (item != NULL) {
  6691. DtlsFrag* cur = item->fragList;
  6692. while (cur != NULL) {
  6693. DtlsFrag* next = cur->next;
  6694. XFREE(cur, heap, DYNAMIC_TYPE_DTLS_FRAG);
  6695. cur = next;
  6696. }
  6697. if (item->buf != NULL)
  6698. XFREE(item->buf, heap, DYNAMIC_TYPE_DTLS_BUFFER);
  6699. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  6700. }
  6701. }
  6702. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  6703. {
  6704. DtlsMsg* next;
  6705. WOLFSSL_ENTER("DtlsMsgListDelete()");
  6706. while (head) {
  6707. next = head->next;
  6708. DtlsMsgDelete(head, heap);
  6709. head = next;
  6710. }
  6711. }
  6712. /**
  6713. * Drop messages when they are no longer going to be retransmitted
  6714. */
  6715. void DtlsTxMsgListClean(WOLFSSL* ssl)
  6716. {
  6717. DtlsMsg* head = ssl->dtls_tx_msg_list;
  6718. DtlsMsg* next;
  6719. WOLFSSL_ENTER("DtlsTxMsgListClean()");
  6720. while (head) {
  6721. next = head->next;
  6722. if (VerifyForTxDtlsMsgDelete(ssl, head))
  6723. DtlsMsgDelete(head, ssl->heap);
  6724. else
  6725. /* Stored packets should be in order so break on first failed
  6726. * verify */
  6727. break;
  6728. ssl->dtls_tx_msg_list_sz--;
  6729. /* Reset timer as deleting a node means that state has progressed */
  6730. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6731. head = next;
  6732. }
  6733. ssl->dtls_tx_msg_list = head;
  6734. }
  6735. /* Create a DTLS Fragment from *begin - end, adjust new *begin and bytesLeft */
  6736. static DtlsFrag* CreateFragment(word32* begin, word32 end, const byte* data,
  6737. byte* buf, word32* bytesLeft, void* heap)
  6738. {
  6739. DtlsFrag* newFrag;
  6740. word32 added = end - *begin + 1;
  6741. WOLFSSL_ENTER("CreateFragment()");
  6742. (void)heap;
  6743. newFrag = (DtlsFrag*)XMALLOC(sizeof(DtlsFrag), heap,
  6744. DYNAMIC_TYPE_DTLS_FRAG);
  6745. if (newFrag != NULL) {
  6746. newFrag->next = NULL;
  6747. newFrag->begin = *begin;
  6748. newFrag->end = end;
  6749. XMEMCPY(buf + *begin, data, added);
  6750. *bytesLeft -= added;
  6751. *begin = newFrag->end + 1;
  6752. }
  6753. return newFrag;
  6754. }
  6755. int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
  6756. word32 fragOffset, word32 fragSz, void* heap)
  6757. {
  6758. WOLFSSL_ENTER("DtlsMsgSet()");
  6759. if (msg != NULL && data != NULL && msg->fragSz <= msg->sz &&
  6760. fragSz <= msg->sz && fragOffset <= msg->sz &&
  6761. (fragOffset + fragSz) <= msg->sz) {
  6762. DtlsFrag* cur = msg->fragList;
  6763. DtlsFrag* prev = cur;
  6764. DtlsFrag* newFrag;
  6765. word32 bytesLeft = fragSz; /* could be overlapping fragment */
  6766. word32 startOffset = fragOffset;
  6767. word32 added;
  6768. msg->seq = seq;
  6769. msg->epoch = epoch;
  6770. msg->type = type;
  6771. if (fragOffset == 0) {
  6772. XMEMCPY(msg->buf, data - DTLS_HANDSHAKE_HEADER_SZ,
  6773. DTLS_HANDSHAKE_HEADER_SZ);
  6774. c32to24(msg->sz, msg->msg - DTLS_HANDSHAKE_FRAG_SZ);
  6775. }
  6776. /* if no message data, just return */
  6777. if (fragSz == 0)
  6778. return 0;
  6779. /* if list is empty add full fragment to front */
  6780. if (cur == NULL) {
  6781. newFrag = CreateFragment(&fragOffset, fragOffset + fragSz - 1, data,
  6782. msg->msg, &bytesLeft, heap);
  6783. if (newFrag == NULL)
  6784. return MEMORY_E;
  6785. msg->fragSz = fragSz;
  6786. msg->fragList = newFrag;
  6787. return 0;
  6788. }
  6789. /* add to front if before current front, up to next->begin */
  6790. if (fragOffset < cur->begin) {
  6791. word32 end = fragOffset + fragSz - 1;
  6792. if (end >= cur->begin)
  6793. end = cur->begin - 1;
  6794. added = end - fragOffset + 1;
  6795. newFrag = CreateFragment(&fragOffset, end, data, msg->msg,
  6796. &bytesLeft, heap);
  6797. if (newFrag == NULL)
  6798. return MEMORY_E;
  6799. msg->fragSz += added;
  6800. newFrag->next = cur;
  6801. msg->fragList = newFrag;
  6802. }
  6803. /* while we have bytes left, try to find a gap to fill */
  6804. while (bytesLeft > 0) {
  6805. /* get previous packet in list */
  6806. while (cur && (fragOffset >= cur->begin)) {
  6807. prev = cur;
  6808. cur = cur->next;
  6809. }
  6810. /* don't add duplicate data */
  6811. if (prev->end >= fragOffset) {
  6812. if ( (fragOffset + bytesLeft - 1) <= prev->end)
  6813. return 0;
  6814. fragOffset = prev->end + 1;
  6815. bytesLeft = startOffset + fragSz - fragOffset;
  6816. }
  6817. if (cur == NULL)
  6818. /* we're at the end */
  6819. added = bytesLeft;
  6820. else
  6821. /* we're in between two frames */
  6822. added = min(bytesLeft, cur->begin - fragOffset);
  6823. /* data already there */
  6824. if (added == 0)
  6825. continue;
  6826. newFrag = CreateFragment(&fragOffset, fragOffset + added - 1,
  6827. data + fragOffset - startOffset,
  6828. msg->msg, &bytesLeft, heap);
  6829. if (newFrag == NULL)
  6830. return MEMORY_E;
  6831. msg->fragSz += added;
  6832. newFrag->next = prev->next;
  6833. prev->next = newFrag;
  6834. }
  6835. }
  6836. return 0;
  6837. }
  6838. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word32 epoch, word32 seq)
  6839. {
  6840. WOLFSSL_ENTER("DtlsMsgFind()");
  6841. while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
  6842. head = head->next;
  6843. }
  6844. return head;
  6845. }
  6846. void DtlsMsgStore(WOLFSSL* ssl, word32 epoch, word32 seq, const byte* data,
  6847. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  6848. {
  6849. /* See if seq exists in the list. If it isn't in the list, make
  6850. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  6851. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  6852. * the seq is in the list and it isn't full, copy fragSz bytes from
  6853. * data to msg->msg starting at offset fragOffset, and add fragSz to
  6854. * msg->fragSz. Insertions take into account data already in the list
  6855. * in case there are overlaps in the handshake message due to retransmit
  6856. * messages. The new item should be inserted into the list in its
  6857. * proper position.
  6858. *
  6859. * 1. Find seq in list, or where seq should go in list. If seq not in
  6860. * list, create new item and insert into list. Either case, keep
  6861. * pointer to item.
  6862. * 2. Copy the data from the message to the stored message where it
  6863. * belongs without overlaps.
  6864. */
  6865. DtlsMsg* head = ssl->dtls_rx_msg_list;
  6866. WOLFSSL_ENTER("DtlsMsgStore()");
  6867. if (head != NULL) {
  6868. DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
  6869. if (cur == NULL) {
  6870. cur = DtlsMsgNew(dataSz, heap);
  6871. if (cur != NULL) {
  6872. if (DtlsMsgSet(cur, seq, epoch, data, type,
  6873. fragOffset, fragSz, heap) < 0) {
  6874. DtlsMsgDelete(cur, heap);
  6875. }
  6876. else {
  6877. ssl->dtls_rx_msg_list_sz++;
  6878. head = DtlsMsgInsert(head, cur);
  6879. }
  6880. }
  6881. }
  6882. else {
  6883. /* If this fails, the data is just dropped. */
  6884. DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
  6885. fragSz, heap);
  6886. }
  6887. }
  6888. else {
  6889. head = DtlsMsgNew(dataSz, heap);
  6890. if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
  6891. fragSz, heap) < 0) {
  6892. DtlsMsgDelete(head, heap);
  6893. head = NULL;
  6894. }
  6895. else {
  6896. ssl->dtls_rx_msg_list_sz++;
  6897. }
  6898. }
  6899. ssl->dtls_rx_msg_list = head;
  6900. }
  6901. /* DtlsMsgInsert() is an in-order insert. */
  6902. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  6903. {
  6904. WOLFSSL_ENTER("DtlsMsgInsert()");
  6905. if (head == NULL || (item->epoch <= head->epoch &&
  6906. item->seq < head->seq)) {
  6907. item->next = head;
  6908. head = item;
  6909. }
  6910. else if (head->next == NULL) {
  6911. head->next = item;
  6912. }
  6913. else {
  6914. DtlsMsg* cur = head->next;
  6915. DtlsMsg* prev = head;
  6916. while (cur) {
  6917. if (item->epoch <= cur->epoch &&
  6918. item->seq < cur->seq) {
  6919. item->next = cur;
  6920. prev->next = item;
  6921. break;
  6922. }
  6923. prev = cur;
  6924. cur = cur->next;
  6925. }
  6926. if (cur == NULL) {
  6927. prev->next = item;
  6928. }
  6929. }
  6930. return head;
  6931. }
  6932. /**
  6933. * DtlsMsgPoolSave() adds the message to the end of the stored transmit
  6934. * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
  6935. * anything else that increments ssl->keys.dtls_handshake_number.
  6936. */
  6937. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
  6938. enum HandShakeType type)
  6939. {
  6940. DtlsMsg* item;
  6941. int ret = 0;
  6942. WOLFSSL_ENTER("DtlsMsgPoolSave()");
  6943. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  6944. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  6945. return DTLS_POOL_SZ_E;
  6946. }
  6947. item = DtlsMsgNew(dataSz, ssl->heap);
  6948. if (item != NULL) {
  6949. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  6950. XMEMCPY(item->buf, data, dataSz);
  6951. item->sz = dataSz;
  6952. item->epoch = ssl->keys.dtls_epoch;
  6953. item->seq = ssl->keys.dtls_handshake_number;
  6954. item->type = type;
  6955. if (cur == NULL)
  6956. ssl->dtls_tx_msg_list = item;
  6957. else {
  6958. while (cur->next)
  6959. cur = cur->next;
  6960. cur->next = item;
  6961. }
  6962. ssl->dtls_tx_msg_list_sz++;
  6963. }
  6964. else
  6965. ret = MEMORY_E;
  6966. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  6967. return ret;
  6968. }
  6969. /* DtlsMsgPoolTimeout() updates the timeout time. */
  6970. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  6971. {
  6972. int result = -1;
  6973. WOLFSSL_ENTER("DtlsMsgPoolTimeout()");
  6974. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  6975. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  6976. result = 0;
  6977. }
  6978. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  6979. return result;
  6980. }
  6981. /* DtlsMsgPoolReset() deletes the stored transmit list and resets the timeout
  6982. * value. */
  6983. void DtlsMsgPoolReset(WOLFSSL* ssl)
  6984. {
  6985. WOLFSSL_ENTER("DtlsMsgPoolReset()");
  6986. if (ssl->dtls_tx_msg_list) {
  6987. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  6988. ssl->dtls_tx_msg_list = NULL;
  6989. ssl->dtls_tx_msg = NULL;
  6990. ssl->dtls_tx_msg_list_sz = 0;
  6991. }
  6992. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6993. }
  6994. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  6995. {
  6996. /**
  6997. * only the first message from previous flight should be valid
  6998. * to be used for triggering retransmission of whole DtlsMsgPool.
  6999. * change cipher suite type is not verified here
  7000. */
  7001. return ((fragOffset == 0) &&
  7002. (((ssl->options.side == WOLFSSL_SERVER_END) &&
  7003. ((type == client_hello) ||
  7004. ((ssl->options.verifyPeer) && (type == certificate)) ||
  7005. ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
  7006. ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  7007. (type == hello_request || type == server_hello))));
  7008. }
  7009. /**
  7010. * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
  7011. * depending on the current state of the handshake negotiation.
  7012. */
  7013. int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
  7014. {
  7015. WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete()");
  7016. if (item->epoch < ssl->keys.dtls_epoch - 1)
  7017. /* Messages not from current or previous epoch can be deleted */
  7018. return 1;
  7019. switch (ssl->options.side) {
  7020. case WOLFSSL_CLIENT_END:
  7021. if (item->type == client_hello &&
  7022. ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
  7023. return 1; /* client can forget first client_hello if received full
  7024. * flight of packets from server */
  7025. else
  7026. return 0;
  7027. case WOLFSSL_SERVER_END:
  7028. if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
  7029. item->type == hello_request)
  7030. return 1; /* Server can forget HelloRequest if client sent a valid
  7031. * ClientHello */
  7032. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
  7033. item->type <= server_hello_done)
  7034. return 1; /* server can forget everything up to ServerHelloDone if
  7035. * a client finished message has been received and
  7036. * successfully processed */
  7037. else
  7038. return 0;
  7039. default:
  7040. return 0;
  7041. }
  7042. }
  7043. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  7044. * updated with new sequence numbers, and will be re-encrypted if needed. */
  7045. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  7046. {
  7047. int ret = 0;
  7048. DtlsMsg* pool;
  7049. int epochOrder;
  7050. WOLFSSL_ENTER("DtlsMsgPoolSend()");
  7051. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  7052. if (pool != NULL) {
  7053. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  7054. !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
  7055. ssl->options.acceptState == SERVER_HELLO_DONE ||
  7056. ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
  7057. ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
  7058. (ssl->options.side == WOLFSSL_CLIENT_END &&
  7059. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  7060. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  7061. ssl->options.connectState == FINISHED_DONE ||
  7062. ssl->options.connectState == SECOND_REPLY_DONE))) {
  7063. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  7064. ssl->error = DTLS_RETX_OVER_TX;
  7065. return WOLFSSL_FATAL_ERROR;
  7066. }
  7067. while (pool != NULL) {
  7068. if (pool->epoch == 0) {
  7069. DtlsRecordLayerHeader* dtls;
  7070. dtls = (DtlsRecordLayerHeader*)pool->buf;
  7071. /* If the stored record's epoch is 0, and the currently set
  7072. * epoch is 0, use the "current order" sequence number.
  7073. * If the stored record's epoch is 0 and the currently set
  7074. * epoch is not 0, the stored record is considered a "previous
  7075. * order" sequence number. */
  7076. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  7077. CUR_ORDER : PREV_ORDER;
  7078. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  7079. DtlsSEQIncrement(ssl, epochOrder);
  7080. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  7081. WOLFSSL_ERROR(ret);
  7082. return ret;
  7083. }
  7084. XMEMCPY(ssl->buffers.outputBuffer.buffer +
  7085. ssl->buffers.outputBuffer.idx +
  7086. ssl->buffers.outputBuffer.length,
  7087. pool->buf, pool->sz);
  7088. ssl->buffers.outputBuffer.length += pool->sz;
  7089. }
  7090. else {
  7091. /* Handle sending packets from previous epoch */
  7092. byte* input;
  7093. byte* output;
  7094. int inputSz, sendSz;
  7095. input = pool->buf;
  7096. inputSz = pool->sz;
  7097. sendSz = inputSz + cipherExtraData(ssl);
  7098. #ifdef HAVE_SECURE_RENEGOTIATION
  7099. /*
  7100. * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
  7101. * ssl->keys otherwise
  7102. * PREV_ORDER will always use ssl->keys
  7103. */
  7104. if (DtlsSCRKeysSet(ssl)) {
  7105. if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  7106. epochOrder = CUR_ORDER;
  7107. else
  7108. epochOrder = PREV_ORDER;
  7109. }
  7110. else {
  7111. epochOrder = CUR_ORDER;
  7112. }
  7113. #else
  7114. epochOrder = CUR_ORDER;
  7115. #endif
  7116. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  7117. WOLFSSL_ERROR(ret);
  7118. return ret;
  7119. }
  7120. output = ssl->buffers.outputBuffer.buffer +
  7121. ssl->buffers.outputBuffer.length;
  7122. if (inputSz != ENUM_LEN)
  7123. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  7124. handshake, 0, 0, 0, epochOrder);
  7125. else
  7126. /* inputSz == ENUM_LEN must mean that this is a change cipher
  7127. * spec message */
  7128. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  7129. change_cipher_spec, 0, 0, 0, epochOrder);
  7130. if (sendSz < 0) {
  7131. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  7132. return BUILD_MSG_ERROR;
  7133. }
  7134. ssl->buffers.outputBuffer.length += sendSz;
  7135. }
  7136. if (!ssl->options.groupMessages)
  7137. ret = SendBuffered(ssl);
  7138. /**
  7139. * on server side, retransmission is being triggered only by sending
  7140. * first message of given flight, in order to trigger client
  7141. * to retransmit its whole flight. Sending the whole previous flight
  7142. * could lead to retransmission of previous client flight for each
  7143. * server message from previous flight. Therefore one message should
  7144. * be enough to do the trick.
  7145. */
  7146. if (sendOnlyFirstPacket &&
  7147. ssl->options.side == WOLFSSL_SERVER_END)
  7148. pool = NULL;
  7149. else
  7150. pool = pool->next;
  7151. ssl->dtls_tx_msg = pool;
  7152. }
  7153. if (ret == 0 && ssl->options.groupMessages)
  7154. ret = SendBuffered(ssl);
  7155. }
  7156. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  7157. return ret;
  7158. }
  7159. #endif /* WOLFSSL_DTLS */
  7160. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  7161. ProtocolVersion MakeSSLv3(void)
  7162. {
  7163. ProtocolVersion pv;
  7164. pv.major = SSLv3_MAJOR;
  7165. pv.minor = SSLv3_MINOR;
  7166. return pv;
  7167. }
  7168. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  7169. #ifdef WOLFSSL_DTLS
  7170. ProtocolVersion MakeDTLSv1(void)
  7171. {
  7172. ProtocolVersion pv;
  7173. pv.major = DTLS_MAJOR;
  7174. pv.minor = DTLS_MINOR;
  7175. return pv;
  7176. }
  7177. #ifndef WOLFSSL_NO_TLS12
  7178. ProtocolVersion MakeDTLSv1_2(void)
  7179. {
  7180. ProtocolVersion pv;
  7181. pv.major = DTLS_MAJOR;
  7182. pv.minor = DTLSv1_2_MINOR;
  7183. return pv;
  7184. }
  7185. #endif /* !WOLFSSL_NO_TLS12 */
  7186. #endif /* WOLFSSL_DTLS */
  7187. #ifndef NO_ASN_TIME
  7188. #if defined(USER_TICKS)
  7189. #if 0
  7190. word32 LowResTimer(void)
  7191. {
  7192. /*
  7193. write your own clock tick function if don't want time(0)
  7194. needs second accuracy but doesn't have to correlated to EPOCH
  7195. */
  7196. }
  7197. #endif
  7198. #elif defined(TIME_OVERRIDES)
  7199. /* use same asn time overrides unless user wants tick override above */
  7200. #ifndef HAVE_TIME_T_TYPE
  7201. typedef long time_t;
  7202. #endif
  7203. extern time_t XTIME(time_t * timer);
  7204. word32 LowResTimer(void)
  7205. {
  7206. return (word32) XTIME(0);
  7207. }
  7208. #elif defined(USE_WINDOWS_API)
  7209. word32 LowResTimer(void)
  7210. {
  7211. static int init = 0;
  7212. static LARGE_INTEGER freq;
  7213. LARGE_INTEGER count;
  7214. if (!init) {
  7215. QueryPerformanceFrequency(&freq);
  7216. init = 1;
  7217. }
  7218. QueryPerformanceCounter(&count);
  7219. return (word32)(count.QuadPart / freq.QuadPart);
  7220. }
  7221. #elif defined(HAVE_RTP_SYS)
  7222. #include "rtptime.h"
  7223. word32 LowResTimer(void)
  7224. {
  7225. return (word32)rtp_get_system_sec();
  7226. }
  7227. #elif defined(WOLFSSL_DEOS)
  7228. word32 LowResTimer(void)
  7229. {
  7230. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  7231. const volatile word32 *systemTickPtr = systemTickPointer();
  7232. return (word32) *systemTickPtr/systemTickTimeInHz;
  7233. }
  7234. #elif defined(MICRIUM)
  7235. word32 LowResTimer(void)
  7236. {
  7237. OS_TICK ticks = 0;
  7238. OS_ERR err;
  7239. ticks = OSTimeGet(&err);
  7240. return (word32) (ticks / OSCfg_TickRate_Hz);
  7241. }
  7242. #elif defined(MICROCHIP_TCPIP_V5)
  7243. word32 LowResTimer(void)
  7244. {
  7245. return (word32) (TickGet() / TICKS_PER_SECOND);
  7246. }
  7247. #elif defined(MICROCHIP_TCPIP)
  7248. #if defined(MICROCHIP_MPLAB_HARMONY)
  7249. #include <system/tmr/sys_tmr.h>
  7250. word32 LowResTimer(void)
  7251. {
  7252. return (word32) (SYS_TMR_TickCountGet() /
  7253. SYS_TMR_TickCounterFrequencyGet());
  7254. }
  7255. #else
  7256. word32 LowResTimer(void)
  7257. {
  7258. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  7259. }
  7260. #endif
  7261. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  7262. word32 LowResTimer(void)
  7263. {
  7264. TIME_STRUCT mqxTime;
  7265. _time_get_elapsed(&mqxTime);
  7266. return (word32) mqxTime.SECONDS;
  7267. }
  7268. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  7269. #include "include/task.h"
  7270. unsigned int LowResTimer(void)
  7271. {
  7272. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  7273. }
  7274. #elif defined(FREERTOS)
  7275. #include "task.h"
  7276. unsigned int LowResTimer(void)
  7277. {
  7278. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  7279. }
  7280. #elif defined(FREESCALE_KSDK_BM)
  7281. #include "lwip/sys.h" /* lwIP */
  7282. word32 LowResTimer(void)
  7283. {
  7284. return sys_now()/1000;
  7285. }
  7286. #elif defined(WOLFSSL_TIRTOS)
  7287. word32 LowResTimer(void)
  7288. {
  7289. return (word32) Seconds_get();
  7290. }
  7291. #elif defined(WOLFSSL_XILINX)
  7292. #include "xrtcpsu.h"
  7293. word32 LowResTimer(void)
  7294. {
  7295. XRtcPsu_Config* con;
  7296. XRtcPsu rtc;
  7297. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  7298. if (con != NULL) {
  7299. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  7300. == XST_SUCCESS) {
  7301. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  7302. }
  7303. else {
  7304. WOLFSSL_MSG("Unable to initialize RTC");
  7305. }
  7306. }
  7307. return 0;
  7308. }
  7309. #elif defined(WOLFSSL_UTASKER)
  7310. word32 LowResTimer(void)
  7311. {
  7312. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  7313. }
  7314. #elif defined(WOLFSSL_NUCLEUS_1_2)
  7315. #define NU_TICKS_PER_SECOND 100
  7316. word32 LowResTimer(void)
  7317. {
  7318. /* returns number of 10ms ticks, so 100 ticks/sec */
  7319. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  7320. }
  7321. #elif defined(WOLFSSL_APACHE_MYNEWT)
  7322. #include "os/os_time.h"
  7323. word32 LowResTimer(void)
  7324. {
  7325. word32 now;
  7326. struct os_timeval tv;
  7327. os_gettimeofday(&tv, NULL);
  7328. now = (word32)tv.tv_sec;
  7329. return now;
  7330. }
  7331. #elif defined(WOLFSSL_ZEPHYR)
  7332. word32 LowResTimer(void)
  7333. {
  7334. return k_uptime_get() / 1000;
  7335. }
  7336. #elif defined(WOLFSSL_LINUXKM)
  7337. word32 LowResTimer(void)
  7338. {
  7339. return (word32)time(NULL);
  7340. }
  7341. #else
  7342. /* Posix style time */
  7343. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  7344. #include <time.h>
  7345. #endif
  7346. word32 LowResTimer(void)
  7347. {
  7348. return (word32)XTIME(0);
  7349. }
  7350. #endif
  7351. #else
  7352. /* user must supply timer function to return elapsed seconds:
  7353. * word32 LowResTimer(void);
  7354. */
  7355. #endif /* !NO_ASN_TIME */
  7356. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  7357. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  7358. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  7359. /* Store the message for use with CertificateVerify using EdDSA.
  7360. *
  7361. * ssl SSL/TLS object.
  7362. * data Message to store.
  7363. * sz Size of message to store.
  7364. * returns MEMORY_E if not able to reallocate, otherwise 0.
  7365. */
  7366. static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
  7367. {
  7368. int ret = 0;
  7369. byte* msgs;
  7370. if (ssl->options.cacheMessages) {
  7371. msgs = (byte*)XREALLOC(ssl->hsHashes->messages,
  7372. ssl->hsHashes->length + sz,
  7373. ssl->heap, DYNAMIC_TYPE_HASHES);
  7374. if (msgs == NULL)
  7375. ret = MEMORY_E;
  7376. if (ret == 0) {
  7377. ssl->hsHashes->messages = msgs;
  7378. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  7379. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  7380. ssl->hsHashes->length += sz;
  7381. }
  7382. }
  7383. return ret;
  7384. }
  7385. #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  7386. int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
  7387. {
  7388. int ret = 0;
  7389. (void)data;
  7390. (void)sz;
  7391. if (ssl->hsHashes == NULL) {
  7392. return BAD_FUNC_ARG;
  7393. }
  7394. #ifndef NO_OLD_TLS
  7395. #ifndef NO_SHA
  7396. wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
  7397. #endif
  7398. #ifndef NO_MD5
  7399. wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
  7400. #endif
  7401. #endif /* NO_OLD_TLS */
  7402. if (IsAtLeastTLSv1_2(ssl)) {
  7403. #ifndef NO_SHA256
  7404. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
  7405. if (ret != 0)
  7406. return ret;
  7407. #endif
  7408. #ifdef WOLFSSL_SHA384
  7409. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
  7410. if (ret != 0)
  7411. return ret;
  7412. #endif
  7413. #ifdef WOLFSSL_SHA512
  7414. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
  7415. if (ret != 0)
  7416. return ret;
  7417. #endif
  7418. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  7419. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  7420. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  7421. ret = EdDSA_Update(ssl, data, sz);
  7422. if (ret != 0)
  7423. return ret;
  7424. #endif
  7425. }
  7426. return ret;
  7427. }
  7428. /* add output to md5 and sha handshake hashes, exclude record header */
  7429. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  7430. {
  7431. const byte* adj;
  7432. if (ssl->hsHashes == NULL)
  7433. return BAD_FUNC_ARG;
  7434. adj = output + RECORD_HEADER_SZ + ivSz;
  7435. sz -= RECORD_HEADER_SZ;
  7436. #ifdef HAVE_FUZZER
  7437. if (ssl->fuzzerCb)
  7438. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  7439. #endif
  7440. #ifdef WOLFSSL_DTLS
  7441. if (ssl->options.dtls) {
  7442. adj += DTLS_RECORD_EXTRA;
  7443. sz -= DTLS_RECORD_EXTRA;
  7444. }
  7445. #endif
  7446. return HashRaw(ssl, adj, sz);
  7447. }
  7448. /* add input to md5 and sha handshake hashes, include handshake header */
  7449. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  7450. {
  7451. const byte* adj;
  7452. if (ssl->hsHashes == NULL) {
  7453. return BAD_FUNC_ARG;
  7454. }
  7455. adj = input - HANDSHAKE_HEADER_SZ;
  7456. sz += HANDSHAKE_HEADER_SZ;
  7457. #ifdef WOLFSSL_DTLS
  7458. if (ssl->options.dtls) {
  7459. adj -= DTLS_HANDSHAKE_EXTRA;
  7460. sz += DTLS_HANDSHAKE_EXTRA;
  7461. }
  7462. #endif
  7463. return HashRaw(ssl, adj, sz);
  7464. }
  7465. /* add record layer header for message */
  7466. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
  7467. {
  7468. RecordLayerHeader* rl;
  7469. (void)epochOrder;
  7470. /* record layer header */
  7471. rl = (RecordLayerHeader*)output;
  7472. if (rl == NULL) {
  7473. return;
  7474. }
  7475. rl->type = type;
  7476. rl->pvMajor = ssl->version.major; /* type and version same in each */
  7477. #ifdef WOLFSSL_TLS13
  7478. if (IsAtLeastTLSv1_3(ssl->version)) {
  7479. rl->pvMinor = TLSv1_2_MINOR;
  7480. }
  7481. else
  7482. #endif
  7483. rl->pvMinor = ssl->version.minor;
  7484. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  7485. if (ssl->options.side == WOLFSSL_CLIENT_END
  7486. && ssl->options.connectState == CONNECT_BEGIN
  7487. && !ssl->options.resuming) {
  7488. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  7489. : ssl->version.minor;
  7490. }
  7491. #endif
  7492. if (!ssl->options.dtls) {
  7493. c16toa((word16)length, rl->length);
  7494. }
  7495. else {
  7496. #ifdef WOLFSSL_DTLS
  7497. DtlsRecordLayerHeader* dtls;
  7498. /* dtls record layer header extensions */
  7499. dtls = (DtlsRecordLayerHeader*)output;
  7500. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  7501. c16toa((word16)length, dtls->length);
  7502. #endif
  7503. }
  7504. }
  7505. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  7506. !defined(NO_WOLFSSL_SERVER))
  7507. /* add handshake header for message */
  7508. static void AddHandShakeHeader(byte* output, word32 length,
  7509. word32 fragOffset, word32 fragLength,
  7510. byte type, WOLFSSL* ssl)
  7511. {
  7512. HandShakeHeader* hs;
  7513. (void)fragOffset;
  7514. (void)fragLength;
  7515. (void)ssl;
  7516. /* handshake header */
  7517. hs = (HandShakeHeader*)output;
  7518. if (hs == NULL)
  7519. return;
  7520. hs->type = type;
  7521. c32to24(length, hs->length); /* type and length same for each */
  7522. #ifdef WOLFSSL_DTLS
  7523. if (ssl->options.dtls) {
  7524. DtlsHandShakeHeader* dtls;
  7525. /* dtls handshake header extensions */
  7526. dtls = (DtlsHandShakeHeader*)output;
  7527. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  7528. c32to24(fragOffset, dtls->fragment_offset);
  7529. c32to24(fragLength, dtls->fragment_length);
  7530. }
  7531. #endif
  7532. }
  7533. /* add both headers for handshake message */
  7534. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  7535. {
  7536. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  7537. word32 outputAdj = RECORD_HEADER_SZ;
  7538. #ifdef WOLFSSL_DTLS
  7539. if (ssl->options.dtls) {
  7540. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  7541. outputAdj += DTLS_RECORD_EXTRA;
  7542. }
  7543. #endif
  7544. AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
  7545. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  7546. }
  7547. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  7548. #ifndef WOLFSSL_NO_TLS12
  7549. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
  7550. !defined(WOLFSSL_NO_CLIENT_AUTH)) || \
  7551. defined(WOLFSSL_DTLS)
  7552. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  7553. word32 length, byte type, WOLFSSL* ssl)
  7554. {
  7555. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  7556. word32 outputAdj = RECORD_HEADER_SZ;
  7557. (void)fragSz;
  7558. #ifdef WOLFSSL_DTLS
  7559. if (ssl->options.dtls) {
  7560. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  7561. outputAdj += DTLS_RECORD_EXTRA;
  7562. }
  7563. #endif
  7564. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
  7565. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  7566. }
  7567. #endif /* NO_CERTS */
  7568. #if !defined(NO_WOLFSSL_SERVER) || \
  7569. (!defined(NO_WOLFSSL_CLIENT) && !defined(NO_CERTS) && \
  7570. !defined(WOLFSSL_NO_CLIENT_AUTH))
  7571. /**
  7572. * Send the handshake message. This function handles fragmenting the message
  7573. * so that it will fit into the desired MTU or the max fragment size.
  7574. * @param ssl Connection object
  7575. * @param input Input starting at the record layer header. This function
  7576. * assumes that the appropriate record and handshake headers
  7577. * are present. These headers must assume no fragmentation.
  7578. * That is handled here.
  7579. * @param inputSz Length of message excluding headers (this is the total
  7580. * length of all fragments)
  7581. * @param type Type of message being sent
  7582. * @return 0 on success and negative otherwise
  7583. */
  7584. static int SendHandshakeMsg(WOLFSSL* ssl, byte* input, word32 inputSz,
  7585. enum HandShakeType type, const char* packetName)
  7586. {
  7587. int maxFrag;
  7588. int ret = 0;
  7589. int headerSz;
  7590. WOLFSSL_ENTER("SendHandshakeMsg");
  7591. (void)type;
  7592. (void)packetName;
  7593. if (ssl == NULL || input == NULL)
  7594. return BAD_FUNC_ARG;
  7595. #ifdef WOLFSSL_DTLS
  7596. if (ssl->options.dtls)
  7597. headerSz = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  7598. else
  7599. #endif
  7600. {
  7601. /* In TLS we send one handshake header in total, not one
  7602. * per fragment like in DTLS. The handshake header should
  7603. * already be in the input buffer. */
  7604. inputSz += HANDSHAKE_HEADER_SZ;
  7605. headerSz = RECORD_HEADER_SZ;
  7606. }
  7607. maxFrag = wolfSSL_GetMaxFragSize(ssl, (int)inputSz);
  7608. /* Make sure input is not the ssl output buffer as this
  7609. * function doesn't handle that */
  7610. if (input >= ssl->buffers.outputBuffer.buffer &&
  7611. input < ssl->buffers.outputBuffer.buffer +
  7612. ssl->buffers.outputBuffer.bufferSize) {
  7613. WOLFSSL_MSG("Can't use output buffer for input in SendHandshakeMsg");
  7614. return BAD_FUNC_ARG;
  7615. }
  7616. if (ssl->fragOffset == 0) {
  7617. /* Hash it before the loop as we modify the input with
  7618. * encryption on */
  7619. ret = HashOutput(ssl, input, headerSz + (int)inputSz, 0);
  7620. if (ret != 0)
  7621. return ret;
  7622. #ifdef WOLFSSL_DTLS
  7623. /* Decrement msg number so that we continue to use the
  7624. * same msg number for this msg */
  7625. if (ssl->options.dtls)
  7626. ssl->keys.dtls_handshake_number--;
  7627. #endif
  7628. }
  7629. while (ssl->fragOffset < inputSz) {
  7630. byte* output;
  7631. int outputSz;
  7632. byte* data = input + ssl->fragOffset + headerSz;
  7633. word32 fragSz = (word32)maxFrag;
  7634. if (inputSz - ssl->fragOffset < fragSz)
  7635. fragSz = inputSz - ssl->fragOffset;
  7636. /* check for available size */
  7637. outputSz = headerSz + fragSz;
  7638. if (IsEncryptionOn(ssl, 1))
  7639. outputSz += cipherExtraData(ssl);
  7640. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  7641. return ret;
  7642. if (ssl->buffers.outputBuffer.buffer == NULL)
  7643. return MEMORY_E;
  7644. output = ssl->buffers.outputBuffer.buffer +
  7645. ssl->buffers.outputBuffer.length;
  7646. if (IsEncryptionOn(ssl, 1)) {
  7647. /* First we need to add the fragment header ourselves.
  7648. * We do this in the input to minimize allocations */
  7649. int dataSz = (int)fragSz;
  7650. #ifdef WOLFSSL_DTLS
  7651. if (ssl->options.dtls) {
  7652. data -= DTLS_HANDSHAKE_HEADER_SZ;
  7653. dataSz += DTLS_HANDSHAKE_HEADER_SZ;
  7654. AddHandShakeHeader(data,
  7655. inputSz, ssl->fragOffset, fragSz, type, ssl);
  7656. }
  7657. if (ssl->options.dtls)
  7658. ssl->keys.dtls_handshake_number--;
  7659. if (IsDtlsNotSctpMode(ssl) &&
  7660. (ret = DtlsMsgPoolSave(ssl, data,
  7661. fragSz + DTLS_HANDSHAKE_HEADER_SZ, type))
  7662. != 0)
  7663. return ret;
  7664. #endif
  7665. ret = BuildMessage(ssl, output, outputSz,
  7666. data, dataSz, handshake, 0, 0, 0, CUR_ORDER);
  7667. if (ret >= 0)
  7668. outputSz = ret;
  7669. else
  7670. return ret;
  7671. ret = 0;
  7672. }
  7673. else {
  7674. #ifdef WOLFSSL_DTLS
  7675. if (ssl->options.dtls)
  7676. AddFragHeaders(output, fragSz, ssl->fragOffset,
  7677. inputSz, type, ssl);
  7678. else
  7679. #endif
  7680. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  7681. XMEMCPY(output + headerSz, data, fragSz);
  7682. #ifdef WOLFSSL_DTLS
  7683. if (ssl->options.dtls) {
  7684. ssl->keys.dtls_handshake_number--;
  7685. DtlsSEQIncrement(ssl, CUR_ORDER);
  7686. }
  7687. if (IsDtlsNotSctpMode(ssl)) {
  7688. if ((ret = DtlsMsgPoolSave(ssl, output, headerSz + fragSz,
  7689. type)) != 0) {
  7690. return ret;
  7691. }
  7692. }
  7693. #endif
  7694. }
  7695. ssl->buffers.outputBuffer.length += outputSz;
  7696. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  7697. if (ssl->hsInfoOn) {
  7698. AddPacketName(ssl, packetName);
  7699. }
  7700. if (ssl->toInfoOn) {
  7701. AddPacketInfo(ssl, packetName, handshake,
  7702. output, outputSz, WRITE_PROTO, ssl->heap);
  7703. }
  7704. #endif
  7705. ssl->fragOffset += fragSz;
  7706. if (!ssl->options.groupMessages)
  7707. ret = SendBuffered(ssl);
  7708. if (ret != 0)
  7709. return ret;
  7710. }
  7711. #ifdef WOLFSSL_DTLS
  7712. /* Increment msg number once we sent all fragments */
  7713. if (ssl->options.dtls)
  7714. ssl->keys.dtls_handshake_number++;
  7715. #endif
  7716. ssl->fragOffset = 0;
  7717. return ret;
  7718. }
  7719. #endif /* !NO_WOLFSSL_SERVER || (!NO_WOLFSSL_CLIENT && !NO_CERTS &&
  7720. * !WOLFSSL_NO_CLIENT_AUTH) */
  7721. #endif /* !WOLFSSL_NO_TLS12 */
  7722. /* return bytes received, -1 on error */
  7723. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  7724. {
  7725. int recvd;
  7726. if (ssl->CBIORecv == NULL) {
  7727. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  7728. return -1;
  7729. }
  7730. retry:
  7731. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  7732. if (recvd < 0) {
  7733. switch (recvd) {
  7734. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  7735. #ifdef WOLFSSL_APACHE_HTTPD
  7736. #ifndef NO_BIO
  7737. if (ssl->biord) {
  7738. /* If retry and read flags are set, return WANT_READ */
  7739. if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
  7740. (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
  7741. return WANT_READ;
  7742. }
  7743. }
  7744. #endif
  7745. #endif
  7746. return -1;
  7747. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  7748. return WANT_READ;
  7749. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  7750. #ifdef USE_WINDOWS_API
  7751. if (ssl->options.dtls) {
  7752. goto retry;
  7753. }
  7754. #endif
  7755. ssl->options.connReset = 1;
  7756. return -1;
  7757. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  7758. /* see if we got our timeout */
  7759. #ifdef WOLFSSL_CALLBACKS
  7760. if (ssl->toInfoOn) {
  7761. struct itimerval timeout;
  7762. getitimer(ITIMER_REAL, &timeout);
  7763. if (timeout.it_value.tv_sec == 0 &&
  7764. timeout.it_value.tv_usec == 0) {
  7765. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  7766. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  7767. ssl->timeoutInfo.timeoutName[
  7768. MAX_TIMEOUT_NAME_SZ] = '\0';
  7769. WOLFSSL_MSG("Got our timeout");
  7770. return WANT_READ;
  7771. }
  7772. }
  7773. #endif
  7774. goto retry;
  7775. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  7776. ssl->options.isClosed = 1;
  7777. return -1;
  7778. case WOLFSSL_CBIO_ERR_TIMEOUT:
  7779. #ifdef WOLFSSL_DTLS
  7780. if (IsDtlsNotSctpMode(ssl) &&
  7781. ssl->options.handShakeState != HANDSHAKE_DONE &&
  7782. DtlsMsgPoolTimeout(ssl) == 0 &&
  7783. DtlsMsgPoolSend(ssl, 0) == 0) {
  7784. /* retry read for DTLS during handshake only */
  7785. goto retry;
  7786. }
  7787. #endif
  7788. return -1;
  7789. default:
  7790. WOLFSSL_MSG("Unexpected recv return code");
  7791. return recvd;
  7792. }
  7793. }
  7794. return recvd;
  7795. }
  7796. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  7797. void ShrinkOutputBuffer(WOLFSSL* ssl)
  7798. {
  7799. WOLFSSL_MSG("Shrinking output buffer\n");
  7800. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  7801. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  7802. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  7803. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  7804. ssl->buffers.outputBuffer.dynamicFlag = 0;
  7805. ssl->buffers.outputBuffer.offset = 0;
  7806. }
  7807. /* Switch dynamic input buffer back to static, keep any remaining input */
  7808. /* forced free means cleaning up */
  7809. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  7810. {
  7811. int usedLength = ssl->buffers.inputBuffer.length -
  7812. ssl->buffers.inputBuffer.idx;
  7813. if (!forcedFree && usedLength > STATIC_BUFFER_LEN)
  7814. return;
  7815. WOLFSSL_MSG("Shrinking input buffer\n");
  7816. if (!forcedFree && usedLength > 0)
  7817. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  7818. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  7819. usedLength);
  7820. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  7821. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  7822. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  7823. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  7824. ssl->buffers.inputBuffer.dynamicFlag = 0;
  7825. ssl->buffers.inputBuffer.offset = 0;
  7826. ssl->buffers.inputBuffer.idx = 0;
  7827. ssl->buffers.inputBuffer.length = usedLength;
  7828. }
  7829. int SendBuffered(WOLFSSL* ssl)
  7830. {
  7831. if (ssl->CBIOSend == NULL) {
  7832. WOLFSSL_MSG("Your IO Send callback is null, please set");
  7833. return SOCKET_ERROR_E;
  7834. }
  7835. #ifdef WOLFSSL_DEBUG_TLS
  7836. if (ssl->buffers.outputBuffer.idx == 0) {
  7837. WOLFSSL_MSG("Data to send");
  7838. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  7839. ssl->buffers.outputBuffer.length);
  7840. }
  7841. #endif
  7842. while (ssl->buffers.outputBuffer.length > 0) {
  7843. int sent = ssl->CBIOSend(ssl,
  7844. (char*)ssl->buffers.outputBuffer.buffer +
  7845. ssl->buffers.outputBuffer.idx,
  7846. (int)ssl->buffers.outputBuffer.length,
  7847. ssl->IOCB_WriteCtx);
  7848. if (sent < 0) {
  7849. switch (sent) {
  7850. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  7851. return WANT_WRITE;
  7852. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  7853. ssl->options.connReset = 1;
  7854. break;
  7855. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  7856. /* see if we got our timeout */
  7857. #ifdef WOLFSSL_CALLBACKS
  7858. if (ssl->toInfoOn) {
  7859. struct itimerval timeout;
  7860. getitimer(ITIMER_REAL, &timeout);
  7861. if (timeout.it_value.tv_sec == 0 &&
  7862. timeout.it_value.tv_usec == 0) {
  7863. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  7864. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  7865. ssl->timeoutInfo.timeoutName[
  7866. MAX_TIMEOUT_NAME_SZ] = '\0';
  7867. WOLFSSL_MSG("Got our timeout");
  7868. return WANT_WRITE;
  7869. }
  7870. }
  7871. #endif
  7872. continue;
  7873. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  7874. ssl->options.connReset = 1; /* treat same as reset */
  7875. break;
  7876. default:
  7877. return SOCKET_ERROR_E;
  7878. }
  7879. return SOCKET_ERROR_E;
  7880. }
  7881. if (sent > (int)ssl->buffers.outputBuffer.length) {
  7882. WOLFSSL_MSG("SendBuffered() out of bounds read");
  7883. return SEND_OOB_READ_E;
  7884. }
  7885. ssl->buffers.outputBuffer.idx += sent;
  7886. ssl->buffers.outputBuffer.length -= sent;
  7887. }
  7888. ssl->buffers.outputBuffer.idx = 0;
  7889. if (ssl->buffers.outputBuffer.dynamicFlag)
  7890. ShrinkOutputBuffer(ssl);
  7891. return 0;
  7892. }
  7893. /* Grow the output buffer */
  7894. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  7895. {
  7896. byte* tmp;
  7897. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7898. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  7899. RECORD_HEADER_SZ;
  7900. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7901. #else
  7902. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7903. #endif
  7904. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7905. /* the encrypted data will be offset from the front of the buffer by
  7906. the header, if the user wants encrypted alignment they need
  7907. to define their alignment requirement */
  7908. while (align < hdrSz)
  7909. align *= 2;
  7910. #endif
  7911. tmp = (byte*)XMALLOC(size + ssl->buffers.outputBuffer.length + align,
  7912. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  7913. WOLFSSL_MSG("growing output buffer\n");
  7914. if (tmp == NULL)
  7915. return MEMORY_E;
  7916. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7917. if (align)
  7918. tmp += align - hdrSz;
  7919. #endif
  7920. #ifdef WOLFSSL_STATIC_MEMORY
  7921. /* can be from IO memory pool which does not need copy if same buffer */
  7922. if (ssl->buffers.outputBuffer.length &&
  7923. tmp == ssl->buffers.outputBuffer.buffer) {
  7924. ssl->buffers.outputBuffer.bufferSize =
  7925. size + ssl->buffers.outputBuffer.length;
  7926. return 0;
  7927. }
  7928. #endif
  7929. if (ssl->buffers.outputBuffer.length)
  7930. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  7931. ssl->buffers.outputBuffer.length);
  7932. if (ssl->buffers.outputBuffer.dynamicFlag)
  7933. XFREE(ssl->buffers.outputBuffer.buffer -
  7934. ssl->buffers.outputBuffer.offset, ssl->heap,
  7935. DYNAMIC_TYPE_OUT_BUFFER);
  7936. ssl->buffers.outputBuffer.dynamicFlag = 1;
  7937. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7938. if (align)
  7939. ssl->buffers.outputBuffer.offset = align - hdrSz;
  7940. else
  7941. #endif
  7942. ssl->buffers.outputBuffer.offset = 0;
  7943. ssl->buffers.outputBuffer.buffer = tmp;
  7944. ssl->buffers.outputBuffer.bufferSize = size +
  7945. ssl->buffers.outputBuffer.length;
  7946. return 0;
  7947. }
  7948. /* Grow the input buffer, should only be to read cert or big app data */
  7949. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  7950. {
  7951. byte* tmp;
  7952. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7953. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  7954. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  7955. #else
  7956. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7957. #endif
  7958. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7959. /* the encrypted data will be offset from the front of the buffer by
  7960. the dtls record header, if the user wants encrypted alignment they need
  7961. to define their alignment requirement. in tls we read record header
  7962. to get size of record and put actual data back at front, so don't need */
  7963. if (align) {
  7964. while (align < hdrSz)
  7965. align *= 2;
  7966. }
  7967. #endif
  7968. if (usedLength < 0 || size < 0) {
  7969. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  7970. return BAD_FUNC_ARG;
  7971. }
  7972. tmp = (byte*)XMALLOC(size + usedLength + align,
  7973. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  7974. WOLFSSL_MSG("growing input buffer\n");
  7975. if (tmp == NULL)
  7976. return MEMORY_E;
  7977. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7978. if (align)
  7979. tmp += align - hdrSz;
  7980. #endif
  7981. #ifdef WOLFSSL_STATIC_MEMORY
  7982. /* can be from IO memory pool which does not need copy if same buffer */
  7983. if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
  7984. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  7985. ssl->buffers.inputBuffer.idx = 0;
  7986. ssl->buffers.inputBuffer.length = usedLength;
  7987. return 0;
  7988. }
  7989. #endif
  7990. if (usedLength)
  7991. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  7992. ssl->buffers.inputBuffer.idx, usedLength);
  7993. if (ssl->buffers.inputBuffer.dynamicFlag)
  7994. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  7995. ssl->heap,DYNAMIC_TYPE_IN_BUFFER);
  7996. ssl->buffers.inputBuffer.dynamicFlag = 1;
  7997. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7998. if (align)
  7999. ssl->buffers.inputBuffer.offset = align - hdrSz;
  8000. else
  8001. #endif
  8002. ssl->buffers.inputBuffer.offset = 0;
  8003. ssl->buffers.inputBuffer.buffer = tmp;
  8004. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  8005. ssl->buffers.inputBuffer.idx = 0;
  8006. ssl->buffers.inputBuffer.length = usedLength;
  8007. return 0;
  8008. }
  8009. /* Check available size into output buffer, make room if needed.
  8010. * This function needs to be called before anything gets put
  8011. * into the output buffers since it flushes pending data if it
  8012. * predicts that the msg will exceed MTU. */
  8013. int CheckAvailableSize(WOLFSSL *ssl, int size)
  8014. {
  8015. if (size < 0) {
  8016. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  8017. return BAD_FUNC_ARG;
  8018. }
  8019. #ifdef WOLFSSL_DTLS
  8020. if (ssl->options.dtls) {
  8021. if (size + ssl->buffers.outputBuffer.length -
  8022. ssl->buffers.outputBuffer.idx >
  8023. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  8024. ssl->dtlsMtuSz
  8025. #else
  8026. ssl->dtls_expected_rx
  8027. #endif
  8028. ) {
  8029. int ret;
  8030. WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
  8031. "to make room for new message");
  8032. if ((ret = SendBuffered(ssl)) != 0) {
  8033. return ret;
  8034. }
  8035. }
  8036. if (size > (int)
  8037. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  8038. ssl->dtlsMtuSz
  8039. #else
  8040. ssl->dtls_expected_rx
  8041. #endif
  8042. ) {
  8043. WOLFSSL_MSG("CheckAvailableSize() called with size greater than MTU.");
  8044. return DTLS_SIZE_ERROR;
  8045. }
  8046. }
  8047. #endif
  8048. if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
  8049. < (word32)size) {
  8050. if (GrowOutputBuffer(ssl, size) < 0)
  8051. return MEMORY_E;
  8052. }
  8053. return 0;
  8054. }
  8055. /* do all verify and sanity checks on record header */
  8056. static int GetRecordHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  8057. RecordLayerHeader* rh, word16 *size)
  8058. {
  8059. if (!ssl->options.dtls) {
  8060. #ifdef HAVE_FUZZER
  8061. if (ssl->fuzzerCb)
  8062. ssl->fuzzerCb(ssl, input + *inOutIdx, RECORD_HEADER_SZ, FUZZ_HEAD,
  8063. ssl->fuzzerCtx);
  8064. #endif
  8065. XMEMCPY(rh, input + *inOutIdx, RECORD_HEADER_SZ);
  8066. *inOutIdx += RECORD_HEADER_SZ;
  8067. ato16(rh->length, size);
  8068. }
  8069. else {
  8070. #ifdef WOLFSSL_DTLS
  8071. #ifdef HAVE_FUZZER
  8072. if (ssl->fuzzerCb)
  8073. ssl->fuzzerCb(ssl, input + *inOutIdx, DTLS_RECORD_HEADER_SZ,
  8074. FUZZ_HEAD, ssl->fuzzerCtx);
  8075. #endif
  8076. /* type and version in same sport */
  8077. XMEMCPY(rh, input + *inOutIdx, ENUM_LEN + VERSION_SZ);
  8078. *inOutIdx += ENUM_LEN + VERSION_SZ;
  8079. ato16(input + *inOutIdx, &ssl->keys.curEpoch);
  8080. *inOutIdx += OPAQUE16_LEN;
  8081. if (ssl->options.haveMcast) {
  8082. #ifdef WOLFSSL_MULTICAST
  8083. ssl->keys.curPeerId = input[*inOutIdx];
  8084. ssl->keys.curSeq_hi = input[*inOutIdx+1];
  8085. #endif
  8086. }
  8087. else
  8088. ato16(input + *inOutIdx, &ssl->keys.curSeq_hi);
  8089. *inOutIdx += OPAQUE16_LEN;
  8090. ato32(input + *inOutIdx, &ssl->keys.curSeq_lo);
  8091. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  8092. ato16(input + *inOutIdx, size);
  8093. *inOutIdx += LENGTH_SZ;
  8094. #endif
  8095. }
  8096. #ifdef WOLFSSL_DTLS
  8097. if (IsDtlsNotSctpMode(ssl)) {
  8098. if (!DtlsCheckWindow(ssl) ||
  8099. (rh->type == application_data && ssl->keys.curEpoch == 0) ||
  8100. (rh->type == alert && ssl->options.handShakeDone &&
  8101. ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
  8102. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  8103. return SEQUENCE_ERROR;
  8104. }
  8105. }
  8106. #endif
  8107. /* catch version mismatch */
  8108. #ifndef WOLFSSL_TLS13
  8109. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  8110. #else
  8111. if (rh->pvMajor != ssl->version.major ||
  8112. (rh->pvMinor != ssl->version.minor &&
  8113. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_2_MINOR)
  8114. ))
  8115. #endif
  8116. {
  8117. if (ssl->options.side == WOLFSSL_SERVER_END &&
  8118. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  8119. WOLFSSL_MSG("Client attempting to connect with different version");
  8120. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  8121. ssl->options.downgrade &&
  8122. ssl->options.connectState < FIRST_REPLY_DONE)
  8123. WOLFSSL_MSG("Server attempting to accept with different version");
  8124. else if (ssl->options.dtls && rh->type == handshake)
  8125. /* Check the DTLS handshake message RH version later. */
  8126. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  8127. else {
  8128. WOLFSSL_MSG("SSL version error");
  8129. /* send alert per RFC5246 Appendix E. Backward Compatibility */
  8130. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  8131. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  8132. SendAlert(ssl, alert_fatal, wc_protocol_version);
  8133. #else
  8134. SendAlert(ssl, alert_fatal, protocol_version);
  8135. #endif
  8136. }
  8137. return VERSION_ERROR; /* only use requested version */
  8138. }
  8139. }
  8140. /* record layer length check */
  8141. #ifdef HAVE_MAX_FRAGMENT
  8142. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  8143. SendAlert(ssl, alert_fatal, record_overflow);
  8144. return LENGTH_ERROR;
  8145. }
  8146. #else
  8147. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA))
  8148. return LENGTH_ERROR;
  8149. #endif
  8150. if (*size == 0 && rh->type != application_data) {
  8151. WOLFSSL_MSG("0 length, non-app data record.");
  8152. return LENGTH_ERROR;
  8153. }
  8154. /* verify record type here as well */
  8155. switch (rh->type) {
  8156. case handshake:
  8157. case change_cipher_spec:
  8158. case application_data:
  8159. case alert:
  8160. break;
  8161. case no_type:
  8162. default:
  8163. WOLFSSL_MSG("Unknown Record Type");
  8164. return UNKNOWN_RECORD_TYPE;
  8165. }
  8166. /* haven't decrypted this record yet */
  8167. ssl->keys.decryptedCur = 0;
  8168. return 0;
  8169. }
  8170. #ifndef WOLFSSL_NO_TLS12
  8171. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  8172. byte *type, word32 *size, word32 totalSz)
  8173. {
  8174. const byte *ptr = input + *inOutIdx;
  8175. (void)ssl;
  8176. *inOutIdx += HANDSHAKE_HEADER_SZ;
  8177. if (*inOutIdx > totalSz)
  8178. return BUFFER_E;
  8179. *type = ptr[0];
  8180. c24to32(&ptr[1], size);
  8181. return 0;
  8182. }
  8183. #endif
  8184. #ifdef WOLFSSL_DTLS
  8185. static int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  8186. word32* inOutIdx, byte *type, word32 *size,
  8187. word32 *fragOffset, word32 *fragSz,
  8188. word32 totalSz)
  8189. {
  8190. word32 idx = *inOutIdx;
  8191. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  8192. if (*inOutIdx > totalSz) {
  8193. WOLFSSL_ERROR(BUFFER_E);
  8194. return BUFFER_E;
  8195. }
  8196. *type = input[idx++];
  8197. c24to32(input + idx, size);
  8198. idx += OPAQUE24_LEN;
  8199. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  8200. idx += DTLS_HANDSHAKE_SEQ_SZ;
  8201. c24to32(input + idx, fragOffset);
  8202. idx += DTLS_HANDSHAKE_FRAG_SZ;
  8203. c24to32(input + idx, fragSz);
  8204. if (ssl->curRL.pvMajor != ssl->version.major ||
  8205. ssl->curRL.pvMinor != ssl->version.minor) {
  8206. if (*type != client_hello && *type != hello_verify_request) {
  8207. WOLFSSL_ERROR(VERSION_ERROR);
  8208. return VERSION_ERROR;
  8209. }
  8210. else {
  8211. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  8212. }
  8213. }
  8214. return 0;
  8215. }
  8216. #endif
  8217. #if !defined(NO_OLD_TLS) || \
  8218. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  8219. /* fill with MD5 pad size since biggest required */
  8220. static const byte PAD1[PAD_MD5] =
  8221. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  8222. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  8223. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  8224. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  8225. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  8226. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  8227. };
  8228. static const byte PAD2[PAD_MD5] =
  8229. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  8230. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  8231. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  8232. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  8233. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  8234. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  8235. };
  8236. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  8237. #ifndef NO_OLD_TLS
  8238. /* calculate MD5 hash for finished */
  8239. #ifdef WOLFSSL_TI_HASH
  8240. #include <wolfssl/wolfcrypt/hash.h>
  8241. #endif
  8242. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  8243. {
  8244. int ret;
  8245. byte md5_result[WC_MD5_DIGEST_SIZE];
  8246. #ifdef WOLFSSL_SMALL_STACK
  8247. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  8248. if (md5 == NULL)
  8249. return MEMORY_E;
  8250. #else
  8251. wc_Md5 md5[1];
  8252. #endif
  8253. /* make md5 inner */
  8254. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  8255. if (ret == 0)
  8256. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  8257. if (ret == 0)
  8258. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  8259. if (ret == 0)
  8260. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  8261. if (ret == 0)
  8262. ret = wc_Md5Final(md5, md5_result);
  8263. /* make md5 outer */
  8264. if (ret == 0) {
  8265. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  8266. if (ret == 0) {
  8267. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  8268. if (ret == 0)
  8269. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  8270. if (ret == 0)
  8271. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  8272. if (ret == 0)
  8273. ret = wc_Md5Final(md5, hashes->md5);
  8274. wc_Md5Free(md5);
  8275. }
  8276. }
  8277. #ifdef WOLFSSL_SMALL_STACK
  8278. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  8279. #endif
  8280. return ret;
  8281. }
  8282. /* calculate SHA hash for finished */
  8283. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  8284. {
  8285. int ret;
  8286. byte sha_result[WC_SHA_DIGEST_SIZE];
  8287. #ifdef WOLFSSL_SMALL_STACK
  8288. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  8289. if (sha == NULL)
  8290. return MEMORY_E;
  8291. #else
  8292. wc_Sha sha[1];
  8293. #endif
  8294. /* make sha inner */
  8295. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  8296. if (ret == 0)
  8297. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  8298. if (ret == 0)
  8299. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  8300. if (ret == 0)
  8301. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  8302. if (ret == 0)
  8303. ret = wc_ShaFinal(sha, sha_result);
  8304. /* make sha outer */
  8305. if (ret == 0) {
  8306. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  8307. if (ret == 0) {
  8308. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  8309. if (ret == 0)
  8310. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  8311. if (ret == 0)
  8312. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  8313. if (ret == 0)
  8314. ret = wc_ShaFinal(sha, hashes->sha);
  8315. wc_ShaFree(sha);
  8316. }
  8317. }
  8318. #ifdef WOLFSSL_SMALL_STACK
  8319. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  8320. #endif
  8321. return ret;
  8322. }
  8323. #endif
  8324. #ifndef WOLFSSL_NO_TLS12
  8325. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  8326. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  8327. {
  8328. int ret = 0;
  8329. if (ssl == NULL)
  8330. return BAD_FUNC_ARG;
  8331. #ifndef NO_TLS
  8332. if (ssl->options.tls) {
  8333. ret = BuildTlsFinished(ssl, hashes, sender);
  8334. }
  8335. #endif
  8336. #ifndef NO_OLD_TLS
  8337. if (!ssl->options.tls) {
  8338. ret = BuildMD5(ssl, hashes, sender);
  8339. if (ret == 0) {
  8340. ret = BuildSHA(ssl, hashes, sender);
  8341. }
  8342. }
  8343. #endif
  8344. return ret;
  8345. }
  8346. #endif /* WOLFSSL_NO_TLS12 */
  8347. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  8348. /* cipher requirements */
  8349. enum {
  8350. REQUIRES_RSA,
  8351. REQUIRES_DHE,
  8352. REQUIRES_ECC,
  8353. REQUIRES_ECC_STATIC,
  8354. REQUIRES_PSK,
  8355. REQUIRES_RSA_SIG,
  8356. REQUIRES_AEAD
  8357. };
  8358. /* Does this cipher suite (first, second) have the requirement
  8359. an ephemeral key exchange will still require the key for signing
  8360. the key exchange so ECHDE_RSA requires an rsa key thus rsa_kea */
  8361. static int CipherRequires(byte first, byte second, int requirement)
  8362. {
  8363. (void)requirement;
  8364. #ifndef WOLFSSL_NO_TLS12
  8365. #ifdef HAVE_CHACHA
  8366. if (first == CHACHA_BYTE) {
  8367. switch (second) {
  8368. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  8369. if (requirement == REQUIRES_RSA)
  8370. return 1;
  8371. break;
  8372. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  8373. if (requirement == REQUIRES_ECC)
  8374. return 1;
  8375. break;
  8376. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  8377. if (requirement == REQUIRES_RSA)
  8378. return 1;
  8379. if (requirement == REQUIRES_DHE)
  8380. return 1;
  8381. break;
  8382. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  8383. if (requirement == REQUIRES_RSA)
  8384. return 1;
  8385. break;
  8386. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  8387. if (requirement == REQUIRES_ECC)
  8388. return 1;
  8389. break;
  8390. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  8391. if (requirement == REQUIRES_RSA)
  8392. return 1;
  8393. if (requirement == REQUIRES_DHE)
  8394. return 1;
  8395. break;
  8396. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  8397. if (requirement == REQUIRES_PSK)
  8398. return 1;
  8399. break;
  8400. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  8401. if (requirement == REQUIRES_PSK)
  8402. return 1;
  8403. break;
  8404. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  8405. if (requirement == REQUIRES_PSK)
  8406. return 1;
  8407. if (requirement == REQUIRES_DHE)
  8408. return 1;
  8409. break;
  8410. }
  8411. if (requirement == REQUIRES_AEAD)
  8412. return 1;
  8413. }
  8414. #endif /* HAVE_CHACHA */
  8415. /* ECC extensions */
  8416. if (first == ECC_BYTE) {
  8417. switch (second) {
  8418. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8419. #ifndef NO_RSA
  8420. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  8421. if (requirement == REQUIRES_RSA)
  8422. return 1;
  8423. break;
  8424. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  8425. if (requirement == REQUIRES_ECC_STATIC)
  8426. return 1;
  8427. if (requirement == REQUIRES_RSA_SIG)
  8428. return 1;
  8429. break;
  8430. #ifndef NO_DES3
  8431. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  8432. if (requirement == REQUIRES_RSA)
  8433. return 1;
  8434. break;
  8435. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  8436. if (requirement == REQUIRES_ECC_STATIC)
  8437. return 1;
  8438. if (requirement == REQUIRES_RSA_SIG)
  8439. return 1;
  8440. break;
  8441. #endif /* !NO_DES3 */
  8442. #ifndef NO_RC4
  8443. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  8444. if (requirement == REQUIRES_RSA)
  8445. return 1;
  8446. break;
  8447. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  8448. if (requirement == REQUIRES_ECC_STATIC)
  8449. return 1;
  8450. if (requirement == REQUIRES_RSA_SIG)
  8451. return 1;
  8452. break;
  8453. #endif /* !NO_RC4 */
  8454. #endif /* NO_RSA */
  8455. #ifndef NO_DES3
  8456. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  8457. if (requirement == REQUIRES_ECC)
  8458. return 1;
  8459. break;
  8460. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  8461. if (requirement == REQUIRES_ECC_STATIC)
  8462. return 1;
  8463. break;
  8464. #endif /* !NO_DES3 */
  8465. #ifndef NO_RC4
  8466. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  8467. if (requirement == REQUIRES_ECC)
  8468. return 1;
  8469. break;
  8470. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  8471. if (requirement == REQUIRES_ECC_STATIC)
  8472. return 1;
  8473. break;
  8474. #endif /* !NO_RC4 */
  8475. #ifndef NO_RSA
  8476. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  8477. if (requirement == REQUIRES_RSA)
  8478. return 1;
  8479. break;
  8480. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  8481. if (requirement == REQUIRES_ECC_STATIC)
  8482. return 1;
  8483. if (requirement == REQUIRES_RSA_SIG)
  8484. return 1;
  8485. break;
  8486. #endif /* !NO_RSA */
  8487. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  8488. if (requirement == REQUIRES_ECC)
  8489. return 1;
  8490. break;
  8491. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  8492. if (requirement == REQUIRES_ECC_STATIC)
  8493. return 1;
  8494. break;
  8495. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  8496. if (requirement == REQUIRES_ECC)
  8497. return 1;
  8498. break;
  8499. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  8500. if (requirement == REQUIRES_ECC_STATIC)
  8501. return 1;
  8502. break;
  8503. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  8504. if (requirement == REQUIRES_ECC)
  8505. return 1;
  8506. if (requirement == REQUIRES_AEAD)
  8507. return 1;
  8508. break;
  8509. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  8510. if (requirement == REQUIRES_ECC)
  8511. return 1;
  8512. if (requirement == REQUIRES_AEAD)
  8513. return 1;
  8514. break;
  8515. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  8516. if (requirement == REQUIRES_ECC_STATIC)
  8517. return 1;
  8518. if (requirement == REQUIRES_AEAD)
  8519. return 1;
  8520. break;
  8521. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  8522. if (requirement == REQUIRES_ECC_STATIC)
  8523. return 1;
  8524. if (requirement == REQUIRES_AEAD)
  8525. return 1;
  8526. break;
  8527. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8528. #ifndef NO_RSA
  8529. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8530. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  8531. if (requirement == REQUIRES_RSA)
  8532. return 1;
  8533. if (requirement == REQUIRES_AEAD)
  8534. return 1;
  8535. break;
  8536. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  8537. if (requirement == REQUIRES_RSA)
  8538. return 1;
  8539. if (requirement == REQUIRES_AEAD)
  8540. return 1;
  8541. break;
  8542. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  8543. if (requirement == REQUIRES_ECC_STATIC)
  8544. return 1;
  8545. if (requirement == REQUIRES_RSA_SIG)
  8546. return 1;
  8547. if (requirement == REQUIRES_AEAD)
  8548. return 1;
  8549. break;
  8550. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  8551. if (requirement == REQUIRES_ECC_STATIC)
  8552. return 1;
  8553. if (requirement == REQUIRES_RSA_SIG)
  8554. return 1;
  8555. if (requirement == REQUIRES_AEAD)
  8556. return 1;
  8557. break;
  8558. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8559. #ifdef HAVE_AESCCM
  8560. case TLS_RSA_WITH_AES_128_CCM_8 :
  8561. case TLS_RSA_WITH_AES_256_CCM_8 :
  8562. if (requirement == REQUIRES_RSA)
  8563. return 1;
  8564. if (requirement == REQUIRES_RSA_SIG)
  8565. return 1;
  8566. if (requirement == REQUIRES_AEAD)
  8567. return 1;
  8568. break;
  8569. #endif /* HAVE_AESCCM */
  8570. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8571. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  8572. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  8573. if (requirement == REQUIRES_RSA)
  8574. return 1;
  8575. break;
  8576. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  8577. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  8578. if (requirement == REQUIRES_RSA_SIG)
  8579. return 1;
  8580. if (requirement == REQUIRES_ECC_STATIC)
  8581. return 1;
  8582. break;
  8583. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8584. #endif /* !NO_RSA */
  8585. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8586. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  8587. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  8588. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  8589. if (requirement == REQUIRES_ECC)
  8590. return 1;
  8591. if (requirement == REQUIRES_AEAD)
  8592. return 1;
  8593. break;
  8594. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  8595. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  8596. if (requirement == REQUIRES_ECC)
  8597. return 1;
  8598. break;
  8599. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  8600. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  8601. if (requirement == REQUIRES_ECC)
  8602. return 1;
  8603. if (requirement == REQUIRES_ECC_STATIC)
  8604. return 1;
  8605. break;
  8606. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8607. #ifndef NO_PSK
  8608. case TLS_PSK_WITH_AES_128_CCM:
  8609. case TLS_PSK_WITH_AES_256_CCM:
  8610. case TLS_PSK_WITH_AES_128_CCM_8:
  8611. case TLS_PSK_WITH_AES_256_CCM_8:
  8612. if (requirement == REQUIRES_PSK)
  8613. return 1;
  8614. if (requirement == REQUIRES_AEAD)
  8615. return 1;
  8616. break;
  8617. case TLS_DHE_PSK_WITH_AES_128_CCM:
  8618. case TLS_DHE_PSK_WITH_AES_256_CCM:
  8619. if (requirement == REQUIRES_PSK)
  8620. return 1;
  8621. if (requirement == REQUIRES_DHE)
  8622. return 1;
  8623. if (requirement == REQUIRES_AEAD)
  8624. return 1;
  8625. break;
  8626. #endif /* !NO_PSK */
  8627. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8628. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  8629. if (requirement == REQUIRES_ECC)
  8630. return 1;
  8631. break;
  8632. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  8633. if (requirement == REQUIRES_PSK)
  8634. return 1;
  8635. break;
  8636. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  8637. if (requirement == REQUIRES_PSK)
  8638. return 1;
  8639. break;
  8640. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8641. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  8642. case TLS_SHA256_SHA256:
  8643. break;
  8644. case TLS_SHA384_SHA384:
  8645. break;
  8646. #endif
  8647. default:
  8648. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  8649. return 0;
  8650. } /* switch */
  8651. } /* if */
  8652. #endif /* !WOLFSSL_NO_TLS12 */
  8653. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  8654. if (first == TLS13_BYTE) {
  8655. switch (second) {
  8656. #ifdef WOLFSSL_TLS13
  8657. case TLS_AES_128_GCM_SHA256:
  8658. case TLS_AES_256_GCM_SHA384:
  8659. case TLS_CHACHA20_POLY1305_SHA256:
  8660. case TLS_AES_128_CCM_SHA256:
  8661. case TLS_AES_128_CCM_8_SHA256:
  8662. break;
  8663. #endif
  8664. default:
  8665. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  8666. "TLS v1.3");
  8667. return 0;
  8668. }
  8669. }
  8670. #ifndef WOLFSSL_NO_TLS12
  8671. if (first != ECC_BYTE && first != CHACHA_BYTE &&
  8672. first != TLS13_BYTE) { /* normal suites */
  8673. switch (second) {
  8674. #ifndef NO_RSA
  8675. #ifndef NO_RC4
  8676. case SSL_RSA_WITH_RC4_128_SHA :
  8677. if (requirement == REQUIRES_RSA)
  8678. return 1;
  8679. break;
  8680. case SSL_RSA_WITH_RC4_128_MD5 :
  8681. if (requirement == REQUIRES_RSA)
  8682. return 1;
  8683. break;
  8684. #endif /* NO_RC4 */
  8685. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  8686. if (requirement == REQUIRES_RSA)
  8687. return 1;
  8688. break;
  8689. case TLS_RSA_WITH_AES_128_CBC_SHA :
  8690. if (requirement == REQUIRES_RSA)
  8691. return 1;
  8692. break;
  8693. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  8694. if (requirement == REQUIRES_RSA)
  8695. return 1;
  8696. break;
  8697. case TLS_RSA_WITH_AES_256_CBC_SHA :
  8698. if (requirement == REQUIRES_RSA)
  8699. return 1;
  8700. break;
  8701. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  8702. if (requirement == REQUIRES_RSA)
  8703. return 1;
  8704. break;
  8705. case TLS_RSA_WITH_NULL_MD5 :
  8706. case TLS_RSA_WITH_NULL_SHA :
  8707. case TLS_RSA_WITH_NULL_SHA256 :
  8708. if (requirement == REQUIRES_RSA)
  8709. return 1;
  8710. break;
  8711. #ifdef HAVE_IDEA
  8712. case SSL_RSA_WITH_IDEA_CBC_SHA :
  8713. if (requirement == REQUIRES_RSA)
  8714. return 1;
  8715. break;
  8716. #endif /* HAVE_IDEA */
  8717. #endif /* !NO_RSA */
  8718. #ifndef NO_PSK
  8719. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  8720. if (requirement == REQUIRES_PSK)
  8721. return 1;
  8722. if (requirement == REQUIRES_AEAD)
  8723. return 1;
  8724. break;
  8725. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  8726. if (requirement == REQUIRES_PSK)
  8727. return 1;
  8728. if (requirement == REQUIRES_AEAD)
  8729. return 1;
  8730. break;
  8731. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  8732. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  8733. case TLS_PSK_WITH_AES_128_CBC_SHA :
  8734. case TLS_PSK_WITH_AES_256_CBC_SHA :
  8735. case TLS_PSK_WITH_NULL_SHA384 :
  8736. case TLS_PSK_WITH_NULL_SHA256 :
  8737. case TLS_PSK_WITH_NULL_SHA :
  8738. if (requirement == REQUIRES_PSK)
  8739. return 1;
  8740. break;
  8741. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  8742. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  8743. if (requirement == REQUIRES_DHE)
  8744. return 1;
  8745. if (requirement == REQUIRES_PSK)
  8746. return 1;
  8747. if (requirement == REQUIRES_AEAD)
  8748. return 1;
  8749. break;
  8750. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  8751. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  8752. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  8753. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  8754. if (requirement == REQUIRES_DHE)
  8755. return 1;
  8756. if (requirement == REQUIRES_PSK)
  8757. return 1;
  8758. break;
  8759. #endif /* NO_PSK */
  8760. #ifndef NO_RSA
  8761. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  8762. if (requirement == REQUIRES_RSA)
  8763. return 1;
  8764. if (requirement == REQUIRES_DHE)
  8765. return 1;
  8766. break;
  8767. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  8768. if (requirement == REQUIRES_RSA)
  8769. return 1;
  8770. if (requirement == REQUIRES_DHE)
  8771. return 1;
  8772. break;
  8773. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  8774. if (requirement == REQUIRES_RSA)
  8775. return 1;
  8776. if (requirement == REQUIRES_DHE)
  8777. return 1;
  8778. break;
  8779. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  8780. if (requirement == REQUIRES_RSA)
  8781. return 1;
  8782. if (requirement == REQUIRES_DHE)
  8783. return 1;
  8784. break;
  8785. #ifndef NO_HC128
  8786. case TLS_RSA_WITH_HC_128_MD5 :
  8787. if (requirement == REQUIRES_RSA)
  8788. return 1;
  8789. break;
  8790. case TLS_RSA_WITH_HC_128_SHA :
  8791. if (requirement == REQUIRES_RSA)
  8792. return 1;
  8793. break;
  8794. #endif /* NO_HC128 */
  8795. #ifndef NO_RABBIT
  8796. case TLS_RSA_WITH_RABBIT_SHA :
  8797. if (requirement == REQUIRES_RSA)
  8798. return 1;
  8799. break;
  8800. #endif /* !NO_RABBIT */
  8801. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  8802. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  8803. if (requirement == REQUIRES_RSA)
  8804. return 1;
  8805. if (requirement == REQUIRES_AEAD)
  8806. return 1;
  8807. break;
  8808. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  8809. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  8810. if (requirement == REQUIRES_RSA)
  8811. return 1;
  8812. if (requirement == REQUIRES_DHE)
  8813. return 1;
  8814. if (requirement == REQUIRES_AEAD)
  8815. return 1;
  8816. break;
  8817. #ifdef HAVE_CAMELLIA
  8818. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  8819. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  8820. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  8821. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  8822. if (requirement == REQUIRES_RSA)
  8823. return 1;
  8824. break;
  8825. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  8826. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  8827. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  8828. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  8829. if (requirement == REQUIRES_RSA)
  8830. return 1;
  8831. if (requirement == REQUIRES_RSA_SIG)
  8832. return 1;
  8833. if (requirement == REQUIRES_DHE)
  8834. return 1;
  8835. break;
  8836. #endif /* HAVE_CAMELLIA */
  8837. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  8838. if (requirement == REQUIRES_RSA)
  8839. return 1;
  8840. if (requirement == REQUIRES_RSA_SIG)
  8841. return 1;
  8842. if (requirement == REQUIRES_DHE)
  8843. return 1;
  8844. break;
  8845. #endif
  8846. #ifdef HAVE_ANON
  8847. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  8848. if (requirement == REQUIRES_DHE)
  8849. return 1;
  8850. break;
  8851. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  8852. if (requirement == REQUIRES_DHE)
  8853. return 1;
  8854. if (requirement == REQUIRES_AEAD)
  8855. return 1;
  8856. break;
  8857. #endif
  8858. #ifdef WOLFSSL_MULTICAST
  8859. case WDM_WITH_NULL_SHA256 :
  8860. break;
  8861. #endif
  8862. default:
  8863. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  8864. return 0;
  8865. } /* switch */
  8866. } /* if ECC / Normal suites else */
  8867. #endif /* !WOLFSSL_NO_TLS12 */
  8868. return 0;
  8869. }
  8870. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  8871. #ifndef NO_CERTS
  8872. /* Match names with wildcards, each wildcard can represent a single name
  8873. component or fragment but not multiple names, i.e.,
  8874. *.z.com matches y.z.com but not x.y.z.com
  8875. return 1 on success */
  8876. int MatchDomainName(const char* pattern, int len, const char* str)
  8877. {
  8878. int ret = 0;
  8879. char p, s;
  8880. if (pattern == NULL || str == NULL || len <= 0)
  8881. return 0;
  8882. while (len > 0) {
  8883. p = (char)XTOLOWER((unsigned char)*pattern++);
  8884. if (p == '\0')
  8885. break;
  8886. if (p == '*') {
  8887. while (--len > 0 &&
  8888. (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') {
  8889. }
  8890. if (len == 0)
  8891. p = '\0';
  8892. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  8893. if (s == p)
  8894. break;
  8895. if (s == '.')
  8896. return 0;
  8897. str++;
  8898. }
  8899. }
  8900. else {
  8901. if (p != (char)XTOLOWER((unsigned char) *str))
  8902. return 0;
  8903. }
  8904. if (len > 0) {
  8905. str++;
  8906. len--;
  8907. }
  8908. }
  8909. if (*str == '\0' && len == 0) {
  8910. ret = 1; /* success */
  8911. }
  8912. return ret;
  8913. }
  8914. /* Check that alternative names, if they exists, match the domain.
  8915. * Fail if there are wild patterns and they didn't match.
  8916. * Check the common name if no alternative names matched.
  8917. *
  8918. * dCert Decoded cert to get the alternative names from.
  8919. * domain Domain name to compare against.
  8920. * checkCN Whether to check the common name.
  8921. * returns 1 : match was found.
  8922. * 0 : no match found.
  8923. * -1 : No matches and wild pattern match failed.
  8924. */
  8925. int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
  8926. {
  8927. int match = 0;
  8928. DNS_entry* altName = NULL;
  8929. char *buf;
  8930. word32 len;
  8931. WOLFSSL_MSG("Checking AltNames");
  8932. if (dCert)
  8933. altName = dCert->altNames;
  8934. if (checkCN != NULL) {
  8935. *checkCN = (altName == NULL) ? 1 : 0;
  8936. }
  8937. while (altName) {
  8938. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  8939. char name[WOLFSSL_MAX_IPSTR] = {0};
  8940. #endif
  8941. WOLFSSL_MSG("\tindividual AltName check");
  8942. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  8943. /* check if alt name is stored as IP addr octet */
  8944. if (altName->type == ASN_IP_TYPE) {
  8945. const unsigned char *ip = (const unsigned char*)altName->name;
  8946. if (altName->len == WOLFSSL_IP4_ADDR_LEN) {
  8947. XSNPRINTF(name, sizeof(name), "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);
  8948. }
  8949. else if (altName->len == WOLFSSL_IP6_ADDR_LEN) {
  8950. int i;
  8951. for (i = 0; i < 8; i++) {
  8952. XSNPRINTF(name + i * 5, sizeof(name) - i * 5, "%02X%02X%s",
  8953. ip[2 * i], ip[2 * i + 1], (i < 7) ? ":" : "");
  8954. }
  8955. }
  8956. else {
  8957. WOLFSSL_MSG("\tnot an IPv4 or IPv6 address");
  8958. altName = altName->next;
  8959. continue;
  8960. }
  8961. buf = name;
  8962. len = (word32)XSTRLEN(name);
  8963. }
  8964. else
  8965. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  8966. {
  8967. buf = altName->name;
  8968. len = altName->len;
  8969. }
  8970. if (MatchDomainName(buf, len, domain)) {
  8971. match = 1;
  8972. if (checkCN != NULL) {
  8973. *checkCN = 0;
  8974. }
  8975. WOLFSSL_MSG("\tmatch found");
  8976. break;
  8977. }
  8978. /* No matches and wild pattern match failed. */
  8979. else if (buf && (len >=1) && (buf[0] == '*')) {
  8980. match = -1;
  8981. WOLFSSL_MSG("\twildcard match failed");
  8982. }
  8983. altName = altName->next;
  8984. }
  8985. return match;
  8986. }
  8987. /* Check the domain name matches the subject alternative name or the subject
  8988. * name.
  8989. *
  8990. * dcert Decoded certificate.
  8991. * domainName The domain name.
  8992. * domainNameLen The length of the domain name.
  8993. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  8994. */
  8995. int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
  8996. {
  8997. int checkCN;
  8998. int ret = DOMAIN_NAME_MISMATCH;
  8999. /* Assume name is NUL terminated. */
  9000. (void)domainNameLen;
  9001. if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
  9002. WOLFSSL_MSG("DomainName match on alt names failed");
  9003. }
  9004. else {
  9005. ret = 0;
  9006. }
  9007. if (checkCN == 1) {
  9008. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  9009. domainName) == 1) {
  9010. ret = 0;
  9011. }
  9012. else {
  9013. WOLFSSL_MSG("DomainName match on common name failed");
  9014. }
  9015. }
  9016. return ret;
  9017. }
  9018. int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
  9019. {
  9020. WOLFSSL_MSG("Checking IPAddr");
  9021. return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
  9022. }
  9023. #ifdef SESSION_CERTS
  9024. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  9025. byte* certBuf, word32 certSz)
  9026. {
  9027. if (chain->count < MAX_CHAIN_DEPTH &&
  9028. certSz < MAX_X509_SIZE) {
  9029. chain->certs[chain->count].length = certSz;
  9030. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  9031. chain->count++;
  9032. }
  9033. else {
  9034. WOLFSSL_MSG("Couldn't store chain cert for session");
  9035. }
  9036. }
  9037. #endif
  9038. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  9039. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9040. static void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType)
  9041. {
  9042. if (nameType == SUBJECT) {
  9043. XSTRNCPY(name->name, dCert->subject, ASN_NAME_MAX);
  9044. name->name[ASN_NAME_MAX - 1] = '\0';
  9045. name->sz = (int)XSTRLEN(name->name) + 1;
  9046. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  9047. name->rawLen = min(dCert->subjectRawLen, ASN_NAME_MAX);
  9048. XMEMCPY(name->raw, dCert->subjectRaw, name->rawLen);
  9049. #endif
  9050. }
  9051. else {
  9052. XSTRNCPY(name->name, dCert->issuer, ASN_NAME_MAX);
  9053. name->name[ASN_NAME_MAX - 1] = '\0';
  9054. name->sz = (int)XSTRLEN(name->name) + 1;
  9055. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)) \
  9056. && (defined(HAVE_PKCS7) || defined(WOLFSSL_CERT_EXT))
  9057. name->rawLen = min(dCert->issuerRawLen, ASN_NAME_MAX);
  9058. if (name->rawLen) {
  9059. XMEMCPY(name->raw, dCert->issuerRaw, name->rawLen);
  9060. }
  9061. #endif
  9062. }
  9063. }
  9064. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  9065. !defined(IGNORE_NAME_CONSTRAINTS)
  9066. /* copies over additional alt names such as dirName
  9067. * returns 0 on success
  9068. */
  9069. static int CopyAdditionalAltNames(DNS_entry** to, DNS_entry* from, int type,
  9070. void* heap)
  9071. {
  9072. DNS_entry* cur = from;
  9073. if (to == NULL) {
  9074. return BAD_FUNC_ARG;
  9075. }
  9076. while (cur != NULL) {
  9077. if (cur->type == type) {
  9078. DNS_entry* dnsEntry;
  9079. int strLen = cur->len;
  9080. dnsEntry = AltNameNew(heap);
  9081. if (dnsEntry == NULL) {
  9082. WOLFSSL_MSG("\tOut of Memory");
  9083. return MEMORY_E;
  9084. }
  9085. dnsEntry->type = type;
  9086. dnsEntry->name = (char*)XMALLOC(strLen + 1, heap,
  9087. DYNAMIC_TYPE_ALTNAME);
  9088. if (dnsEntry->name == NULL) {
  9089. WOLFSSL_MSG("\tOut of Memory");
  9090. XFREE(dnsEntry, heap, DYNAMIC_TYPE_ALTNAME);
  9091. return MEMORY_E;
  9092. }
  9093. dnsEntry->len = strLen;
  9094. XMEMCPY(dnsEntry->name, cur->name, strLen);
  9095. dnsEntry->name[strLen] = '\0';
  9096. dnsEntry->next = *to;
  9097. *to = dnsEntry;
  9098. }
  9099. cur = cur->next;
  9100. }
  9101. return 0;
  9102. }
  9103. #endif /* OPENSSL_EXTRA */
  9104. /* Copy parts X509 needs from Decoded cert, 0 on success */
  9105. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  9106. * altNames pointers could be free'd by second x509 still active by first */
  9107. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  9108. {
  9109. int ret = 0;
  9110. if (x509 == NULL || dCert == NULL ||
  9111. dCert->subjectCNLen < 0)
  9112. return BAD_FUNC_ARG;
  9113. if (x509->issuer.name == NULL || x509->subject.name == NULL) {
  9114. WOLFSSL_MSG("Either init was not called on X509 or programming error");
  9115. return BAD_FUNC_ARG;
  9116. }
  9117. x509->version = dCert->version + 1;
  9118. CopyDecodedName(&x509->issuer, dCert, ISSUER);
  9119. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9120. if (dCert->issuerName != NULL) {
  9121. wolfSSL_X509_set_issuer_name(x509,
  9122. (WOLFSSL_X509_NAME*)dCert->issuerName);
  9123. x509->issuer.x509 = x509;
  9124. }
  9125. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  9126. CopyDecodedName(&x509->subject, dCert, SUBJECT);
  9127. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9128. if (dCert->subjectName != NULL) {
  9129. wolfSSL_X509_set_subject_name(x509,
  9130. (WOLFSSL_X509_NAME*)dCert->subjectName);
  9131. x509->subject.x509 = x509;
  9132. }
  9133. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  9134. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  9135. x509->serialSz = dCert->serialSz;
  9136. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  9137. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  9138. x509->subjectCN[dCert->subjectCNLen] = '\0';
  9139. }
  9140. else
  9141. x509->subjectCN[0] = '\0';
  9142. #ifdef WOLFSSL_CERT_REQ
  9143. x509->isCSR = dCert->isCSR;
  9144. /* CSR attributes */
  9145. if (dCert->cPwd) {
  9146. if (dCert->cPwdLen < CTC_NAME_SIZE) {
  9147. XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
  9148. x509->challengePw[dCert->cPwdLen] = '\0';
  9149. #ifdef OPENSSL_ALL
  9150. if (x509->challengePwAttr) {
  9151. wolfSSL_X509_ATTRIBUTE_free(x509->challengePwAttr);
  9152. }
  9153. x509->challengePwAttr = wolfSSL_X509_ATTRIBUTE_new();
  9154. if (x509->challengePwAttr) {
  9155. x509->challengePwAttr->value->value.asn1_string =
  9156. wolfSSL_ASN1_STRING_new();
  9157. if (wolfSSL_ASN1_STRING_set(
  9158. x509->challengePwAttr->value->value.asn1_string,
  9159. dCert->cPwd, dCert->cPwdLen) != WOLFSSL_SUCCESS) {
  9160. ret = MEMORY_E;
  9161. }
  9162. x509->challengePwAttr->value->type = V_ASN1_PRINTABLESTRING;
  9163. }
  9164. else {
  9165. ret = MEMORY_E;
  9166. }
  9167. #endif
  9168. }
  9169. else {
  9170. WOLFSSL_MSG("Challenge password too long");
  9171. ret = MEMORY_E;
  9172. }
  9173. }
  9174. if (dCert->contentType) {
  9175. if (dCert->contentTypeLen < CTC_NAME_SIZE) {
  9176. XMEMCPY(x509->contentType, dCert->contentType, dCert->contentTypeLen);
  9177. x509->contentType[dCert->contentTypeLen] = '\0';
  9178. }
  9179. }
  9180. #endif /* WOLFSSL_CERT_REQ */
  9181. #ifdef WOLFSSL_SEP
  9182. {
  9183. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  9184. if (minSz > 0) {
  9185. x509->deviceTypeSz = minSz;
  9186. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  9187. }
  9188. else
  9189. x509->deviceTypeSz = 0;
  9190. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  9191. if (minSz > 0) {
  9192. x509->hwTypeSz = minSz;
  9193. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  9194. }
  9195. else
  9196. x509->hwTypeSz = 0;
  9197. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  9198. if (minSz > 0) {
  9199. x509->hwSerialNumSz = minSz;
  9200. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  9201. }
  9202. else
  9203. x509->hwSerialNumSz = 0;
  9204. }
  9205. #endif /* WOLFSSL_SEP */
  9206. {
  9207. int minSz;
  9208. if (dCert->beforeDateLen > 0) {
  9209. minSz = min(dCert->beforeDate[1], MAX_DATE_SZ);
  9210. x509->notBefore.type = dCert->beforeDate[0];
  9211. x509->notBefore.length = minSz;
  9212. XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
  9213. }
  9214. else
  9215. x509->notBefore.length = 0;
  9216. if (dCert->afterDateLen > 0) {
  9217. minSz = min(dCert->afterDate[1], MAX_DATE_SZ);
  9218. x509->notAfter.type = dCert->afterDate[0];
  9219. x509->notAfter.length = minSz;
  9220. XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
  9221. }
  9222. else
  9223. x509->notAfter.length = 0;
  9224. }
  9225. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  9226. x509->pubKey.buffer = (byte*)XMALLOC(
  9227. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  9228. if (x509->pubKey.buffer != NULL) {
  9229. x509->pubKeyOID = dCert->keyOID;
  9230. x509->pubKey.length = dCert->pubKeySize;
  9231. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  9232. }
  9233. else
  9234. ret = MEMORY_E;
  9235. #if defined(OPENSSL_ALL)
  9236. if (ret == 0) {
  9237. x509->key.pubKeyOID = dCert->keyOID;
  9238. if (!x509->key.algor) {
  9239. x509->key.algor = wolfSSL_X509_ALGOR_new();
  9240. } else {
  9241. wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
  9242. }
  9243. if (!x509->key.algor) {
  9244. ret = MEMORY_E;
  9245. } else {
  9246. if (!(x509->key.algor->algorithm =
  9247. wolfSSL_OBJ_nid2obj(oid2nid(dCert->keyOID, oidKeyType)))) {
  9248. ret = PUBLIC_KEY_E;
  9249. }
  9250. }
  9251. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  9252. if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
  9253. &dCert->publicKey,
  9254. dCert->pubKeySize))) {
  9255. ret = PUBLIC_KEY_E;
  9256. }
  9257. }
  9258. #endif
  9259. }
  9260. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  9261. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  9262. x509->sig.buffer = (byte*)XMALLOC(
  9263. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  9264. if (x509->sig.buffer == NULL) {
  9265. ret = MEMORY_E;
  9266. }
  9267. else {
  9268. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  9269. x509->sig.length = dCert->sigLength;
  9270. x509->sigOID = dCert->signatureOID;
  9271. }
  9272. #if defined(OPENSSL_ALL)
  9273. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  9274. if (!(x509->algor.algorithm =
  9275. wolfSSL_OBJ_nid2obj(oid2nid(dCert->signatureOID, oidSigType)))) {
  9276. ret = PUBLIC_KEY_E;
  9277. }
  9278. #endif
  9279. }
  9280. /* store cert for potential retrieval */
  9281. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap) == 0) {
  9282. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  9283. }
  9284. else {
  9285. ret = MEMORY_E;
  9286. }
  9287. x509->altNames = dCert->altNames;
  9288. dCert->weOwnAltNames = 0;
  9289. x509->altNamesNext = x509->altNames; /* index hint */
  9290. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  9291. !defined(IGNORE_NAME_CONSTRAINTS)
  9292. /* add copies of email names from dCert to X509 */
  9293. if (CopyAdditionalAltNames(&x509->altNames, dCert->altEmailNames,
  9294. ASN_RFC822_TYPE, x509->heap) != 0) {
  9295. return MEMORY_E;
  9296. }
  9297. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  9298. #if defined(OPENSSL_EXTRA) && !defined(IGNORE_NAME_CONSTRAINTS)
  9299. /* add copies of alternate directory names from dCert to X509 */
  9300. if (CopyAdditionalAltNames(&x509->altNames, dCert->altDirNames,
  9301. ASN_DIR_TYPE, x509->heap) != 0) {
  9302. return MEMORY_E;
  9303. }
  9304. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  9305. x509->isCa = dCert->isCA;
  9306. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9307. x509->pathLength = dCert->pathLength;
  9308. x509->keyUsage = dCert->extKeyUsage;
  9309. x509->CRLdistSet = dCert->extCRLdistSet;
  9310. x509->CRLdistCrit = dCert->extCRLdistCrit;
  9311. if (dCert->extCrlInfoRaw != NULL && dCert->extCrlInfoRawSz > 0) {
  9312. x509->rawCRLInfo = (byte*)XMALLOC(dCert->extCrlInfoRawSz, x509->heap,
  9313. DYNAMIC_TYPE_X509_EXT);
  9314. if (x509->rawCRLInfo != NULL) {
  9315. XMEMCPY(x509->rawCRLInfo, dCert->extCrlInfoRaw, dCert->extCrlInfoRawSz);
  9316. x509->rawCRLInfoSz = dCert->extCrlInfoRawSz;
  9317. }
  9318. else {
  9319. ret = MEMORY_E;
  9320. }
  9321. }
  9322. if (dCert->extCrlInfo != NULL && dCert->extCrlInfoSz > 0) {
  9323. x509->CRLInfo = (byte*)XMALLOC(dCert->extCrlInfoSz, x509->heap,
  9324. DYNAMIC_TYPE_X509_EXT);
  9325. if (x509->CRLInfo != NULL) {
  9326. XMEMCPY(x509->CRLInfo, dCert->extCrlInfo, dCert->extCrlInfoSz);
  9327. x509->CRLInfoSz = dCert->extCrlInfoSz;
  9328. }
  9329. else {
  9330. ret = MEMORY_E;
  9331. }
  9332. }
  9333. x509->authInfoSet = dCert->extAuthInfoSet;
  9334. x509->authInfoCrit = dCert->extAuthInfoCrit;
  9335. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  9336. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  9337. DYNAMIC_TYPE_X509_EXT);
  9338. if (x509->authInfo != NULL) {
  9339. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  9340. x509->authInfoSz = dCert->extAuthInfoSz;
  9341. }
  9342. else {
  9343. ret = MEMORY_E;
  9344. }
  9345. }
  9346. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  9347. if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
  9348. x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
  9349. DYNAMIC_TYPE_X509_EXT);
  9350. if (x509->authInfoCaIssuer != NULL) {
  9351. XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
  9352. x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
  9353. }
  9354. else {
  9355. ret = MEMORY_E;
  9356. }
  9357. }
  9358. #endif
  9359. x509->basicConstSet = dCert->extBasicConstSet;
  9360. x509->basicConstCrit = dCert->extBasicConstCrit;
  9361. x509->basicConstPlSet = dCert->pathLengthSet;
  9362. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  9363. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  9364. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  9365. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  9366. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  9367. #ifdef WOLFSSL_AKID_NAME
  9368. if (dCert->extRawAuthKeyIdSrc != NULL &&
  9369. dCert->extAuthKeyIdSrc > dCert->extRawAuthKeyIdSrc &&
  9370. dCert->extAuthKeyIdSrc <
  9371. (dCert->extRawAuthKeyIdSrc + dCert->extRawAuthKeyIdSz)) {
  9372. /* Confirmed: extAuthKeyIdSrc points inside extRawAuthKeyIdSrc */
  9373. x509->authKeyIdSrc = (byte*)XMALLOC(dCert->extRawAuthKeyIdSz,
  9374. x509->heap, DYNAMIC_TYPE_X509_EXT);
  9375. if (x509->authKeyIdSrc != NULL) {
  9376. XMEMCPY(x509->authKeyIdSrc, dCert->extRawAuthKeyIdSrc,
  9377. dCert->extRawAuthKeyIdSz);
  9378. x509->authKeyIdSrcSz = dCert->extRawAuthKeyIdSz;
  9379. /* Set authKeyId to same offset inside authKeyIdSrc */
  9380. x509->authKeyId = x509->authKeyIdSrc +
  9381. (dCert->extAuthKeyIdSrc - dCert->extRawAuthKeyIdSrc);
  9382. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  9383. }
  9384. else
  9385. ret = MEMORY_E;
  9386. }
  9387. #else
  9388. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  9389. DYNAMIC_TYPE_X509_EXT);
  9390. if (x509->authKeyId != NULL) {
  9391. XMEMCPY(x509->authKeyId,
  9392. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  9393. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  9394. }
  9395. #endif
  9396. else
  9397. ret = MEMORY_E;
  9398. }
  9399. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  9400. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  9401. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  9402. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  9403. DYNAMIC_TYPE_X509_EXT);
  9404. if (x509->subjKeyId != NULL) {
  9405. XMEMCPY(x509->subjKeyId,
  9406. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  9407. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  9408. }
  9409. else
  9410. ret = MEMORY_E;
  9411. }
  9412. x509->keyUsageSet = dCert->extKeyUsageSet;
  9413. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  9414. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  9415. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  9416. x509->heap, DYNAMIC_TYPE_X509_EXT);
  9417. if (x509->extKeyUsageSrc != NULL) {
  9418. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  9419. dCert->extExtKeyUsageSz);
  9420. x509->extKeyUsage = dCert->extExtKeyUsage;
  9421. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  9422. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  9423. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  9424. }
  9425. else {
  9426. ret = MEMORY_E;
  9427. }
  9428. }
  9429. #ifndef IGNORE_NETSCAPE_CERT_TYPE
  9430. x509->nsCertType = dCert->nsCertType;
  9431. #endif
  9432. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  9433. x509->certPolicySet = dCert->extCertPolicySet;
  9434. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  9435. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  9436. #ifdef WOLFSSL_CERT_EXT
  9437. {
  9438. int i;
  9439. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  9440. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  9441. MAX_CERTPOL_SZ);
  9442. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  9443. }
  9444. #endif /* WOLFSSL_CERT_EXT */
  9445. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  9446. #ifdef OPENSSL_ALL
  9447. if (dCert->extSubjAltNameSrc != NULL && dCert->extSubjAltNameSz != 0) {
  9448. x509->subjAltNameSrc = (byte*)XMALLOC(dCert->extSubjAltNameSz, x509->heap,
  9449. DYNAMIC_TYPE_X509_EXT);
  9450. if (x509->subjAltNameSrc != NULL) {
  9451. XMEMCPY(x509->subjAltNameSrc,
  9452. dCert->extSubjAltNameSrc, dCert->extSubjAltNameSz);
  9453. x509->subjAltNameSz = dCert->extSubjAltNameSz;
  9454. }
  9455. else
  9456. ret = MEMORY_E;
  9457. }
  9458. #endif
  9459. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  9460. x509->pkCurveOID = dCert->pkCurveOID;
  9461. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9462. return ret;
  9463. }
  9464. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  9465. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  9466. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  9467. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  9468. word32 status_length)
  9469. {
  9470. int ret = 0;
  9471. OcspRequest* request;
  9472. WOLFSSL_ENTER("ProcessCSR");
  9473. #ifdef WOLFSSL_SMALL_STACK
  9474. CertStatus* status;
  9475. OcspEntry* single;
  9476. OcspResponse* response;
  9477. #else
  9478. CertStatus status[1];
  9479. OcspEntry single[1];
  9480. OcspResponse response[1];
  9481. #endif
  9482. do {
  9483. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  9484. if (ssl->status_request) {
  9485. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  9486. ssl->status_request = 0;
  9487. break;
  9488. }
  9489. #endif
  9490. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  9491. if (ssl->status_request_v2) {
  9492. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  9493. WOLFSSL_CSR2_OCSP, 0);
  9494. ssl->status_request_v2 = 0;
  9495. break;
  9496. }
  9497. #endif
  9498. return BUFFER_ERROR;
  9499. } while(0);
  9500. if (request == NULL)
  9501. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  9502. #ifdef WOLFSSL_SMALL_STACK
  9503. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  9504. DYNAMIC_TYPE_OCSP_STATUS);
  9505. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  9506. DYNAMIC_TYPE_OCSP_ENTRY);
  9507. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  9508. DYNAMIC_TYPE_OCSP_REQUEST);
  9509. if (status == NULL || single == NULL || response == NULL) {
  9510. if (status)
  9511. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  9512. if (single)
  9513. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  9514. if (response)
  9515. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  9516. return MEMORY_ERROR;
  9517. }
  9518. #endif
  9519. InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
  9520. if (OcspResponseDecode(response, SSL_CM(ssl), ssl->heap, 0) != 0)
  9521. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9522. else if (CompareOcspReqResp(request, response) != 0)
  9523. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9524. else if (response->responseStatus != OCSP_SUCCESSFUL)
  9525. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9526. else if (response->single->status->status == CERT_REVOKED)
  9527. ret = OCSP_CERT_REVOKED;
  9528. else if (response->single->status->status != CERT_GOOD)
  9529. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9530. else {
  9531. XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
  9532. ssl->ocspProducedDateFormat = response->producedDateFormat;
  9533. }
  9534. *inOutIdx += status_length;
  9535. #ifdef WOLFSSL_SMALL_STACK
  9536. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  9537. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  9538. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  9539. #endif
  9540. WOLFSSL_LEAVE("ProcessCSR", ret);
  9541. return ret;
  9542. }
  9543. #endif
  9544. #ifdef HAVE_PK_CALLBACKS
  9545. #ifdef HAVE_ECC
  9546. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  9547. const unsigned char* hash, unsigned int hashSz,
  9548. const unsigned char* keyDer, unsigned int keySz,
  9549. int* result, void* ctx)
  9550. {
  9551. int ret = NOT_COMPILED_IN;
  9552. WOLFSSL* ssl = (WOLFSSL*)ctx;
  9553. if (ssl && ssl->ctx->EccVerifyCb) {
  9554. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  9555. keyDer, keySz, result, ssl->EccVerifyCtx);
  9556. }
  9557. return ret;
  9558. }
  9559. #endif
  9560. #ifndef NO_RSA
  9561. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  9562. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  9563. void* ctx)
  9564. {
  9565. int ret = NOT_COMPILED_IN;
  9566. WOLFSSL* ssl = (WOLFSSL*)ctx;
  9567. if (ssl && ssl->ctx->RsaVerifyCb) {
  9568. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  9569. ssl->RsaVerifyCtx);
  9570. }
  9571. return ret;
  9572. }
  9573. #endif
  9574. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  9575. {
  9576. if (ssl == NULL || sigCtx == NULL)
  9577. return BAD_FUNC_ARG;
  9578. /* only setup the verify callback if a PK is set */
  9579. #ifdef HAVE_ECC
  9580. if (ssl->ctx->EccVerifyCb) {
  9581. sigCtx->pkCbEcc = SigPkCbEccVerify;
  9582. sigCtx->pkCtxEcc = ssl;
  9583. }
  9584. #endif
  9585. #ifndef NO_RSA
  9586. /* only setup the verify callback if a PK is set */
  9587. if (ssl->ctx->RsaVerifyCb) {
  9588. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  9589. sigCtx->pkCtxRsa = ssl;
  9590. }
  9591. #endif
  9592. return 0;
  9593. }
  9594. #endif /* HAVE_PK_CALLBACKS */
  9595. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  9596. static void DoCertFatalAlert(WOLFSSL* ssl, int ret)
  9597. {
  9598. int alertWhy;
  9599. if (ssl == NULL || ret == 0) {
  9600. return;
  9601. }
  9602. WOLFSSL_ERROR(ret);
  9603. /* Determine alert reason */
  9604. alertWhy = bad_certificate;
  9605. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
  9606. alertWhy = certificate_expired;
  9607. } else if (ret == ASN_NO_SIGNER_E) {
  9608. alertWhy = unknown_ca;
  9609. }
  9610. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD))
  9611. else if (ret == CRL_CERT_REVOKED) {
  9612. alertWhy = certificate_revoked;
  9613. }
  9614. #endif
  9615. else if (ret == NO_PEER_CERT) {
  9616. #ifdef WOLFSSL_TLS13
  9617. if (ssl->options.tls1_3) {
  9618. alertWhy = certificate_required;
  9619. }
  9620. else
  9621. #endif
  9622. {
  9623. alertWhy = handshake_failure;
  9624. }
  9625. }
  9626. /* send fatal alert and mark connection closed */
  9627. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  9628. ssl->options.isClosed = 1;
  9629. }
  9630. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  9631. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  9632. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  9633. * The intermediates are done first then peer leaf cert last. Use the
  9634. * store->error_depth member to determine index (0=peer, >1 intermediates)
  9635. */
  9636. int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret,
  9637. ProcPeerCertArgs* args)
  9638. {
  9639. int verify_ok = 0, use_cb = 0;
  9640. void *heap;
  9641. if (cm == NULL) {
  9642. return BAD_FUNC_ARG;
  9643. }
  9644. heap = (ssl != NULL) ? ssl->heap : cm->heap;
  9645. /* Determine if verify was okay */
  9646. if (ret == 0) {
  9647. verify_ok = 1;
  9648. }
  9649. /* Determine if verify callback should be used */
  9650. if (ret != 0) {
  9651. if ((ssl != NULL) && (!ssl->options.verifyNone)) {
  9652. use_cb = 1; /* always report errors */
  9653. }
  9654. }
  9655. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  9656. /* always use verify callback on peer leaf cert */
  9657. if (args->certIdx == 0) {
  9658. use_cb = 1;
  9659. }
  9660. #endif
  9661. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  9662. /* perform verify callback on other intermediate certs (not just peer) */
  9663. if (args->certIdx > 0) {
  9664. use_cb = 1;
  9665. }
  9666. #endif
  9667. #if defined(OPENSSL_EXTRA)
  9668. /* perform domain name check on the peer certificate */
  9669. if (args->dCertInit && args->dCert && (ssl != NULL) &&
  9670. ssl->param && ssl->param->hostName[0]) {
  9671. /* If altNames names is present, then subject common name is ignored */
  9672. if (args->dCert->altNames != NULL) {
  9673. if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
  9674. if (ret == 0) {
  9675. ret = DOMAIN_NAME_MISMATCH;
  9676. }
  9677. }
  9678. }
  9679. else {
  9680. if (args->dCert->subjectCN) {
  9681. if (MatchDomainName(args->dCert->subjectCN,
  9682. args->dCert->subjectCNLen,
  9683. ssl->param->hostName) == 0) {
  9684. if (ret == 0) {
  9685. ret = DOMAIN_NAME_MISMATCH;
  9686. }
  9687. }
  9688. }
  9689. }
  9690. }
  9691. /* perform IP address check on the peer certificate */
  9692. if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
  9693. (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
  9694. if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
  9695. if (ret == 0) {
  9696. ret = IPADDR_MISMATCH;
  9697. }
  9698. }
  9699. }
  9700. #endif
  9701. /* if verify callback has been set */
  9702. if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
  9703. #ifdef OPENSSL_ALL
  9704. || (ssl->ctx->verifyCertCb != NULL)
  9705. #endif
  9706. ))
  9707. #ifndef NO_WOLFSSL_CM_VERIFY
  9708. || (cm->verifyCallback != NULL)
  9709. #endif
  9710. ) {
  9711. int verifyFail = 0;
  9712. #ifdef WOLFSSL_SMALL_STACK
  9713. WOLFSSL_X509_STORE_CTX* store;
  9714. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9715. WOLFSSL_X509* x509;
  9716. #endif
  9717. char* domain = NULL;
  9718. #else
  9719. WOLFSSL_X509_STORE_CTX store[1];
  9720. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9721. WOLFSSL_X509 x509[1];
  9722. #endif
  9723. char domain[ASN_NAME_MAX];
  9724. #endif
  9725. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9726. int x509Free = 0;
  9727. #endif
  9728. #ifdef WOLFSSL_SMALL_STACK
  9729. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  9730. sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE);
  9731. if (store == NULL) {
  9732. return MEMORY_E;
  9733. }
  9734. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9735. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  9736. DYNAMIC_TYPE_X509);
  9737. if (x509 == NULL) {
  9738. XFREE(store, heap, DYNAMIC_TYPE_X509);
  9739. return MEMORY_E;
  9740. }
  9741. #endif
  9742. domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
  9743. if (domain == NULL) {
  9744. XFREE(store, heap, DYNAMIC_TYPE_X509);
  9745. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9746. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  9747. #endif
  9748. return MEMORY_E;
  9749. }
  9750. #endif /* WOLFSSL_SMALL_STACK */
  9751. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  9752. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9753. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  9754. #endif
  9755. domain[0] = '\0';
  9756. /* build subject CN as string to return in store */
  9757. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  9758. int subjectCNLen = args->dCert->subjectCNLen;
  9759. if (subjectCNLen > ASN_NAME_MAX-1)
  9760. subjectCNLen = ASN_NAME_MAX-1;
  9761. if (subjectCNLen > 0) {
  9762. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  9763. domain[subjectCNLen] = '\0';
  9764. }
  9765. }
  9766. store->error = ret;
  9767. store->error_depth = args->certIdx;
  9768. store->discardSessionCerts = 0;
  9769. store->domain = domain;
  9770. store->userCtx = (ssl != NULL) ? ssl->verifyCbCtx : cm;
  9771. store->certs = args->certs;
  9772. store->totalCerts = args->totalCerts;
  9773. #if (defined(HAVE_EX_DATA) || defined(FORTRESS)) && \
  9774. (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  9775. if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
  9776. != WOLFSSL_SUCCESS) {
  9777. WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
  9778. }
  9779. #endif
  9780. if (ssl != NULL) {
  9781. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  9782. store->store = SSL_STORE(ssl);
  9783. #if defined(OPENSSL_EXTRA)
  9784. store->depth = args->count;
  9785. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  9786. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  9787. heap, DYNAMIC_TYPE_OPENSSL);
  9788. if (store->param == NULL) {
  9789. #ifdef WOLFSSL_SMALL_STACK
  9790. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  9791. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9792. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  9793. #endif
  9794. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  9795. #endif
  9796. return MEMORY_E;
  9797. }
  9798. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  9799. /* Overwrite with non-default param values in SSL */
  9800. if (ssl->param) {
  9801. if (ssl->param->check_time)
  9802. store->param->check_time = ssl->param->check_time;
  9803. if (ssl->param->flags)
  9804. store->param->flags = ssl->param->flags;
  9805. if (ssl->param->hostName[0])
  9806. XMEMCPY(store->param->hostName, ssl->param->hostName,
  9807. WOLFSSL_HOST_NAME_MAX);
  9808. }
  9809. #endif /* defined(OPENSSL_EXTRA) */
  9810. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  9811. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9812. #ifdef KEEP_PEER_CERT
  9813. if (args->certIdx == 0) {
  9814. store->current_cert = &ssl->peerCert; /* use existing X509 */
  9815. }
  9816. else
  9817. #endif
  9818. {
  9819. InitX509(x509, 0, heap);
  9820. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  9821. store->current_cert = x509;
  9822. x509Free = 1;
  9823. }
  9824. else {
  9825. FreeX509(x509);
  9826. }
  9827. }
  9828. #endif
  9829. #ifdef SESSION_CERTS
  9830. store->sesChain = &ssl->session.chain;
  9831. #endif
  9832. }
  9833. #ifndef NO_WOLFSSL_CM_VERIFY
  9834. /* non-zero return code indicates failure override */
  9835. if (cm->verifyCallback != NULL) {
  9836. store->userCtx = cm;
  9837. if (cm->verifyCallback(verify_ok, store)) {
  9838. if (ret != 0) {
  9839. WOLFSSL_MSG("Verify CM callback overriding error!");
  9840. ret = 0;
  9841. }
  9842. }
  9843. else {
  9844. verifyFail = 1;
  9845. }
  9846. }
  9847. #endif
  9848. if (ssl != NULL) {
  9849. #ifdef OPENSSL_ALL
  9850. /* non-zero return code indicates failure override */
  9851. if (ssl->ctx->verifyCertCb) {
  9852. if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
  9853. if (ret != 0) {
  9854. WOLFSSL_MSG("Verify Cert callback overriding error!");
  9855. ret = 0;
  9856. }
  9857. }
  9858. else {
  9859. verifyFail = 1;
  9860. }
  9861. }
  9862. #endif
  9863. /* non-zero return code indicates failure override */
  9864. if (ssl->verifyCallback) {
  9865. if (ssl->verifyCallback(verify_ok, store)) {
  9866. if (ret != 0) {
  9867. WOLFSSL_MSG("Verify callback overriding error!");
  9868. ret = 0;
  9869. }
  9870. }
  9871. else {
  9872. verifyFail = 1;
  9873. }
  9874. }
  9875. }
  9876. if (verifyFail) {
  9877. /* induce error if one not present */
  9878. if (ret == 0) {
  9879. ret = VERIFY_CERT_ERROR;
  9880. }
  9881. /* mark as verify error */
  9882. args->verifyErr = 1;
  9883. }
  9884. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9885. if (x509Free) {
  9886. FreeX509(x509);
  9887. }
  9888. #endif
  9889. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  9890. wolfSSL_sk_X509_free(store->chain);
  9891. store->chain = NULL;
  9892. #endif
  9893. #ifdef SESSION_CERTS
  9894. if ((ssl != NULL) && (store->discardSessionCerts)) {
  9895. WOLFSSL_MSG("Verify callback requested discard sess certs");
  9896. ssl->session.chain.count = 0;
  9897. #ifdef WOLFSSL_ALT_CERT_CHAINS
  9898. ssl->session.altChain.count = 0;
  9899. #endif
  9900. }
  9901. #endif /* SESSION_CERTS */
  9902. #ifdef OPENSSL_EXTRA
  9903. if ((ssl != NULL) && (store->param)) {
  9904. XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL);
  9905. }
  9906. #endif
  9907. #ifdef WOLFSSL_SMALL_STACK
  9908. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  9909. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9910. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  9911. #endif
  9912. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  9913. #endif
  9914. }
  9915. (void)heap;
  9916. return ret;
  9917. }
  9918. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  9919. {
  9920. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  9921. (void)ssl;
  9922. if (args->certs) {
  9923. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  9924. args->certs = NULL;
  9925. }
  9926. #ifdef WOLFSSL_TLS13
  9927. if (args->exts) {
  9928. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  9929. args->exts = NULL;
  9930. }
  9931. #endif
  9932. if (args->dCert) {
  9933. if (args->dCertInit) {
  9934. FreeDecodedCert(args->dCert);
  9935. args->dCertInit = 0;
  9936. }
  9937. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  9938. args->dCert = NULL;
  9939. }
  9940. }
  9941. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  9942. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  9943. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  9944. /* load certificate file which has the form <hash>.(r)N[0..N] */
  9945. /* in the folder. */
  9946. /* (r), in the case of CRL file */
  9947. /* @param store a pointer to X509_STORE structure */
  9948. /* @param issuer a pointer to X509_NAME that presents an issuer */
  9949. /* @param type X509_LU_X509 or X509_LU_CRL */
  9950. /* @return WOLFSSL_SUCCESS on successful, otherwise WOLFSSL_FAILURE */
  9951. int LoadCertByIssuer(WOLFSSL_X509_STORE* store, X509_NAME* issuer, int type)
  9952. {
  9953. const int MAX_SUFFIX = 10;/* The number comes from CA_TABLE_SIZE=10 */
  9954. int ret = WOLFSSL_SUCCESS;
  9955. WOLFSSL_X509_LOOKUP* lookup;
  9956. WOLFSSL_BY_DIR_entry* entry;
  9957. WOLFSSL_BY_DIR_HASH hash_tmp;
  9958. WOLFSSL_BY_DIR_HASH* ph = NULL;
  9959. WOLFSSL_X509* x509;
  9960. unsigned long hash = 0;
  9961. char* filename = NULL;
  9962. const char* post = "";
  9963. byte* pbuf = NULL;
  9964. int len, num, i, index;
  9965. byte suffix = 0;
  9966. int retHash = NOT_COMPILED_IN;
  9967. byte dgt[WC_MAX_DIGEST_SIZE];
  9968. WOLFSSL_ENTER("LoadCertByIssuer");
  9969. /* sanity check */
  9970. if (store == NULL || issuer == NULL || (type != X509_LU_X509 && type != X509_LU_CRL)) {
  9971. return WOLFSSL_FAILURE;
  9972. }
  9973. lookup = &store->lookup;
  9974. if (lookup->dirs == NULL || lookup->type != 1) {
  9975. return WOLFSSL_FAILURE;
  9976. }
  9977. len = wolfSSL_i2d_X509_NAME_canon(issuer, &pbuf);
  9978. if (len > 0) {
  9979. #ifndef NO_SHA
  9980. retHash = wc_ShaHash((const byte*)pbuf, len, dgt);
  9981. #endif
  9982. if (retHash == 0) {
  9983. /* 4 bytes in little endian as unsigned long */
  9984. hash = (((unsigned long)dgt[3] << 24) |
  9985. ((unsigned long)dgt[2] << 16) |
  9986. ((unsigned long)dgt[1] << 8) |
  9987. ((unsigned long)dgt[0]));
  9988. } else {
  9989. WOLFSSL_MSG("failed hash operation");
  9990. return WOLFSSL_FAILURE;
  9991. }
  9992. wolfSSL_OPENSSL_free(pbuf);
  9993. }
  9994. /* try to load each hashed name file in path */
  9995. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  9996. if (type == X509_LU_CRL) {
  9997. post = "r";
  9998. }
  9999. num = wolfSSL_sk_BY_DIR_entry_num(lookup->dirs->dir_entry);
  10000. for (i=0; i<num; i++) {
  10001. entry = wolfSSL_sk_BY_DIR_entry_value(lookup->dirs->dir_entry, i);
  10002. if (type == X509_LU_CRL && entry->hashes != NULL &&
  10003. wolfSSL_sk_BY_DIR_HASH_num(entry->hashes) > 0) {
  10004. /* lock the list */
  10005. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  10006. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  10007. return BAD_MUTEX_E;
  10008. }
  10009. hash_tmp.hash_value = hash;
  10010. index = wolfSSL_sk_BY_DIR_HASH_find(entry->hashes, &hash_tmp);
  10011. if (index >= 0) {
  10012. WOLFSSL_MSG("find hashed CRL in list");
  10013. ph = wolfSSL_sk_BY_DIR_HASH_value(entry->hashes, index);
  10014. suffix = ph->last_suffix;
  10015. } else {
  10016. ph = NULL;
  10017. suffix = 0;
  10018. }
  10019. wc_UnLockMutex(&lookup->dirs->lock);
  10020. }
  10021. /* Additional buffer length for file name memory allocation : */
  10022. /* / <hashvalue>.(r)N\0 */
  10023. /*|1| 8 |1|1|1|1| => 13 */
  10024. len = (int)XSTRLEN(entry->dir_name) + 13;
  10025. if (filename != NULL) {
  10026. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  10027. }
  10028. filename = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  10029. if (filename == NULL) {
  10030. WOLFSSL_MSG("memory allocation error");
  10031. return MEMORY_E;
  10032. }
  10033. /* set as FAILURE, if successfuly loading cert of CRL, this becomes */
  10034. /* WOLFSSL_SUCCESS */
  10035. ret = WOLFSSL_FAILURE;
  10036. for (; suffix < MAX_SUFFIX; suffix++) {
  10037. /* /folder-path/<hash>.(r)N[0..9] */
  10038. XSNPRINTF(filename, len, "%s/%08lx.%s%d", entry->dir_name,
  10039. hash, post, suffix);
  10040. if(wc_FileExists(filename) == 0/*0 file exists */) {
  10041. if (type == X509_LU_X509) {
  10042. x509 = wolfSSL_X509_load_certificate_file(filename,
  10043. WOLFSSL_FILETYPE_PEM);
  10044. if (x509 != NULL) {
  10045. ret = wolfSSL_X509_STORE_add_cert(store, x509);
  10046. wolfSSL_X509_free(x509);
  10047. } else {
  10048. WOLFSSL_MSG("failed to load certificate\n");
  10049. ret = WOLFSSL_FAILURE;
  10050. break;
  10051. }
  10052. }
  10053. #if defined(HAVE_CRL) && !defined(NO_BIO)
  10054. else if (type == X509_LU_CRL) {
  10055. ret = wolfSSL_X509_load_crl_file(&store->lookup, filename,
  10056. WOLFSSL_FILETYPE_PEM);
  10057. if (ret != WOLFSSL_SUCCESS) {
  10058. WOLFSSL_MSG("failed to load CRL\n");
  10059. break;
  10060. }
  10061. }
  10062. #else
  10063. else if (type == X509_LU_CRL) {
  10064. WOLFSSL_MSG("CRL is not supported");
  10065. ret = WOLFSSL_FAILURE;
  10066. break;
  10067. }
  10068. #endif /* HAVE_CRL && !NO_BIO */
  10069. } else
  10070. break;
  10071. }
  10072. if (ret != WOLFSSL_SUCCESS) {
  10073. WOLFSSL_MSG("not found file");
  10074. ret = WOLFSSL_FAILURE;
  10075. } else {
  10076. if (type == X509_LU_CRL) {
  10077. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  10078. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  10079. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  10080. return BAD_MUTEX_E;
  10081. }
  10082. if (ph == NULL) {
  10083. ph = wolfSSL_BY_DIR_HASH_new();
  10084. if (ph == NULL) {
  10085. WOLFSSL_MSG("failed to allocate hash stack");
  10086. ret = WOLFSSL_FAILURE;
  10087. } else {
  10088. ph->hash_value = hash;
  10089. ph->last_suffix = suffix;
  10090. ret = wolfSSL_sk_BY_DIR_HASH_push(entry->hashes, ph);
  10091. }
  10092. }
  10093. wc_UnLockMutex(&lookup->dirs->lock);
  10094. }
  10095. }
  10096. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  10097. }
  10098. #else
  10099. (void) type;
  10100. (void) ret;
  10101. (void) x509;
  10102. (void) filename;
  10103. (void) suffix;
  10104. (void) num;
  10105. (void) i;
  10106. ret = WOLFSSL_NOT_IMPLEMENTED;
  10107. #endif
  10108. WOLFSSL_LEAVE("LoadCertByIssuer", ret);
  10109. return ret;
  10110. }
  10111. #endif
  10112. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  10113. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  10114. {
  10115. int ret = 0;
  10116. buffer* cert;
  10117. byte* subjectHash = NULL;
  10118. int alreadySigner = 0;
  10119. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  10120. int sigRet = 0;
  10121. #endif
  10122. if (ssl == NULL || args == NULL)
  10123. return BAD_FUNC_ARG;
  10124. /* check to make sure certificate index is valid */
  10125. if (args->certIdx > args->count)
  10126. return BUFFER_E;
  10127. /* check if returning from non-blocking OCSP */
  10128. /* skip this section because cert is already initialized and parsed */
  10129. #ifdef WOLFSSL_NONBLOCK_OCSP
  10130. if (args->lastErr == OCSP_WANT_READ) {
  10131. args->lastErr = 0; /* clear error */
  10132. return 0;
  10133. }
  10134. #endif
  10135. #ifdef WOLFSSL_TRUST_PEER_CERT
  10136. /* we have trusted peer */
  10137. if (args->haveTrustPeer) {
  10138. return 0;
  10139. }
  10140. #endif
  10141. /* get certificate buffer */
  10142. cert = &args->certs[args->certIdx];
  10143. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  10144. if (verify == VERIFY) {
  10145. /* for small cert verify, release decoded cert during signature check to
  10146. reduce peak memory usage */
  10147. if (args->dCert != NULL) {
  10148. if (args->dCertInit) {
  10149. FreeDecodedCert(args->dCert);
  10150. args->dCertInit = 0;
  10151. }
  10152. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  10153. args->dCert = NULL;
  10154. }
  10155. /* perform cert parsing and signature check */
  10156. sigRet = CheckCertSignature(cert->buffer, cert->length,
  10157. ssl->heap, SSL_CM(ssl));
  10158. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  10159. /* verify name only in ParseCertRelative below, signature check done */
  10160. verify = VERIFY_NAME;
  10161. }
  10162. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  10163. /* make sure the decoded cert structure is allocated and initialized */
  10164. if (!args->dCertInit
  10165. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  10166. || args->dCert == NULL
  10167. #endif
  10168. ) {
  10169. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  10170. if (args->dCert == NULL) {
  10171. args->dCert = (DecodedCert*)XMALLOC(
  10172. sizeof(DecodedCert), ssl->heap,
  10173. DYNAMIC_TYPE_DCERT);
  10174. if (args->dCert == NULL) {
  10175. return MEMORY_E;
  10176. }
  10177. }
  10178. #endif
  10179. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  10180. args->dCertInit = 1;
  10181. args->dCert->sigCtx.devId = ssl->devId;
  10182. #ifdef WOLFSSL_ASYNC_CRYPT
  10183. args->dCert->sigCtx.asyncCtx = ssl;
  10184. #endif
  10185. #ifdef HAVE_PK_CALLBACKS
  10186. /* setup the PK callback context */
  10187. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  10188. if (ret != 0)
  10189. return ret;
  10190. #endif
  10191. }
  10192. /* Parse Certificate */
  10193. ret = ParseCertRelative(args->dCert, certType, verify, SSL_CM(ssl));
  10194. /* perform below checks for date failure cases */
  10195. if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) {
  10196. /* get subject and determine if already loaded */
  10197. #ifndef NO_SKID
  10198. if (args->dCert->extAuthKeyIdSet)
  10199. subjectHash = args->dCert->extSubjKeyId;
  10200. else
  10201. #endif
  10202. subjectHash = args->dCert->subjectHash;
  10203. alreadySigner = AlreadySigner(SSL_CM(ssl), subjectHash);
  10204. }
  10205. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  10206. /* get signature check failures from above */
  10207. if (ret == 0)
  10208. ret = sigRet;
  10209. #endif
  10210. if (pSubjectHash)
  10211. *pSubjectHash = subjectHash;
  10212. if (pAlreadySigner)
  10213. *pAlreadySigner = alreadySigner;
  10214. #ifdef WOLFSSL_ASYNC_CRYPT
  10215. if (ret == WC_PENDING_E) {
  10216. ret = wolfSSL_AsyncPush(ssl,
  10217. args->dCert->sigCtx.asyncDev);
  10218. }
  10219. #endif
  10220. return ret;
  10221. }
  10222. /* Check key sizes for certs. Is redundant check since
  10223. ProcessBuffer also performs this check. */
  10224. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  10225. {
  10226. int ret = 0;
  10227. if (ssl->options.verifyNone) {
  10228. return ret;
  10229. }
  10230. switch (args->dCert->keyOID) {
  10231. #ifndef NO_RSA
  10232. case RSAk:
  10233. if (ssl->options.minRsaKeySz < 0 ||
  10234. args->dCert->pubKeySize <
  10235. (word16)ssl->options.minRsaKeySz) {
  10236. WOLFSSL_MSG(
  10237. "RSA key size in cert chain error");
  10238. ret = RSA_KEY_SIZE_E;
  10239. }
  10240. break;
  10241. #endif /* !NO_RSA */
  10242. #ifdef HAVE_ECC
  10243. case ECDSAk:
  10244. if (ssl->options.minEccKeySz < 0 ||
  10245. args->dCert->pubKeySize <
  10246. (word16)ssl->options.minEccKeySz) {
  10247. WOLFSSL_MSG(
  10248. "ECC key size in cert chain error");
  10249. ret = ECC_KEY_SIZE_E;
  10250. }
  10251. break;
  10252. #endif /* HAVE_ECC */
  10253. #ifdef HAVE_ED25519
  10254. case ED25519k:
  10255. if (ssl->options.minEccKeySz < 0 ||
  10256. ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  10257. WOLFSSL_MSG(
  10258. "ECC key size in cert chain error");
  10259. ret = ECC_KEY_SIZE_E;
  10260. }
  10261. break;
  10262. #endif /* HAVE_ED25519 */
  10263. #ifdef HAVE_ED448
  10264. case ED448k:
  10265. if (ssl->options.minEccKeySz < 0 ||
  10266. ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  10267. WOLFSSL_MSG(
  10268. "ECC key size in cert chain error");
  10269. ret = ECC_KEY_SIZE_E;
  10270. }
  10271. break;
  10272. #endif /* HAVE_ED448 */
  10273. default:
  10274. WOLFSSL_MSG("Key size not checked");
  10275. /* key not being checked for size if not in
  10276. switch */
  10277. break;
  10278. }
  10279. return ret;
  10280. }
  10281. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10282. word32 totalSz)
  10283. {
  10284. int ret = 0;
  10285. #ifdef WOLFSSL_ASYNC_CRYPT
  10286. ProcPeerCertArgs* args = (ProcPeerCertArgs*)ssl->async.args;
  10287. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  10288. (void)sizeof(args_test);
  10289. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  10290. ProcPeerCertArgs* args = ssl->nonblockarg;
  10291. #elif defined(WOLFSSL_SMALL_STACK)
  10292. ProcPeerCertArgs* args = NULL;
  10293. #else
  10294. ProcPeerCertArgs args[1];
  10295. #endif
  10296. byte* subjectHash = NULL;
  10297. int alreadySigner = 0;
  10298. WOLFSSL_ENTER("ProcessPeerCerts");
  10299. #ifdef WOLFSSL_ASYNC_CRYPT
  10300. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  10301. if (ret != WC_NOT_PENDING_E) {
  10302. /* Check for error */
  10303. if (ret < 0)
  10304. goto exit_ppc;
  10305. }
  10306. else
  10307. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  10308. if (args == NULL) {
  10309. args = (ProcPeerCertArgs*)XMALLOC(
  10310. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  10311. if (args == NULL) {
  10312. ERROR_OUT(MEMORY_E, exit_ppc);
  10313. }
  10314. }
  10315. if (ssl->nonblockarg == NULL) /* new args */
  10316. #elif defined(WOLFSSL_SMALL_STACK)
  10317. args = (ProcPeerCertArgs*)XMALLOC(
  10318. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  10319. if (args == NULL) {
  10320. ERROR_OUT(MEMORY_E, exit_ppc);
  10321. }
  10322. #endif
  10323. {
  10324. /* Reset state */
  10325. ret = 0;
  10326. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  10327. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  10328. args->idx = *inOutIdx;
  10329. args->begin = *inOutIdx;
  10330. #ifdef WOLFSSL_ASYNC_CRYPT
  10331. ssl->async.freeArgs = FreeProcPeerCertArgs;
  10332. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  10333. ssl->nonblockarg = args;
  10334. #endif
  10335. }
  10336. switch (ssl->options.asyncState)
  10337. {
  10338. case TLS_ASYNC_BEGIN:
  10339. {
  10340. word32 listSz;
  10341. #ifdef WOLFSSL_CALLBACKS
  10342. if (ssl->hsInfoOn)
  10343. AddPacketName(ssl, "Certificate");
  10344. if (ssl->toInfoOn)
  10345. AddLateName("Certificate", &ssl->timeoutInfo);
  10346. #endif
  10347. #ifdef WOLFSSL_TLS13
  10348. if (ssl->options.tls1_3) {
  10349. byte ctxSz;
  10350. /* Certificate Request Context */
  10351. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  10352. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10353. ctxSz = *(input + args->idx);
  10354. args->idx++;
  10355. if ((args->idx - args->begin) + ctxSz > totalSz)
  10356. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10357. #ifndef NO_WOLFSSL_CLIENT
  10358. /* Must be empty when received from server. */
  10359. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10360. if (ctxSz != 0) {
  10361. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  10362. }
  10363. }
  10364. #endif
  10365. #ifndef NO_WOLFSSL_SERVER
  10366. /* Must contain value sent in request. */
  10367. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10368. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  10369. ctxSz != 0) {
  10370. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  10371. }
  10372. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  10373. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  10374. CertReqCtx* curr = ssl->certReqCtx;
  10375. CertReqCtx* prev = NULL;
  10376. while (curr != NULL) {
  10377. if ((ctxSz == curr->len) &&
  10378. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  10379. == 0) {
  10380. if (prev != NULL)
  10381. prev->next = curr->next;
  10382. else
  10383. ssl->certReqCtx = curr->next;
  10384. XFREE(curr, ssl->heap,
  10385. DYNAMIC_TYPE_TMP_BUFFER);
  10386. break;
  10387. }
  10388. prev = curr;
  10389. curr = curr->next;
  10390. }
  10391. if (curr == NULL)
  10392. #endif
  10393. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  10394. }
  10395. }
  10396. #endif
  10397. args->idx += ctxSz;
  10398. /* allocate buffer for cert extensions */
  10399. args->exts = (buffer*)XMALLOC(sizeof(buffer) *
  10400. MAX_CHAIN_DEPTH, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  10401. if (args->exts == NULL) {
  10402. ERROR_OUT(MEMORY_E, exit_ppc);
  10403. }
  10404. }
  10405. #endif
  10406. /* allocate buffer for certs */
  10407. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  10408. ssl->heap, DYNAMIC_TYPE_DER);
  10409. if (args->certs == NULL) {
  10410. ERROR_OUT(MEMORY_E, exit_ppc);
  10411. }
  10412. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  10413. /* Certificate List */
  10414. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  10415. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10416. }
  10417. c24to32(input + args->idx, &listSz);
  10418. args->idx += OPAQUE24_LEN;
  10419. if (listSz > MAX_CERTIFICATE_SZ) {
  10420. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10421. }
  10422. if ((args->idx - args->begin) + listSz != totalSz) {
  10423. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10424. }
  10425. WOLFSSL_MSG("Loading peer's cert chain");
  10426. /* first put cert chain into buffer so can verify top down
  10427. we're sent bottom up */
  10428. while (listSz) {
  10429. word32 certSz;
  10430. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10431. if (args->totalCerts >= MAX_CHAIN_DEPTH) {
  10432. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  10433. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  10434. ret = MAX_CHAIN_ERROR;
  10435. WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
  10436. break; /* break out to avoid reading more certs then buffer
  10437. * can hold */
  10438. }
  10439. #else
  10440. if (args->totalCerts >= ssl->verifyDepth ||
  10441. args->totalCerts >= MAX_CHAIN_DEPTH) {
  10442. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  10443. }
  10444. #endif
  10445. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  10446. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10447. }
  10448. c24to32(input + args->idx, &certSz);
  10449. args->idx += OPAQUE24_LEN;
  10450. if ((args->idx - args->begin) + certSz > totalSz) {
  10451. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10452. }
  10453. args->certs[args->totalCerts].length = certSz;
  10454. args->certs[args->totalCerts].buffer = input + args->idx;
  10455. #ifdef SESSION_CERTS
  10456. AddSessionCertToChain(&ssl->session.chain,
  10457. input + args->idx, certSz);
  10458. #endif /* SESSION_CERTS */
  10459. args->idx += certSz;
  10460. listSz -= certSz + CERT_HEADER_SZ;
  10461. #ifdef WOLFSSL_TLS13
  10462. /* Extensions */
  10463. if (ssl->options.tls1_3) {
  10464. word16 extSz;
  10465. if (args->exts == NULL) {
  10466. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10467. }
  10468. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  10469. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10470. }
  10471. ato16(input + args->idx, &extSz);
  10472. args->idx += OPAQUE16_LEN;
  10473. if ((args->idx - args->begin) + extSz > totalSz) {
  10474. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10475. }
  10476. /* Store extension data info for later processing. */
  10477. args->exts[args->totalCerts].length = extSz;
  10478. args->exts[args->totalCerts].buffer = input + args->idx;
  10479. args->idx += extSz;
  10480. listSz -= extSz + OPAQUE16_LEN;
  10481. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  10482. (word16)args->exts[args->totalCerts].length,
  10483. certificate, NULL);
  10484. if (ret < 0) {
  10485. ERROR_OUT(ret, exit_ppc);
  10486. }
  10487. }
  10488. #endif
  10489. args->totalCerts++;
  10490. WOLFSSL_MSG("\tPut another cert into chain");
  10491. } /* while (listSz) */
  10492. args->count = args->totalCerts;
  10493. args->certIdx = 0; /* select peer cert (first one) */
  10494. if (args->count == 0 && (ssl->options.mutualAuth ||
  10495. (ssl->options.failNoCert && IsAtLeastTLSv1_3(ssl->version))) &&
  10496. ssl->options.side == WOLFSSL_SERVER_END) {
  10497. ret = NO_PEER_CERT;
  10498. DoCertFatalAlert(ssl, ret);
  10499. }
  10500. args->dCertInit = 0;
  10501. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  10502. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  10503. DYNAMIC_TYPE_DCERT);
  10504. if (args->dCert == NULL) {
  10505. ERROR_OUT(MEMORY_E, exit_ppc);
  10506. }
  10507. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  10508. #endif
  10509. /* Advance state and proceed */
  10510. ssl->options.asyncState = TLS_ASYNC_BUILD;
  10511. } /* case TLS_ASYNC_BEGIN */
  10512. FALL_THROUGH;
  10513. case TLS_ASYNC_BUILD:
  10514. {
  10515. if (args->count > 0) {
  10516. /* check for trusted peer and get untrustedDepth */
  10517. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  10518. if (args->certIdx == 0) {
  10519. #ifdef WOLFSSL_TRUST_PEER_CERT
  10520. TrustedPeerCert* tp;
  10521. int matchType = WC_MATCH_NAME;
  10522. #endif
  10523. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  10524. &subjectHash, &alreadySigner);
  10525. if (ret != 0)
  10526. goto exit_ppc;
  10527. #ifdef OPENSSL_EXTRA
  10528. /* Determine untrusted depth */
  10529. if (!alreadySigner && (!args->dCert ||
  10530. !args->dCertInit || !args->dCert->selfSigned)) {
  10531. args->untrustedDepth = 1;
  10532. }
  10533. #endif
  10534. #ifdef WOLFSSL_TRUST_PEER_CERT
  10535. #ifndef NO_SKID
  10536. if (args->dCert->extAuthKeyIdSet)
  10537. matchType = WC_MATCH_SKID;
  10538. #endif
  10539. tp = GetTrustedPeer(SSL_CM(ssl), subjectHash, matchType);
  10540. WOLFSSL_MSG("Checking for trusted peer cert");
  10541. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  10542. WOLFSSL_MSG("Found matching trusted peer cert");
  10543. args->haveTrustPeer = 1;
  10544. }
  10545. else if (tp == NULL) {
  10546. /* no trusted peer cert */
  10547. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  10548. }
  10549. else {
  10550. WOLFSSL_MSG("Trusted peer cert did not match!");
  10551. }
  10552. if (!args->haveTrustPeer)
  10553. #endif
  10554. {
  10555. /* free cert if not trusted peer */
  10556. FreeDecodedCert(args->dCert);
  10557. args->dCertInit = 0;
  10558. }
  10559. }
  10560. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  10561. /* check certificate up to peer's first */
  10562. /* do not verify chain if trusted peer cert found */
  10563. while (args->count > 1
  10564. #ifdef WOLFSSL_TRUST_PEER_CERT
  10565. && !args->haveTrustPeer
  10566. #endif /* WOLFSSL_TRUST_PEER_CERT */
  10567. ) {
  10568. int skipAddCA = 0;
  10569. /* select last certificate */
  10570. args->certIdx = args->count - 1;
  10571. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  10572. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  10573. &subjectHash, &alreadySigner);
  10574. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  10575. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  10576. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  10577. if (ret == ASN_NO_SIGNER_E) {
  10578. WOLFSSL_MSG("try to load certificate if hash dir is set");
  10579. ret = LoadCertByIssuer(SSL_STORE(ssl),
  10580. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  10581. X509_LU_X509);
  10582. if (ret == WOLFSSL_SUCCESS) {
  10583. FreeDecodedCert(args->dCert);
  10584. args->dCertInit = 0;
  10585. /* once again */
  10586. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  10587. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  10588. &subjectHash, &alreadySigner);
  10589. } else
  10590. ret = ASN_NO_SIGNER_E;
  10591. }
  10592. #endif
  10593. #ifdef WOLFSSL_ASYNC_CRYPT
  10594. if (ret == WC_PENDING_E)
  10595. goto exit_ppc;
  10596. #endif
  10597. if (ret == 0) {
  10598. ret = ProcessPeerCertCheckKey(ssl, args);
  10599. }
  10600. if (ret == 0 && args->dCert->isCA == 0) {
  10601. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  10602. }
  10603. else if (ret == 0 && ssl->options.verifyNone) {
  10604. WOLFSSL_MSG("Chain cert not verified by option, "
  10605. "not adding as CA");
  10606. }
  10607. else if (ret == 0) {
  10608. #ifdef OPENSSL_EXTRA
  10609. if (args->certIdx > args->untrustedDepth) {
  10610. args->untrustedDepth = (char)args->certIdx + 1;
  10611. }
  10612. #endif
  10613. if (alreadySigner) {
  10614. WOLFSSL_MSG("Verified CA from chain and already had it");
  10615. }
  10616. }
  10617. else {
  10618. WOLFSSL_MSG("Failed to verify CA from chain");
  10619. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10620. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  10621. ssl->peerVerifyRet = X509_V_ERR_INVALID_CA;
  10622. #endif
  10623. }
  10624. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  10625. if (ret == 0) {
  10626. int doCrlLookup = 1;
  10627. #ifdef HAVE_OCSP
  10628. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10629. if (ssl->status_request_v2) {
  10630. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  10631. args->dCert, 0, ssl->heap);
  10632. }
  10633. else /* skips OCSP and force CRL check */
  10634. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  10635. if (SSL_CM(ssl)->ocspEnabled &&
  10636. SSL_CM(ssl)->ocspCheckAll) {
  10637. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  10638. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  10639. args->dCert, NULL, ssl);
  10640. #ifdef WOLFSSL_NONBLOCK_OCSP
  10641. if (ret == OCSP_WANT_READ) {
  10642. args->lastErr = ret;
  10643. goto exit_ppc;
  10644. }
  10645. #endif
  10646. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  10647. if (ret != 0) {
  10648. doCrlLookup = 0;
  10649. WOLFSSL_MSG("\tOCSP Lookup not ok");
  10650. }
  10651. }
  10652. #endif /* HAVE_OCSP */
  10653. #ifdef HAVE_CRL
  10654. if (ret == 0 && doCrlLookup &&
  10655. SSL_CM(ssl)->crlEnabled &&
  10656. SSL_CM(ssl)->crlCheckAll) {
  10657. WOLFSSL_MSG("Doing Non Leaf CRL check");
  10658. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  10659. #ifdef WOLFSSL_NONBLOCK_OCSP
  10660. if (ret == OCSP_WANT_READ) {
  10661. args->lastErr = ret;
  10662. goto exit_ppc;
  10663. }
  10664. #endif
  10665. if (ret != 0) {
  10666. WOLFSSL_MSG("\tCRL check not ok");
  10667. }
  10668. }
  10669. #endif /* HAVE_CRL */
  10670. (void)doCrlLookup;
  10671. }
  10672. #endif /* HAVE_OCSP || HAVE_CRL */
  10673. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10674. if (ret == 0 &&
  10675. /* extend the limit "+1" until reaching
  10676. * an ultimately trusted issuer.*/
  10677. args->count > (ssl->verifyDepth + 1)) {
  10678. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  10679. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  10680. ret = MAX_CHAIN_ERROR;
  10681. }
  10682. #endif
  10683. /* Do verify callback */
  10684. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  10685. if (ssl->options.verifyNone &&
  10686. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  10687. ret == CRL_CERT_DATE_ERR)) {
  10688. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  10689. ret = ssl->error = 0;
  10690. }
  10691. #ifdef WOLFSSL_ALT_CERT_CHAINS
  10692. /* For alternate cert chain, its okay for a CA cert to fail
  10693. with ASN_NO_SIGNER_E here. The "alternate" certificate
  10694. chain mode only requires that the peer certificate
  10695. validate to a trusted CA */
  10696. if (ret != 0 && args->dCert->isCA) {
  10697. if (ret == ASN_NO_SIGNER_E) {
  10698. if (!ssl->options.usingAltCertChain) {
  10699. WOLFSSL_MSG("Trying alternate cert chain");
  10700. ssl->options.usingAltCertChain = 1;
  10701. }
  10702. ret = 0; /* clear errors and continue */
  10703. args->verifyErr = 0;
  10704. }
  10705. /* do not add to certificate manager */
  10706. skipAddCA = 1;
  10707. }
  10708. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  10709. /* If valid CA then add to Certificate Manager */
  10710. if (ret == 0 && args->dCert->isCA &&
  10711. !ssl->options.verifyNone && !skipAddCA) {
  10712. buffer* cert = &args->certs[args->certIdx];
  10713. /* Is valid CA */
  10714. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  10715. /* if using alternate chain, store the cert used */
  10716. if (ssl->options.usingAltCertChain) {
  10717. AddSessionCertToChain(&ssl->session.altChain,
  10718. cert->buffer, cert->length);
  10719. }
  10720. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  10721. if (!alreadySigner) {
  10722. DerBuffer* add = NULL;
  10723. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  10724. if (ret < 0)
  10725. goto exit_ppc;
  10726. XMEMCPY(add->buffer, cert->buffer, cert->length);
  10727. /* CA already verified above in ParseCertRelative */
  10728. WOLFSSL_MSG("Adding CA from chain");
  10729. ret = AddCA(SSL_CM(ssl), &add, WOLFSSL_CHAIN_CA,
  10730. NO_VERIFY);
  10731. if (ret == WOLFSSL_SUCCESS) {
  10732. ret = 0;
  10733. }
  10734. }
  10735. }
  10736. /* Handle error codes */
  10737. if (ret != 0) {
  10738. if (!ssl->options.verifyNone) {
  10739. DoCertFatalAlert(ssl, ret);
  10740. }
  10741. ssl->error = ret; /* Report SSL error */
  10742. if (args->lastErr == 0) {
  10743. args->lastErr = ret; /* save error from last time */
  10744. ret = 0; /* reset error */
  10745. }
  10746. }
  10747. FreeDecodedCert(args->dCert);
  10748. args->dCertInit = 0;
  10749. args->count--;
  10750. } /* while (count > 0 && !args->haveTrustPeer) */
  10751. } /* if (count > 0) */
  10752. /* Check for error */
  10753. if (ret != 0) {
  10754. goto exit_ppc;
  10755. }
  10756. /* Advance state and proceed */
  10757. ssl->options.asyncState = TLS_ASYNC_DO;
  10758. } /* case TLS_ASYNC_BUILD */
  10759. FALL_THROUGH;
  10760. case TLS_ASYNC_DO:
  10761. {
  10762. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  10763. if (args->count > 0) {
  10764. WOLFSSL_MSG("Verifying Peer's cert");
  10765. /* select peer cert (first one) */
  10766. args->certIdx = 0;
  10767. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  10768. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  10769. &subjectHash, &alreadySigner);
  10770. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  10771. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  10772. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  10773. if (ret == ASN_NO_SIGNER_E) {
  10774. WOLFSSL_MSG("try to load certificate if hash dir is set");
  10775. ret = LoadCertByIssuer(SSL_STORE(ssl),
  10776. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  10777. X509_LU_X509);
  10778. if (ret == WOLFSSL_SUCCESS) {
  10779. FreeDecodedCert(args->dCert);
  10780. args->dCertInit = 0;
  10781. /* once again */
  10782. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  10783. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  10784. &subjectHash, &alreadySigner);
  10785. } else
  10786. ret = ASN_NO_SIGNER_E;
  10787. }
  10788. #endif
  10789. #ifdef WOLFSSL_ASYNC_CRYPT
  10790. if (ret == WC_PENDING_E)
  10791. goto exit_ppc;
  10792. #endif
  10793. if (ret == 0) {
  10794. WOLFSSL_MSG("Verified Peer's cert");
  10795. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10796. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  10797. ssl->peerVerifyRet = X509_V_OK;
  10798. #endif
  10799. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  10800. /* if using alternate chain, store the cert used */
  10801. if (ssl->options.usingAltCertChain) {
  10802. buffer* cert = &args->certs[args->certIdx];
  10803. AddSessionCertToChain(&ssl->session.altChain,
  10804. cert->buffer, cert->length);
  10805. }
  10806. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  10807. /* Check peer's certificate version number. TLS 1.2 / 1.3
  10808. * requires the clients certificate be version 3 unless a
  10809. * different version has been negotiated using RFC 7250 */
  10810. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10811. if (args->dCert->version != WOLFSSL_X509_V3) {
  10812. WOLFSSL_MSG("Peers certificate was not version 3!");
  10813. args->lastErr = ASN_VERSION_E;
  10814. /* setting last error but not considering it fatal
  10815. * giving the user a chance to override */
  10816. }
  10817. }
  10818. /* check if fatal error */
  10819. if (args->verifyErr) {
  10820. args->fatal = 1;
  10821. ret = args->lastErr;
  10822. }
  10823. else {
  10824. args->fatal = 0;
  10825. }
  10826. }
  10827. else if (ret == ASN_PARSE_E || ret == BUFFER_E) {
  10828. WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR");
  10829. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
  10830. defined(OPENSSL_EXTRA_X509_SMALL)
  10831. DoCertFatalAlert(ssl, ret);
  10832. #endif
  10833. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10834. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  10835. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  10836. #endif
  10837. args->fatal = 1;
  10838. }
  10839. else {
  10840. WOLFSSL_MSG("Failed to verify Peer's cert");
  10841. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10842. if (ssl->peerVerifyRet == 0) { /* Return first cert error here */
  10843. if (ret == ASN_BEFORE_DATE_E)
  10844. ssl->peerVerifyRet = X509_V_ERR_CERT_NOT_YET_VALID;
  10845. else if (ret == ASN_AFTER_DATE_E)
  10846. ssl->peerVerifyRet = X509_V_ERR_CERT_HAS_EXPIRED;
  10847. else {
  10848. ssl->peerVerifyRet =
  10849. X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  10850. }
  10851. }
  10852. #endif
  10853. if (ssl->verifyCallback) {
  10854. WOLFSSL_MSG(
  10855. "\tCallback override available, will continue");
  10856. /* check if fatal error */
  10857. args->fatal = (args->verifyErr) ? 1 : 0;
  10858. if (args->fatal)
  10859. DoCertFatalAlert(ssl, ret);
  10860. }
  10861. else {
  10862. WOLFSSL_MSG("\tNo callback override available, fatal");
  10863. args->fatal = 1;
  10864. DoCertFatalAlert(ssl, ret);
  10865. }
  10866. }
  10867. #ifdef HAVE_SECURE_RENEGOTIATION
  10868. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  10869. && ssl->secure_renegotiation
  10870. && ssl->secure_renegotiation->enabled) {
  10871. if (IsEncryptionOn(ssl, 0)) {
  10872. /* compare against previous time */
  10873. if (ssl->secure_renegotiation->subject_hash_set) {
  10874. if (XMEMCMP(args->dCert->subjectHash,
  10875. ssl->secure_renegotiation->subject_hash,
  10876. KEYID_SIZE) != 0) {
  10877. WOLFSSL_MSG(
  10878. "Peer sent different cert during scr, fatal");
  10879. args->fatal = 1;
  10880. ret = SCR_DIFFERENT_CERT_E;
  10881. }
  10882. }
  10883. }
  10884. /* cache peer's hash */
  10885. if (args->fatal == 0) {
  10886. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  10887. args->dCert->subjectHash, KEYID_SIZE);
  10888. ssl->secure_renegotiation->subject_hash_set = 1;
  10889. }
  10890. }
  10891. #endif /* HAVE_SECURE_RENEGOTIATION */
  10892. } /* if (count > 0) */
  10893. /* Check for error */
  10894. if (args->fatal && ret != 0) {
  10895. goto exit_ppc;
  10896. }
  10897. /* Advance state and proceed */
  10898. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  10899. } /* case TLS_ASYNC_DO */
  10900. FALL_THROUGH;
  10901. case TLS_ASYNC_VERIFY:
  10902. {
  10903. if (args->count > 0) {
  10904. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  10905. /* only attempt to check OCSP or CRL if not previous error such
  10906. * as ASN_BEFORE_DATE_E or ASN_AFTER_DATE_E */
  10907. if (args->fatal == 0 && ret == 0) {
  10908. int doLookup = 1;
  10909. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10910. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  10911. if (ssl->status_request) {
  10912. args->fatal = (TLSX_CSR_InitRequest(ssl->extensions,
  10913. args->dCert, ssl->heap) != 0);
  10914. doLookup = 0;
  10915. #if defined(WOLFSSL_TLS13)
  10916. if (ssl->options.tls1_3) {
  10917. TLSX* ext = TLSX_Find(ssl->extensions,
  10918. TLSX_STATUS_REQUEST);
  10919. if (ext != NULL) {
  10920. word32 idx = 0;
  10921. CertificateStatusRequest* csr =
  10922. (CertificateStatusRequest*)ext->data;
  10923. ret = ProcessCSR(ssl, csr->response.buffer,
  10924. &idx, csr->response.length);
  10925. if (ret < 0)
  10926. goto exit_ppc;
  10927. }
  10928. }
  10929. #endif
  10930. }
  10931. /* Ensure a stapling response was seen */
  10932. else if (ssl->options.tls1_3 &&
  10933. SSL_CM(ssl)->ocspMustStaple) {
  10934. ret = OCSP_CERT_UNKNOWN;
  10935. goto exit_ppc;
  10936. }
  10937. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  10938. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10939. if (ssl->status_request_v2) {
  10940. args->fatal = (TLSX_CSR2_InitRequests(ssl->extensions,
  10941. args->dCert, 1, ssl->heap) != 0);
  10942. doLookup = 0;
  10943. }
  10944. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  10945. }
  10946. #ifdef HAVE_OCSP
  10947. if (doLookup && SSL_CM(ssl)->ocspEnabled) {
  10948. WOLFSSL_MSG("Doing Leaf OCSP check");
  10949. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  10950. args->dCert, NULL, ssl);
  10951. #ifdef WOLFSSL_NONBLOCK_OCSP
  10952. if (ret == OCSP_WANT_READ) {
  10953. goto exit_ppc;
  10954. }
  10955. #endif
  10956. doLookup = (ret == OCSP_CERT_UNKNOWN);
  10957. if (ret != 0) {
  10958. WOLFSSL_MSG("\tOCSP Lookup not ok");
  10959. args->fatal = 0;
  10960. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10961. if (ssl->peerVerifyRet == 0) {
  10962. /* Return first cert error here */
  10963. ssl->peerVerifyRet =
  10964. ret == OCSP_CERT_REVOKED
  10965. ? X509_V_ERR_CERT_REVOKED
  10966. : X509_V_ERR_CERT_REJECTED;
  10967. }
  10968. #endif
  10969. }
  10970. }
  10971. #endif /* HAVE_OCSP */
  10972. #ifdef HAVE_CRL
  10973. if (doLookup && SSL_CM(ssl)->crlEnabled) {
  10974. WOLFSSL_MSG("Doing Leaf CRL check");
  10975. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  10976. #ifdef WOLFSSL_NONBLOCK_OCSP
  10977. if (ret == OCSP_WANT_READ) {
  10978. goto exit_ppc;
  10979. }
  10980. #endif
  10981. if (ret != 0) {
  10982. WOLFSSL_MSG("\tCRL check not ok");
  10983. args->fatal = 0;
  10984. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10985. if (ssl->peerVerifyRet == 0) {
  10986. /* Return first cert error here */
  10987. ssl->peerVerifyRet =
  10988. ret == CRL_CERT_REVOKED
  10989. ? X509_V_ERR_CERT_REVOKED
  10990. : X509_V_ERR_CERT_REJECTED;;
  10991. }
  10992. #endif
  10993. }
  10994. }
  10995. #endif /* HAVE_CRL */
  10996. (void)doLookup;
  10997. }
  10998. #endif /* HAVE_OCSP || HAVE_CRL */
  10999. #ifdef KEEP_PEER_CERT
  11000. if (args->fatal == 0) {
  11001. int copyRet = 0;
  11002. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  11003. if (ssl->options.handShakeDone) {
  11004. FreeX509(&ssl->peerCert);
  11005. InitX509(&ssl->peerCert, 0, ssl->heap);
  11006. }
  11007. else
  11008. #endif
  11009. #ifdef HAVE_SECURE_RENEGOTIATION
  11010. if (ssl->secure_renegotiation &&
  11011. ssl->secure_renegotiation->enabled) {
  11012. /* free old peer cert */
  11013. FreeX509(&ssl->peerCert);
  11014. InitX509(&ssl->peerCert, 0, ssl->heap);
  11015. }
  11016. else
  11017. #endif
  11018. {
  11019. }
  11020. /* set X509 format for peer cert */
  11021. copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
  11022. if (copyRet == MEMORY_E) {
  11023. args->fatal = 1;
  11024. }
  11025. }
  11026. #endif /* KEEP_PEER_CERT */
  11027. #ifndef IGNORE_KEY_EXTENSIONS
  11028. #if defined(OPENSSL_EXTRA)
  11029. /* when compatibility layer is turned on and no verify is
  11030. * set then ignore the certificate key extension */
  11031. if (args->dCert->extKeyUsageSet &&
  11032. args->dCert->extKeyUsageCrit == 0 &&
  11033. ssl->options.verifyNone) {
  11034. WOLFSSL_MSG("Not verifying certificate key usage");
  11035. }
  11036. else
  11037. #endif
  11038. if (args->dCert->extKeyUsageSet) {
  11039. if ((ssl->specs.kea == rsa_kea) &&
  11040. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  11041. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  11042. ret = KEYUSE_ENCIPHER_E;
  11043. }
  11044. if ((ssl->specs.sig_algo == rsa_sa_algo ||
  11045. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  11046. !ssl->specs.static_ecdh)) &&
  11047. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  11048. WOLFSSL_MSG("KeyUse Digital Sig not set");
  11049. ret = KEYUSE_SIGNATURE_E;
  11050. }
  11051. }
  11052. #if defined(OPENSSL_EXTRA)
  11053. /* when compatibility layer is turned on and no verify is
  11054. * set then ignore the certificate key extension */
  11055. if (args->dCert->extExtKeyUsageSet &&
  11056. args->dCert->extExtKeyUsageCrit == 0 &&
  11057. ssl->options.verifyNone) {
  11058. WOLFSSL_MSG("Not verifying certificate ext key usage");
  11059. }
  11060. else
  11061. #endif
  11062. if (args->dCert->extExtKeyUsageSet) {
  11063. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11064. if ((args->dCert->extExtKeyUsage &
  11065. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  11066. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  11067. ret = EXTKEYUSE_AUTH_E;
  11068. }
  11069. }
  11070. else {
  11071. if ((args->dCert->extExtKeyUsage &
  11072. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  11073. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  11074. ret = EXTKEYUSE_AUTH_E;
  11075. }
  11076. }
  11077. }
  11078. #endif /* IGNORE_KEY_EXTENSIONS */
  11079. if (args->fatal) {
  11080. ssl->error = ret;
  11081. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11082. SendAlert(ssl, alert_fatal, bad_certificate);
  11083. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11084. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  11085. #endif
  11086. goto exit_ppc;
  11087. }
  11088. ssl->options.havePeerCert = 1;
  11089. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  11090. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  11091. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  11092. * are to be bound into a certificate, the subject
  11093. * alternative name extension MUST be used." */
  11094. if (args->dCert->altNames) {
  11095. if (CheckForAltNames(args->dCert,
  11096. (char*)ssl->buffers.domainName.buffer,
  11097. NULL) != 1) {
  11098. WOLFSSL_MSG("DomainName match on alt names failed");
  11099. /* try to get peer key still */
  11100. ret = DOMAIN_NAME_MISMATCH;
  11101. }
  11102. }
  11103. else {
  11104. if (MatchDomainName(
  11105. args->dCert->subjectCN,
  11106. args->dCert->subjectCNLen,
  11107. (char*)ssl->buffers.domainName.buffer) == 0) {
  11108. WOLFSSL_MSG("DomainName match on common name failed");
  11109. ret = DOMAIN_NAME_MISMATCH;
  11110. }
  11111. }
  11112. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  11113. /* Old behavior. */
  11114. if (MatchDomainName(args->dCert->subjectCN,
  11115. args->dCert->subjectCNLen,
  11116. (char*)ssl->buffers.domainName.buffer) == 0) {
  11117. WOLFSSL_MSG("DomainName match on common name failed");
  11118. if (CheckForAltNames(args->dCert,
  11119. (char*)ssl->buffers.domainName.buffer,
  11120. NULL) != 1) {
  11121. WOLFSSL_MSG(
  11122. "DomainName match on alt names failed too");
  11123. /* try to get peer key still */
  11124. ret = DOMAIN_NAME_MISMATCH;
  11125. }
  11126. }
  11127. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  11128. }
  11129. /* decode peer key */
  11130. switch (args->dCert->keyOID) {
  11131. #ifndef NO_RSA
  11132. case RSAk:
  11133. {
  11134. word32 keyIdx = 0;
  11135. int keyRet = 0;
  11136. if (ssl->peerRsaKey == NULL) {
  11137. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  11138. (void**)&ssl->peerRsaKey);
  11139. } else if (ssl->peerRsaKeyPresent) {
  11140. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  11141. ssl->peerRsaKey);
  11142. ssl->peerRsaKeyPresent = 0;
  11143. }
  11144. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  11145. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  11146. args->dCert->pubKeySize) != 0) {
  11147. ret = PEER_KEY_ERROR;
  11148. }
  11149. else {
  11150. ssl->peerRsaKeyPresent = 1;
  11151. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  11152. /* copy encrypted tsip key index into ssl object */
  11153. if (args->dCert->tsip_encRsaKeyIdx) {
  11154. if (!ssl->peerTsipEncRsaKeyIndex) {
  11155. ssl->peerTsipEncRsaKeyIndex = (byte*)XMALLOC(
  11156. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  11157. ssl->heap, DYNAMIC_TYPE_RSA);
  11158. if (!ssl->peerTsipEncRsaKeyIndex) {
  11159. args->lastErr = MEMORY_E;
  11160. goto exit_ppc;
  11161. }
  11162. }
  11163. XMEMCPY(ssl->peerTsipEncRsaKeyIndex,
  11164. args->dCert->tsip_encRsaKeyIdx,
  11165. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  11166. }
  11167. #endif
  11168. #ifdef HAVE_PK_CALLBACKS
  11169. #ifndef NO_RSA
  11170. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  11171. defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  11172. if (ssl->buffers.peerRsaKey.buffer) {
  11173. XFREE(ssl->buffers.peerRsaKey.buffer,
  11174. ssl->heap, DYNAMIC_TYPE_RSA);
  11175. ssl->buffers.peerRsaKey.buffer = NULL;
  11176. }
  11177. #endif
  11178. ssl->buffers.peerRsaKey.buffer =
  11179. (byte*)XMALLOC(args->dCert->pubKeySize,
  11180. ssl->heap, DYNAMIC_TYPE_RSA);
  11181. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  11182. ret = MEMORY_ERROR;
  11183. }
  11184. else {
  11185. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  11186. args->dCert->publicKey,
  11187. args->dCert->pubKeySize);
  11188. ssl->buffers.peerRsaKey.length =
  11189. args->dCert->pubKeySize;
  11190. }
  11191. #endif /* NO_RSA */
  11192. #endif /* HAVE_PK_CALLBACKS */
  11193. }
  11194. /* check size of peer RSA key */
  11195. if (ret == 0 && ssl->peerRsaKeyPresent &&
  11196. !ssl->options.verifyNone &&
  11197. wc_RsaEncryptSize(ssl->peerRsaKey)
  11198. < ssl->options.minRsaKeySz) {
  11199. ret = RSA_KEY_SIZE_E;
  11200. WOLFSSL_MSG("Peer RSA key is too small");
  11201. }
  11202. break;
  11203. }
  11204. #endif /* NO_RSA */
  11205. #ifdef HAVE_ECC
  11206. case ECDSAk:
  11207. {
  11208. int keyRet = 0;
  11209. word32 idx = 0;
  11210. if (ssl->peerEccDsaKey == NULL) {
  11211. /* alloc/init on demand */
  11212. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  11213. (void**)&ssl->peerEccDsaKey);
  11214. } else if (ssl->peerEccDsaKeyPresent) {
  11215. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  11216. ssl->peerEccDsaKey);
  11217. ssl->peerEccDsaKeyPresent = 0;
  11218. }
  11219. if (keyRet != 0 ||
  11220. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  11221. ssl->peerEccDsaKey,
  11222. args->dCert->pubKeySize) != 0) {
  11223. ret = PEER_KEY_ERROR;
  11224. }
  11225. else {
  11226. ssl->peerEccDsaKeyPresent = 1;
  11227. #ifdef HAVE_PK_CALLBACKS
  11228. if (ssl->buffers.peerEccDsaKey.buffer)
  11229. XFREE(ssl->buffers.peerEccDsaKey.buffer,
  11230. ssl->heap, DYNAMIC_TYPE_ECC);
  11231. ssl->buffers.peerEccDsaKey.buffer =
  11232. (byte*)XMALLOC(args->dCert->pubKeySize,
  11233. ssl->heap, DYNAMIC_TYPE_ECC);
  11234. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  11235. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  11236. }
  11237. else {
  11238. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  11239. args->dCert->publicKey,
  11240. args->dCert->pubKeySize);
  11241. ssl->buffers.peerEccDsaKey.length =
  11242. args->dCert->pubKeySize;
  11243. }
  11244. #endif /* HAVE_PK_CALLBACKS */
  11245. }
  11246. /* check size of peer ECC key */
  11247. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  11248. !ssl->options.verifyNone &&
  11249. wc_ecc_size(ssl->peerEccDsaKey)
  11250. < ssl->options.minEccKeySz) {
  11251. ret = ECC_KEY_SIZE_E;
  11252. WOLFSSL_MSG("Peer ECC key is too small");
  11253. }
  11254. /* populate curve oid - if missing */
  11255. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  11256. ssl->ecdhCurveOID = args->dCert->pkCurveOID;
  11257. break;
  11258. }
  11259. #endif /* HAVE_ECC */
  11260. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  11261. case ED25519k:
  11262. {
  11263. int keyRet = 0;
  11264. if (ssl->peerEd25519Key == NULL) {
  11265. /* alloc/init on demand */
  11266. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  11267. (void**)&ssl->peerEd25519Key);
  11268. } else if (ssl->peerEd25519KeyPresent) {
  11269. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  11270. ssl->peerEd25519Key);
  11271. ssl->peerEd25519KeyPresent = 0;
  11272. }
  11273. if (keyRet != 0 ||
  11274. wc_ed25519_import_public(args->dCert->publicKey,
  11275. args->dCert->pubKeySize,
  11276. ssl->peerEd25519Key)
  11277. != 0) {
  11278. ret = PEER_KEY_ERROR;
  11279. }
  11280. else {
  11281. ssl->peerEd25519KeyPresent = 1;
  11282. #ifdef HAVE_PK_CALLBACKS
  11283. ssl->buffers.peerEd25519Key.buffer =
  11284. (byte*)XMALLOC(args->dCert->pubKeySize,
  11285. ssl->heap, DYNAMIC_TYPE_ED25519);
  11286. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  11287. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  11288. }
  11289. else {
  11290. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  11291. args->dCert->publicKey,
  11292. args->dCert->pubKeySize);
  11293. ssl->buffers.peerEd25519Key.length =
  11294. args->dCert->pubKeySize;
  11295. }
  11296. #endif /*HAVE_PK_CALLBACKS */
  11297. }
  11298. /* check size of peer ECC key */
  11299. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  11300. !ssl->options.verifyNone &&
  11301. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  11302. ret = ECC_KEY_SIZE_E;
  11303. WOLFSSL_MSG("Peer ECC key is too small");
  11304. }
  11305. /* populate curve oid - if missing */
  11306. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  11307. ssl->ecdhCurveOID = ECC_X25519_OID;
  11308. break;
  11309. }
  11310. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  11311. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  11312. case ED448k:
  11313. {
  11314. int keyRet = 0;
  11315. if (ssl->peerEd448Key == NULL) {
  11316. /* alloc/init on demand */
  11317. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
  11318. (void**)&ssl->peerEd448Key);
  11319. } else if (ssl->peerEd448KeyPresent) {
  11320. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
  11321. ssl->peerEd448Key);
  11322. ssl->peerEd448KeyPresent = 0;
  11323. }
  11324. if (keyRet != 0 ||
  11325. wc_ed448_import_public(args->dCert->publicKey,
  11326. args->dCert->pubKeySize,
  11327. ssl->peerEd448Key) != 0) {
  11328. ret = PEER_KEY_ERROR;
  11329. }
  11330. else {
  11331. ssl->peerEd448KeyPresent = 1;
  11332. #ifdef HAVE_PK_CALLBACKS
  11333. ssl->buffers.peerEd448Key.buffer =
  11334. (byte*)XMALLOC(args->dCert->pubKeySize,
  11335. ssl->heap, DYNAMIC_TYPE_ED448);
  11336. if (ssl->buffers.peerEd448Key.buffer == NULL) {
  11337. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  11338. }
  11339. else {
  11340. XMEMCPY(ssl->buffers.peerEd448Key.buffer,
  11341. args->dCert->publicKey,
  11342. args->dCert->pubKeySize);
  11343. ssl->buffers.peerEd448Key.length =
  11344. args->dCert->pubKeySize;
  11345. }
  11346. #endif /*HAVE_PK_CALLBACKS */
  11347. }
  11348. /* check size of peer ECC key */
  11349. if (ret == 0 && ssl->peerEd448KeyPresent &&
  11350. !ssl->options.verifyNone &&
  11351. ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  11352. ret = ECC_KEY_SIZE_E;
  11353. WOLFSSL_MSG("Peer ECC key is too small");
  11354. }
  11355. /* populate curve oid - if missing */
  11356. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  11357. ssl->ecdhCurveOID = ECC_X448_OID;
  11358. break;
  11359. }
  11360. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  11361. default:
  11362. break;
  11363. }
  11364. /* args->dCert free'd in function cleanup after callback */
  11365. } /* if (count > 0) */
  11366. /* Check for error */
  11367. if (args->fatal && ret != 0) {
  11368. goto exit_ppc;
  11369. }
  11370. /* Advance state and proceed */
  11371. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  11372. } /* case TLS_ASYNC_VERIFY */
  11373. FALL_THROUGH;
  11374. case TLS_ASYNC_FINALIZE:
  11375. {
  11376. /* load last error */
  11377. if (args->lastErr != 0 && ret == 0) {
  11378. ret = args->lastErr;
  11379. }
  11380. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11381. /* limit compliant with OpenSSL verify Depth + 1
  11382. * OpenSSL tries to expand the chain one longer than limit until
  11383. * reaching an ultimately trusted issuer. Becoming failure if
  11384. * we hit the limit, with X509_V_ERR_CERT_CHAIN_TOO_LONG
  11385. */
  11386. if (args->untrustedDepth > (ssl->options.verifyDepth + 1)) {
  11387. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11388. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  11389. ret = MAX_CHAIN_ERROR;
  11390. }
  11391. #endif
  11392. /* Do verify callback */
  11393. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  11394. if (ssl->options.verifyNone &&
  11395. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  11396. ret == CRL_CERT_DATE_ERR)) {
  11397. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  11398. ret = ssl->error = 0;
  11399. }
  11400. if (ret != 0) {
  11401. if (!ssl->options.verifyNone) {
  11402. DoCertFatalAlert(ssl, ret);
  11403. }
  11404. ssl->error = ret; /* Report SSL error */
  11405. }
  11406. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  11407. ssl->options.serverState = SERVER_CERT_COMPLETE;
  11408. }
  11409. if (IsEncryptionOn(ssl, 0)) {
  11410. args->idx += ssl->keys.padSz;
  11411. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11412. if (ssl->options.startedETMRead)
  11413. args->idx += MacSize(ssl);
  11414. #endif
  11415. }
  11416. /* Advance state and proceed */
  11417. ssl->options.asyncState = TLS_ASYNC_END;
  11418. } /* case TLS_ASYNC_FINALIZE */
  11419. FALL_THROUGH;
  11420. case TLS_ASYNC_END:
  11421. {
  11422. /* Set final index */
  11423. *inOutIdx = args->idx;
  11424. break;
  11425. }
  11426. default:
  11427. ret = INPUT_CASE_ERROR;
  11428. break;
  11429. } /* switch(ssl->options.asyncState) */
  11430. exit_ppc:
  11431. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  11432. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11433. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  11434. /* Mark message as not received so it can process again */
  11435. ssl->msgsReceived.got_certificate = 0;
  11436. return ret;
  11437. }
  11438. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  11439. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) || \
  11440. defined(WOLFSSL_SMALL_STACK)
  11441. if (args)
  11442. {
  11443. FreeProcPeerCertArgs(ssl, args);
  11444. }
  11445. #else
  11446. FreeProcPeerCertArgs(ssl, args);
  11447. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
  11448. #if defined(WOLFSSL_ASYNC_CRYPT)
  11449. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  11450. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11451. ssl->nonblockarg = NULL;
  11452. #elif defined(WOLFSSL_SMALL_STACK)
  11453. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11454. #endif
  11455. FreeKeyExchange(ssl);
  11456. return ret;
  11457. }
  11458. #endif
  11459. #ifndef WOLFSSL_NO_TLS12
  11460. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  11461. /* handle processing of certificate (11) */
  11462. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11463. word32 size)
  11464. {
  11465. int ret;
  11466. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  11467. WOLFSSL_ENTER("DoCertificate");
  11468. #ifdef SESSION_CERTS
  11469. /* Reset the session cert chain count in case the session resume failed. */
  11470. ssl->session.chain.count = 0;
  11471. #ifdef WOLFSSL_ALT_CERT_CHAINS
  11472. ssl->session.altChain.count = 0;
  11473. #endif
  11474. #endif /* SESSION_CERTS */
  11475. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  11476. #ifdef WOLFSSL_EXTRA_ALERTS
  11477. if (ret == BUFFER_ERROR || ret == ASN_PARSE_E)
  11478. SendAlert(ssl, alert_fatal, decode_error);
  11479. #endif
  11480. #ifdef OPENSSL_EXTRA
  11481. ssl->options.serverState = SERVER_CERT_COMPLETE;
  11482. #endif
  11483. WOLFSSL_LEAVE("DoCertificate", ret);
  11484. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  11485. return ret;
  11486. }
  11487. /* handle processing of certificate_status (22) */
  11488. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11489. word32 size)
  11490. {
  11491. int ret = 0;
  11492. byte status_type;
  11493. word32 status_length;
  11494. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  11495. WOLFSSL_ENTER("DoCertificateStatus");
  11496. if (size < ENUM_LEN + OPAQUE24_LEN)
  11497. return BUFFER_ERROR;
  11498. status_type = input[(*inOutIdx)++];
  11499. c24to32(input + *inOutIdx, &status_length);
  11500. *inOutIdx += OPAQUE24_LEN;
  11501. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  11502. return BUFFER_ERROR;
  11503. switch (status_type) {
  11504. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  11505. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  11506. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  11507. case WOLFSSL_CSR2_OCSP:
  11508. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  11509. break;
  11510. #endif
  11511. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  11512. case WOLFSSL_CSR2_OCSP_MULTI: {
  11513. OcspRequest* request;
  11514. word32 list_length = status_length;
  11515. byte idx = 0;
  11516. #ifdef WOLFSSL_SMALL_STACK
  11517. CertStatus* status;
  11518. OcspEntry* single;
  11519. OcspResponse* response;
  11520. #else
  11521. CertStatus status[1];
  11522. OcspEntry single[1];
  11523. OcspResponse response[1];
  11524. #endif
  11525. do {
  11526. if (ssl->status_request_v2) {
  11527. ssl->status_request_v2 = 0;
  11528. break;
  11529. }
  11530. return BUFFER_ERROR;
  11531. } while(0);
  11532. #ifdef WOLFSSL_SMALL_STACK
  11533. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  11534. DYNAMIC_TYPE_OCSP_STATUS);
  11535. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  11536. DYNAMIC_TYPE_OCSP_ENTRY);
  11537. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  11538. DYNAMIC_TYPE_OCSP_REQUEST);
  11539. if (status == NULL || single == NULL || response == NULL) {
  11540. if (status)
  11541. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  11542. if (single)
  11543. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  11544. if (response)
  11545. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  11546. return MEMORY_ERROR;
  11547. }
  11548. #endif
  11549. while (list_length && ret == 0) {
  11550. if (OPAQUE24_LEN > list_length) {
  11551. ret = BUFFER_ERROR;
  11552. break;
  11553. }
  11554. c24to32(input + *inOutIdx, &status_length);
  11555. *inOutIdx += OPAQUE24_LEN;
  11556. list_length -= OPAQUE24_LEN;
  11557. if (status_length > list_length) {
  11558. ret = BUFFER_ERROR;
  11559. break;
  11560. }
  11561. if (status_length) {
  11562. InitOcspResponse(response, single, status, input +*inOutIdx,
  11563. status_length, ssl->heap);
  11564. if ((OcspResponseDecode(response, SSL_CM(ssl), ssl->heap,
  11565. 0) != 0)
  11566. || (response->responseStatus != OCSP_SUCCESSFUL)
  11567. || (response->single->status->status != CERT_GOOD))
  11568. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11569. while (ret == 0) {
  11570. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  11571. ssl->extensions, status_type, idx++);
  11572. if (request == NULL)
  11573. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11574. else if (CompareOcspReqResp(request, response) == 0)
  11575. break;
  11576. else if (idx == 1) /* server cert must be OK */
  11577. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11578. }
  11579. FreeOcspResponse(response);
  11580. *inOutIdx += status_length;
  11581. list_length -= status_length;
  11582. }
  11583. }
  11584. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  11585. ssl->status_request_v2 = 0;
  11586. #endif
  11587. #ifdef WOLFSSL_SMALL_STACK
  11588. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  11589. XFREE(single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
  11590. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  11591. #endif
  11592. }
  11593. break;
  11594. #endif
  11595. default:
  11596. ret = BUFFER_ERROR;
  11597. }
  11598. if (ret != 0)
  11599. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  11600. if (IsEncryptionOn(ssl, 0)) {
  11601. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11602. if (ssl->options.startedETMRead) {
  11603. word32 digestSz = MacSize(ssl);
  11604. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  11605. return BUFFER_E;
  11606. *inOutIdx += ssl->keys.padSz + digestSz;
  11607. }
  11608. else
  11609. #endif
  11610. {
  11611. if (*inOutIdx + ssl->keys.padSz > size)
  11612. return BUFFER_E;
  11613. *inOutIdx += ssl->keys.padSz;
  11614. }
  11615. }
  11616. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  11617. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  11618. return ret;
  11619. }
  11620. #endif
  11621. #endif /* !WOLFSSL_NO_TLS12 */
  11622. #endif /* !NO_CERTS */
  11623. #ifndef WOLFSSL_NO_TLS12
  11624. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  11625. word32 size, word32 totalSz)
  11626. {
  11627. (void)input;
  11628. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  11629. WOLFSSL_ENTER("DoHelloRequest");
  11630. if (size) /* must be 0 */
  11631. return BUFFER_ERROR;
  11632. if (IsEncryptionOn(ssl, 0)) {
  11633. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  11634. * about padding */
  11635. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11636. if (ssl->options.startedETMRead) {
  11637. word32 digestSz = MacSize(ssl);
  11638. if (size != totalSz &&
  11639. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11640. return BUFFER_E;
  11641. *inOutIdx += ssl->keys.padSz + digestSz;
  11642. }
  11643. else
  11644. #endif
  11645. {
  11646. /* access beyond input + size should be checked against totalSz */
  11647. if (size != totalSz &&
  11648. *inOutIdx + ssl->keys.padSz > totalSz)
  11649. return BUFFER_E;
  11650. *inOutIdx += ssl->keys.padSz;
  11651. }
  11652. }
  11653. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11654. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  11655. return FATAL_ERROR;
  11656. }
  11657. #ifdef HAVE_SECURE_RENEGOTIATION
  11658. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  11659. ssl->secure_renegotiation->startScr = 1;
  11660. WOLFSSL_LEAVE("DoHelloRequest", 0);
  11661. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  11662. return 0;
  11663. }
  11664. #endif
  11665. else {
  11666. return SendAlert(ssl, alert_warning, no_renegotiation);
  11667. }
  11668. }
  11669. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  11670. word32 totalSz, int sniff)
  11671. {
  11672. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  11673. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  11674. WOLFSSL_ENTER("DoFinished");
  11675. if (finishedSz != size)
  11676. return BUFFER_ERROR;
  11677. /* check against totalSz
  11678. * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
  11679. * padding */
  11680. if (size != totalSz) {
  11681. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11682. if (ssl->options.startedETMRead) {
  11683. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  11684. return BUFFER_E;
  11685. }
  11686. else
  11687. #endif
  11688. {
  11689. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  11690. return BUFFER_E;
  11691. }
  11692. }
  11693. #ifdef WOLFSSL_CALLBACKS
  11694. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  11695. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  11696. #endif
  11697. if (sniff == NO_SNIFF) {
  11698. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  11699. WOLFSSL_MSG("Verify finished error on hashes");
  11700. #ifdef WOLFSSL_EXTRA_ALERTS
  11701. SendAlert(ssl, alert_fatal, decrypt_error);
  11702. #endif
  11703. return VERIFY_FINISHED_ERROR;
  11704. }
  11705. }
  11706. #ifdef HAVE_SECURE_RENEGOTIATION
  11707. if (ssl->secure_renegotiation) {
  11708. /* save peer's state */
  11709. if (ssl->options.side == WOLFSSL_CLIENT_END)
  11710. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  11711. input + *inOutIdx, TLS_FINISHED_SZ);
  11712. else
  11713. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  11714. input + *inOutIdx, TLS_FINISHED_SZ);
  11715. ssl->secure_renegotiation->verifySet = 1;
  11716. }
  11717. #endif
  11718. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  11719. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11720. XMEMCPY(ssl->serverFinished,
  11721. input + *inOutIdx, TLS_FINISHED_SZ);
  11722. ssl->serverFinished_len = TLS_FINISHED_SZ;
  11723. }
  11724. else {
  11725. XMEMCPY(ssl->clientFinished,
  11726. input + *inOutIdx, TLS_FINISHED_SZ);
  11727. ssl->clientFinished_len = TLS_FINISHED_SZ;
  11728. }
  11729. #endif
  11730. /* force input exhaustion at ProcessReply consuming padSz */
  11731. *inOutIdx += size + ssl->keys.padSz;
  11732. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11733. if (ssl->options.startedETMRead)
  11734. *inOutIdx += MacSize(ssl);
  11735. #endif
  11736. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11737. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  11738. #ifdef OPENSSL_EXTRA
  11739. ssl->cbmode = SSL_CB_MODE_WRITE;
  11740. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  11741. #endif
  11742. if (!ssl->options.resuming) {
  11743. #ifdef OPENSSL_EXTRA
  11744. if (ssl->CBIS != NULL) {
  11745. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  11746. }
  11747. #endif
  11748. ssl->options.handShakeState = HANDSHAKE_DONE;
  11749. ssl->options.handShakeDone = 1;
  11750. }
  11751. }
  11752. else {
  11753. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  11754. #ifdef OPENSSL_EXTRA
  11755. ssl->cbmode = SSL_CB_MODE_READ;
  11756. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  11757. #endif
  11758. if (ssl->options.resuming) {
  11759. #ifdef OPENSSL_EXTRA
  11760. if (ssl->CBIS != NULL) {
  11761. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  11762. }
  11763. #endif
  11764. ssl->options.handShakeState = HANDSHAKE_DONE;
  11765. ssl->options.handShakeDone = 1;
  11766. }
  11767. }
  11768. #ifdef WOLFSSL_DTLS
  11769. if (ssl->options.dtls) {
  11770. if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
  11771. (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
  11772. DtlsMsgPoolReset(ssl);
  11773. ssl->keys.dtls_handshake_number = 0;
  11774. ssl->keys.dtls_expected_peer_handshake_number = 0;
  11775. }
  11776. }
  11777. #endif
  11778. WOLFSSL_LEAVE("DoFinished", 0);
  11779. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  11780. return 0;
  11781. }
  11782. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  11783. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  11784. {
  11785. /* verify not a duplicate, mark received, check state */
  11786. switch (type) {
  11787. #ifndef NO_WOLFSSL_CLIENT
  11788. case hello_request:
  11789. if (ssl->msgsReceived.got_hello_request) {
  11790. WOLFSSL_MSG("Duplicate HelloRequest received");
  11791. return DUPLICATE_MSG_E;
  11792. }
  11793. ssl->msgsReceived.got_hello_request = 1;
  11794. break;
  11795. #endif
  11796. #ifndef NO_WOLFSSL_SERVER
  11797. case client_hello:
  11798. if (ssl->msgsReceived.got_client_hello) {
  11799. WOLFSSL_MSG("Duplicate ClientHello received");
  11800. #ifdef WOLFSSL_EXTRA_ALERTS
  11801. SendAlert(ssl, alert_fatal, unexpected_message);
  11802. #endif
  11803. return DUPLICATE_MSG_E;
  11804. }
  11805. ssl->msgsReceived.got_client_hello = 1;
  11806. break;
  11807. #endif
  11808. #ifndef NO_WOLFSSL_CLIENT
  11809. case server_hello:
  11810. if (ssl->msgsReceived.got_server_hello) {
  11811. WOLFSSL_MSG("Duplicate ServerHello received");
  11812. return DUPLICATE_MSG_E;
  11813. }
  11814. ssl->msgsReceived.got_server_hello = 1;
  11815. break;
  11816. #endif
  11817. #ifndef NO_WOLFSSL_CLIENT
  11818. case hello_verify_request:
  11819. if (ssl->msgsReceived.got_hello_verify_request) {
  11820. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  11821. return DUPLICATE_MSG_E;
  11822. }
  11823. ssl->msgsReceived.got_hello_verify_request = 1;
  11824. break;
  11825. #endif
  11826. #ifndef NO_WOLFSSL_CLIENT
  11827. case session_ticket:
  11828. if (ssl->msgsReceived.got_session_ticket) {
  11829. WOLFSSL_MSG("Duplicate SessionTicket received");
  11830. return DUPLICATE_MSG_E;
  11831. }
  11832. ssl->msgsReceived.got_session_ticket = 1;
  11833. break;
  11834. #endif
  11835. case certificate:
  11836. if (ssl->msgsReceived.got_certificate) {
  11837. WOLFSSL_MSG("Duplicate Certificate received");
  11838. return DUPLICATE_MSG_E;
  11839. }
  11840. ssl->msgsReceived.got_certificate = 1;
  11841. #ifndef NO_WOLFSSL_CLIENT
  11842. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11843. if ( ssl->msgsReceived.got_server_hello == 0) {
  11844. WOLFSSL_MSG("No ServerHello before Cert");
  11845. return OUT_OF_ORDER_E;
  11846. }
  11847. }
  11848. #endif
  11849. #ifndef NO_WOLFSSL_SERVER
  11850. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11851. if ( ssl->msgsReceived.got_client_hello == 0) {
  11852. WOLFSSL_MSG("No ClientHello before Cert");
  11853. return OUT_OF_ORDER_E;
  11854. }
  11855. }
  11856. #endif
  11857. break;
  11858. #ifndef NO_WOLFSSL_CLIENT
  11859. case certificate_status:
  11860. if (ssl->msgsReceived.got_certificate_status) {
  11861. WOLFSSL_MSG("Duplicate CertificateSatatus received");
  11862. return DUPLICATE_MSG_E;
  11863. }
  11864. ssl->msgsReceived.got_certificate_status = 1;
  11865. if (ssl->msgsReceived.got_certificate == 0) {
  11866. WOLFSSL_MSG("No Certificate before CertificateStatus");
  11867. return OUT_OF_ORDER_E;
  11868. }
  11869. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  11870. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  11871. return OUT_OF_ORDER_E;
  11872. }
  11873. break;
  11874. #endif
  11875. #ifndef NO_WOLFSSL_CLIENT
  11876. case server_key_exchange:
  11877. if (ssl->msgsReceived.got_server_key_exchange) {
  11878. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  11879. return DUPLICATE_MSG_E;
  11880. }
  11881. ssl->msgsReceived.got_server_key_exchange = 1;
  11882. if (ssl->msgsReceived.got_server_hello == 0) {
  11883. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  11884. return OUT_OF_ORDER_E;
  11885. }
  11886. if (ssl->msgsReceived.got_certificate_status == 0) {
  11887. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  11888. if (ssl->status_request) {
  11889. int ret;
  11890. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  11891. if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0)
  11892. return ret;
  11893. }
  11894. #endif
  11895. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  11896. if (ssl->status_request_v2) {
  11897. int ret;
  11898. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  11899. if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0)
  11900. return ret;
  11901. }
  11902. #endif
  11903. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  11904. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  11905. /* Check that a status request extension was seen as the
  11906. * CertificateStatus wasn't when an OCSP staple is required.
  11907. */
  11908. if (
  11909. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  11910. !ssl->status_request &&
  11911. #endif
  11912. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  11913. !ssl->status_request_v2 &&
  11914. #endif
  11915. SSL_CM(ssl)->ocspMustStaple) {
  11916. return OCSP_CERT_UNKNOWN;
  11917. }
  11918. #endif
  11919. }
  11920. break;
  11921. #endif
  11922. #ifndef NO_WOLFSSL_CLIENT
  11923. case certificate_request:
  11924. if (ssl->msgsReceived.got_certificate_request) {
  11925. WOLFSSL_MSG("Duplicate CertificateRequest received");
  11926. return DUPLICATE_MSG_E;
  11927. }
  11928. ssl->msgsReceived.got_certificate_request = 1;
  11929. break;
  11930. #endif
  11931. #ifndef NO_WOLFSSL_CLIENT
  11932. case server_hello_done:
  11933. if (ssl->msgsReceived.got_server_hello_done) {
  11934. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  11935. return DUPLICATE_MSG_E;
  11936. }
  11937. ssl->msgsReceived.got_server_hello_done = 1;
  11938. if (ssl->msgsReceived.got_certificate == 0) {
  11939. if (ssl->specs.kea == psk_kea ||
  11940. ssl->specs.kea == dhe_psk_kea ||
  11941. ssl->specs.kea == ecdhe_psk_kea ||
  11942. ssl->options.usingAnon_cipher) {
  11943. WOLFSSL_MSG("No Cert required");
  11944. } else {
  11945. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  11946. return OUT_OF_ORDER_E;
  11947. }
  11948. }
  11949. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  11950. int pskNoServerHint = 0; /* not required in this case */
  11951. #ifndef NO_PSK
  11952. if (ssl->specs.kea == psk_kea &&
  11953. ssl->arrays != NULL &&
  11954. ssl->arrays->server_hint[0] == 0)
  11955. pskNoServerHint = 1;
  11956. #endif
  11957. if (ssl->specs.static_ecdh == 1 ||
  11958. ssl->specs.kea == rsa_kea ||
  11959. pskNoServerHint) {
  11960. WOLFSSL_MSG("No KeyExchange required");
  11961. } else {
  11962. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  11963. return OUT_OF_ORDER_E;
  11964. }
  11965. }
  11966. break;
  11967. #endif
  11968. #ifndef NO_WOLFSSL_SERVER
  11969. case certificate_verify:
  11970. if (ssl->msgsReceived.got_certificate_verify) {
  11971. WOLFSSL_MSG("Duplicate CertificateVerify received");
  11972. return DUPLICATE_MSG_E;
  11973. }
  11974. ssl->msgsReceived.got_certificate_verify = 1;
  11975. if ( ssl->msgsReceived.got_certificate == 0) {
  11976. WOLFSSL_MSG("No Cert before CertVerify");
  11977. return OUT_OF_ORDER_E;
  11978. }
  11979. break;
  11980. #endif
  11981. #ifndef NO_WOLFSSL_SERVER
  11982. case client_key_exchange:
  11983. if (ssl->msgsReceived.got_client_key_exchange) {
  11984. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  11985. #ifdef WOLFSSL_EXTRA_ALERTS
  11986. SendAlert(ssl, alert_fatal, unexpected_message);
  11987. #endif
  11988. return DUPLICATE_MSG_E;
  11989. }
  11990. ssl->msgsReceived.got_client_key_exchange = 1;
  11991. if (ssl->msgsReceived.got_client_hello == 0) {
  11992. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  11993. return OUT_OF_ORDER_E;
  11994. }
  11995. break;
  11996. #endif
  11997. case finished:
  11998. if (ssl->msgsReceived.got_finished) {
  11999. WOLFSSL_MSG("Duplicate Finished received");
  12000. return DUPLICATE_MSG_E;
  12001. }
  12002. #ifdef WOLFSSL_DTLS
  12003. if (ssl->options.dtls) {
  12004. if (ssl->keys.curEpoch == 0) {
  12005. WOLFSSL_MSG("Finished received with epoch 0");
  12006. return SEQUENCE_ERROR;
  12007. }
  12008. }
  12009. #endif
  12010. ssl->msgsReceived.got_finished = 1;
  12011. if (ssl->msgsReceived.got_change_cipher == 0) {
  12012. WOLFSSL_MSG("Finished received before ChangeCipher");
  12013. #ifdef WOLFSSL_EXTRA_ALERTS
  12014. SendAlert(ssl, alert_fatal, unexpected_message);
  12015. #endif
  12016. return NO_CHANGE_CIPHER_E;
  12017. }
  12018. break;
  12019. case change_cipher_hs:
  12020. if (ssl->msgsReceived.got_change_cipher) {
  12021. WOLFSSL_MSG("Duplicate ChangeCipher received");
  12022. return DUPLICATE_MSG_E;
  12023. }
  12024. /* DTLS is going to ignore the CCS message if the client key
  12025. * exchange message wasn't received yet. */
  12026. if (!ssl->options.dtls)
  12027. ssl->msgsReceived.got_change_cipher = 1;
  12028. #ifndef NO_WOLFSSL_CLIENT
  12029. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12030. if (!ssl->options.resuming) {
  12031. if (ssl->msgsReceived.got_server_hello_done == 0) {
  12032. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  12033. return OUT_OF_ORDER_E;
  12034. }
  12035. }
  12036. else {
  12037. if (ssl->msgsReceived.got_server_hello == 0) {
  12038. WOLFSSL_MSG("No ServerHello before ChangeCipher on Resume");
  12039. return OUT_OF_ORDER_E;
  12040. }
  12041. }
  12042. #ifdef HAVE_SESSION_TICKET
  12043. if (ssl->expect_session_ticket) {
  12044. WOLFSSL_MSG("Expected session ticket missing");
  12045. #ifdef WOLFSSL_DTLS
  12046. if (ssl->options.dtls)
  12047. return OUT_OF_ORDER_E;
  12048. #endif
  12049. return SESSION_TICKET_EXPECT_E;
  12050. }
  12051. #endif
  12052. }
  12053. #endif
  12054. #ifndef NO_WOLFSSL_SERVER
  12055. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12056. if (!ssl->options.resuming &&
  12057. ssl->msgsReceived.got_client_key_exchange == 0) {
  12058. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  12059. #ifdef WOLFSSL_EXTRA_ALERTS
  12060. SendAlert(ssl, alert_fatal, unexpected_message);
  12061. #endif
  12062. return OUT_OF_ORDER_E;
  12063. }
  12064. #ifndef NO_CERTS
  12065. if (ssl->options.verifyPeer &&
  12066. ssl->options.havePeerCert) {
  12067. if (!ssl->options.havePeerVerify ||
  12068. !ssl->msgsReceived.got_certificate_verify) {
  12069. WOLFSSL_MSG("client didn't send cert verify");
  12070. #ifdef WOLFSSL_DTLS
  12071. if (ssl->options.dtls)
  12072. return OUT_OF_ORDER_E;
  12073. #endif
  12074. return NO_PEER_VERIFY;
  12075. }
  12076. }
  12077. #endif
  12078. }
  12079. #endif
  12080. if (ssl->options.dtls)
  12081. ssl->msgsReceived.got_change_cipher = 1;
  12082. break;
  12083. default:
  12084. WOLFSSL_MSG("Unknown message type");
  12085. return SANITY_MSG_E;
  12086. }
  12087. return 0;
  12088. }
  12089. static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12090. byte type, word32 size, word32 totalSz)
  12091. {
  12092. int ret = 0;
  12093. word32 expectedIdx;
  12094. WOLFSSL_ENTER("DoHandShakeMsgType");
  12095. #ifdef WOLFSSL_TLS13
  12096. if (type == hello_retry_request) {
  12097. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  12098. totalSz);
  12099. }
  12100. #endif
  12101. /* make sure can read the message */
  12102. if (*inOutIdx + size > totalSz) {
  12103. WOLFSSL_MSG("Incomplete Data");
  12104. return INCOMPLETE_DATA;
  12105. }
  12106. expectedIdx = *inOutIdx + size +
  12107. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  12108. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12109. if (ssl->options.startedETMRead && ssl->keys.encryptionOn)
  12110. expectedIdx += MacSize(ssl);
  12111. #endif
  12112. #if !defined(NO_WOLFSSL_SERVER) && \
  12113. defined(HAVE_SECURE_RENEGOTIATION) && \
  12114. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  12115. if (ssl->options.handShakeDone && type == client_hello &&
  12116. ssl->secure_renegotiation &&
  12117. ssl->secure_renegotiation->enabled)
  12118. {
  12119. WOLFSSL_MSG("Reset handshake state");
  12120. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  12121. ssl->options.serverState = NULL_STATE;
  12122. ssl->options.clientState = NULL_STATE;
  12123. ssl->options.connectState = CONNECT_BEGIN;
  12124. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  12125. ssl->options.handShakeState = NULL_STATE;
  12126. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  12127. ret = InitHandshakeHashes(ssl);
  12128. if (ret != 0)
  12129. return ret;
  12130. }
  12131. #endif
  12132. /* sanity check msg received */
  12133. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  12134. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  12135. return ret;
  12136. }
  12137. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  12138. /* add name later, add on record and handshake header part back on */
  12139. if (ssl->toInfoOn) {
  12140. int add = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  12141. AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - add,
  12142. size + add, READ_PROTO, ssl->heap);
  12143. #ifdef WOLFSSL_CALLBACKS
  12144. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  12145. #endif
  12146. }
  12147. #endif
  12148. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  12149. WOLFSSL_MSG("HandShake message after handshake complete");
  12150. SendAlert(ssl, alert_fatal, unexpected_message);
  12151. return OUT_OF_ORDER_E;
  12152. }
  12153. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  12154. ssl->options.serverState == NULL_STATE && type != server_hello) {
  12155. WOLFSSL_MSG("First server message not server hello");
  12156. SendAlert(ssl, alert_fatal, unexpected_message);
  12157. return OUT_OF_ORDER_E;
  12158. }
  12159. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  12160. type == server_hello_done &&
  12161. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  12162. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  12163. SendAlert(ssl, alert_fatal, unexpected_message);
  12164. return OUT_OF_ORDER_E;
  12165. }
  12166. if (ssl->options.side == WOLFSSL_SERVER_END &&
  12167. ssl->options.clientState == NULL_STATE && type != client_hello) {
  12168. WOLFSSL_MSG("First client message not client hello");
  12169. SendAlert(ssl, alert_fatal, unexpected_message);
  12170. return OUT_OF_ORDER_E;
  12171. }
  12172. /* above checks handshake state */
  12173. /* hello_request not hashed */
  12174. /* Also, skip hashing the client_hello message here for DTLS. It will be
  12175. * hashed later if the DTLS cookie is correct. */
  12176. if (type != hello_request &&
  12177. !(IsDtlsNotSctpMode(ssl) && type == client_hello)
  12178. #ifdef WOLFSSL_ASYNC_CRYPT
  12179. && ssl->error != WC_PENDING_E
  12180. #endif
  12181. #ifdef WOLFSSL_NONBLOCK_OCSP
  12182. && ssl->error != OCSP_WANT_READ
  12183. #endif
  12184. ) {
  12185. ret = HashInput(ssl, input + *inOutIdx, size);
  12186. if (ret != 0) {
  12187. WOLFSSL_MSG("Incomplete handshake hashes");
  12188. return ret;
  12189. }
  12190. }
  12191. #ifdef OPENSSL_EXTRA
  12192. if (ssl->CBIS != NULL){
  12193. ssl->cbmode = SSL_CB_MODE_READ;
  12194. ssl->cbtype = type;
  12195. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  12196. }
  12197. #endif
  12198. switch (type) {
  12199. case hello_request:
  12200. WOLFSSL_MSG("processing hello request");
  12201. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  12202. break;
  12203. #ifndef NO_WOLFSSL_CLIENT
  12204. case hello_verify_request:
  12205. WOLFSSL_MSG("processing hello verify request");
  12206. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  12207. if (IsEncryptionOn(ssl, 0)) {
  12208. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12209. if (ssl->options.startedETMRead) {
  12210. word32 digestSz = MacSize(ssl);
  12211. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  12212. return BUFFER_E;
  12213. *inOutIdx += ssl->keys.padSz + digestSz;
  12214. }
  12215. else
  12216. #endif
  12217. {
  12218. /* access beyond input + size should be checked against totalSz
  12219. */
  12220. if (*inOutIdx + ssl->keys.padSz > totalSz)
  12221. return BUFFER_E;
  12222. *inOutIdx += ssl->keys.padSz;
  12223. }
  12224. }
  12225. break;
  12226. case server_hello:
  12227. WOLFSSL_MSG("processing server hello");
  12228. ret = DoServerHello(ssl, input, inOutIdx, size);
  12229. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  12230. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  12231. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  12232. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  12233. IsAtLeastTLSv1_3(ssl->version)) {
  12234. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12235. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  12236. #endif
  12237. {
  12238. ssl->options.cacheMessages = 0;
  12239. if (ssl->hsHashes->messages != NULL) {
  12240. XFREE(ssl->hsHashes->messages, ssl->heap,
  12241. DYNAMIC_TYPE_HASHES);
  12242. ssl->hsHashes->messages = NULL;
  12243. }
  12244. }
  12245. }
  12246. #endif
  12247. break;
  12248. #ifndef NO_CERTS
  12249. case certificate_request:
  12250. WOLFSSL_MSG("processing certificate request");
  12251. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  12252. break;
  12253. #endif
  12254. case server_key_exchange:
  12255. WOLFSSL_MSG("processing server key exchange");
  12256. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  12257. break;
  12258. #ifdef HAVE_SESSION_TICKET
  12259. case session_ticket:
  12260. WOLFSSL_MSG("processing session ticket");
  12261. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  12262. break;
  12263. #endif /* HAVE_SESSION_TICKET */
  12264. #endif
  12265. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  12266. !defined(WOLFSSL_NO_CLIENT_AUTH))
  12267. case certificate:
  12268. WOLFSSL_MSG("processing certificate");
  12269. ret = DoCertificate(ssl, input, inOutIdx, size);
  12270. break;
  12271. case certificate_status:
  12272. WOLFSSL_MSG("processing certificate status");
  12273. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  12274. break;
  12275. #endif
  12276. case server_hello_done:
  12277. WOLFSSL_MSG("processing server hello done");
  12278. #ifdef WOLFSSL_CALLBACKS
  12279. if (ssl->hsInfoOn)
  12280. AddPacketName(ssl, "ServerHelloDone");
  12281. if (ssl->toInfoOn)
  12282. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  12283. #endif
  12284. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  12285. if (IsEncryptionOn(ssl, 0)) {
  12286. *inOutIdx += ssl->keys.padSz;
  12287. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12288. if (ssl->options.startedETMRead)
  12289. *inOutIdx += MacSize(ssl);
  12290. #endif
  12291. }
  12292. if (ssl->options.resuming) {
  12293. WOLFSSL_MSG("Not resuming as thought");
  12294. ssl->options.resuming = 0;
  12295. }
  12296. break;
  12297. case finished:
  12298. WOLFSSL_MSG("processing finished");
  12299. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  12300. break;
  12301. #ifndef NO_WOLFSSL_SERVER
  12302. case client_hello:
  12303. WOLFSSL_MSG("processing client hello");
  12304. ret = DoClientHello(ssl, input, inOutIdx, size);
  12305. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  12306. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  12307. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  12308. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  12309. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  12310. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12311. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  12312. #endif
  12313. {
  12314. ssl->options.cacheMessages = 0;
  12315. if (ssl->hsHashes->messages != NULL) {
  12316. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  12317. ssl->hsHashes->messages = NULL;
  12318. }
  12319. }
  12320. }
  12321. #endif
  12322. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  12323. * about padding */
  12324. if (IsEncryptionOn(ssl, 0)) {
  12325. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12326. if (ssl->options.startedETMRead) {
  12327. word32 digestSz = MacSize(ssl);
  12328. if (size != totalSz &&
  12329. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  12330. return BUFFER_E;
  12331. *inOutIdx += ssl->keys.padSz + digestSz;
  12332. }
  12333. else
  12334. #endif
  12335. {
  12336. /* access beyond input + size should be checked against totalSz
  12337. */
  12338. if (size != totalSz &&
  12339. *inOutIdx + ssl->keys.padSz > totalSz)
  12340. return BUFFER_E;
  12341. *inOutIdx += ssl->keys.padSz;
  12342. }
  12343. }
  12344. break;
  12345. case client_key_exchange:
  12346. WOLFSSL_MSG("processing client key exchange");
  12347. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  12348. break;
  12349. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  12350. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  12351. case certificate_verify:
  12352. WOLFSSL_MSG("processing certificate verify");
  12353. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  12354. break;
  12355. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  12356. #endif /* !NO_WOLFSSL_SERVER */
  12357. default:
  12358. WOLFSSL_MSG("Unknown handshake message type");
  12359. ret = UNKNOWN_HANDSHAKE_TYPE;
  12360. break;
  12361. }
  12362. if (ret == 0 && expectedIdx != *inOutIdx) {
  12363. WOLFSSL_MSG("Extra data in handshake message");
  12364. if (!ssl->options.dtls)
  12365. SendAlert(ssl, alert_fatal, decode_error);
  12366. ret = DECODE_E;
  12367. }
  12368. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag
  12369. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12370. /* do not shrink input for async or non-block */
  12371. && ssl->error != WC_PENDING_E && ssl->error != OCSP_WANT_READ
  12372. #endif
  12373. ) {
  12374. if (IsEncryptionOn(ssl, 0)) {
  12375. word32 extra = ssl->keys.padSz;
  12376. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12377. if (ssl->options.startedETMRead)
  12378. extra += MacSize(ssl);
  12379. #endif
  12380. if (extra > ssl->buffers.inputBuffer.idx)
  12381. return BUFFER_E;
  12382. ssl->buffers.inputBuffer.idx -= extra;
  12383. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  12384. ssl->buffers.inputBuffer.idx += extra;
  12385. }
  12386. else {
  12387. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  12388. }
  12389. }
  12390. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12391. /* if async, offset index so this msg will be processed again */
  12392. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  12393. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  12394. #ifdef WOLFSSL_DTLS
  12395. if (ssl->options.dtls) {
  12396. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  12397. }
  12398. #endif
  12399. }
  12400. /* make sure async error is cleared */
  12401. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  12402. ssl->error = 0;
  12403. }
  12404. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  12405. #ifdef WOLFSSL_DTLS
  12406. if (ret == 0) {
  12407. if (type == client_hello) {
  12408. /* Advance expected number only if cookie exchange complete */
  12409. if (ssl->msgsReceived.got_client_hello)
  12410. ssl->keys.dtls_expected_peer_handshake_number =
  12411. ssl->keys.dtls_peer_handshake_number + 1;
  12412. }
  12413. else if (type != finished) {
  12414. ssl->keys.dtls_expected_peer_handshake_number++;
  12415. }
  12416. }
  12417. #endif
  12418. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  12419. return ret;
  12420. }
  12421. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12422. word32 totalSz)
  12423. {
  12424. int ret = 0;
  12425. word32 inputLength;
  12426. WOLFSSL_ENTER("DoHandShakeMsg()");
  12427. if (ssl->arrays == NULL) {
  12428. byte type;
  12429. word32 size;
  12430. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0)
  12431. return PARSE_ERROR;
  12432. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  12433. }
  12434. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  12435. /* If there is a pending fragmented handshake message,
  12436. * pending message size will be non-zero. */
  12437. if (ssl->arrays->pendingMsgSz == 0) {
  12438. byte type;
  12439. word32 size;
  12440. if (GetHandShakeHeader(ssl,input, inOutIdx, &type, &size, totalSz) != 0)
  12441. return PARSE_ERROR;
  12442. /* Cap the maximum size of a handshake message to something reasonable.
  12443. * By default is the maximum size of a certificate message assuming
  12444. * nine 2048-bit RSA certificates in the chain. */
  12445. if (size > MAX_HANDSHAKE_SZ) {
  12446. WOLFSSL_MSG("Handshake message too large");
  12447. return HANDSHAKE_SIZE_ERROR;
  12448. }
  12449. /* size is the size of the certificate message payload */
  12450. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  12451. ssl->arrays->pendingMsgType = type;
  12452. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  12453. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  12454. ssl->heap,
  12455. DYNAMIC_TYPE_ARRAYS);
  12456. if (ssl->arrays->pendingMsg == NULL)
  12457. return MEMORY_E;
  12458. XMEMCPY(ssl->arrays->pendingMsg,
  12459. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  12460. inputLength);
  12461. ssl->arrays->pendingMsgOffset = inputLength;
  12462. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  12463. return 0;
  12464. }
  12465. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  12466. }
  12467. else {
  12468. word32 pendSz =
  12469. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  12470. /* Catch the case where there may be the remainder of a fragmented
  12471. * handshake message and the next handshake message in the same
  12472. * record. */
  12473. if (inputLength > pendSz)
  12474. inputLength = pendSz;
  12475. #ifdef WOLFSSL_ASYNC_CRYPT
  12476. if (ssl->error != WC_PENDING_E)
  12477. #endif
  12478. {
  12479. /* for async this copy was already done, do not replace, since
  12480. * conents may have been changed for inline operations */
  12481. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  12482. input + *inOutIdx, inputLength);
  12483. }
  12484. ssl->arrays->pendingMsgOffset += inputLength;
  12485. *inOutIdx += inputLength;
  12486. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  12487. {
  12488. word32 idx = HANDSHAKE_HEADER_SZ;
  12489. ret = DoHandShakeMsgType(ssl,
  12490. ssl->arrays->pendingMsg,
  12491. &idx, ssl->arrays->pendingMsgType,
  12492. ssl->arrays->pendingMsgSz - idx,
  12493. ssl->arrays->pendingMsgSz);
  12494. #ifdef WOLFSSL_ASYNC_CRYPT
  12495. if (ret == WC_PENDING_E) {
  12496. /* setup to process fragment again */
  12497. ssl->arrays->pendingMsgOffset -= inputLength;
  12498. *inOutIdx -= inputLength;
  12499. }
  12500. else
  12501. #endif
  12502. {
  12503. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  12504. ssl->arrays->pendingMsg = NULL;
  12505. ssl->arrays->pendingMsgSz = 0;
  12506. }
  12507. }
  12508. }
  12509. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  12510. return ret;
  12511. }
  12512. #endif /* !WOLFSSL_NO_TLS12 */
  12513. #ifdef WOLFSSL_DTLS
  12514. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl)
  12515. {
  12516. word32* window;
  12517. word16 cur_hi, next_hi;
  12518. word32 cur_lo, next_lo, diff;
  12519. int curLT;
  12520. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  12521. if (!ssl->options.haveMcast)
  12522. peerSeq = ssl->keys.peerSeq;
  12523. else {
  12524. #ifdef WOLFSSL_MULTICAST
  12525. WOLFSSL_DTLS_PEERSEQ* p;
  12526. int i;
  12527. for (i = 0, p = ssl->keys.peerSeq;
  12528. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  12529. i++, p++) {
  12530. if (p->peerId == ssl->keys.curPeerId) {
  12531. peerSeq = p;
  12532. break;
  12533. }
  12534. }
  12535. #endif
  12536. }
  12537. if (peerSeq == NULL) {
  12538. WOLFSSL_MSG("Could not find peer sequence");
  12539. return 0;
  12540. }
  12541. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  12542. next_hi = peerSeq->nextSeq_hi;
  12543. next_lo = peerSeq->nextSeq_lo;
  12544. window = peerSeq->window;
  12545. }
  12546. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  12547. next_hi = peerSeq->prevSeq_hi;
  12548. next_lo = peerSeq->prevSeq_lo;
  12549. window = peerSeq->prevWindow;
  12550. }
  12551. else {
  12552. return 0;
  12553. }
  12554. cur_hi = ssl->keys.curSeq_hi;
  12555. cur_lo = ssl->keys.curSeq_lo;
  12556. /* If the difference between next and cur is > 2^32, way outside window. */
  12557. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  12558. WOLFSSL_MSG("Current record from way too far in the future.");
  12559. return 0;
  12560. }
  12561. if (cur_hi == next_hi) {
  12562. curLT = cur_lo < next_lo;
  12563. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  12564. }
  12565. else {
  12566. curLT = cur_hi < next_hi;
  12567. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  12568. }
  12569. /* Check to see that the next value is greater than the number of messages
  12570. * trackable in the window, and that the difference between the next
  12571. * expected sequence number and the received sequence number is inside the
  12572. * window. */
  12573. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  12574. curLT && (diff > DTLS_SEQ_BITS)) {
  12575. WOLFSSL_MSG("Current record sequence number from the past.");
  12576. return 0;
  12577. }
  12578. #ifdef WOLFSSL_DTLS_DISALLOW_FUTURE
  12579. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  12580. WOLFSSL_MSG("Rejecting message too far into the future.");
  12581. return 0;
  12582. }
  12583. #endif
  12584. else if (curLT) {
  12585. word32 idx;
  12586. word32 newDiff;
  12587. if (diff == 0) {
  12588. WOLFSSL_MSG("DTLS sanity check failed");
  12589. return 0;
  12590. }
  12591. diff--;
  12592. idx = diff / DTLS_WORD_BITS;
  12593. newDiff = diff % DTLS_WORD_BITS;
  12594. /* verify idx is valid for window array */
  12595. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  12596. WOLFSSL_MSG("Invalid DTLS windows index");
  12597. return 0;
  12598. }
  12599. if (window[idx] & (1 << newDiff)) {
  12600. WOLFSSL_MSG("Current record sequence number already received.");
  12601. return 0;
  12602. }
  12603. }
  12604. return 1;
  12605. }
  12606. #ifdef WOLFSSL_MULTICAST
  12607. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  12608. word32 second, word32 high)
  12609. {
  12610. word32 newCur = 0;
  12611. if (cur < first)
  12612. newCur = first;
  12613. else if (cur < second)
  12614. newCur = second;
  12615. else if (cur < high)
  12616. newCur = high;
  12617. return newCur;
  12618. }
  12619. #endif /* WOLFSSL_MULTICAST */
  12620. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl)
  12621. {
  12622. word32* window;
  12623. word32* next_lo;
  12624. word16* next_hi;
  12625. int curLT;
  12626. word32 cur_lo, diff;
  12627. word16 cur_hi;
  12628. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  12629. cur_hi = ssl->keys.curSeq_hi;
  12630. cur_lo = ssl->keys.curSeq_lo;
  12631. #ifdef WOLFSSL_MULTICAST
  12632. if (ssl->options.haveMcast) {
  12633. WOLFSSL_DTLS_PEERSEQ* p;
  12634. int i;
  12635. peerSeq = NULL;
  12636. for (i = 0, p = ssl->keys.peerSeq;
  12637. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  12638. i++, p++) {
  12639. if (p->peerId == ssl->keys.curPeerId) {
  12640. peerSeq = p;
  12641. break;
  12642. }
  12643. }
  12644. if (peerSeq == NULL) {
  12645. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  12646. return 0;
  12647. }
  12648. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  12649. int cbError = 0;
  12650. if (ssl->ctx->mcastHwCb)
  12651. cbError = ssl->ctx->mcastHwCb(p->peerId,
  12652. ssl->ctx->mcastMaxSeq,
  12653. cur_lo, ssl->mcastHwCbCtx);
  12654. if (cbError) {
  12655. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  12656. return MCAST_HIGHWATER_CB_E;
  12657. }
  12658. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  12659. ssl->ctx->mcastFirstSeq,
  12660. ssl->ctx->mcastSecondSeq,
  12661. ssl->ctx->mcastMaxSeq);
  12662. }
  12663. }
  12664. #endif
  12665. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  12666. next_hi = &peerSeq->nextSeq_hi;
  12667. next_lo = &peerSeq->nextSeq_lo;
  12668. window = peerSeq->window;
  12669. }
  12670. else {
  12671. next_hi = &peerSeq->prevSeq_hi;
  12672. next_lo = &peerSeq->prevSeq_lo;
  12673. window = peerSeq->prevWindow;
  12674. }
  12675. if (cur_hi == *next_hi) {
  12676. curLT = cur_lo < *next_lo;
  12677. diff = curLT ? *next_lo - cur_lo - 1 : cur_lo - *next_lo + 1;
  12678. }
  12679. else {
  12680. curLT = cur_hi < *next_hi;
  12681. diff = curLT ? cur_lo - *next_lo - 1 : *next_lo - cur_lo + 1;
  12682. }
  12683. if (curLT) {
  12684. word32 idx = diff / DTLS_WORD_BITS;
  12685. word32 newDiff = diff % DTLS_WORD_BITS;
  12686. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  12687. window[idx] |= (1 << newDiff);
  12688. }
  12689. else {
  12690. if (diff >= DTLS_SEQ_BITS)
  12691. XMEMSET(window, 0, DTLS_SEQ_SZ);
  12692. else {
  12693. word32 idx, newDiff, temp, i;
  12694. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  12695. temp = 0;
  12696. idx = diff / DTLS_WORD_BITS;
  12697. newDiff = diff % DTLS_WORD_BITS;
  12698. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  12699. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  12700. if (i < idx)
  12701. window[i] = 0;
  12702. else {
  12703. temp |= (oldWindow[i-idx] << newDiff);
  12704. window[i] = temp;
  12705. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - newDiff - 1);
  12706. }
  12707. }
  12708. }
  12709. window[0] |= 1;
  12710. *next_lo = cur_lo + 1;
  12711. if (*next_lo < cur_lo)
  12712. (*next_hi)++;
  12713. }
  12714. return 1;
  12715. }
  12716. static int DtlsMsgDrain(WOLFSSL* ssl)
  12717. {
  12718. DtlsMsg* item = ssl->dtls_rx_msg_list;
  12719. int ret = 0;
  12720. WOLFSSL_ENTER("DtlsMsgDrain()");
  12721. /* While there is an item in the store list, and it is the expected
  12722. * message, and it is complete, and there hasn't been an error in the
  12723. * last message... */
  12724. while (item != NULL &&
  12725. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  12726. item->fragSz == item->sz &&
  12727. ret == 0) {
  12728. word32 idx = 0;
  12729. if ((ret = DoHandShakeMsgType(ssl, item->msg, &idx, item->type,
  12730. item->sz, item->sz)) == 0) {
  12731. DtlsTxMsgListClean(ssl);
  12732. }
  12733. #ifdef WOLFSSL_ASYNC_CRYPT
  12734. if (ret == WC_PENDING_E) {
  12735. break;
  12736. }
  12737. #endif
  12738. ssl->dtls_rx_msg_list = item->next;
  12739. DtlsMsgDelete(item, ssl->heap);
  12740. item = ssl->dtls_rx_msg_list;
  12741. ssl->dtls_rx_msg_list_sz--;
  12742. }
  12743. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  12744. return ret;
  12745. }
  12746. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12747. word32 totalSz)
  12748. {
  12749. byte type;
  12750. word32 size;
  12751. word32 fragOffset, fragSz;
  12752. int ret = 0;
  12753. int ignoreFinished = 0;
  12754. WOLFSSL_ENTER("DoDtlsHandShakeMsg()");
  12755. /* parse header */
  12756. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  12757. &size, &fragOffset, &fragSz, totalSz) != 0) {
  12758. WOLFSSL_ERROR(PARSE_ERROR);
  12759. return PARSE_ERROR;
  12760. }
  12761. /* Cap the maximum size of a handshake message to something reasonable.
  12762. * By default is the maximum size of a certificate message assuming
  12763. * nine 2048-bit RSA certificates in the chain. */
  12764. if (size > MAX_HANDSHAKE_SZ) {
  12765. WOLFSSL_MSG("Handshake message too large");
  12766. return HANDSHAKE_SIZE_ERROR;
  12767. }
  12768. /* check that we have complete fragment */
  12769. if (*inOutIdx + fragSz > totalSz) {
  12770. WOLFSSL_ERROR(INCOMPLETE_DATA);
  12771. return INCOMPLETE_DATA;
  12772. }
  12773. if (type == finished && ssl->keys.dtls_peer_handshake_number >=
  12774. ssl->keys.dtls_expected_peer_handshake_number &&
  12775. ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
  12776. /* finished msg should be ignore from the current epoch
  12777. * if it comes from a previous handshake */
  12778. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12779. ignoreFinished = ssl->options.connectState < FINISHED_DONE;
  12780. }
  12781. else {
  12782. ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
  12783. }
  12784. }
  12785. /* Check the handshake sequence number first. If out of order,
  12786. * add the current message to the list. If the message is in order,
  12787. * but it is a fragment, add the current message to the list, then
  12788. * check the head of the list to see if it is complete, if so, pop
  12789. * it out as the current message. If the message is complete and in
  12790. * order, process it. Check the head of the list to see if it is in
  12791. * order, if so, process it. (Repeat until list exhausted.) If the
  12792. * head is out of order, return for more processing.
  12793. */
  12794. if (ssl->keys.dtls_peer_handshake_number >
  12795. ssl->keys.dtls_expected_peer_handshake_number &&
  12796. /* Only client_hello shouldn't be ignored if the handshake
  12797. * num is greater */
  12798. (type == client_hello ||
  12799. ssl->options.handShakeState != HANDSHAKE_DONE) &&
  12800. !ignoreFinished) {
  12801. /* Current message is out of order. It will get stored in the list.
  12802. * Storing also takes care of defragmentation. If the messages is a
  12803. * client hello, we need to process this out of order; the server
  12804. * is not supposed to keep state, but the second client hello will
  12805. * have a different handshake sequence number than is expected, and
  12806. * the server shouldn't be expecting any particular handshake sequence
  12807. * number. (If the cookie changes multiple times in quick succession,
  12808. * the client could be sending multiple new client hello messages
  12809. * with newer and newer cookies.) */
  12810. if (type != client_hello) {
  12811. WOLFSSL_MSG("Current message is out of order");
  12812. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  12813. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  12814. ssl->keys.dtls_peer_handshake_number,
  12815. input + *inOutIdx, size, type,
  12816. fragOffset, fragSz, ssl->heap);
  12817. }
  12818. *inOutIdx += fragSz;
  12819. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12820. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  12821. word32 digestSz = MacSize(ssl);
  12822. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  12823. return BUFFER_E;
  12824. *inOutIdx += digestSz;
  12825. }
  12826. else
  12827. #endif
  12828. {
  12829. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  12830. WOLFSSL_ERROR(BUFFER_E);
  12831. return BUFFER_E;
  12832. }
  12833. }
  12834. *inOutIdx += ssl->keys.padSz;
  12835. ret = 0;
  12836. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  12837. /* If we receive an out of order last flight msg then retransmit */
  12838. if (type == server_hello_done || type == finished) {
  12839. ret = DtlsMsgPoolSend(ssl, 0);
  12840. }
  12841. #endif
  12842. }
  12843. else {
  12844. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  12845. }
  12846. }
  12847. else if (ssl->keys.dtls_peer_handshake_number <
  12848. ssl->keys.dtls_expected_peer_handshake_number ||
  12849. /* ignore all handshake messages if we are done with the
  12850. * handshake */
  12851. (ssl->keys.dtls_peer_handshake_number >
  12852. ssl->keys.dtls_expected_peer_handshake_number &&
  12853. ssl->options.handShakeState == HANDSHAKE_DONE) ||
  12854. ignoreFinished) {
  12855. /* Already saw this message and processed it. It can be ignored. */
  12856. WOLFSSL_MSG("Already saw this message and processed it");
  12857. *inOutIdx += fragSz;
  12858. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12859. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  12860. word32 digestSz = MacSize(ssl);
  12861. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  12862. return BUFFER_E;
  12863. *inOutIdx += digestSz;
  12864. }
  12865. else
  12866. #endif
  12867. {
  12868. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  12869. WOLFSSL_ERROR(BUFFER_E);
  12870. return BUFFER_E;
  12871. }
  12872. }
  12873. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  12874. if (IsDtlsNotSctpMode(ssl) &&
  12875. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  12876. ret = DtlsMsgPoolSend(ssl, 0);
  12877. }
  12878. #endif
  12879. *inOutIdx += ssl->keys.padSz;
  12880. }
  12881. else if (fragSz < size) {
  12882. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  12883. * be pointing to the message with this fragment in it. Check it to see
  12884. * if it is completed. */
  12885. WOLFSSL_MSG("Branch is in order, but fragmented");
  12886. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  12887. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  12888. ssl->keys.dtls_peer_handshake_number,
  12889. input + *inOutIdx, size, type,
  12890. fragOffset, fragSz, ssl->heap);
  12891. }
  12892. *inOutIdx += fragSz;
  12893. *inOutIdx += ssl->keys.padSz;
  12894. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12895. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  12896. word32 digestSz = MacSize(ssl);
  12897. if (*inOutIdx + digestSz > totalSz)
  12898. return BUFFER_E;
  12899. *inOutIdx += digestSz;
  12900. }
  12901. #endif
  12902. ret = 0;
  12903. if (ssl->dtls_rx_msg_list != NULL &&
  12904. ssl->dtls_rx_msg_list->fragSz >= ssl->dtls_rx_msg_list->sz)
  12905. ret = DtlsMsgDrain(ssl);
  12906. }
  12907. else {
  12908. /* This branch is in order next, and a complete message. On success
  12909. * clean the tx list. */
  12910. #ifdef WOLFSSL_ASYNC_CRYPT
  12911. word32 idx = *inOutIdx;
  12912. #endif
  12913. WOLFSSL_MSG("Branch is in order and a complete message");
  12914. #ifdef WOLFSSL_ASYNC_CRYPT
  12915. /* In async mode always store the message and process it with
  12916. * DtlsMsgDrain because in case of a WC_PENDING_E it will be
  12917. * easier this way. */
  12918. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  12919. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  12920. ssl->keys.dtls_peer_handshake_number,
  12921. input + idx, size, type,
  12922. fragOffset, fragSz, ssl->heap);
  12923. }
  12924. if (idx + fragSz + ssl->keys.padSz > totalSz)
  12925. return BUFFER_E;
  12926. *inOutIdx = idx + fragSz + ssl->keys.padSz;
  12927. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12928. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  12929. word32 digestSz = MacSize(ssl);
  12930. if (*inOutIdx + digestSz > totalSz)
  12931. return BUFFER_E;
  12932. *inOutIdx += digestSz;
  12933. }
  12934. #endif
  12935. ret = DtlsMsgDrain(ssl);
  12936. #else
  12937. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  12938. if (ret == 0) {
  12939. DtlsTxMsgListClean(ssl);
  12940. if (ssl->dtls_rx_msg_list != NULL) {
  12941. ret = DtlsMsgDrain(ssl);
  12942. }
  12943. }
  12944. #endif
  12945. }
  12946. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  12947. return ret;
  12948. }
  12949. #endif
  12950. #ifndef WOLFSSL_NO_TLS12
  12951. #ifdef HAVE_AEAD
  12952. #if (!defined(NO_PUBLIC_GCM_SET_IV) && \
  12953. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  12954. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
  12955. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
  12956. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  12957. {
  12958. int i;
  12959. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  12960. if (++ssl->keys.aead_exp_IV[i]) return;
  12961. }
  12962. }
  12963. #endif
  12964. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && !defined(NO_CHAPOL_AEAD)
  12965. /* Used for the older version of creating AEAD tags with Poly1305 */
  12966. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  12967. byte* cipher, word16 sz, byte* tag)
  12968. {
  12969. int ret = 0;
  12970. int msglen = (sz - ssl->specs.aead_mac_size);
  12971. word32 keySz = 32;
  12972. byte padding[8]; /* used to temporarily store lengths */
  12973. #ifdef CHACHA_AEAD_TEST
  12974. printf("Using old version of poly1305 input.\n");
  12975. #endif
  12976. if (msglen < 0)
  12977. return INPUT_CASE_ERROR;
  12978. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  12979. return ret;
  12980. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  12981. AEAD_AUTH_DATA_SZ)) != 0)
  12982. return ret;
  12983. /* length of additional input plus padding */
  12984. XMEMSET(padding, 0, sizeof(padding));
  12985. padding[0] = AEAD_AUTH_DATA_SZ;
  12986. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  12987. sizeof(padding))) != 0)
  12988. return ret;
  12989. /* add cipher info and then its length */
  12990. XMEMSET(padding, 0, sizeof(padding));
  12991. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  12992. return ret;
  12993. /* 32 bit size of cipher to 64 bit endian */
  12994. padding[0] = msglen & 0xff;
  12995. padding[1] = (msglen >> 8) & 0xff;
  12996. padding[2] = ((word32)msglen >> 16) & 0xff;
  12997. padding[3] = ((word32)msglen >> 24) & 0xff;
  12998. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  12999. != 0)
  13000. return ret;
  13001. /* generate tag */
  13002. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  13003. return ret;
  13004. return ret;
  13005. }
  13006. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  13007. * the implementation follows an older draft for creating the nonce and MAC.
  13008. * The flag oldPoly gets set automatically depending on what cipher suite was
  13009. * negotiated in the handshake. This is able to be done because the IDs for the
  13010. * cipher suites was updated in RFC7905 giving unique values for the older
  13011. * draft in comparison to the more recent RFC.
  13012. *
  13013. * ssl WOLFSSL structure to get cipher and TLS state from
  13014. * out output buffer to hold encrypted data
  13015. * input data to encrypt
  13016. * sz size of input
  13017. *
  13018. * Return 0 on success negative values in error case
  13019. */
  13020. static int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  13021. word16 sz)
  13022. {
  13023. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  13024. int ret = 0;
  13025. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  13026. byte tag[POLY1305_AUTH_SZ];
  13027. byte add[AEAD_AUTH_DATA_SZ];
  13028. byte nonce[CHACHA20_NONCE_SZ];
  13029. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  13030. #ifdef CHACHA_AEAD_TEST
  13031. int i;
  13032. #endif
  13033. Keys* keys = &ssl->keys;
  13034. XMEMSET(tag, 0, sizeof(tag));
  13035. XMEMSET(nonce, 0, sizeof(nonce));
  13036. XMEMSET(poly, 0, sizeof(poly));
  13037. XMEMSET(add, 0, sizeof(add));
  13038. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  13039. /*
  13040. * For epochs 2+:
  13041. * * use ssl->secure_renegotiation when encrypting the current epoch as it
  13042. * has the current epoch cipher material
  13043. * * use PREV_ORDER if encrypting the epoch not in
  13044. * ssl->secure_renegotiation
  13045. */
  13046. /* opaque SEQ number stored for AD */
  13047. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  13048. if (ssl->keys.dtls_epoch ==
  13049. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  13050. keys = &ssl->secure_renegotiation->tmp_keys;
  13051. WriteSEQ(ssl, CUR_ORDER, add);
  13052. }
  13053. else
  13054. WriteSEQ(ssl, PREV_ORDER, add);
  13055. }
  13056. else
  13057. #endif
  13058. WriteSEQ(ssl, CUR_ORDER, add);
  13059. if (ssl->options.oldPoly != 0) {
  13060. /* get nonce. SEQ should not be incremented again here */
  13061. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  13062. }
  13063. /* Store the type, version. Unfortunately, they are in
  13064. * the input buffer ahead of the plaintext. */
  13065. #ifdef WOLFSSL_DTLS
  13066. if (ssl->options.dtls) {
  13067. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  13068. }
  13069. #endif
  13070. /* add TLS message size to additional data */
  13071. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  13072. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  13073. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  13074. #ifdef CHACHA_AEAD_TEST
  13075. printf("Encrypt Additional : ");
  13076. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  13077. printf("%02x", add[i]);
  13078. }
  13079. printf("\n\n");
  13080. printf("input before encryption :\n");
  13081. for (i = 0; i < sz; i++) {
  13082. printf("%02x", input[i]);
  13083. if ((i + 1) % 16 == 0)
  13084. printf("\n");
  13085. }
  13086. printf("\n");
  13087. #endif
  13088. if (ssl->options.oldPoly == 0) {
  13089. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  13090. * record sequence number XORed with client_write_IV/server_write_IV */
  13091. XMEMCPY(nonce, keys->aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  13092. nonce[4] ^= add[0];
  13093. nonce[5] ^= add[1];
  13094. nonce[6] ^= add[2];
  13095. nonce[7] ^= add[3];
  13096. nonce[8] ^= add[4];
  13097. nonce[9] ^= add[5];
  13098. nonce[10] ^= add[6];
  13099. nonce[11] ^= add[7];
  13100. }
  13101. /* set the nonce for chacha and get poly1305 key */
  13102. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  13103. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13104. return ret;
  13105. }
  13106. /* create Poly1305 key using chacha20 keystream */
  13107. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  13108. poly, sizeof(poly))) != 0) {
  13109. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13110. return ret;
  13111. }
  13112. /* set the counter after getting poly1305 key */
  13113. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
  13114. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13115. return ret;
  13116. }
  13117. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  13118. /* encrypt the plain text */
  13119. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  13120. input, msgLen)) != 0) {
  13121. ForceZero(poly, sizeof(poly));
  13122. return ret;
  13123. }
  13124. /* get the poly1305 tag using either old padding scheme or more recent */
  13125. if (ssl->options.oldPoly != 0) {
  13126. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  13127. poly, sz, tag)) != 0) {
  13128. ForceZero(poly, sizeof(poly));
  13129. return ret;
  13130. }
  13131. }
  13132. else {
  13133. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  13134. sizeof(poly))) != 0) {
  13135. ForceZero(poly, sizeof(poly));
  13136. return ret;
  13137. }
  13138. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  13139. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  13140. ForceZero(poly, sizeof(poly));
  13141. return ret;
  13142. }
  13143. }
  13144. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  13145. /* append tag to ciphertext */
  13146. XMEMCPY(out + msgLen, tag, sizeof(tag));
  13147. AeadIncrementExpIV(ssl);
  13148. #ifdef CHACHA_AEAD_TEST
  13149. printf("mac tag :\n");
  13150. for (i = 0; i < 16; i++) {
  13151. printf("%02x", tag[i]);
  13152. if ((i + 1) % 16 == 0)
  13153. printf("\n");
  13154. }
  13155. printf("\n\noutput after encrypt :\n");
  13156. for (i = 0; i < sz; i++) {
  13157. printf("%02x", out[i]);
  13158. if ((i + 1) % 16 == 0)
  13159. printf("\n");
  13160. }
  13161. printf("\n");
  13162. #endif
  13163. return ret;
  13164. }
  13165. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  13166. * the implementation follows an older draft for creating the nonce and MAC.
  13167. * The flag oldPoly gets set automatically depending on what cipher suite was
  13168. * negotiated in the handshake. This is able to be done because the IDs for the
  13169. * cipher suites was updated in RFC7905 giving unique values for the older
  13170. * draft in comparison to the more recent RFC.
  13171. *
  13172. * ssl WOLFSSL structure to get cipher and TLS state from
  13173. * plain output buffer to hold decrypted data
  13174. * input data to decrypt
  13175. * sz size of input
  13176. *
  13177. * Return 0 on success negative values in error case
  13178. */
  13179. static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  13180. word16 sz)
  13181. {
  13182. byte add[AEAD_AUTH_DATA_SZ];
  13183. byte nonce[CHACHA20_NONCE_SZ];
  13184. byte tag[POLY1305_AUTH_SZ];
  13185. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  13186. int ret = 0;
  13187. int msgLen = (sz - ssl->specs.aead_mac_size);
  13188. Keys* keys = &ssl->keys;
  13189. #ifdef CHACHA_AEAD_TEST
  13190. int i;
  13191. printf("input before decrypt :\n");
  13192. for (i = 0; i < sz; i++) {
  13193. printf("%02x", input[i]);
  13194. if ((i + 1) % 16 == 0)
  13195. printf("\n");
  13196. }
  13197. printf("\n");
  13198. #endif
  13199. XMEMSET(tag, 0, sizeof(tag));
  13200. XMEMSET(poly, 0, sizeof(poly));
  13201. XMEMSET(nonce, 0, sizeof(nonce));
  13202. XMEMSET(add, 0, sizeof(add));
  13203. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  13204. /*
  13205. * For epochs 2+:
  13206. * * use ssl->secure_renegotiation when decrypting the latest epoch as it
  13207. * has the latest epoch cipher material
  13208. */
  13209. if (ssl->options.dtls && DtlsSCRKeysSet(ssl) &&
  13210. ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  13211. keys = &ssl->secure_renegotiation->tmp_keys;
  13212. #endif
  13213. /* sequence number field is 64-bits */
  13214. WriteSEQ(ssl, PEER_ORDER, add);
  13215. if (ssl->options.oldPoly != 0) {
  13216. /* get nonce, SEQ should not be incremented again here */
  13217. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  13218. }
  13219. /* get AD info */
  13220. /* Store the type, version. */
  13221. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  13222. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  13223. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  13224. /* add TLS message size to additional data */
  13225. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  13226. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  13227. #ifdef CHACHA_AEAD_TEST
  13228. printf("Decrypt Additional : ");
  13229. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  13230. printf("%02x", add[i]);
  13231. }
  13232. printf("\n\n");
  13233. #endif
  13234. if (ssl->options.oldPoly == 0) {
  13235. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  13236. * record sequence number XORed with client_write_IV/server_write_IV */
  13237. XMEMCPY(nonce, keys->aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  13238. nonce[4] ^= add[0];
  13239. nonce[5] ^= add[1];
  13240. nonce[6] ^= add[2];
  13241. nonce[7] ^= add[3];
  13242. nonce[8] ^= add[4];
  13243. nonce[9] ^= add[5];
  13244. nonce[10] ^= add[6];
  13245. nonce[11] ^= add[7];
  13246. }
  13247. /* set nonce and get poly1305 key */
  13248. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  13249. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13250. return ret;
  13251. }
  13252. /* use chacha20 keystream to get poly1305 key for tag */
  13253. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  13254. poly, sizeof(poly))) != 0) {
  13255. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13256. return ret;
  13257. }
  13258. /* set counter after getting poly1305 key */
  13259. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
  13260. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13261. return ret;
  13262. }
  13263. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  13264. /* get the tag using Poly1305 */
  13265. if (ssl->options.oldPoly != 0) {
  13266. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  13267. ForceZero(poly, sizeof(poly));
  13268. return ret;
  13269. }
  13270. }
  13271. else {
  13272. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  13273. sizeof(poly))) != 0) {
  13274. ForceZero(poly, sizeof(poly));
  13275. return ret;
  13276. }
  13277. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  13278. sizeof(add), input, msgLen, tag, sizeof(tag))) != 0) {
  13279. ForceZero(poly, sizeof(poly));
  13280. return ret;
  13281. }
  13282. }
  13283. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  13284. /* check tag sent along with packet */
  13285. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  13286. WOLFSSL_MSG("MAC did not match");
  13287. if (!ssl->options.dtls)
  13288. SendAlert(ssl, alert_fatal, bad_record_mac);
  13289. return VERIFY_MAC_ERROR;
  13290. }
  13291. /* if the tag was good decrypt message */
  13292. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  13293. input, msgLen)) != 0)
  13294. return ret;
  13295. #ifdef CHACHA_AEAD_TEST
  13296. printf("plain after decrypt :\n");
  13297. for (i = 0; i < sz; i++) {
  13298. printf("%02x", plain[i]);
  13299. if ((i + 1) % 16 == 0)
  13300. printf("\n");
  13301. }
  13302. printf("\n");
  13303. #endif
  13304. return ret;
  13305. }
  13306. #endif /* HAVE_CHACHA && HAVE_POLY1305 && !NO_CHAPOL_AEAD*/
  13307. #endif /* HAVE_AEAD */
  13308. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13309. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  13310. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  13311. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  13312. /* The following type is used to share code between AES-GCM and AES-CCM. */
  13313. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  13314. const byte* in, word32 sz,
  13315. byte* iv, word32 ivSz,
  13316. byte* authTag, word32 authTagSz,
  13317. const byte* authIn, word32 authInSz);
  13318. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  13319. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  13320. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  13321. #else
  13322. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  13323. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  13324. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  13325. #endif
  13326. #endif
  13327. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  13328. word16 sz, int asyncOkay)
  13329. {
  13330. int ret = 0;
  13331. #ifdef WOLFSSL_ASYNC_CRYPT
  13332. WC_ASYNC_DEV* asyncDev = NULL;
  13333. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  13334. #else
  13335. (void)asyncOkay;
  13336. #endif
  13337. (void)out;
  13338. (void)input;
  13339. (void)sz;
  13340. switch (ssl->specs.bulk_cipher_algorithm) {
  13341. #ifdef BUILD_ARC4
  13342. case wolfssl_rc4:
  13343. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  13344. break;
  13345. #endif
  13346. #ifdef BUILD_DES3
  13347. case wolfssl_triple_des:
  13348. #ifdef WOLFSSL_ASYNC_CRYPT
  13349. /* initialize event */
  13350. asyncDev = &ssl->encrypt.des3->asyncDev;
  13351. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  13352. if (ret != 0)
  13353. break;
  13354. #endif
  13355. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  13356. #ifdef WOLFSSL_ASYNC_CRYPT
  13357. if (ret == WC_PENDING_E && asyncOkay) {
  13358. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  13359. }
  13360. #endif
  13361. break;
  13362. #endif
  13363. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  13364. case wolfssl_aes:
  13365. #ifdef WOLFSSL_ASYNC_CRYPT
  13366. /* initialize event */
  13367. asyncDev = &ssl->encrypt.aes->asyncDev;
  13368. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  13369. if (ret != 0)
  13370. break;
  13371. #endif
  13372. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  13373. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  13374. if (tsip_useable(ssl)) {
  13375. ret = wc_tsip_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  13376. } else
  13377. #endif
  13378. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  13379. #ifdef WOLFSSL_ASYNC_CRYPT
  13380. if (ret == WC_PENDING_E && asyncOkay) {
  13381. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  13382. }
  13383. #endif
  13384. break;
  13385. #endif
  13386. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13387. case wolfssl_aes_gcm:
  13388. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  13389. {
  13390. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  13391. const byte* additionalSrc;
  13392. #ifdef WOLFSSL_ASYNC_CRYPT
  13393. /* initialize event */
  13394. asyncDev = &ssl->encrypt.aes->asyncDev;
  13395. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  13396. if (ret != 0)
  13397. break;
  13398. #endif
  13399. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  13400. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  13401. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  13402. #elif defined(BUILD_AESGCM)
  13403. aes_auth_fn = AES_GCM_ENCRYPT;
  13404. #else
  13405. aes_auth_fn = AES_CCM_ENCRYPT;
  13406. #endif
  13407. additionalSrc = input - 5;
  13408. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  13409. /* sequence number field is 64-bits */
  13410. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  13411. /* Store the type, version. Unfortunately, they are in
  13412. * the input buffer ahead of the plaintext. */
  13413. #ifdef WOLFSSL_DTLS
  13414. if (ssl->options.dtls) {
  13415. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  13416. }
  13417. #endif
  13418. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  13419. additionalSrc, 3);
  13420. /* Store the length of the plain text minus the explicit
  13421. * IV length minus the authentication tag size. */
  13422. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  13423. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  13424. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  13425. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  13426. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  13427. XMEMCPY(ssl->encrypt.nonce,
  13428. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  13429. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  13430. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  13431. #endif
  13432. ret = aes_auth_fn(ssl->encrypt.aes,
  13433. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  13434. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  13435. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  13436. out + sz - ssl->specs.aead_mac_size,
  13437. ssl->specs.aead_mac_size,
  13438. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  13439. #ifdef WOLFSSL_ASYNC_CRYPT
  13440. if (ret == WC_PENDING_E && asyncOkay) {
  13441. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  13442. }
  13443. #endif
  13444. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  13445. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  13446. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  13447. XMEMCPY(out,
  13448. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  13449. #endif
  13450. }
  13451. break;
  13452. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13453. #ifdef HAVE_CAMELLIA
  13454. case wolfssl_camellia:
  13455. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  13456. break;
  13457. #endif
  13458. #ifdef HAVE_HC128
  13459. case wolfssl_hc128:
  13460. ret = wc_Hc128_Process(ssl->encrypt.hc128, out, input, sz);
  13461. break;
  13462. #endif
  13463. #ifdef BUILD_RABBIT
  13464. case wolfssl_rabbit:
  13465. ret = wc_RabbitProcess(ssl->encrypt.rabbit, out, input, sz);
  13466. break;
  13467. #endif
  13468. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  13469. !defined(NO_CHAPOL_AEAD)
  13470. case wolfssl_chacha:
  13471. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  13472. break;
  13473. #endif
  13474. #ifdef HAVE_NULL_CIPHER
  13475. case wolfssl_cipher_null:
  13476. if (input != out) {
  13477. XMEMMOVE(out, input, sz);
  13478. }
  13479. break;
  13480. #endif
  13481. #ifdef HAVE_IDEA
  13482. case wolfssl_idea:
  13483. ret = wc_IdeaCbcEncrypt(ssl->encrypt.idea, out, input, sz);
  13484. break;
  13485. #endif
  13486. default:
  13487. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  13488. ret = ENCRYPT_ERROR;
  13489. }
  13490. #ifdef WOLFSSL_ASYNC_CRYPT
  13491. /* if async is not okay, then block */
  13492. if (ret == WC_PENDING_E && !asyncOkay) {
  13493. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  13494. }
  13495. #endif
  13496. return ret;
  13497. }
  13498. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz,
  13499. int asyncOkay)
  13500. {
  13501. int ret = 0;
  13502. #ifdef WOLFSSL_ASYNC_CRYPT
  13503. if (ssl->error == WC_PENDING_E) {
  13504. ssl->error = 0; /* clear async */
  13505. }
  13506. #endif
  13507. switch (ssl->encrypt.state) {
  13508. case CIPHER_STATE_BEGIN:
  13509. {
  13510. if (ssl->encrypt.setup == 0) {
  13511. WOLFSSL_MSG("Encrypt ciphers not setup");
  13512. return ENCRYPT_ERROR;
  13513. }
  13514. #ifdef HAVE_FUZZER
  13515. if (ssl->fuzzerCb)
  13516. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  13517. #endif
  13518. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13519. /* make sure AES GCM/CCM memory is allocated */
  13520. /* free for these happens in FreeCiphers */
  13521. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  13522. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  13523. /* make sure auth iv and auth are allocated */
  13524. if (ssl->encrypt.additional == NULL)
  13525. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  13526. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  13527. if (ssl->encrypt.nonce == NULL)
  13528. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  13529. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  13530. if (ssl->encrypt.additional == NULL ||
  13531. ssl->encrypt.nonce == NULL) {
  13532. return MEMORY_E;
  13533. }
  13534. }
  13535. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13536. /* Advance state and proceed */
  13537. ssl->encrypt.state = CIPHER_STATE_DO;
  13538. }
  13539. FALL_THROUGH;
  13540. case CIPHER_STATE_DO:
  13541. {
  13542. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  13543. /* Advance state */
  13544. ssl->encrypt.state = CIPHER_STATE_END;
  13545. #ifdef WOLFSSL_ASYNC_CRYPT
  13546. /* If pending, then leave and return will resume below */
  13547. if (ret == WC_PENDING_E) {
  13548. return ret;
  13549. }
  13550. #endif
  13551. }
  13552. FALL_THROUGH;
  13553. case CIPHER_STATE_END:
  13554. {
  13555. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13556. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  13557. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  13558. {
  13559. /* finalize authentication cipher */
  13560. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  13561. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  13562. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  13563. AeadIncrementExpIV(ssl);
  13564. #endif
  13565. if (ssl->encrypt.nonce)
  13566. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  13567. }
  13568. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13569. break;
  13570. }
  13571. default:
  13572. break;
  13573. }
  13574. /* Reset state */
  13575. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  13576. return ret;
  13577. }
  13578. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  13579. word16 sz)
  13580. {
  13581. int ret = 0;
  13582. (void)plain;
  13583. (void)input;
  13584. (void)sz;
  13585. switch (ssl->specs.bulk_cipher_algorithm)
  13586. {
  13587. #ifdef BUILD_ARC4
  13588. case wolfssl_rc4:
  13589. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  13590. break;
  13591. #endif
  13592. #ifdef BUILD_DES3
  13593. case wolfssl_triple_des:
  13594. #ifdef WOLFSSL_ASYNC_CRYPT
  13595. /* initialize event */
  13596. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  13597. WC_ASYNC_FLAG_CALL_AGAIN);
  13598. if (ret != 0)
  13599. break;
  13600. #endif
  13601. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  13602. #ifdef WOLFSSL_ASYNC_CRYPT
  13603. if (ret == WC_PENDING_E) {
  13604. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  13605. }
  13606. #endif
  13607. break;
  13608. #endif
  13609. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  13610. case wolfssl_aes:
  13611. #ifdef WOLFSSL_ASYNC_CRYPT
  13612. /* initialize event */
  13613. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  13614. WC_ASYNC_FLAG_CALL_AGAIN);
  13615. if (ret != 0)
  13616. break;
  13617. #endif
  13618. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  13619. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  13620. if (tsip_useable(ssl)) {
  13621. ret = wc_tsip_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  13622. } else
  13623. #endif
  13624. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  13625. #ifdef WOLFSSL_ASYNC_CRYPT
  13626. if (ret == WC_PENDING_E) {
  13627. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  13628. }
  13629. #endif
  13630. break;
  13631. #endif
  13632. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13633. case wolfssl_aes_gcm:
  13634. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  13635. {
  13636. wc_AesAuthDecryptFunc aes_auth_fn;
  13637. #ifdef WOLFSSL_ASYNC_CRYPT
  13638. /* initialize event */
  13639. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  13640. WC_ASYNC_FLAG_CALL_AGAIN);
  13641. if (ret != 0)
  13642. break;
  13643. #endif
  13644. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  13645. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  13646. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  13647. #elif defined(BUILD_AESGCM)
  13648. aes_auth_fn = wc_AesGcmDecrypt;
  13649. #else
  13650. aes_auth_fn = wc_AesCcmDecrypt;
  13651. #endif
  13652. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  13653. /* sequence number field is 64-bits */
  13654. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  13655. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  13656. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  13657. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  13658. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  13659. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  13660. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  13661. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  13662. XMEMCPY(ssl->decrypt.nonce,
  13663. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  13664. AESGCM_IMP_IV_SZ);
  13665. else
  13666. #endif
  13667. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  13668. AESGCM_IMP_IV_SZ);
  13669. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  13670. AESGCM_EXP_IV_SZ);
  13671. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  13672. plain + AESGCM_EXP_IV_SZ,
  13673. input + AESGCM_EXP_IV_SZ,
  13674. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  13675. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  13676. input + sz - ssl->specs.aead_mac_size,
  13677. ssl->specs.aead_mac_size,
  13678. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  13679. #ifdef WOLFSSL_ASYNC_CRYPT
  13680. if (ret == WC_PENDING_E) {
  13681. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  13682. }
  13683. #endif
  13684. }
  13685. }
  13686. break;
  13687. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13688. #ifdef HAVE_CAMELLIA
  13689. case wolfssl_camellia:
  13690. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  13691. break;
  13692. #endif
  13693. #ifdef HAVE_HC128
  13694. case wolfssl_hc128:
  13695. ret = wc_Hc128_Process(ssl->decrypt.hc128, plain, input, sz);
  13696. break;
  13697. #endif
  13698. #ifdef BUILD_RABBIT
  13699. case wolfssl_rabbit:
  13700. ret = wc_RabbitProcess(ssl->decrypt.rabbit, plain, input, sz);
  13701. break;
  13702. #endif
  13703. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  13704. !defined(NO_CHAPOL_AEAD)
  13705. case wolfssl_chacha:
  13706. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  13707. break;
  13708. #endif
  13709. #ifdef HAVE_NULL_CIPHER
  13710. case wolfssl_cipher_null:
  13711. if (input != plain) {
  13712. XMEMMOVE(plain, input, sz);
  13713. }
  13714. break;
  13715. #endif
  13716. #ifdef HAVE_IDEA
  13717. case wolfssl_idea:
  13718. ret = wc_IdeaCbcDecrypt(ssl->decrypt.idea, plain, input, sz);
  13719. break;
  13720. #endif
  13721. default:
  13722. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  13723. ret = DECRYPT_ERROR;
  13724. }
  13725. return ret;
  13726. }
  13727. static WC_INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  13728. word16 sz)
  13729. {
  13730. int ret = 0;
  13731. #ifdef WOLFSSL_ASYNC_CRYPT
  13732. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  13733. if (ret != WC_NOT_PENDING_E) {
  13734. /* check for still pending */
  13735. if (ret == WC_PENDING_E)
  13736. return ret;
  13737. ssl->error = 0; /* clear async */
  13738. /* let failures through so CIPHER_STATE_END logic is run */
  13739. }
  13740. else
  13741. #endif
  13742. {
  13743. /* Reset state */
  13744. ret = 0;
  13745. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  13746. }
  13747. switch (ssl->decrypt.state) {
  13748. case CIPHER_STATE_BEGIN:
  13749. {
  13750. if (ssl->decrypt.setup == 0) {
  13751. WOLFSSL_MSG("Decrypt ciphers not setup");
  13752. return DECRYPT_ERROR;
  13753. }
  13754. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13755. /* make sure AES GCM/CCM memory is allocated */
  13756. /* free for these happens in FreeCiphers */
  13757. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  13758. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  13759. /* make sure auth iv and auth are allocated */
  13760. if (ssl->decrypt.additional == NULL)
  13761. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  13762. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  13763. if (ssl->decrypt.nonce == NULL)
  13764. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  13765. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  13766. if (ssl->decrypt.additional == NULL ||
  13767. ssl->decrypt.nonce == NULL) {
  13768. return MEMORY_E;
  13769. }
  13770. }
  13771. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13772. /* Advance state and proceed */
  13773. ssl->decrypt.state = CIPHER_STATE_DO;
  13774. }
  13775. FALL_THROUGH;
  13776. case CIPHER_STATE_DO:
  13777. {
  13778. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  13779. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  13780. /* For epochs >1 the current cipher parameters are located in
  13781. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  13782. * parameters and for epoch 1 use ssl->keys */
  13783. if (ssl->keys.curEpoch ==
  13784. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  13785. if (ssl->decrypt.src != SCR) {
  13786. ssl->secure_renegotiation->cache_status =
  13787. SCR_CACHE_NEEDED;
  13788. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  13789. break;
  13790. }
  13791. }
  13792. else {
  13793. if (ssl->decrypt.src != KEYS) {
  13794. ssl->secure_renegotiation->cache_status =
  13795. SCR_CACHE_NULL;
  13796. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  13797. break;
  13798. }
  13799. }
  13800. }
  13801. #endif
  13802. ret = DecryptDo(ssl, plain, input, sz);
  13803. /* Advance state */
  13804. ssl->decrypt.state = CIPHER_STATE_END;
  13805. #ifdef WOLFSSL_ASYNC_CRYPT
  13806. /* If pending, leave and return below */
  13807. if (ret == WC_PENDING_E) {
  13808. return ret;
  13809. }
  13810. #endif
  13811. }
  13812. FALL_THROUGH;
  13813. case CIPHER_STATE_END:
  13814. {
  13815. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13816. /* make sure AES GCM/CCM nonce is cleared */
  13817. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  13818. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  13819. if (ssl->decrypt.nonce)
  13820. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  13821. if (ret < 0)
  13822. ret = VERIFY_MAC_ERROR;
  13823. }
  13824. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13825. break;
  13826. }
  13827. default:
  13828. break;
  13829. }
  13830. /* Reset state */
  13831. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  13832. /* handle mac error case */
  13833. if (ret == VERIFY_MAC_ERROR) {
  13834. if (!ssl->options.dtls)
  13835. SendAlert(ssl, alert_fatal, bad_record_mac);
  13836. #ifdef WOLFSSL_DTLS_DROP_STATS
  13837. ssl->macDropCount++;
  13838. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13839. }
  13840. return ret;
  13841. }
  13842. #endif /* !WOLFSSL_NO_TLS12 */
  13843. /* Check conditions for a cipher to have an explicit IV.
  13844. *
  13845. * ssl The SSL/TLS object.
  13846. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  13847. */
  13848. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  13849. {
  13850. #ifdef WOLFSSL_TLS13
  13851. if (ssl->options.tls1_3)
  13852. return 0;
  13853. #endif
  13854. return (ssl->specs.cipher_type == aead) &&
  13855. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  13856. }
  13857. /* check cipher text size for sanity */
  13858. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  13859. {
  13860. #ifdef HAVE_TRUNCATED_HMAC
  13861. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  13862. : ssl->specs.hash_size;
  13863. #else
  13864. word32 minLength = ssl->specs.hash_size; /* covers stream */
  13865. #endif
  13866. #ifndef WOLFSSL_AEAD_ONLY
  13867. if (ssl->specs.cipher_type == block) {
  13868. #ifdef HAVE_ENCRYPT_THEN_MAC
  13869. if (ssl->options.startedETMRead) {
  13870. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  13871. WOLFSSL_MSG("Block ciphertext not block size");
  13872. return SANITY_CIPHER_E;
  13873. }
  13874. }
  13875. else
  13876. #endif
  13877. if (encryptSz % ssl->specs.block_size) {
  13878. WOLFSSL_MSG("Block ciphertext not block size");
  13879. return SANITY_CIPHER_E;
  13880. }
  13881. minLength++; /* pad byte */
  13882. if (ssl->specs.block_size > minLength)
  13883. minLength = ssl->specs.block_size;
  13884. if (ssl->options.tls1_1)
  13885. minLength += ssl->specs.block_size; /* explicit IV */
  13886. }
  13887. else
  13888. #endif
  13889. if (ssl->specs.cipher_type == aead) {
  13890. minLength = ssl->specs.aead_mac_size; /* authTag size */
  13891. if (CipherHasExpIV(ssl))
  13892. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  13893. }
  13894. if (encryptSz < minLength) {
  13895. WOLFSSL_MSG("Ciphertext not minimum size");
  13896. return SANITY_CIPHER_E;
  13897. }
  13898. return 0;
  13899. }
  13900. #ifndef WOLFSSL_AEAD_ONLY
  13901. /* check all length bytes for the pad value, return 0 on success */
  13902. static int PadCheck(const byte* a, byte pad, int length)
  13903. {
  13904. int i;
  13905. int compareSum = 0;
  13906. for (i = 0; i < length; i++) {
  13907. compareSum |= a[i] ^ pad;
  13908. }
  13909. return compareSum;
  13910. }
  13911. /* Mask the padding bytes with the expected values.
  13912. * Constant time implementation - does maximum pad size possible.
  13913. *
  13914. * data Message data.
  13915. * sz Size of the message including MAC and padding and padding length.
  13916. * macSz Size of the MAC.
  13917. * returns 0 on success, otherwise failure.
  13918. */
  13919. static byte MaskPadding(const byte* data, int sz, int macSz)
  13920. {
  13921. int i;
  13922. int checkSz = sz - 1;
  13923. byte paddingSz = data[sz - 1];
  13924. byte mask;
  13925. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  13926. if (checkSz > TLS_MAX_PAD_SZ)
  13927. checkSz = TLS_MAX_PAD_SZ;
  13928. for (i = 0; i < checkSz; i++) {
  13929. mask = ctMaskLTE(i, paddingSz);
  13930. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  13931. }
  13932. return good;
  13933. }
  13934. /* Mask the MAC in the message with the MAC calculated.
  13935. * Constant time implementation - starts looking for MAC where maximum padding
  13936. * size has it.
  13937. *
  13938. * data Message data.
  13939. * sz Size of the message including MAC and padding and padding length.
  13940. * macSz Size of the MAC data.
  13941. * expMac Expected MAC value.
  13942. * returns 0 on success, otherwise failure.
  13943. */
  13944. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  13945. {
  13946. int i, j;
  13947. unsigned char mac[WC_MAX_DIGEST_SIZE];
  13948. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  13949. int macEnd = sz - 1 - data[sz - 1];
  13950. int macStart = macEnd - macSz;
  13951. int r = 0;
  13952. unsigned char started, notEnded;
  13953. unsigned char good = 0;
  13954. scanStart &= ctMaskIntGTE(scanStart, 0);
  13955. macStart &= ctMaskIntGTE(macStart, 0);
  13956. /* Div on Intel has different speeds depending on value.
  13957. * Use a bitwise AND or mod a specific value (converted to mul). */
  13958. if ((macSz & (macSz - 1)) == 0)
  13959. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  13960. #ifndef NO_SHA
  13961. else if (macSz == WC_SHA_DIGEST_SIZE)
  13962. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  13963. #endif
  13964. #ifdef WOLFSSL_SHA384
  13965. else if (macSz == WC_SHA384_DIGEST_SIZE)
  13966. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  13967. #endif
  13968. XMEMSET(mac, 0, macSz);
  13969. for (i = scanStart; i < sz; i += macSz) {
  13970. for (j = 0; j < macSz && j + i < sz; j++) {
  13971. started = ctMaskGTE(i + j, macStart);
  13972. notEnded = ctMaskLT(i + j, macEnd);
  13973. mac[j] |= started & notEnded & data[i + j];
  13974. }
  13975. }
  13976. if ((macSz & (macSz - 1)) == 0) {
  13977. for (i = 0; i < macSz; i++)
  13978. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  13979. }
  13980. #ifndef NO_SHA
  13981. else if (macSz == WC_SHA_DIGEST_SIZE) {
  13982. for (i = 0; i < macSz; i++)
  13983. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  13984. }
  13985. #endif
  13986. #ifdef WOLFSSL_SHA384
  13987. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  13988. for (i = 0; i < macSz; i++)
  13989. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  13990. }
  13991. #endif
  13992. return good;
  13993. }
  13994. /* timing resistant pad/verify check, return 0 on success */
  13995. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  13996. int pLen, int content)
  13997. {
  13998. byte verify[WC_MAX_DIGEST_SIZE];
  13999. byte good;
  14000. int ret = 0;
  14001. good = MaskPadding(input, pLen, macSz);
  14002. /* 4th argument has potential to underflow, ssl->hmac function should
  14003. * either increment the size by (macSz + padLen + 1) before use or check on
  14004. * the size to make sure is valid. */
  14005. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  14006. content, 1, PEER_ORDER);
  14007. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  14008. /* Non-zero on failure. */
  14009. good = (byte)~(word32)good;
  14010. good &= good >> 4;
  14011. good &= good >> 2;
  14012. good &= good >> 1;
  14013. /* Make ret negative on masking failure. */
  14014. ret -= 1 - good;
  14015. /* Treat any failure as verify MAC error. */
  14016. if (ret != 0)
  14017. ret = VERIFY_MAC_ERROR;
  14018. return ret;
  14019. }
  14020. #endif
  14021. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx, int sniff)
  14022. {
  14023. word32 msgSz = ssl->keys.encryptSz;
  14024. word32 idx = *inOutIdx;
  14025. int dataSz;
  14026. int ivExtra = 0;
  14027. byte* rawData = input + idx; /* keep current for hmac */
  14028. #ifdef HAVE_LIBZ
  14029. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  14030. #endif
  14031. #ifdef WOLFSSL_EARLY_DATA
  14032. if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
  14033. int process = 0;
  14034. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14035. if ((ssl->earlyData != no_early_data) &&
  14036. (ssl->options.clientState == CLIENT_HELLO_COMPLETE)) {
  14037. process = 1;
  14038. }
  14039. if (!process) {
  14040. WOLFSSL_MSG("Ignoring EarlyData!");
  14041. *inOutIdx = ssl->buffers.inputBuffer.length;
  14042. return 0;
  14043. }
  14044. }
  14045. if (!process) {
  14046. WOLFSSL_MSG("Received App data before a handshake completed");
  14047. if (sniff == NO_SNIFF) {
  14048. SendAlert(ssl, alert_fatal, unexpected_message);
  14049. }
  14050. return OUT_OF_ORDER_E;
  14051. }
  14052. }
  14053. else
  14054. #endif
  14055. if (ssl->options.handShakeDone == 0) {
  14056. WOLFSSL_MSG("Received App data before a handshake completed");
  14057. if (sniff == NO_SNIFF) {
  14058. SendAlert(ssl, alert_fatal, unexpected_message);
  14059. }
  14060. return OUT_OF_ORDER_E;
  14061. }
  14062. #ifndef WOLFSSL_AEAD_ONLY
  14063. if (ssl->specs.cipher_type == block) {
  14064. if (ssl->options.tls1_1)
  14065. ivExtra = ssl->specs.block_size;
  14066. }
  14067. else
  14068. #endif
  14069. if (ssl->specs.cipher_type == aead) {
  14070. if (CipherHasExpIV(ssl))
  14071. ivExtra = AESGCM_EXP_IV_SZ;
  14072. }
  14073. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  14074. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14075. if (ssl->options.startedETMRead)
  14076. dataSz -= MacSize(ssl);
  14077. #endif
  14078. if (dataSz < 0) {
  14079. WOLFSSL_MSG("App data buffer error, malicious input?");
  14080. if (sniff == NO_SNIFF) {
  14081. SendAlert(ssl, alert_fatal, unexpected_message);
  14082. }
  14083. return BUFFER_ERROR;
  14084. }
  14085. #ifdef WOLFSSL_EARLY_DATA
  14086. if (ssl->earlyData > early_data_ext) {
  14087. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  14088. if (sniff == NO_SNIFF) {
  14089. SendAlert(ssl, alert_fatal, unexpected_message);
  14090. }
  14091. return WOLFSSL_FATAL_ERROR;
  14092. }
  14093. ssl->earlyDataSz += dataSz;
  14094. }
  14095. #endif
  14096. /* read data */
  14097. if (dataSz) {
  14098. int rawSz = dataSz; /* keep raw size for idx adjustment */
  14099. #ifdef HAVE_LIBZ
  14100. if (ssl->options.usingCompression) {
  14101. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  14102. if (dataSz < 0) return dataSz;
  14103. }
  14104. #endif
  14105. idx += rawSz;
  14106. ssl->buffers.clearOutputBuffer.buffer = rawData;
  14107. ssl->buffers.clearOutputBuffer.length = dataSz;
  14108. }
  14109. idx += ssl->keys.padSz;
  14110. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14111. if (ssl->options.startedETMRead)
  14112. idx += MacSize(ssl);
  14113. #endif
  14114. #ifdef HAVE_LIBZ
  14115. /* decompress could be bigger, overwrite after verify */
  14116. if (ssl->options.usingCompression)
  14117. XMEMMOVE(rawData, decomp, dataSz);
  14118. #endif
  14119. *inOutIdx = idx;
  14120. #ifdef HAVE_SECURE_RENEGOTIATION
  14121. if (IsSCR(ssl)) {
  14122. /* Reset the processReply state since
  14123. * we finished processing this message. */
  14124. ssl->options.processReply = doProcessInit;
  14125. /* If we are in a secure renegotiation then APP DATA is treated
  14126. * differently */
  14127. return APP_DATA_READY;
  14128. }
  14129. #endif
  14130. return 0;
  14131. }
  14132. const char* AlertTypeToString(int type)
  14133. {
  14134. switch (type) {
  14135. case close_notify:
  14136. {
  14137. static const char close_notify_str[] =
  14138. "close_notify";
  14139. return close_notify_str;
  14140. }
  14141. case unexpected_message:
  14142. {
  14143. static const char unexpected_message_str[] =
  14144. "unexpected_message";
  14145. return unexpected_message_str;
  14146. }
  14147. case bad_record_mac:
  14148. {
  14149. static const char bad_record_mac_str[] =
  14150. "bad_record_mac";
  14151. return bad_record_mac_str;
  14152. }
  14153. case record_overflow:
  14154. {
  14155. static const char record_overflow_str[] =
  14156. "record_overflow";
  14157. return record_overflow_str;
  14158. }
  14159. case decompression_failure:
  14160. {
  14161. static const char decompression_failure_str[] =
  14162. "decompression_failure";
  14163. return decompression_failure_str;
  14164. }
  14165. case handshake_failure:
  14166. {
  14167. static const char handshake_failure_str[] =
  14168. "handshake_failure";
  14169. return handshake_failure_str;
  14170. }
  14171. case no_certificate:
  14172. {
  14173. static const char no_certificate_str[] =
  14174. "no_certificate";
  14175. return no_certificate_str;
  14176. }
  14177. case bad_certificate:
  14178. {
  14179. static const char bad_certificate_str[] =
  14180. "bad_certificate";
  14181. return bad_certificate_str;
  14182. }
  14183. case unsupported_certificate:
  14184. {
  14185. static const char unsupported_certificate_str[] =
  14186. "unsupported_certificate";
  14187. return unsupported_certificate_str;
  14188. }
  14189. case certificate_revoked:
  14190. {
  14191. static const char certificate_revoked_str[] =
  14192. "certificate_revoked";
  14193. return certificate_revoked_str;
  14194. }
  14195. case certificate_expired:
  14196. {
  14197. static const char certificate_expired_str[] =
  14198. "certificate_expired";
  14199. return certificate_expired_str;
  14200. }
  14201. case certificate_unknown:
  14202. {
  14203. static const char certificate_unknown_str[] =
  14204. "certificate_unknown";
  14205. return certificate_unknown_str;
  14206. }
  14207. case illegal_parameter:
  14208. {
  14209. static const char illegal_parameter_str[] =
  14210. "illegal_parameter";
  14211. return illegal_parameter_str;
  14212. }
  14213. case unknown_ca:
  14214. {
  14215. static const char unknown_ca_str[] =
  14216. "unknown_ca";
  14217. return unknown_ca_str;
  14218. }
  14219. case access_denied:
  14220. {
  14221. static const char access_denied_str[] =
  14222. "access_denied";
  14223. return access_denied_str;
  14224. }
  14225. case decode_error:
  14226. {
  14227. static const char decode_error_str[] =
  14228. "decode_error";
  14229. return decode_error_str;
  14230. }
  14231. case decrypt_error:
  14232. {
  14233. static const char decrypt_error_str[] =
  14234. "decrypt_error";
  14235. return decrypt_error_str;
  14236. }
  14237. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  14238. /* catch name conflict for enum protocol with MYSQL build */
  14239. case wc_protocol_version:
  14240. {
  14241. static const char wc_protocol_version_str[] =
  14242. "wc_protocol_version";
  14243. return wc_protocol_version_str;
  14244. }
  14245. #else
  14246. case protocol_version:
  14247. {
  14248. static const char protocol_version_str[] =
  14249. "protocol_version";
  14250. return protocol_version_str;
  14251. }
  14252. #endif
  14253. case insufficient_security:
  14254. {
  14255. static const char insufficient_security_str[] =
  14256. "insufficient_security";
  14257. return insufficient_security_str;
  14258. }
  14259. case internal_error:
  14260. {
  14261. static const char internal_error_str[] =
  14262. "internal_error";
  14263. return internal_error_str;
  14264. }
  14265. case user_canceled:
  14266. {
  14267. static const char user_canceled_str[] =
  14268. "user_canceled";
  14269. return user_canceled_str;
  14270. }
  14271. case no_renegotiation:
  14272. {
  14273. static const char no_renegotiation_str[] =
  14274. "no_renegotiation";
  14275. return no_renegotiation_str;
  14276. }
  14277. case unrecognized_name:
  14278. {
  14279. static const char unrecognized_name_str[] =
  14280. "unrecognized_name";
  14281. return unrecognized_name_str;
  14282. }
  14283. case bad_certificate_status_response:
  14284. {
  14285. static const char bad_certificate_status_response_str[] =
  14286. "bad_certificate_status_response";
  14287. return bad_certificate_status_response_str;
  14288. }
  14289. case no_application_protocol:
  14290. {
  14291. static const char no_application_protocol_str[] =
  14292. "no_application_protocol";
  14293. return no_application_protocol_str;
  14294. }
  14295. default:
  14296. WOLFSSL_MSG("Unknown Alert");
  14297. return NULL;
  14298. }
  14299. }
  14300. static void LogAlert(int type)
  14301. {
  14302. (void)type;
  14303. #ifdef DEBUG_WOLFSSL
  14304. const char* typeStr;
  14305. char buff[60];
  14306. typeStr = AlertTypeToString(type);
  14307. if (typeStr != NULL) {
  14308. XSNPRINTF(buff, sizeof(buff), "Alert type: %s", typeStr);
  14309. WOLFSSL_MSG(buff);
  14310. }
  14311. #endif /* DEBUG_WOLFSSL */
  14312. }
  14313. /* process alert, return level */
  14314. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
  14315. {
  14316. byte level;
  14317. byte code;
  14318. word32 dataSz = (word32)ssl->curSize;
  14319. int ivExtra = 0;
  14320. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14321. if (ssl->hsInfoOn)
  14322. AddPacketName(ssl, "Alert");
  14323. if (ssl->toInfoOn)
  14324. /* add record header back on to info + alert bytes level/code */
  14325. AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx -
  14326. RECORD_HEADER_SZ, RECORD_HEADER_SZ + ALERT_SIZE,
  14327. READ_PROTO, ssl->heap);
  14328. #endif
  14329. #ifndef WOLFSSL_AEAD_ONLY
  14330. if (ssl->specs.cipher_type == block) {
  14331. if (ssl->options.tls1_1)
  14332. ivExtra = ssl->specs.block_size;
  14333. }
  14334. else
  14335. #endif
  14336. if (ssl->specs.cipher_type == aead) {
  14337. if (CipherHasExpIV(ssl))
  14338. ivExtra = AESGCM_EXP_IV_SZ;
  14339. }
  14340. dataSz -= ivExtra;
  14341. if (IsEncryptionOn(ssl, 0)) {
  14342. dataSz -= ssl->keys.padSz;
  14343. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14344. if (ssl->options.startedETMRead)
  14345. dataSz -= MacSize(ssl);
  14346. #endif
  14347. }
  14348. /* make sure can read the message */
  14349. if (dataSz != ALERT_SIZE) {
  14350. #ifdef WOLFSSL_EXTRA_ALERTS
  14351. SendAlert(ssl, alert_fatal, unexpected_message);
  14352. #endif
  14353. return BUFFER_E;
  14354. }
  14355. level = input[(*inOutIdx)++];
  14356. code = input[(*inOutIdx)++];
  14357. ssl->alert_history.last_rx.code = code;
  14358. ssl->alert_history.last_rx.level = level;
  14359. *type = code;
  14360. if (level == alert_fatal) {
  14361. ssl->options.isClosed = 1; /* Don't send close_notify */
  14362. }
  14363. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  14364. WOLFSSL_MSG("Alert count exceeded");
  14365. #ifdef WOLFSSL_EXTRA_ALERTS
  14366. if (level != alert_warning || code != close_notify)
  14367. SendAlert(ssl, alert_fatal, unexpected_message);
  14368. #endif
  14369. return ALERT_COUNT_E;
  14370. }
  14371. LogAlert(*type);
  14372. if (*type == close_notify) {
  14373. ssl->options.closeNotify = 1;
  14374. }
  14375. WOLFSSL_ERROR(*type);
  14376. if (IsEncryptionOn(ssl, 0)) {
  14377. *inOutIdx += ssl->keys.padSz;
  14378. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14379. if (ssl->options.startedETMRead)
  14380. *inOutIdx += MacSize(ssl);
  14381. #endif
  14382. }
  14383. return level;
  14384. }
  14385. static int GetInputData(WOLFSSL *ssl, word32 size)
  14386. {
  14387. int in;
  14388. int inSz;
  14389. int maxLength;
  14390. int usedLength;
  14391. int dtlsExtra = 0;
  14392. /* check max input length */
  14393. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  14394. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  14395. inSz = (int)(size - usedLength); /* from last partial read */
  14396. #ifdef WOLFSSL_DTLS
  14397. if (ssl->options.dtls) {
  14398. if (size < ssl->dtls_expected_rx)
  14399. dtlsExtra = (int)(ssl->dtls_expected_rx - size);
  14400. inSz = ssl->dtls_expected_rx;
  14401. }
  14402. #endif
  14403. /* check that no lengths or size values are negative */
  14404. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  14405. return BUFFER_ERROR;
  14406. }
  14407. if (inSz > maxLength) {
  14408. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  14409. return MEMORY_E;
  14410. }
  14411. /* Put buffer data at start if not there */
  14412. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  14413. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  14414. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  14415. usedLength);
  14416. /* remove processed data */
  14417. ssl->buffers.inputBuffer.idx = 0;
  14418. ssl->buffers.inputBuffer.length = usedLength;
  14419. /* read data from network */
  14420. do {
  14421. in = wolfSSLReceive(ssl,
  14422. ssl->buffers.inputBuffer.buffer +
  14423. ssl->buffers.inputBuffer.length,
  14424. inSz);
  14425. if (in == WANT_READ)
  14426. return WANT_READ;
  14427. if (in < 0)
  14428. return SOCKET_ERROR_E;
  14429. if (in > inSz)
  14430. return RECV_OVERFLOW_E;
  14431. ssl->buffers.inputBuffer.length += in;
  14432. inSz -= in;
  14433. } while (ssl->buffers.inputBuffer.length < size);
  14434. #ifdef WOLFSSL_DEBUG_TLS
  14435. if (ssl->buffers.inputBuffer.idx == 0) {
  14436. WOLFSSL_MSG("Data received");
  14437. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  14438. ssl->buffers.inputBuffer.length);
  14439. }
  14440. #endif
  14441. return 0;
  14442. }
  14443. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14444. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  14445. int content)
  14446. {
  14447. int ret;
  14448. #ifdef HAVE_TRUNCATED_HMAC
  14449. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  14450. : ssl->specs.hash_size;
  14451. #else
  14452. word32 digestSz = ssl->specs.hash_size;
  14453. #endif
  14454. byte verify[WC_MAX_DIGEST_SIZE];
  14455. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  14456. if (msgSz < digestSz) {
  14457. return VERIFY_MAC_ERROR;
  14458. }
  14459. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
  14460. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  14461. if (ret != 0) {
  14462. return VERIFY_MAC_ERROR;
  14463. }
  14464. return 0;
  14465. }
  14466. #endif
  14467. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  14468. int content, word32* padSz)
  14469. {
  14470. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  14471. int ivExtra = 0;
  14472. int ret;
  14473. word32 pad = 0;
  14474. word32 padByte = 0;
  14475. #ifdef HAVE_TRUNCATED_HMAC
  14476. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  14477. : ssl->specs.hash_size;
  14478. #else
  14479. word32 digestSz = ssl->specs.hash_size;
  14480. #endif
  14481. byte verify[WC_MAX_DIGEST_SIZE];
  14482. if (ssl->specs.cipher_type == block) {
  14483. if (ssl->options.tls1_1)
  14484. ivExtra = ssl->specs.block_size;
  14485. pad = *(input + msgSz - ivExtra - 1);
  14486. padByte = 1;
  14487. if (ssl->options.tls) {
  14488. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  14489. content);
  14490. if (ret != 0)
  14491. return ret;
  14492. }
  14493. else { /* sslv3, some implementations have bad padding, but don't
  14494. * allow bad read */
  14495. int badPadLen = 0;
  14496. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  14497. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  14498. (void)dmy;
  14499. if (pad > (msgSz - digestSz - 1)) {
  14500. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  14501. pad = 0; /* no bad read */
  14502. badPadLen = 1;
  14503. }
  14504. (void)PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  14505. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
  14506. pad, content, 1, PEER_ORDER);
  14507. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  14508. digestSz) != 0)
  14509. return VERIFY_MAC_ERROR;
  14510. if (ret != 0 || badPadLen)
  14511. return VERIFY_MAC_ERROR;
  14512. }
  14513. }
  14514. else if (ssl->specs.cipher_type == stream) {
  14515. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
  14516. PEER_ORDER);
  14517. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0){
  14518. return VERIFY_MAC_ERROR;
  14519. }
  14520. if (ret != 0)
  14521. return VERIFY_MAC_ERROR;
  14522. }
  14523. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  14524. if (ssl->specs.cipher_type == aead) {
  14525. *padSz = ssl->specs.aead_mac_size;
  14526. }
  14527. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  14528. else {
  14529. *padSz = digestSz + pad + padByte;
  14530. }
  14531. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  14532. (void)input;
  14533. (void)msgSz;
  14534. (void)content;
  14535. return 0;
  14536. }
  14537. int ProcessReply(WOLFSSL* ssl)
  14538. {
  14539. return ProcessReplyEx(ssl, 0);
  14540. }
  14541. /* Process input requests. Return 0 is done, 1 is call again to complete, and
  14542. negative number is error. If allowSocketErr is set, SOCKET_ERROR_E in
  14543. ssl->error will be whitelisted. This is useful when the connection has been
  14544. closed and the endpoint wants to check for an alert sent by the other end. */
  14545. int ProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
  14546. {
  14547. int ret = 0, type, readSz;
  14548. int atomicUser = 0;
  14549. word32 startIdx = 0;
  14550. #if defined(WOLFSSL_DTLS)
  14551. int used;
  14552. #endif
  14553. #ifdef ATOMIC_USER
  14554. if (ssl->ctx->DecryptVerifyCb)
  14555. atomicUser = 1;
  14556. #endif
  14557. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  14558. #ifdef HAVE_SECURE_RENEGOTIATION
  14559. && ssl->error != APP_DATA_READY
  14560. #endif
  14561. #ifdef WOLFSSL_ASYNC_CRYPT
  14562. && ssl->error != WC_PENDING_E
  14563. #endif
  14564. #ifdef WOLFSSL_NONBLOCK_OCSP
  14565. && ssl->error != OCSP_WANT_READ
  14566. #endif
  14567. && (allowSocketErr != 1 || ssl->error != SOCKET_ERROR_E)
  14568. ) {
  14569. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  14570. return ssl->error;
  14571. }
  14572. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
  14573. /* process any pending DTLS messages - this flow can happen with async */
  14574. if (ssl->dtls_rx_msg_list != NULL) {
  14575. ret = DtlsMsgDrain(ssl);
  14576. if (ret != 0) {
  14577. WOLFSSL_ERROR(ret);
  14578. return ret;
  14579. }
  14580. }
  14581. #endif
  14582. for (;;) {
  14583. switch (ssl->options.processReply) {
  14584. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  14585. * old client hello */
  14586. case doProcessInit:
  14587. readSz = RECORD_HEADER_SZ;
  14588. #ifdef WOLFSSL_DTLS
  14589. if (ssl->options.dtls)
  14590. readSz = DTLS_RECORD_HEADER_SZ;
  14591. #endif
  14592. /* get header or return error */
  14593. if (!ssl->options.dtls) {
  14594. if ((ret = GetInputData(ssl, readSz)) < 0)
  14595. return ret;
  14596. } else {
  14597. #ifdef WOLFSSL_DTLS
  14598. /* read ahead may already have header */
  14599. used = ssl->buffers.inputBuffer.length -
  14600. ssl->buffers.inputBuffer.idx;
  14601. if (used < readSz) {
  14602. if ((ret = GetInputData(ssl, readSz)) < 0)
  14603. return ret;
  14604. }
  14605. #endif
  14606. }
  14607. #ifdef OLD_HELLO_ALLOWED
  14608. /* see if sending SSLv2 client hello */
  14609. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  14610. ssl->options.clientState == NULL_STATE &&
  14611. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  14612. != handshake) {
  14613. byte b0, b1;
  14614. ssl->options.processReply = runProcessOldClientHello;
  14615. /* sanity checks before getting size at front */
  14616. if (ssl->buffers.inputBuffer.buffer[
  14617. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  14618. WOLFSSL_MSG("Not a valid old client hello");
  14619. return PARSE_ERROR;
  14620. }
  14621. if (ssl->buffers.inputBuffer.buffer[
  14622. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  14623. ssl->buffers.inputBuffer.buffer[
  14624. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  14625. WOLFSSL_MSG("Not a valid version in old client hello");
  14626. return PARSE_ERROR;
  14627. }
  14628. /* how many bytes need ProcessOldClientHello */
  14629. b0 =
  14630. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  14631. b1 =
  14632. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  14633. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  14634. }
  14635. else {
  14636. ssl->options.processReply = getRecordLayerHeader;
  14637. continue;
  14638. }
  14639. FALL_THROUGH;
  14640. /* in the WOLFSSL_SERVER case, run the old client hello */
  14641. case runProcessOldClientHello:
  14642. /* get sz bytes or return error */
  14643. if (!ssl->options.dtls) {
  14644. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  14645. return ret;
  14646. } else {
  14647. #ifdef WOLFSSL_DTLS
  14648. /* read ahead may already have */
  14649. used = ssl->buffers.inputBuffer.length -
  14650. ssl->buffers.inputBuffer.idx;
  14651. if (used < ssl->curSize)
  14652. if ((ret = GetInputData(ssl, ssl->curSize - used)) < 0)
  14653. return ret;
  14654. #endif /* WOLFSSL_DTLS */
  14655. }
  14656. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  14657. &ssl->buffers.inputBuffer.idx,
  14658. ssl->buffers.inputBuffer.length -
  14659. ssl->buffers.inputBuffer.idx,
  14660. ssl->curSize);
  14661. if (ret < 0)
  14662. return ret;
  14663. else if (ssl->buffers.inputBuffer.idx ==
  14664. ssl->buffers.inputBuffer.length) {
  14665. ssl->options.processReply = doProcessInit;
  14666. return 0;
  14667. }
  14668. #endif /* OLD_HELLO_ALLOWED */
  14669. FALL_THROUGH;
  14670. /* get the record layer header */
  14671. case getRecordLayerHeader:
  14672. ret = GetRecordHeader(ssl, ssl->buffers.inputBuffer.buffer,
  14673. &ssl->buffers.inputBuffer.idx,
  14674. &ssl->curRL, &ssl->curSize);
  14675. #ifdef WOLFSSL_DTLS
  14676. if (ssl->options.dtls && ret == SEQUENCE_ERROR) {
  14677. WOLFSSL_MSG("Silently dropping out of order DTLS message");
  14678. ssl->options.processReply = doProcessInit;
  14679. ssl->buffers.inputBuffer.length = 0;
  14680. ssl->buffers.inputBuffer.idx = 0;
  14681. #ifdef WOLFSSL_DTLS_DROP_STATS
  14682. ssl->replayDropCount++;
  14683. #endif /* WOLFSSL_DTLS_DROP_STATS */
  14684. continue;
  14685. }
  14686. #endif
  14687. if (ret != 0)
  14688. return ret;
  14689. #ifdef WOLFSSL_TLS13
  14690. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  14691. ssl->curRL.type != application_data &&
  14692. ssl->curRL.type != change_cipher_spec) {
  14693. SendAlert(ssl, alert_fatal, unexpected_message);
  14694. return PARSE_ERROR;
  14695. }
  14696. #endif
  14697. ssl->options.processReply = getData;
  14698. FALL_THROUGH;
  14699. /* retrieve record layer data */
  14700. case getData:
  14701. /* get sz bytes or return error */
  14702. if (!ssl->options.dtls) {
  14703. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  14704. #ifdef WOLFSSL_EXTRA_ALERTS
  14705. if (ret != WANT_READ)
  14706. SendAlert(ssl, alert_fatal, bad_record_mac);
  14707. #endif
  14708. return ret;
  14709. }
  14710. }
  14711. else {
  14712. #ifdef WOLFSSL_DTLS
  14713. /* read ahead may already have */
  14714. used = ssl->buffers.inputBuffer.length -
  14715. ssl->buffers.inputBuffer.idx;
  14716. if (used < ssl->curSize)
  14717. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  14718. return ret;
  14719. #endif
  14720. }
  14721. if (IsEncryptionOn(ssl, 0)) {
  14722. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  14723. int tooLong = 0;
  14724. #endif
  14725. #ifdef WOLFSSL_TLS13
  14726. if (IsAtLeastTLSv1_3(ssl->version)) {
  14727. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  14728. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  14729. MAX_TLS13_PLAIN_SZ;
  14730. }
  14731. #endif
  14732. #ifdef WOLFSSL_EXTRA_ALERTS
  14733. if (!IsAtLeastTLSv1_3(ssl->version))
  14734. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  14735. #endif
  14736. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  14737. if (tooLong) {
  14738. WOLFSSL_MSG("Encrypted data too long");
  14739. SendAlert(ssl, alert_fatal, record_overflow);
  14740. return BUFFER_ERROR;
  14741. }
  14742. #endif
  14743. }
  14744. ssl->keys.padSz = 0;
  14745. ssl->options.processReply = verifyEncryptedMessage;
  14746. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  14747. FALL_THROUGH;
  14748. /* verify digest of encrypted message */
  14749. case verifyEncryptedMessage:
  14750. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14751. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  14752. !atomicUser && ssl->options.startedETMRead) {
  14753. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  14754. ssl->buffers.inputBuffer.idx,
  14755. ssl->curSize, ssl->curRL.type);
  14756. #ifdef WOLFSSL_ASYNC_CRYPT
  14757. if (ret == WC_PENDING_E)
  14758. return ret;
  14759. #endif
  14760. if (ret < 0) {
  14761. WOLFSSL_MSG("VerifyMacEnc failed");
  14762. WOLFSSL_ERROR(ret);
  14763. #ifdef WOLFSSL_DTLS
  14764. /* If in DTLS mode, if the decrypt fails for any
  14765. * reason, pretend the datagram never happened. */
  14766. if (ssl->options.dtls) {
  14767. ssl->options.processReply = doProcessInit;
  14768. ssl->buffers.inputBuffer.idx =
  14769. ssl->buffers.inputBuffer.length;
  14770. #ifdef WOLFSSL_DTLS_DROP_STATS
  14771. ssl->macDropCount++;
  14772. #endif /* WOLFSSL_DTLS_DROP_STATS */
  14773. }
  14774. #endif /* WOLFSSL_DTLS */
  14775. #ifdef WOLFSSL_EXTRA_ALERTS
  14776. if (!ssl->options.dtls)
  14777. SendAlert(ssl, alert_fatal, bad_record_mac);
  14778. #endif
  14779. return DECRYPT_ERROR;
  14780. }
  14781. ssl->keys.encryptSz = ssl->curSize;
  14782. }
  14783. #endif
  14784. ssl->options.processReply = decryptMessage;
  14785. FALL_THROUGH;
  14786. /* decrypt message */
  14787. case decryptMessage:
  14788. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  14789. (!IsAtLeastTLSv1_3(ssl->version) ||
  14790. ssl->curRL.type != change_cipher_spec))
  14791. {
  14792. bufferStatic* in = &ssl->buffers.inputBuffer;
  14793. ret = SanityCheckCipherText(ssl, ssl->curSize);
  14794. if (ret < 0) {
  14795. #ifdef WOLFSSL_EXTRA_ALERTS
  14796. SendAlert(ssl, alert_fatal, bad_record_mac);
  14797. #endif
  14798. return ret;
  14799. }
  14800. if (atomicUser) {
  14801. #ifdef ATOMIC_USER
  14802. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14803. if (ssl->options.startedETMRead) {
  14804. ret = ssl->ctx->VerifyDecryptCb(ssl,
  14805. in->buffer + in->idx, in->buffer + in->idx,
  14806. ssl->curSize - MacSize(ssl),
  14807. ssl->curRL.type, 1, &ssl->keys.padSz,
  14808. ssl->DecryptVerifyCtx);
  14809. }
  14810. else
  14811. #endif
  14812. {
  14813. ret = ssl->ctx->DecryptVerifyCb(ssl,
  14814. in->buffer + in->idx,
  14815. in->buffer + in->idx,
  14816. ssl->curSize, ssl->curRL.type, 1,
  14817. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  14818. }
  14819. #endif /* ATOMIC_USER */
  14820. }
  14821. else {
  14822. if (!ssl->options.tls1_3) {
  14823. #ifndef WOLFSSL_NO_TLS12
  14824. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14825. if (ssl->options.startedETMRead) {
  14826. word32 digestSz = MacSize(ssl);
  14827. ret = Decrypt(ssl,
  14828. in->buffer + in->idx,
  14829. in->buffer + in->idx,
  14830. ssl->curSize - (word16)digestSz);
  14831. if (ret == 0) {
  14832. byte invalid = 0;
  14833. byte padding = (byte)-1;
  14834. word32 i;
  14835. word32 off = in->idx + ssl->curSize - digestSz - 1;
  14836. /* Last of padding bytes - indicates length. */
  14837. ssl->keys.padSz = in->buffer[off];
  14838. /* Constant time checking of padding - don't leak
  14839. * the length of the data.
  14840. */
  14841. /* Compare max pad bytes or at most data + pad. */
  14842. for (i = 1; i < MAX_PAD_SIZE && off >= i; i++) {
  14843. /* Mask on indicates this is expected to be a
  14844. * padding byte.
  14845. */
  14846. padding &= ctMaskLTE(i, ssl->keys.padSz);
  14847. /* When this is a padding byte and not equal
  14848. * to length then mask is set.
  14849. */
  14850. invalid |= padding &
  14851. ctMaskNotEq(in->buffer[off - i],
  14852. ssl->keys.padSz);
  14853. }
  14854. /* If mask is set then there was an error. */
  14855. if (invalid) {
  14856. ret = DECRYPT_ERROR;
  14857. }
  14858. ssl->keys.padSz += 1;
  14859. ssl->keys.decryptedCur = 1;
  14860. }
  14861. }
  14862. else
  14863. #endif
  14864. {
  14865. ret = Decrypt(ssl,
  14866. in->buffer + in->idx,
  14867. in->buffer + in->idx,
  14868. ssl->curSize);
  14869. }
  14870. #else
  14871. ret = DECRYPT_ERROR;
  14872. #endif
  14873. }
  14874. else
  14875. {
  14876. #ifdef WOLFSSL_TLS13
  14877. ret = DecryptTls13(ssl,
  14878. in->buffer + in->idx,
  14879. in->buffer + in->idx,
  14880. ssl->curSize,
  14881. (byte*)&ssl->curRL, RECORD_HEADER_SZ);
  14882. #else
  14883. ret = DECRYPT_ERROR;
  14884. #endif /* WOLFSSL_TLS13 */
  14885. }
  14886. }
  14887. #ifdef WOLFSSL_ASYNC_CRYPT
  14888. if (ret == WC_PENDING_E)
  14889. return ret;
  14890. #endif
  14891. if (ret >= 0) {
  14892. #ifndef WOLFSSL_NO_TLS12
  14893. /* handle success */
  14894. #ifndef WOLFSSL_AEAD_ONLY
  14895. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  14896. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  14897. #endif
  14898. /* go past TLSv1.1 IV */
  14899. if (CipherHasExpIV(ssl))
  14900. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  14901. #endif
  14902. }
  14903. else {
  14904. WOLFSSL_MSG("Decrypt failed");
  14905. WOLFSSL_ERROR(ret);
  14906. #ifdef WOLFSSL_EARLY_DATA
  14907. if (ssl->options.tls1_3) {
  14908. if (ssl->options.side == WOLFSSL_SERVER_END &&
  14909. ssl->earlyData != no_early_data &&
  14910. ssl->options.clientState <
  14911. CLIENT_FINISHED_COMPLETE) {
  14912. ssl->earlyDataSz += ssl->curSize;
  14913. if (ssl->earlyDataSz <=
  14914. ssl->options.maxEarlyDataSz) {
  14915. WOLFSSL_MSG("Ignoring EarlyData!");
  14916. if (ssl->keys.peer_sequence_number_lo-- == 0)
  14917. ssl->keys.peer_sequence_number_hi--;
  14918. ssl->options.processReply = doProcessInit;
  14919. ssl->buffers.inputBuffer.idx =
  14920. ssl->buffers.inputBuffer.length;
  14921. return 0;
  14922. }
  14923. WOLFSSL_MSG("Too much EarlyData!");
  14924. }
  14925. SendAlert(ssl, alert_fatal, bad_record_mac);
  14926. }
  14927. #endif
  14928. #ifdef WOLFSSL_DTLS
  14929. /* If in DTLS mode, if the decrypt fails for any
  14930. * reason, pretend the datagram never happened. */
  14931. if (ssl->options.dtls) {
  14932. ssl->options.processReply = doProcessInit;
  14933. ssl->buffers.inputBuffer.idx =
  14934. ssl->buffers.inputBuffer.length;
  14935. #ifdef WOLFSSL_DTLS_DROP_STATS
  14936. ssl->macDropCount++;
  14937. #endif /* WOLFSSL_DTLS_DROP_STATS */
  14938. }
  14939. #endif /* WOLFSSL_DTLS */
  14940. return DECRYPT_ERROR;
  14941. }
  14942. }
  14943. ssl->options.processReply = verifyMessage;
  14944. FALL_THROUGH;
  14945. /* verify digest of message */
  14946. case verifyMessage:
  14947. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  14948. (!IsAtLeastTLSv1_3(ssl->version) ||
  14949. ssl->curRL.type != change_cipher_spec))
  14950. {
  14951. if (!atomicUser
  14952. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14953. && !ssl->options.startedETMRead
  14954. #endif
  14955. ) {
  14956. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  14957. ssl->buffers.inputBuffer.idx,
  14958. ssl->curSize, ssl->curRL.type,
  14959. &ssl->keys.padSz);
  14960. #ifdef WOLFSSL_ASYNC_CRYPT
  14961. if (ret == WC_PENDING_E)
  14962. return ret;
  14963. #endif
  14964. if (ret < 0) {
  14965. WOLFSSL_MSG("VerifyMac failed");
  14966. WOLFSSL_ERROR(ret);
  14967. #ifdef WOLFSSL_DTLS
  14968. /* If in DTLS mode, if the decrypt fails for any
  14969. * reason, pretend the datagram never happened. */
  14970. if (ssl->options.dtls) {
  14971. ssl->options.processReply = doProcessInit;
  14972. ssl->buffers.inputBuffer.idx =
  14973. ssl->buffers.inputBuffer.length;
  14974. #ifdef WOLFSSL_DTLS_DROP_STATS
  14975. ssl->macDropCount++;
  14976. #endif /* WOLFSSL_DTLS_DROP_STATS */
  14977. }
  14978. #endif /* WOLFSSL_DTLS */
  14979. #ifdef WOLFSSL_EXTRA_ALERTS
  14980. if (!ssl->options.dtls)
  14981. SendAlert(ssl, alert_fatal, bad_record_mac);
  14982. #endif
  14983. return DECRYPT_ERROR;
  14984. }
  14985. }
  14986. ssl->keys.encryptSz = ssl->curSize;
  14987. ssl->keys.decryptedCur = 1;
  14988. #ifdef WOLFSSL_TLS13
  14989. if (ssl->options.tls1_3) {
  14990. word16 i = (word16)(ssl->buffers.inputBuffer.length -
  14991. ssl->keys.padSz);
  14992. /* sanity check on underflow */
  14993. if (ssl->keys.padSz >= ssl->buffers.inputBuffer.length) {
  14994. WOLFSSL_ERROR(DECRYPT_ERROR);
  14995. return DECRYPT_ERROR;
  14996. }
  14997. /* Remove padding from end of plain text. */
  14998. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  14999. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  15000. break;
  15001. }
  15002. /* Get the real content type from the end of the data. */
  15003. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  15004. ssl->keys.padSz = ssl->buffers.inputBuffer.length - i;
  15005. }
  15006. #endif
  15007. }
  15008. ssl->options.processReply = runProcessingOneMessage;
  15009. FALL_THROUGH;
  15010. /* the record layer is here */
  15011. case runProcessingOneMessage:
  15012. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15013. if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
  15014. if ((ssl->buffers.inputBuffer.length -
  15015. ssl->keys.padSz -
  15016. MacSize(ssl) -
  15017. ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ)
  15018. #ifdef WOLFSSL_ASYNC_CRYPT
  15019. && ssl->buffers.inputBuffer.length !=
  15020. ssl->buffers.inputBuffer.idx
  15021. #endif
  15022. ) {
  15023. WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
  15024. #if defined(WOLFSSL_EXTRA_ALERTS)
  15025. SendAlert(ssl, alert_fatal, record_overflow);
  15026. #endif
  15027. return BUFFER_ERROR;
  15028. }
  15029. }
  15030. else
  15031. #endif
  15032. if (ssl->buffers.inputBuffer.length -
  15033. ssl->keys.padSz -
  15034. ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ
  15035. #ifdef WOLFSSL_ASYNC_CRYPT
  15036. && ssl->buffers.inputBuffer.length !=
  15037. ssl->buffers.inputBuffer.idx
  15038. #endif
  15039. ) {
  15040. WOLFSSL_MSG("Plaintext too long");
  15041. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  15042. SendAlert(ssl, alert_fatal, record_overflow);
  15043. #endif
  15044. return BUFFER_ERROR;
  15045. }
  15046. #ifdef WOLFSSL_DTLS
  15047. if (IsDtlsNotSctpMode(ssl)) {
  15048. DtlsUpdateWindow(ssl);
  15049. }
  15050. #endif /* WOLFSSL_DTLS */
  15051. WOLFSSL_MSG("received record layer msg");
  15052. switch (ssl->curRL.type) {
  15053. case handshake :
  15054. WOLFSSL_MSG("got HANDSHAKE");
  15055. /* debugging in DoHandShakeMsg */
  15056. if (ssl->options.dtls) {
  15057. #ifdef WOLFSSL_DTLS
  15058. ret = DoDtlsHandShakeMsg(ssl,
  15059. ssl->buffers.inputBuffer.buffer,
  15060. &ssl->buffers.inputBuffer.idx,
  15061. ssl->buffers.inputBuffer.length);
  15062. #endif
  15063. }
  15064. else if (!IsAtLeastTLSv1_3(ssl->version)
  15065. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  15066. || !TLSv1_3_Capable(ssl)
  15067. #endif
  15068. ) {
  15069. #ifndef WOLFSSL_NO_TLS12
  15070. ret = DoHandShakeMsg(ssl,
  15071. ssl->buffers.inputBuffer.buffer,
  15072. &ssl->buffers.inputBuffer.idx,
  15073. ssl->buffers.inputBuffer.length);
  15074. #else
  15075. ret = BUFFER_ERROR;
  15076. #endif
  15077. }
  15078. else {
  15079. #ifdef WOLFSSL_TLS13
  15080. ssl->msgsReceived.got_change_cipher = 0;
  15081. ret = DoTls13HandShakeMsg(ssl,
  15082. ssl->buffers.inputBuffer.buffer,
  15083. &ssl->buffers.inputBuffer.idx,
  15084. ssl->buffers.inputBuffer.length);
  15085. #ifdef WOLFSSL_EARLY_DATA
  15086. if (ret != 0)
  15087. return ret;
  15088. if (ssl->options.side == WOLFSSL_SERVER_END &&
  15089. ssl->earlyData > early_data_ext &&
  15090. ssl->options.handShakeState == HANDSHAKE_DONE) {
  15091. ssl->earlyData = no_early_data;
  15092. ssl->options.processReply = doProcessInit;
  15093. return ZERO_RETURN;
  15094. }
  15095. #endif
  15096. #else
  15097. ret = BUFFER_ERROR;
  15098. #endif
  15099. }
  15100. if (ret != 0
  15101. #ifdef WOLFSSL_ASYNC_CRYPT
  15102. /* In async case, on pending, move onto next message.
  15103. * Current message should have been DtlsMsgStore'ed and
  15104. * should be processed with DtlsMsgDrain */
  15105. && (!ssl->options.dtls
  15106. || ret != WC_PENDING_E)
  15107. #endif
  15108. ) {
  15109. WOLFSSL_ERROR(ret);
  15110. return ret;
  15111. }
  15112. break;
  15113. case change_cipher_spec:
  15114. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  15115. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15116. if (ssl->hsInfoOn)
  15117. AddPacketName(ssl, "ChangeCipher");
  15118. /* add record header back on info */
  15119. if (ssl->toInfoOn) {
  15120. AddPacketInfo(ssl, "ChangeCipher",
  15121. change_cipher_spec,
  15122. ssl->buffers.inputBuffer.buffer +
  15123. ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ -
  15124. (ssl->options.dtls ? DTLS_RECORD_EXTRA : 0),
  15125. 1 + RECORD_HEADER_SZ, READ_PROTO, ssl->heap);
  15126. #ifdef WOLFSSL_CALLBACKS
  15127. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  15128. #endif
  15129. }
  15130. #endif
  15131. #ifdef WOLFSSL_TLS13
  15132. if (IsAtLeastTLSv1_3(ssl->version)) {
  15133. word32 i = ssl->buffers.inputBuffer.idx;
  15134. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  15135. SendAlert(ssl, alert_fatal, unexpected_message);
  15136. return UNKNOWN_RECORD_TYPE;
  15137. }
  15138. if (ssl->curSize != 1 ||
  15139. ssl->buffers.inputBuffer.buffer[i] != 1) {
  15140. SendAlert(ssl, alert_fatal, illegal_parameter);
  15141. return UNKNOWN_RECORD_TYPE;
  15142. }
  15143. ssl->buffers.inputBuffer.idx++;
  15144. if (!ssl->msgsReceived.got_change_cipher) {
  15145. ssl->msgsReceived.got_change_cipher = 1;
  15146. }
  15147. else {
  15148. SendAlert(ssl, alert_fatal, illegal_parameter);
  15149. return UNKNOWN_RECORD_TYPE;
  15150. }
  15151. break;
  15152. }
  15153. #endif
  15154. #ifndef WOLFSSL_NO_TLS12
  15155. if (ssl->buffers.inputBuffer.idx >=
  15156. ssl->buffers.inputBuffer.length ||
  15157. ssl->curSize < 1) {
  15158. WOLFSSL_MSG("ChangeCipher msg too short");
  15159. return LENGTH_ERROR;
  15160. }
  15161. if (ssl->buffers.inputBuffer.buffer[
  15162. ssl->buffers.inputBuffer.idx] != 1) {
  15163. WOLFSSL_MSG("ChangeCipher msg wrong value");
  15164. return LENGTH_ERROR;
  15165. }
  15166. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  15167. #ifdef HAVE_AEAD
  15168. if (ssl->specs.cipher_type == aead) {
  15169. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  15170. ssl->curSize -= AESGCM_EXP_IV_SZ;
  15171. ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
  15172. ssl->curSize -= ssl->specs.aead_mac_size;
  15173. }
  15174. else
  15175. #endif
  15176. {
  15177. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  15178. ssl->curSize -= (word16)ssl->keys.padSz;
  15179. ssl->curSize -= ssl->specs.iv_size;
  15180. }
  15181. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15182. if (ssl->options.startedETMRead) {
  15183. word32 digestSz = MacSize(ssl);
  15184. ssl->buffers.inputBuffer.idx += digestSz;
  15185. ssl->curSize -= (word16)digestSz;
  15186. }
  15187. #endif
  15188. }
  15189. if (ssl->curSize != 1) {
  15190. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  15191. return LENGTH_ERROR;
  15192. }
  15193. ssl->buffers.inputBuffer.idx++;
  15194. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  15195. if (ret != 0) {
  15196. if (!ssl->options.dtls) {
  15197. return ret;
  15198. }
  15199. else {
  15200. #ifdef WOLFSSL_DTLS
  15201. /* Check for duplicate CCS message in DTLS mode.
  15202. * DTLS allows for duplicate messages, and it should be
  15203. * skipped. Also skip if out of order. */
  15204. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  15205. return ret;
  15206. /* Reset error */
  15207. ret = 0;
  15208. break;
  15209. #endif /* WOLFSSL_DTLS */
  15210. }
  15211. }
  15212. ssl->keys.encryptionOn = 1;
  15213. /* setup decrypt keys for following messages */
  15214. /* XXX This might not be what we want to do when
  15215. * receiving a CCS with multicast. We update the
  15216. * key when the application updates them. */
  15217. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  15218. return ret;
  15219. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15220. ssl->options.startedETMRead = ssl->options.encThenMac;
  15221. #endif
  15222. #ifdef WOLFSSL_DTLS
  15223. if (ssl->options.dtls) {
  15224. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  15225. #ifdef WOLFSSL_MULTICAST
  15226. if (ssl->options.haveMcast) {
  15227. peerSeq += ssl->keys.curPeerId;
  15228. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  15229. ssl->ctx->mcastFirstSeq,
  15230. ssl->ctx->mcastSecondSeq,
  15231. ssl->ctx->mcastMaxSeq);
  15232. }
  15233. #endif
  15234. peerSeq->nextEpoch++;
  15235. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  15236. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  15237. peerSeq->nextSeq_lo = 0;
  15238. peerSeq->nextSeq_hi = 0;
  15239. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  15240. DTLS_SEQ_SZ);
  15241. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  15242. }
  15243. #endif
  15244. #ifdef HAVE_LIBZ
  15245. if (ssl->options.usingCompression)
  15246. if ( (ret = InitStreams(ssl)) != 0)
  15247. return ret;
  15248. #endif
  15249. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  15250. ssl->options.side == WOLFSSL_CLIENT_END ?
  15251. server : client);
  15252. if (ret != 0)
  15253. return ret;
  15254. #endif /* !WOLFSSL_NO_TLS12 */
  15255. break;
  15256. case application_data:
  15257. WOLFSSL_MSG("got app DATA");
  15258. #ifdef WOLFSSL_DTLS
  15259. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  15260. #ifdef HAVE_SECURE_RENEGOTIATION
  15261. /*
  15262. * Only free HS resources when not in the process of a
  15263. * secure renegotiation and we have received APP DATA
  15264. * from the current epoch
  15265. */
  15266. if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
  15267. || !DtlsSCRKeysSet(ssl))) {
  15268. FreeHandshakeResources(ssl);
  15269. ssl->options.dtlsHsRetain = 0;
  15270. }
  15271. #else
  15272. FreeHandshakeResources(ssl);
  15273. ssl->options.dtlsHsRetain = 0;
  15274. #endif
  15275. }
  15276. #endif
  15277. #ifdef WOLFSSL_TLS13
  15278. if (ssl->keys.keyUpdateRespond) {
  15279. WOLFSSL_MSG("No KeyUpdate from peer seen");
  15280. return SANITY_MSG_E;
  15281. }
  15282. #endif
  15283. if ((ret = DoApplicationData(ssl,
  15284. ssl->buffers.inputBuffer.buffer,
  15285. &ssl->buffers.inputBuffer.idx,
  15286. NO_SNIFF)) != 0) {
  15287. WOLFSSL_ERROR(ret);
  15288. return ret;
  15289. }
  15290. break;
  15291. case alert:
  15292. WOLFSSL_MSG("got ALERT!");
  15293. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  15294. &ssl->buffers.inputBuffer.idx, &type);
  15295. if (ret == alert_fatal)
  15296. return FATAL_ERROR;
  15297. else if (ret < 0)
  15298. return ret;
  15299. /* catch warnings that are handled as errors */
  15300. if (type == close_notify)
  15301. return ssl->error = ZERO_RETURN;
  15302. if (type == decrypt_error)
  15303. return FATAL_ERROR;
  15304. /* Reset error if we got an alert level in ret */
  15305. if (ret > 0)
  15306. ret = 0;
  15307. break;
  15308. default:
  15309. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  15310. return UNKNOWN_RECORD_TYPE;
  15311. }
  15312. ssl->options.processReply = doProcessInit;
  15313. /* input exhausted */
  15314. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
  15315. #ifdef WOLFSSL_DTLS
  15316. /* If app data was processed then return now to avoid
  15317. * dropping any app data. */
  15318. || (ssl->options.dtls && ssl->curRL.type == application_data)
  15319. #endif
  15320. )
  15321. return ret;
  15322. /* more messages per record */
  15323. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  15324. WOLFSSL_MSG("More messages in record");
  15325. ssl->options.processReply = runProcessingOneMessage;
  15326. if (IsEncryptionOn(ssl, 0)) {
  15327. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  15328. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15329. if (ssl->options.startedETMRead) {
  15330. word32 digestSz = MacSize(ssl);
  15331. if (ssl->buffers.inputBuffer.idx >=
  15332. ssl->keys.padSz + digestSz) {
  15333. ssl->buffers.inputBuffer.idx -=
  15334. ssl->keys.padSz + digestSz;
  15335. }
  15336. else {
  15337. WOLFSSL_MSG("\tmiddle padding error");
  15338. return FATAL_ERROR;
  15339. }
  15340. }
  15341. else
  15342. #endif
  15343. {
  15344. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  15345. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  15346. }
  15347. else {
  15348. WOLFSSL_MSG("\tmiddle padding error");
  15349. return FATAL_ERROR;
  15350. }
  15351. }
  15352. }
  15353. }
  15354. /* more records */
  15355. else {
  15356. WOLFSSL_MSG("More records in input");
  15357. }
  15358. #ifdef WOLFSSL_ASYNC_CRYPT
  15359. /* We are setup to read next message/record but we had an error
  15360. * (probably WC_PENDING_E) so return that so it can be handled
  15361. * by higher layers. */
  15362. if (ret != 0)
  15363. return ret;
  15364. #endif
  15365. continue;
  15366. default:
  15367. WOLFSSL_MSG("Bad process input state, programming error");
  15368. return INPUT_CASE_ERROR;
  15369. }
  15370. }
  15371. }
  15372. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  15373. (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
  15374. int SendChangeCipher(WOLFSSL* ssl)
  15375. {
  15376. byte *output;
  15377. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  15378. int idx = RECORD_HEADER_SZ;
  15379. int ret;
  15380. #ifdef OPENSSL_EXTRA
  15381. ssl->cbmode = SSL_CB_MODE_WRITE;
  15382. if (ssl->options.side == WOLFSSL_SERVER_END){
  15383. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  15384. if (ssl->CBIS != NULL)
  15385. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  15386. }
  15387. else{
  15388. ssl->options.clientState =
  15389. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  15390. if (ssl->CBIS != NULL)
  15391. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  15392. }
  15393. #endif
  15394. #ifdef WOLFSSL_DTLS
  15395. if (ssl->options.dtls) {
  15396. sendSz += DTLS_RECORD_EXTRA;
  15397. idx += DTLS_RECORD_EXTRA;
  15398. }
  15399. #endif
  15400. /* are we in scr */
  15401. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  15402. sendSz += MAX_MSG_EXTRA;
  15403. }
  15404. /* check for available size */
  15405. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  15406. return ret;
  15407. /* get output buffer */
  15408. output = ssl->buffers.outputBuffer.buffer +
  15409. ssl->buffers.outputBuffer.length;
  15410. AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
  15411. output[idx] = 1; /* turn it on */
  15412. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  15413. byte input[ENUM_LEN];
  15414. int inputSz = ENUM_LEN;
  15415. input[0] = 1; /* turn it on */
  15416. #ifdef WOLFSSL_DTLS
  15417. if (IsDtlsNotSctpMode(ssl) &&
  15418. (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
  15419. return ret;
  15420. }
  15421. #endif
  15422. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15423. change_cipher_spec, 0, 0, 0, CUR_ORDER);
  15424. if (sendSz < 0) {
  15425. return sendSz;
  15426. }
  15427. }
  15428. #ifdef WOLFSSL_DTLS
  15429. else {
  15430. if (IsDtlsNotSctpMode(ssl)) {
  15431. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
  15432. return ret;
  15433. DtlsSEQIncrement(ssl, CUR_ORDER);
  15434. }
  15435. }
  15436. #endif
  15437. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15438. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  15439. if (ssl->toInfoOn)
  15440. AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  15441. sendSz, WRITE_PROTO, ssl->heap);
  15442. #endif
  15443. ssl->buffers.outputBuffer.length += sendSz;
  15444. #ifdef WOLFSSL_TLS13
  15445. if (!ssl->options.tls1_3)
  15446. #endif
  15447. {
  15448. /* setup encrypt keys */
  15449. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  15450. return ret;
  15451. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15452. ssl->options.startedETMWrite = ssl->options.encThenMac;
  15453. #endif
  15454. }
  15455. if (ssl->options.groupMessages)
  15456. return 0;
  15457. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  15458. else if (ssl->options.dtls) {
  15459. /* If using DTLS, force the ChangeCipherSpec message to be in the
  15460. * same datagram as the finished message. */
  15461. return 0;
  15462. }
  15463. #endif
  15464. else
  15465. return SendBuffered(ssl);
  15466. }
  15467. #endif
  15468. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  15469. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  15470. int padLen, int content, int verify, int epochOrder)
  15471. {
  15472. byte result[WC_MAX_DIGEST_SIZE];
  15473. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  15474. word32 padSz = ssl->specs.pad_size;
  15475. int ret = 0;
  15476. wc_Md5 md5;
  15477. wc_Sha sha;
  15478. /* data */
  15479. byte seq[SEQ_SZ];
  15480. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  15481. const byte* macSecret = NULL;
  15482. (void)padLen;
  15483. #ifdef HAVE_FUZZER
  15484. if (ssl->fuzzerCb)
  15485. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  15486. #endif
  15487. #ifdef WOLFSSL_DTLS
  15488. if (ssl->options.dtls)
  15489. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  15490. else
  15491. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  15492. #else
  15493. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  15494. #endif
  15495. XMEMSET(seq, 0, SEQ_SZ);
  15496. conLen[0] = (byte)content;
  15497. c16toa((word16)sz, &conLen[ENUM_LEN]);
  15498. WriteSEQ(ssl, epochOrder, seq);
  15499. if (ssl->specs.mac_algorithm == md5_mac) {
  15500. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  15501. if (ret != 0)
  15502. return ret;
  15503. /* inner */
  15504. ret = wc_Md5Update(&md5, macSecret, digestSz);
  15505. ret |= wc_Md5Update(&md5, PAD1, padSz);
  15506. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  15507. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  15508. /* in buffer */
  15509. ret |= wc_Md5Update(&md5, in, sz);
  15510. if (ret != 0)
  15511. return VERIFY_MAC_ERROR;
  15512. ret = wc_Md5Final(&md5, result);
  15513. #ifdef WOLFSSL_ASYNC_CRYPT
  15514. /* TODO: Make non-blocking */
  15515. if (ret == WC_PENDING_E) {
  15516. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  15517. }
  15518. #endif
  15519. if (ret != 0)
  15520. return VERIFY_MAC_ERROR;
  15521. /* outer */
  15522. ret = wc_Md5Update(&md5, macSecret, digestSz);
  15523. ret |= wc_Md5Update(&md5, PAD2, padSz);
  15524. ret |= wc_Md5Update(&md5, result, digestSz);
  15525. if (ret != 0)
  15526. return VERIFY_MAC_ERROR;
  15527. ret = wc_Md5Final(&md5, digest);
  15528. #ifdef WOLFSSL_ASYNC_CRYPT
  15529. /* TODO: Make non-blocking */
  15530. if (ret == WC_PENDING_E) {
  15531. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  15532. }
  15533. #endif
  15534. if (ret != 0)
  15535. return VERIFY_MAC_ERROR;
  15536. wc_Md5Free(&md5);
  15537. }
  15538. else {
  15539. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  15540. if (ret != 0)
  15541. return ret;
  15542. /* inner */
  15543. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  15544. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  15545. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  15546. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  15547. /* in buffer */
  15548. ret |= wc_ShaUpdate(&sha, in, sz);
  15549. if (ret != 0)
  15550. return VERIFY_MAC_ERROR;
  15551. ret = wc_ShaFinal(&sha, result);
  15552. #ifdef WOLFSSL_ASYNC_CRYPT
  15553. /* TODO: Make non-blocking */
  15554. if (ret == WC_PENDING_E) {
  15555. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  15556. }
  15557. #endif
  15558. if (ret != 0)
  15559. return VERIFY_MAC_ERROR;
  15560. /* outer */
  15561. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  15562. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  15563. ret |= wc_ShaUpdate(&sha, result, digestSz);
  15564. if (ret != 0)
  15565. return VERIFY_MAC_ERROR;
  15566. ret = wc_ShaFinal(&sha, digest);
  15567. #ifdef WOLFSSL_ASYNC_CRYPT
  15568. /* TODO: Make non-blocking */
  15569. if (ret == WC_PENDING_E) {
  15570. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  15571. }
  15572. #endif
  15573. if (ret != 0)
  15574. return VERIFY_MAC_ERROR;
  15575. wc_ShaFree(&sha);
  15576. }
  15577. return 0;
  15578. }
  15579. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  15580. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  15581. static int BuildMD5_CertVerify(WOLFSSL* ssl, byte* digest)
  15582. {
  15583. int ret;
  15584. byte md5_result[WC_MD5_DIGEST_SIZE];
  15585. #ifdef WOLFSSL_SMALL_STACK
  15586. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  15587. #else
  15588. wc_Md5 md5[1];
  15589. #endif
  15590. /* make md5 inner */
  15591. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  15592. if (ret == 0)
  15593. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  15594. if (ret == 0)
  15595. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  15596. if (ret == 0)
  15597. ret = wc_Md5Final(md5, md5_result);
  15598. /* make md5 outer */
  15599. if (ret == 0) {
  15600. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  15601. if (ret == 0) {
  15602. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  15603. if (ret == 0)
  15604. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  15605. if (ret == 0)
  15606. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  15607. if (ret == 0)
  15608. ret = wc_Md5Final(md5, digest);
  15609. wc_Md5Free(md5);
  15610. }
  15611. }
  15612. #ifdef WOLFSSL_SMALL_STACK
  15613. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  15614. #endif
  15615. return ret;
  15616. }
  15617. #endif /* !NO_MD5 && !NO_OLD_TLS */
  15618. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  15619. defined(WOLFSSL_ALLOW_TLS_SHA1))
  15620. static int BuildSHA_CertVerify(WOLFSSL* ssl, byte* digest)
  15621. {
  15622. int ret;
  15623. byte sha_result[WC_SHA_DIGEST_SIZE];
  15624. #ifdef WOLFSSL_SMALL_STACK
  15625. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  15626. #else
  15627. wc_Sha sha[1];
  15628. #endif
  15629. /* make sha inner */
  15630. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  15631. if (ret == 0)
  15632. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  15633. if (ret == 0)
  15634. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  15635. if (ret == 0)
  15636. ret = wc_ShaFinal(sha, sha_result);
  15637. /* make sha outer */
  15638. if (ret == 0) {
  15639. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  15640. if (ret == 0) {
  15641. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  15642. if (ret == 0)
  15643. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  15644. if (ret == 0)
  15645. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  15646. if (ret == 0)
  15647. ret = wc_ShaFinal(sha, digest);
  15648. wc_ShaFree(sha);
  15649. }
  15650. }
  15651. #ifdef WOLFSSL_SMALL_STACK
  15652. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  15653. #endif
  15654. return ret;
  15655. }
  15656. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  15657. int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes)
  15658. {
  15659. int ret = 0;
  15660. (void)hashes;
  15661. if (ssl->options.tls) {
  15662. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  15663. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  15664. if (ret != 0)
  15665. return ret;
  15666. #endif
  15667. #if !defined(NO_SHA)
  15668. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  15669. if (ret != 0)
  15670. return ret;
  15671. #endif
  15672. if (IsAtLeastTLSv1_2(ssl)) {
  15673. #ifndef NO_SHA256
  15674. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  15675. hashes->sha256);
  15676. if (ret != 0)
  15677. return ret;
  15678. #endif
  15679. #ifdef WOLFSSL_SHA384
  15680. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  15681. hashes->sha384);
  15682. if (ret != 0)
  15683. return ret;
  15684. #endif
  15685. #ifdef WOLFSSL_SHA512
  15686. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  15687. hashes->sha512);
  15688. if (ret != 0)
  15689. return ret;
  15690. #endif
  15691. }
  15692. }
  15693. else {
  15694. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  15695. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  15696. if (ret != 0)
  15697. return ret;
  15698. #endif
  15699. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  15700. defined(WOLFSSL_ALLOW_TLS_SHA1))
  15701. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  15702. if (ret != 0)
  15703. return ret;
  15704. #endif
  15705. }
  15706. return ret;
  15707. }
  15708. #ifndef WOLFSSL_NO_TLS12
  15709. void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
  15710. {
  15711. if (args) {
  15712. if (ssl && args->iv)
  15713. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  15714. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  15715. }
  15716. }
  15717. #endif
  15718. /* Build SSL Message, encrypted */
  15719. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  15720. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
  15721. int epochOrder)
  15722. {
  15723. #ifndef WOLFSSL_NO_TLS12
  15724. int ret;
  15725. BuildMsgArgs* args;
  15726. BuildMsgArgs lcl_args;
  15727. #ifdef WOLFSSL_ASYNC_CRYPT
  15728. args = &ssl->async.buildArgs;
  15729. #endif
  15730. #endif
  15731. WOLFSSL_ENTER("BuildMessage");
  15732. if (ssl == NULL) {
  15733. return BAD_FUNC_ARG;
  15734. }
  15735. (void)epochOrder;
  15736. #ifdef WOLFSSL_NO_TLS12
  15737. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  15738. hashOutput, sizeOnly, asyncOkay);
  15739. #else
  15740. #ifdef WOLFSSL_TLS13
  15741. if (ssl->options.tls1_3) {
  15742. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  15743. hashOutput, sizeOnly, asyncOkay);
  15744. }
  15745. #endif
  15746. #ifdef WOLFSSL_ASYNC_CRYPT
  15747. ret = WC_NOT_PENDING_E;
  15748. if (asyncOkay) {
  15749. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  15750. if (ret != WC_NOT_PENDING_E) {
  15751. /* Check for error */
  15752. if (ret < 0)
  15753. goto exit_buildmsg;
  15754. }
  15755. }
  15756. else
  15757. #endif
  15758. {
  15759. args = &lcl_args;
  15760. }
  15761. /* Reset state */
  15762. #ifdef WOLFSSL_ASYNC_CRYPT
  15763. if (ret == WC_NOT_PENDING_E)
  15764. #endif
  15765. {
  15766. ret = 0;
  15767. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  15768. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  15769. args->sz = RECORD_HEADER_SZ + inSz;
  15770. args->idx = RECORD_HEADER_SZ;
  15771. args->headerSz = RECORD_HEADER_SZ;
  15772. }
  15773. switch (ssl->options.buildMsgState) {
  15774. case BUILD_MSG_BEGIN:
  15775. {
  15776. /* catch mistaken sizeOnly parameter */
  15777. if (!sizeOnly && (output == NULL || input == NULL) ) {
  15778. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  15779. }
  15780. if (sizeOnly && (output || input) ) {
  15781. WOLFSSL_MSG("BuildMessage w/sizeOnly doesn't need input/output");
  15782. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  15783. }
  15784. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15785. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  15786. /* For epochs >1 the current cipher parameters are located in
  15787. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  15788. * parameters and for epoch 1 use ssl->keys */
  15789. switch (epochOrder) {
  15790. case PREV_ORDER:
  15791. if (ssl->encrypt.src != KEYS) {
  15792. ssl->secure_renegotiation->cache_status =
  15793. SCR_CACHE_NULL;
  15794. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  15795. ERROR_OUT(ret, exit_buildmsg);
  15796. }
  15797. break;
  15798. case CUR_ORDER:
  15799. if (ssl->keys.dtls_epoch ==
  15800. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  15801. if (ssl->encrypt.src != SCR) {
  15802. ssl->secure_renegotiation->cache_status =
  15803. SCR_CACHE_NEEDED;
  15804. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  15805. != 0)
  15806. ERROR_OUT(ret, exit_buildmsg);
  15807. }
  15808. }
  15809. else {
  15810. if (ssl->encrypt.src != KEYS) {
  15811. ssl->secure_renegotiation->cache_status =
  15812. SCR_CACHE_NULL;
  15813. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  15814. != 0)
  15815. ERROR_OUT(ret, exit_buildmsg);
  15816. }
  15817. }
  15818. break;
  15819. default:
  15820. WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
  15821. "CUR_ORDER");
  15822. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  15823. }
  15824. }
  15825. #endif
  15826. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  15827. }
  15828. FALL_THROUGH;
  15829. case BUILD_MSG_SIZE:
  15830. {
  15831. args->digestSz = ssl->specs.hash_size;
  15832. #ifdef HAVE_TRUNCATED_HMAC
  15833. if (ssl->truncated_hmac)
  15834. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  15835. #endif
  15836. args->sz += args->digestSz;
  15837. #ifdef WOLFSSL_DTLS
  15838. if (ssl->options.dtls) {
  15839. args->sz += DTLS_RECORD_EXTRA;
  15840. args->idx += DTLS_RECORD_EXTRA;
  15841. args->headerSz += DTLS_RECORD_EXTRA;
  15842. }
  15843. #endif
  15844. #ifndef WOLFSSL_AEAD_ONLY
  15845. if (ssl->specs.cipher_type == block) {
  15846. word32 blockSz = ssl->specs.block_size;
  15847. if (blockSz == 0) {
  15848. WOLFSSL_MSG("Invalid block size with block cipher type");
  15849. ERROR_OUT(BAD_STATE_E, exit_buildmsg);
  15850. }
  15851. if (ssl->options.tls1_1) {
  15852. args->ivSz = blockSz;
  15853. args->sz += args->ivSz;
  15854. if (args->ivSz > MAX_IV_SZ)
  15855. ERROR_OUT(BUFFER_E, exit_buildmsg);
  15856. }
  15857. args->sz += 1; /* pad byte */
  15858. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15859. if (ssl->options.startedETMWrite) {
  15860. args->pad = (args->sz - args->headerSz -
  15861. args->digestSz) % blockSz;
  15862. }
  15863. else
  15864. #endif
  15865. args->pad = (args->sz - args->headerSz) % blockSz;
  15866. #ifdef OPENSSL_EXTRA
  15867. if(args->pad != 0)
  15868. #endif
  15869. args->pad = blockSz - args->pad;
  15870. args->sz += args->pad;
  15871. }
  15872. #endif /* WOLFSSL_AEAD_ONLY */
  15873. #ifdef HAVE_AEAD
  15874. if (ssl->specs.cipher_type == aead) {
  15875. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  15876. args->ivSz = AESGCM_EXP_IV_SZ;
  15877. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  15878. }
  15879. #endif
  15880. /* done with size calculations */
  15881. if (sizeOnly)
  15882. goto exit_buildmsg;
  15883. if (args->sz > (word32)outSz) {
  15884. WOLFSSL_MSG("Oops, want to write past output buffer size");
  15885. ERROR_OUT(BUFFER_E, exit_buildmsg);
  15886. }
  15887. if (args->ivSz > 0) {
  15888. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap, DYNAMIC_TYPE_SALT);
  15889. if (args->iv == NULL)
  15890. ERROR_OUT(MEMORY_E, exit_buildmsg);
  15891. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  15892. if (ret != 0)
  15893. goto exit_buildmsg;
  15894. XMEMSET(args->iv, 0, args->ivSz);
  15895. }
  15896. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15897. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  15898. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  15899. defined(HAVE_AEAD))
  15900. if (ssl->specs.cipher_type == aead) {
  15901. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  15902. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  15903. }
  15904. #endif
  15905. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  15906. AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
  15907. /* write to output */
  15908. if (args->ivSz > 0) {
  15909. XMEMCPY(output + args->idx, args->iv,
  15910. min(args->ivSz, MAX_IV_SZ));
  15911. args->idx += args->ivSz;
  15912. }
  15913. XMEMCPY(output + args->idx, input, inSz);
  15914. args->idx += inSz;
  15915. ssl->options.buildMsgState = BUILD_MSG_HASH;
  15916. }
  15917. FALL_THROUGH;
  15918. case BUILD_MSG_HASH:
  15919. {
  15920. if (type == handshake && hashOutput) {
  15921. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  15922. if (ret != 0)
  15923. goto exit_buildmsg;
  15924. }
  15925. #ifndef WOLFSSL_AEAD_ONLY
  15926. if (ssl->specs.cipher_type == block) {
  15927. word32 tmpIdx;
  15928. word32 i;
  15929. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15930. if (ssl->options.startedETMWrite)
  15931. tmpIdx = args->idx;
  15932. else
  15933. #endif
  15934. tmpIdx = args->idx + args->digestSz;
  15935. for (i = 0; i <= args->pad; i++)
  15936. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  15937. }
  15938. #endif
  15939. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  15940. }
  15941. FALL_THROUGH;
  15942. case BUILD_MSG_VERIFY_MAC:
  15943. {
  15944. /* User Record Layer Callback handling */
  15945. #ifdef ATOMIC_USER
  15946. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15947. if (ssl->options.startedETMWrite) {
  15948. if (ssl->ctx->EncryptMacCb) {
  15949. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  15950. args->pad + 1, type, 0,
  15951. output + args->headerSz,
  15952. output + args->headerSz,
  15953. args->size - args->digestSz,
  15954. ssl->MacEncryptCtx);
  15955. goto exit_buildmsg;
  15956. }
  15957. }
  15958. else
  15959. #endif
  15960. {
  15961. if (ssl->ctx->MacEncryptCb) {
  15962. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  15963. output + args->headerSz + args->ivSz, inSz,
  15964. type, 0, output + args->headerSz,
  15965. output + args->headerSz, args->size,
  15966. ssl->MacEncryptCtx);
  15967. goto exit_buildmsg;
  15968. }
  15969. }
  15970. #endif
  15971. #ifndef WOLFSSL_AEAD_ONLY
  15972. if (ssl->specs.cipher_type != aead
  15973. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15974. && !ssl->options.startedETMWrite
  15975. #endif
  15976. ) {
  15977. #ifdef HAVE_TRUNCATED_HMAC
  15978. if (ssl->truncated_hmac &&
  15979. ssl->specs.hash_size > args->digestSz) {
  15980. #ifdef WOLFSSL_SMALL_STACK
  15981. byte* hmac;
  15982. #else
  15983. byte hmac[WC_MAX_DIGEST_SIZE];
  15984. #endif
  15985. #ifdef WOLFSSL_SMALL_STACK
  15986. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  15987. DYNAMIC_TYPE_DIGEST);
  15988. if (hmac == NULL)
  15989. ERROR_OUT(MEMORY_E, exit_buildmsg);
  15990. #endif
  15991. ret = ssl->hmac(ssl, hmac,
  15992. output + args->headerSz + args->ivSz, inSz,
  15993. -1, type, 0, epochOrder);
  15994. XMEMCPY(output + args->idx, hmac, args->digestSz);
  15995. #ifdef WOLFSSL_SMALL_STACK
  15996. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  15997. #endif
  15998. }
  15999. else
  16000. #endif
  16001. {
  16002. ret = ssl->hmac(ssl, output + args->idx, output +
  16003. args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
  16004. }
  16005. }
  16006. #endif /* WOLFSSL_AEAD_ONLY */
  16007. if (ret != 0)
  16008. goto exit_buildmsg;
  16009. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  16010. }
  16011. FALL_THROUGH;
  16012. case BUILD_MSG_ENCRYPT:
  16013. {
  16014. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  16015. /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
  16016. * for all encryption algos that use it for encryption parameters */
  16017. word16 dtls_epoch = 0;
  16018. word16 dtls_sequence_number_hi = 0;
  16019. word32 dtls_sequence_number_lo = 0;
  16020. int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
  16021. DtlsUseSCRKeys(ssl);
  16022. if (swap_seq) {
  16023. dtls_epoch = ssl->keys.dtls_epoch;
  16024. dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
  16025. dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
  16026. ssl->keys.dtls_epoch--;
  16027. ssl->keys.dtls_sequence_number_hi =
  16028. ssl->keys.dtls_prev_sequence_number_hi;
  16029. ssl->keys.dtls_sequence_number_lo =
  16030. ssl->keys.dtls_prev_sequence_number_lo;
  16031. }
  16032. #endif
  16033. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16034. if (ssl->options.startedETMWrite) {
  16035. ret = Encrypt(ssl, output + args->headerSz,
  16036. output + args->headerSz,
  16037. (word16)(args->size - args->digestSz),
  16038. asyncOkay);
  16039. }
  16040. else
  16041. #endif
  16042. {
  16043. ret = Encrypt(ssl, output + args->headerSz,
  16044. output + args->headerSz, args->size, asyncOkay);
  16045. }
  16046. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  16047. /* Restore sequence numbers */
  16048. if (swap_seq) {
  16049. ssl->keys.dtls_epoch = dtls_epoch;
  16050. ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
  16051. ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
  16052. }
  16053. #endif
  16054. if (ret != 0)
  16055. goto exit_buildmsg;
  16056. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  16057. }
  16058. FALL_THROUGH;
  16059. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  16060. {
  16061. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16062. if (ssl->options.startedETMWrite) {
  16063. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  16064. #ifdef HAVE_TRUNCATED_HMAC
  16065. if (ssl->truncated_hmac &&
  16066. ssl->specs.hash_size > args->digestSz) {
  16067. #ifdef WOLFSSL_SMALL_STACK
  16068. byte* hmac = NULL;
  16069. #else
  16070. byte hmac[WC_MAX_DIGEST_SIZE];
  16071. #endif
  16072. #ifdef WOLFSSL_SMALL_STACK
  16073. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  16074. DYNAMIC_TYPE_DIGEST);
  16075. if (hmac == NULL)
  16076. ERROR_OUT(MEMORY_E, exit_buildmsg);
  16077. #endif
  16078. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  16079. args->ivSz + inSz + args->pad + 1, -1, type,
  16080. 0, epochOrder);
  16081. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  16082. args->digestSz);
  16083. #ifdef WOLFSSL_SMALL_STACK
  16084. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  16085. #endif
  16086. }
  16087. else
  16088. #endif
  16089. {
  16090. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  16091. output + args->headerSz,
  16092. args->ivSz + inSz + args->pad + 1, -1, type,
  16093. 0, epochOrder);
  16094. }
  16095. }
  16096. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  16097. }
  16098. FALL_THROUGH;
  16099. default:
  16100. break;
  16101. }
  16102. exit_buildmsg:
  16103. WOLFSSL_LEAVE("BuildMessage", ret);
  16104. #ifdef WOLFSSL_ASYNC_CRYPT
  16105. if (ret == WC_PENDING_E) {
  16106. return ret;
  16107. }
  16108. #endif
  16109. /* make sure build message state is reset */
  16110. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  16111. #ifdef WOLFSSL_DTLS
  16112. if (ret == 0 && ssl->options.dtls && !sizeOnly)
  16113. DtlsSEQIncrement(ssl, epochOrder);
  16114. #endif
  16115. /* return sz on success */
  16116. if (ret == 0)
  16117. ret = args->sz;
  16118. /* Final cleanup */
  16119. FreeBuildMsgArgs(ssl, args);
  16120. return ret;
  16121. #endif /* !WOLFSSL_NO_TLS12 */
  16122. }
  16123. #ifndef WOLFSSL_NO_TLS12
  16124. int SendFinished(WOLFSSL* ssl)
  16125. {
  16126. int sendSz,
  16127. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  16128. FINISHED_SZ;
  16129. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  16130. byte *output;
  16131. Hashes* hashes;
  16132. int ret;
  16133. int headerSz = HANDSHAKE_HEADER_SZ;
  16134. int outputSz;
  16135. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  16136. WOLFSSL_ENTER("SendFinished");
  16137. /* check for available size */
  16138. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  16139. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  16140. return ret;
  16141. #ifdef WOLFSSL_DTLS
  16142. if (ssl->options.dtls) {
  16143. headerSz += DTLS_HANDSHAKE_EXTRA;
  16144. ssl->keys.dtls_epoch++;
  16145. ssl->keys.dtls_prev_sequence_number_hi =
  16146. ssl->keys.dtls_sequence_number_hi;
  16147. ssl->keys.dtls_prev_sequence_number_lo =
  16148. ssl->keys.dtls_sequence_number_lo;
  16149. ssl->keys.dtls_sequence_number_hi = 0;
  16150. ssl->keys.dtls_sequence_number_lo = 0;
  16151. }
  16152. #endif
  16153. /* get output buffer */
  16154. output = ssl->buffers.outputBuffer.buffer +
  16155. ssl->buffers.outputBuffer.length;
  16156. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  16157. /* make finished hashes */
  16158. hashes = (Hashes*)&input[headerSz];
  16159. ret = BuildFinished(ssl, hashes,
  16160. ssl->options.side == WOLFSSL_CLIENT_END ? client : server);
  16161. if (ret != 0) return ret;
  16162. #ifdef HAVE_SECURE_RENEGOTIATION
  16163. if (ssl->secure_renegotiation) {
  16164. if (ssl->options.side == WOLFSSL_CLIENT_END)
  16165. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  16166. TLS_FINISHED_SZ);
  16167. else
  16168. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  16169. TLS_FINISHED_SZ);
  16170. }
  16171. #endif
  16172. #if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS)
  16173. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  16174. XMEMCPY(ssl->clientFinished,
  16175. hashes, TLS_FINISHED_SZ);
  16176. ssl->clientFinished_len = TLS_FINISHED_SZ;
  16177. }
  16178. else {
  16179. XMEMCPY(ssl->serverFinished,
  16180. hashes, TLS_FINISHED_SZ);
  16181. ssl->serverFinished_len = TLS_FINISHED_SZ;
  16182. }
  16183. #endif
  16184. #ifdef WOLFSSL_DTLS
  16185. if (IsDtlsNotSctpMode(ssl)) {
  16186. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz, finished)) != 0)
  16187. return ret;
  16188. }
  16189. #endif
  16190. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  16191. handshake, 1, 0, 0, CUR_ORDER);
  16192. if (sendSz < 0)
  16193. return BUILD_MSG_ERROR;
  16194. if (!ssl->options.resuming) {
  16195. #ifndef NO_SESSION_CACHE
  16196. AddSession(ssl); /* just try */
  16197. #endif
  16198. if (ssl->options.side == WOLFSSL_SERVER_END) {
  16199. #ifdef OPENSSL_EXTRA
  16200. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  16201. ssl->cbmode = SSL_CB_MODE_WRITE;
  16202. if (ssl->CBIS != NULL)
  16203. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  16204. #endif
  16205. ssl->options.handShakeState = HANDSHAKE_DONE;
  16206. ssl->options.handShakeDone = 1;
  16207. }
  16208. }
  16209. else {
  16210. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  16211. #ifdef OPENSSL_EXTRA
  16212. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  16213. ssl->cbmode = SSL_CB_MODE_WRITE;
  16214. if (ssl->CBIS != NULL)
  16215. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  16216. #endif
  16217. ssl->options.handShakeState = HANDSHAKE_DONE;
  16218. ssl->options.handShakeDone = 1;
  16219. }
  16220. }
  16221. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16222. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  16223. if (ssl->toInfoOn)
  16224. AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  16225. WRITE_PROTO, ssl->heap);
  16226. #endif
  16227. ssl->buffers.outputBuffer.length += sendSz;
  16228. ret = SendBuffered(ssl);
  16229. #ifdef WOLFSSL_DTLS
  16230. if ((!ssl->options.resuming &&
  16231. ssl->options.side == WOLFSSL_SERVER_END) ||
  16232. (ssl->options.resuming &&
  16233. ssl->options.side == WOLFSSL_CLIENT_END)) {
  16234. ssl->keys.dtls_handshake_number = 0;
  16235. ssl->keys.dtls_expected_peer_handshake_number = 0;
  16236. }
  16237. #endif
  16238. WOLFSSL_LEAVE("SendFinished", ret);
  16239. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  16240. return ret;
  16241. }
  16242. #endif /* WOLFSSL_NO_TLS12 */
  16243. #ifndef NO_WOLFSSL_SERVER
  16244. #if (!defined(WOLFSSL_NO_TLS12) && \
  16245. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  16246. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  16247. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  16248. /* Parses and decodes the certificate then initializes "request". In the case
  16249. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  16250. *
  16251. * Returns 0 on success
  16252. */
  16253. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  16254. DecodedCert* cert, byte* certData, word32 length)
  16255. {
  16256. int ret;
  16257. if (request != NULL)
  16258. XMEMSET(request, 0, sizeof(OcspRequest));
  16259. InitDecodedCert(cert, certData, length, ssl->heap);
  16260. /* TODO: Setup async support here */
  16261. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl));
  16262. if (ret != 0) {
  16263. WOLFSSL_MSG("ParseCert failed");
  16264. }
  16265. if (ret == 0)
  16266. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  16267. if (ret == 0) {
  16268. /* make sure ctx OCSP request is updated */
  16269. if (!ssl->buffers.weOwnCert) {
  16270. wolfSSL_Mutex* ocspLock = &SSL_CM(ssl)->ocsp_stapling->ocspLock;
  16271. if (wc_LockMutex(ocspLock) == 0) {
  16272. if (ssl->ctx->certOcspRequest == NULL)
  16273. ssl->ctx->certOcspRequest = request;
  16274. wc_UnLockMutex(ocspLock);
  16275. }
  16276. }
  16277. }
  16278. FreeDecodedCert(cert);
  16279. return ret;
  16280. }
  16281. /* Creates OCSP response and places it in variable "response". Memory
  16282. * management for "buffer* response" is up to the caller.
  16283. *
  16284. * Also creates an OcspRequest in the case that ocspRequest is null or that
  16285. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  16286. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  16287. * be set to point to "ocspRequest" and it then should not be free'd since
  16288. * wolfSSL_CTX_free will take care of it.
  16289. *
  16290. * Returns 0 on success
  16291. */
  16292. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  16293. buffer* response)
  16294. {
  16295. int ret = 0;
  16296. OcspRequest* request = NULL;
  16297. byte createdRequest = 0;
  16298. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  16299. return BAD_FUNC_ARG;
  16300. XMEMSET(response, 0, sizeof(*response));
  16301. request = *ocspRequest;
  16302. /* unable to fetch status. skip. */
  16303. if (SSL_CM(ssl) == NULL || SSL_CM(ssl)->ocspStaplingEnabled == 0)
  16304. return 0;
  16305. if (request == NULL || ssl->buffers.weOwnCert) {
  16306. DerBuffer* der = ssl->buffers.certificate;
  16307. #ifdef WOLFSSL_SMALL_STACK
  16308. DecodedCert* cert = NULL;
  16309. #else
  16310. DecodedCert cert[1];
  16311. #endif
  16312. /* unable to fetch status. skip. */
  16313. if (der->buffer == NULL || der->length == 0)
  16314. return 0;
  16315. #ifdef WOLFSSL_SMALL_STACK
  16316. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  16317. DYNAMIC_TYPE_DCERT);
  16318. if (cert == NULL)
  16319. return MEMORY_E;
  16320. #endif
  16321. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  16322. DYNAMIC_TYPE_OCSP_REQUEST);
  16323. if (request == NULL)
  16324. ret = MEMORY_E;
  16325. createdRequest = 1;
  16326. if (ret == 0) {
  16327. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  16328. der->length);
  16329. }
  16330. if (ret != 0) {
  16331. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16332. request = NULL;
  16333. }
  16334. #ifdef WOLFSSL_SMALL_STACK
  16335. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  16336. #endif
  16337. }
  16338. if (ret == 0) {
  16339. request->ssl = ssl;
  16340. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, request, response);
  16341. /* Suppressing, not critical */
  16342. if (ret == OCSP_CERT_REVOKED ||
  16343. ret == OCSP_CERT_UNKNOWN ||
  16344. ret == OCSP_LOOKUP_FAIL) {
  16345. ret = 0;
  16346. }
  16347. }
  16348. /* free request up if error case found otherwise return it */
  16349. if (ret != 0 && createdRequest) {
  16350. FreeOcspRequest(request);
  16351. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16352. }
  16353. if (ret == 0)
  16354. *ocspRequest = request;
  16355. return ret;
  16356. }
  16357. #endif
  16358. #endif /* !NO_WOLFSSL_SERVER */
  16359. static int cipherExtraData(WOLFSSL* ssl)
  16360. {
  16361. int cipherExtra;
  16362. /* Cipher data that may be added by BuildMessage */
  16363. /* There is always an IV (expect for chacha). For AEAD ciphers,
  16364. * there is the authentication tag (aead_mac_size). For block
  16365. * ciphers we have the hash_size MAC on the message, and one
  16366. * block size for possible padding. */
  16367. if (ssl->specs.cipher_type == aead) {
  16368. cipherExtra = ssl->specs.aead_mac_size;
  16369. /* CHACHA does not have an explicit IV. */
  16370. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) {
  16371. cipherExtra += AESGCM_EXP_IV_SZ;
  16372. }
  16373. }
  16374. else {
  16375. cipherExtra = ssl->specs.iv_size + ssl->specs.block_size +
  16376. ssl->specs.hash_size;
  16377. }
  16378. /* Sanity check so we don't ever return negative. */
  16379. return cipherExtra > 0 ? cipherExtra : 0;
  16380. }
  16381. #ifndef WOLFSSL_NO_TLS12
  16382. #ifndef NO_CERTS
  16383. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  16384. /* handle generation of certificate (11) */
  16385. int SendCertificate(WOLFSSL* ssl)
  16386. {
  16387. int ret = 0;
  16388. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  16389. word32 length, maxFragment;
  16390. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  16391. WOLFSSL_ENTER("SendCertificate");
  16392. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  16393. return 0; /* not needed */
  16394. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  16395. #ifdef OPENSSL_EXTRA
  16396. if (ssl->version.major == SSLv3_MAJOR
  16397. && ssl->version.minor == SSLv3_MINOR){
  16398. SendAlert(ssl, alert_warning, no_certificate);
  16399. return 0;
  16400. } else {
  16401. #endif
  16402. certSz = 0;
  16403. certChainSz = 0;
  16404. headerSz = CERT_HEADER_SZ;
  16405. length = CERT_HEADER_SZ;
  16406. listSz = 0;
  16407. #ifdef OPENSSL_EXTRA
  16408. }
  16409. #endif
  16410. }
  16411. else {
  16412. if (!ssl->buffers.certificate) {
  16413. WOLFSSL_MSG("Send Cert missing certificate buffer");
  16414. return BUFFER_ERROR;
  16415. }
  16416. certSz = ssl->buffers.certificate->length;
  16417. headerSz = 2 * CERT_HEADER_SZ;
  16418. /* list + cert size */
  16419. length = certSz + headerSz;
  16420. listSz = certSz + CERT_HEADER_SZ;
  16421. /* may need to send rest of chain, already has leading size(s) */
  16422. if (certSz && ssl->buffers.certChain) {
  16423. certChainSz = ssl->buffers.certChain->length;
  16424. length += certChainSz;
  16425. listSz += certChainSz;
  16426. }
  16427. else
  16428. certChainSz = 0;
  16429. }
  16430. payloadSz = length;
  16431. if (ssl->fragOffset != 0)
  16432. length -= (ssl->fragOffset + headerSz);
  16433. maxFragment = MAX_RECORD_SIZE;
  16434. maxFragment = wolfSSL_GetMaxFragSize(ssl, maxFragment);
  16435. while (length > 0 && ret == 0) {
  16436. byte* output = NULL;
  16437. word32 fragSz = 0;
  16438. word32 i = RECORD_HEADER_SZ;
  16439. int sendSz = RECORD_HEADER_SZ;
  16440. if (!ssl->options.dtls) {
  16441. if (ssl->fragOffset == 0) {
  16442. if (headerSz + certSz + certChainSz <=
  16443. maxFragment - HANDSHAKE_HEADER_SZ) {
  16444. fragSz = headerSz + certSz + certChainSz;
  16445. }
  16446. else {
  16447. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  16448. }
  16449. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  16450. i += HANDSHAKE_HEADER_SZ;
  16451. }
  16452. else {
  16453. fragSz = min(length, maxFragment);
  16454. sendSz += fragSz;
  16455. }
  16456. if (IsEncryptionOn(ssl, 1))
  16457. sendSz += MAX_MSG_EXTRA;
  16458. }
  16459. else {
  16460. #ifdef WOLFSSL_DTLS
  16461. fragSz = min(length, maxFragment);
  16462. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  16463. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  16464. #endif
  16465. }
  16466. if (IsEncryptionOn(ssl, 1))
  16467. sendSz += cipherExtraData(ssl);
  16468. /* check for available size */
  16469. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  16470. return ret;
  16471. /* get output buffer */
  16472. output = ssl->buffers.outputBuffer.buffer +
  16473. ssl->buffers.outputBuffer.length;
  16474. if (ssl->fragOffset == 0) {
  16475. if (!ssl->options.dtls) {
  16476. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  16477. if (!IsEncryptionOn(ssl, 1))
  16478. HashRaw(ssl, output + RECORD_HEADER_SZ,
  16479. HANDSHAKE_HEADER_SZ);
  16480. }
  16481. else {
  16482. #ifdef WOLFSSL_DTLS
  16483. AddHeaders(output, payloadSz, certificate, ssl);
  16484. HashRaw(ssl,
  16485. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  16486. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  16487. /* Adding the headers increments these, decrement them for
  16488. * actual message header. */
  16489. ssl->keys.dtls_handshake_number--;
  16490. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  16491. ssl->keys.dtls_handshake_number--;
  16492. #endif /* WOLFSSL_DTLS */
  16493. }
  16494. /* list total */
  16495. c32to24(listSz, output + i);
  16496. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  16497. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  16498. i += CERT_HEADER_SZ;
  16499. length -= CERT_HEADER_SZ;
  16500. fragSz -= CERT_HEADER_SZ;
  16501. if (certSz) {
  16502. c32to24(certSz, output + i);
  16503. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  16504. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  16505. i += CERT_HEADER_SZ;
  16506. length -= CERT_HEADER_SZ;
  16507. fragSz -= CERT_HEADER_SZ;
  16508. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
  16509. HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  16510. if (certChainSz)
  16511. HashRaw(ssl, ssl->buffers.certChain->buffer,
  16512. certChainSz);
  16513. }
  16514. }
  16515. }
  16516. else {
  16517. if (!ssl->options.dtls) {
  16518. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  16519. }
  16520. else {
  16521. #ifdef WOLFSSL_DTLS
  16522. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  16523. payloadSz, certificate, ssl);
  16524. ssl->keys.dtls_handshake_number--;
  16525. #endif /* WOLFSSL_DTLS */
  16526. }
  16527. }
  16528. /* member */
  16529. if (certSz && ssl->fragOffset < certSz) {
  16530. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  16531. XMEMCPY(output + i,
  16532. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  16533. i += copySz;
  16534. ssl->fragOffset += copySz;
  16535. length -= copySz;
  16536. fragSz -= copySz;
  16537. }
  16538. if (certChainSz && fragSz) {
  16539. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  16540. XMEMCPY(output + i,
  16541. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  16542. copySz);
  16543. i += copySz;
  16544. ssl->fragOffset += copySz;
  16545. length -= copySz;
  16546. }
  16547. if (IsEncryptionOn(ssl, 1)) {
  16548. byte* input = NULL;
  16549. int inputSz = i; /* build msg adds rec hdr */
  16550. int recordHeaderSz = RECORD_HEADER_SZ;
  16551. if (ssl->options.dtls)
  16552. recordHeaderSz += DTLS_RECORD_EXTRA;
  16553. inputSz -= recordHeaderSz;
  16554. if (inputSz < 0) {
  16555. WOLFSSL_MSG("Send Cert bad inputSz");
  16556. return BUFFER_E;
  16557. }
  16558. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  16559. input = (byte*)XMALLOC(inputSz, ssl->heap,
  16560. DYNAMIC_TYPE_IN_BUFFER);
  16561. if (input == NULL)
  16562. return MEMORY_E;
  16563. XMEMCPY(input, output + recordHeaderSz, inputSz);
  16564. }
  16565. #ifndef WOLFSSL_DTLS
  16566. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  16567. handshake, 1, 0, 0, CUR_ORDER);
  16568. #else
  16569. if (!ssl->options.dtls)
  16570. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  16571. handshake, 1, 0, 0, CUR_ORDER);
  16572. else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
  16573. * calculate the hash ourselves above */ {
  16574. if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
  16575. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  16576. return ret;
  16577. }
  16578. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  16579. handshake, 0, 0, 0, CUR_ORDER);
  16580. }
  16581. #endif
  16582. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  16583. if (sendSz < 0)
  16584. return sendSz;
  16585. }
  16586. else {
  16587. sendSz = i;
  16588. #ifdef WOLFSSL_DTLS
  16589. if (IsDtlsNotSctpMode(ssl)) {
  16590. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
  16591. return ret;
  16592. }
  16593. if (ssl->options.dtls)
  16594. DtlsSEQIncrement(ssl, CUR_ORDER);
  16595. #endif
  16596. }
  16597. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16598. if (ssl->hsInfoOn)
  16599. AddPacketName(ssl, "Certificate");
  16600. if (ssl->toInfoOn)
  16601. AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  16602. WRITE_PROTO, ssl->heap);
  16603. #endif
  16604. ssl->buffers.outputBuffer.length += sendSz;
  16605. if (!ssl->options.groupMessages)
  16606. ret = SendBuffered(ssl);
  16607. }
  16608. if (ret != WANT_WRITE) {
  16609. /* Clean up the fragment offset. */
  16610. ssl->fragOffset = 0;
  16611. #ifdef WOLFSSL_DTLS
  16612. if (ssl->options.dtls)
  16613. ssl->keys.dtls_handshake_number++;
  16614. #endif
  16615. if (ssl->options.side == WOLFSSL_SERVER_END){
  16616. ssl->options.serverState = SERVER_CERT_COMPLETE;
  16617. }
  16618. }
  16619. WOLFSSL_LEAVE("SendCertificate", ret);
  16620. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  16621. return ret;
  16622. }
  16623. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  16624. /* handle generation of certificate_request (13) */
  16625. int SendCertificateRequest(WOLFSSL* ssl)
  16626. {
  16627. byte *output;
  16628. int ret;
  16629. int sendSz;
  16630. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  16631. word32 dnLen = 0;
  16632. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  16633. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  16634. #endif
  16635. int typeTotal = 1; /* only 1 for now */
  16636. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  16637. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  16638. WOLFSSL_ENTER("SendCertificateRequest");
  16639. if (IsAtLeastTLSv1_2(ssl))
  16640. reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz;
  16641. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  16642. /* Certificate Authorities */
  16643. names = SSL_CA_NAMES(ssl);
  16644. while (names != NULL) {
  16645. byte seq[MAX_SEQ_SZ];
  16646. WOLFSSL_X509_NAME* name = names->data.name;
  16647. if (name != NULL) {
  16648. /* 16-bit length | SEQ | Len | DER of name */
  16649. dnLen += OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
  16650. name->rawLen;
  16651. }
  16652. names = names->next;
  16653. }
  16654. reqSz += dnLen;
  16655. #endif
  16656. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  16657. return 0; /* not needed */
  16658. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  16659. if (!ssl->options.dtls) {
  16660. if (IsEncryptionOn(ssl, 1))
  16661. sendSz += MAX_MSG_EXTRA;
  16662. }
  16663. else {
  16664. #ifdef WOLFSSL_DTLS
  16665. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  16666. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  16667. #endif
  16668. }
  16669. if (IsEncryptionOn(ssl, 1))
  16670. sendSz += cipherExtraData(ssl);
  16671. /* check for available size */
  16672. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  16673. return ret;
  16674. /* get output buffer */
  16675. output = ssl->buffers.outputBuffer.buffer +
  16676. ssl->buffers.outputBuffer.length;
  16677. AddHeaders(output, reqSz, certificate_request, ssl);
  16678. /* write to output */
  16679. output[i++] = (byte)typeTotal; /* # of types */
  16680. #ifdef HAVE_ECC
  16681. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  16682. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  16683. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  16684. output[i++] = ecdsa_sign;
  16685. } else
  16686. #endif /* HAVE_ECC */
  16687. {
  16688. output[i++] = rsa_sign;
  16689. }
  16690. /* supported hash/sig */
  16691. if (IsAtLeastTLSv1_2(ssl)) {
  16692. c16toa(ssl->suites->hashSigAlgoSz, &output[i]);
  16693. i += OPAQUE16_LEN;
  16694. XMEMCPY(&output[i],
  16695. ssl->suites->hashSigAlgo, ssl->suites->hashSigAlgoSz);
  16696. i += ssl->suites->hashSigAlgoSz;
  16697. }
  16698. /* Certificate Authorities */
  16699. c16toa((word16)dnLen, &output[i]); /* auth's */
  16700. i += REQ_HEADER_SZ;
  16701. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  16702. names = SSL_CA_NAMES(ssl);
  16703. while (names != NULL) {
  16704. byte seq[MAX_SEQ_SZ];
  16705. WOLFSSL_X509_NAME* name = names->data.name;
  16706. if (name != NULL) {
  16707. c16toa((word16)name->rawLen +
  16708. SetSequence(name->rawLen, seq), &output[i]);
  16709. i += OPAQUE16_LEN;
  16710. i += SetSequence(name->rawLen, output + i);
  16711. XMEMCPY(output + i, name->raw, name->rawLen);
  16712. i += name->rawLen;
  16713. }
  16714. names = names->next;
  16715. }
  16716. #endif
  16717. (void)i;
  16718. if (IsEncryptionOn(ssl, 1)) {
  16719. byte* input = NULL;
  16720. int inputSz = i; /* build msg adds rec hdr */
  16721. int recordHeaderSz = RECORD_HEADER_SZ;
  16722. if (ssl->options.dtls)
  16723. recordHeaderSz += DTLS_RECORD_EXTRA;
  16724. inputSz -= recordHeaderSz;
  16725. if (inputSz <= 0) {
  16726. WOLFSSL_MSG("Send Cert Req bad inputSz");
  16727. return BUFFER_E;
  16728. }
  16729. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  16730. if (input == NULL)
  16731. return MEMORY_E;
  16732. XMEMCPY(input, output + recordHeaderSz, inputSz);
  16733. #ifdef WOLFSSL_DTLS
  16734. if (IsDtlsNotSctpMode(ssl) &&
  16735. (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
  16736. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  16737. return ret;
  16738. }
  16739. #endif
  16740. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  16741. handshake, 1, 0, 0, CUR_ORDER);
  16742. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  16743. if (sendSz < 0)
  16744. return sendSz;
  16745. } else {
  16746. sendSz = i;
  16747. #ifdef WOLFSSL_DTLS
  16748. if (IsDtlsNotSctpMode(ssl)) {
  16749. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
  16750. return ret;
  16751. }
  16752. if (ssl->options.dtls)
  16753. DtlsSEQIncrement(ssl, CUR_ORDER);
  16754. #endif
  16755. ret = HashOutput(ssl, output, sendSz, 0);
  16756. if (ret != 0)
  16757. return ret;
  16758. }
  16759. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16760. if (ssl->hsInfoOn)
  16761. AddPacketName(ssl, "CertificateRequest");
  16762. if (ssl->toInfoOn)
  16763. AddPacketInfo(ssl, "CertificateRequest", handshake, output, sendSz,
  16764. WRITE_PROTO, ssl->heap);
  16765. #endif
  16766. ssl->buffers.outputBuffer.length += sendSz;
  16767. if (ssl->options.groupMessages)
  16768. ret = 0;
  16769. else
  16770. ret = SendBuffered(ssl);
  16771. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  16772. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  16773. return ret;
  16774. }
  16775. #ifndef NO_WOLFSSL_SERVER
  16776. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  16777. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  16778. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  16779. byte count)
  16780. {
  16781. byte* output = NULL;
  16782. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  16783. word32 length = ENUM_LEN;
  16784. int sendSz = 0;
  16785. int ret = 0;
  16786. int i = 0;
  16787. WOLFSSL_ENTER("BuildCertificateStatus");
  16788. switch (type) {
  16789. case WOLFSSL_CSR2_OCSP_MULTI:
  16790. length += OPAQUE24_LEN;
  16791. FALL_THROUGH; /* followed by */
  16792. case WOLFSSL_CSR2_OCSP:
  16793. for (i = 0; i < count; i++)
  16794. length += OPAQUE24_LEN + status[i].length;
  16795. break;
  16796. default:
  16797. return 0;
  16798. }
  16799. sendSz = idx + length;
  16800. if (ssl->keys.encryptionOn)
  16801. sendSz += MAX_MSG_EXTRA;
  16802. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  16803. output = ssl->buffers.outputBuffer.buffer +
  16804. ssl->buffers.outputBuffer.length;
  16805. AddHeaders(output, length, certificate_status, ssl);
  16806. output[idx++] = type;
  16807. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  16808. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  16809. idx += OPAQUE24_LEN;
  16810. }
  16811. for (i = 0; i < count; i++) {
  16812. c32to24(status[i].length, output + idx);
  16813. idx += OPAQUE24_LEN;
  16814. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  16815. idx += status[i].length;
  16816. }
  16817. if (IsEncryptionOn(ssl, 1)) {
  16818. byte* input;
  16819. int inputSz = idx; /* build msg adds rec hdr */
  16820. int recordHeaderSz = RECORD_HEADER_SZ;
  16821. if (ssl->options.dtls)
  16822. recordHeaderSz += DTLS_RECORD_EXTRA;
  16823. inputSz -= recordHeaderSz;
  16824. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  16825. if (input == NULL)
  16826. return MEMORY_E;
  16827. XMEMCPY(input, output + recordHeaderSz, inputSz);
  16828. #ifdef WOLFSSL_DTLS
  16829. ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
  16830. #endif
  16831. if (ret == 0)
  16832. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  16833. handshake, 1, 0, 0, CUR_ORDER);
  16834. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  16835. if (sendSz < 0)
  16836. ret = sendSz;
  16837. }
  16838. else {
  16839. #ifdef WOLFSSL_DTLS
  16840. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  16841. ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
  16842. if (ret == 0 && ssl->options.dtls)
  16843. DtlsSEQIncrement(ssl, CUR_ORDER);
  16844. #endif
  16845. ret = HashOutput(ssl, output, sendSz, 0);
  16846. }
  16847. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16848. if (ret == 0 && ssl->hsInfoOn)
  16849. AddPacketName(ssl, "CertificateStatus");
  16850. if (ret == 0 && ssl->toInfoOn)
  16851. AddPacketInfo(ssl, "CertificateStatus", handshake, output, sendSz,
  16852. WRITE_PROTO, ssl->heap);
  16853. #endif
  16854. if (ret == 0) {
  16855. ssl->buffers.outputBuffer.length += sendSz;
  16856. if (!ssl->options.groupMessages)
  16857. ret = SendBuffered(ssl);
  16858. }
  16859. }
  16860. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  16861. return ret;
  16862. }
  16863. #endif
  16864. #endif /* NO_WOLFSSL_SERVER */
  16865. /* handle generation of certificate_status (22) */
  16866. int SendCertificateStatus(WOLFSSL* ssl)
  16867. {
  16868. int ret = 0;
  16869. byte status_type = 0;
  16870. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  16871. WOLFSSL_ENTER("SendCertificateStatus");
  16872. (void) ssl;
  16873. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  16874. status_type = ssl->status_request;
  16875. #endif
  16876. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  16877. status_type = status_type ? status_type : ssl->status_request_v2;
  16878. #endif
  16879. switch (status_type) {
  16880. #ifndef NO_WOLFSSL_SERVER
  16881. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  16882. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  16883. /* case WOLFSSL_CSR_OCSP: */
  16884. case WOLFSSL_CSR2_OCSP:
  16885. {
  16886. OcspRequest* request = ssl->ctx->certOcspRequest;
  16887. buffer response;
  16888. ret = CreateOcspResponse(ssl, &request, &response);
  16889. /* if a request was successfully created and not stored in
  16890. * ssl->ctx then free it */
  16891. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  16892. FreeOcspRequest(request);
  16893. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16894. request = NULL;
  16895. }
  16896. if (ret == 0 && response.buffer) {
  16897. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  16898. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16899. response.buffer = NULL;
  16900. }
  16901. break;
  16902. }
  16903. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  16904. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  16905. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  16906. case WOLFSSL_CSR2_OCSP_MULTI:
  16907. {
  16908. OcspRequest* request = ssl->ctx->certOcspRequest;
  16909. buffer responses[1 + MAX_CHAIN_DEPTH];
  16910. int i = 0;
  16911. XMEMSET(responses, 0, sizeof(responses));
  16912. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  16913. /* if a request was successfully created and not stored in
  16914. * ssl->ctx then free it */
  16915. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  16916. FreeOcspRequest(request);
  16917. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16918. request = NULL;
  16919. }
  16920. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  16921. || ssl->buffers.weOwnCertChain)) {
  16922. buffer der;
  16923. word32 idx = 0;
  16924. #ifdef WOLFSSL_SMALL_STACK
  16925. DecodedCert* cert;
  16926. #else
  16927. DecodedCert cert[1];
  16928. #endif
  16929. DerBuffer* chain;
  16930. #ifdef WOLFSSL_SMALL_STACK
  16931. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  16932. DYNAMIC_TYPE_DCERT);
  16933. if (cert == NULL)
  16934. return MEMORY_E;
  16935. #endif
  16936. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  16937. DYNAMIC_TYPE_OCSP_REQUEST);
  16938. if (request == NULL) {
  16939. #ifdef WOLFSSL_SMALL_STACK
  16940. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  16941. #endif
  16942. return MEMORY_E;
  16943. }
  16944. /* use certChain if available, otherwise use peer certificate */
  16945. chain = ssl->buffers.certChain;
  16946. if (chain == NULL) {
  16947. chain = ssl->buffers.certificate;
  16948. }
  16949. if (chain && chain->buffer) {
  16950. while (idx + OPAQUE24_LEN < chain->length) {
  16951. c24to32(chain->buffer + idx, &der.length);
  16952. idx += OPAQUE24_LEN;
  16953. der.buffer = chain->buffer + idx;
  16954. idx += der.length;
  16955. if (idx > chain->length)
  16956. break;
  16957. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  16958. der.length);
  16959. if (ret == 0) {
  16960. request->ssl = ssl;
  16961. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  16962. request, &responses[i + 1]);
  16963. /* Suppressing, not critical */
  16964. if (ret == OCSP_CERT_REVOKED ||
  16965. ret == OCSP_CERT_UNKNOWN ||
  16966. ret == OCSP_LOOKUP_FAIL) {
  16967. ret = 0;
  16968. }
  16969. i++;
  16970. FreeOcspRequest(request);
  16971. }
  16972. }
  16973. }
  16974. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16975. #ifdef WOLFSSL_SMALL_STACK
  16976. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  16977. #endif
  16978. }
  16979. else {
  16980. while (ret == 0 &&
  16981. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  16982. request->ssl = ssl;
  16983. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  16984. request, &responses[++i]);
  16985. /* Suppressing, not critical */
  16986. if (ret == OCSP_CERT_REVOKED ||
  16987. ret == OCSP_CERT_UNKNOWN ||
  16988. ret == OCSP_LOOKUP_FAIL) {
  16989. ret = 0;
  16990. }
  16991. }
  16992. }
  16993. if (responses[0].buffer) {
  16994. if (ret == 0) {
  16995. ret = BuildCertificateStatus(ssl, status_type, responses,
  16996. (byte)i + 1);
  16997. }
  16998. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  16999. if (responses[i].buffer) {
  17000. XFREE(responses[i].buffer, ssl->heap,
  17001. DYNAMIC_TYPE_OCSP_REQUEST);
  17002. }
  17003. }
  17004. }
  17005. break;
  17006. }
  17007. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  17008. #endif /* NO_WOLFSSL_SERVER */
  17009. default:
  17010. break;
  17011. }
  17012. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  17013. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  17014. return ret;
  17015. }
  17016. #endif /* !NO_CERTS */
  17017. #endif /* WOLFSSL_NO_TLS12 */
  17018. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  17019. /**
  17020. * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
  17021. */
  17022. int DtlsSCRKeysSet(WOLFSSL* ssl)
  17023. {
  17024. return ssl->secure_renegotiation &&
  17025. ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
  17026. }
  17027. /**
  17028. * ssl->keys contains the current cipher parameters only for epoch 1. For
  17029. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  17030. * cipher parameters. This function checks if the message currently being
  17031. * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  17032. */
  17033. int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
  17034. {
  17035. return DtlsSCRKeysSet(ssl) &&
  17036. ssl->keys.curEpoch ==
  17037. ssl->secure_renegotiation->tmp_keys.dtls_epoch;
  17038. }
  17039. /**
  17040. * ssl->keys contains the current cipher parameters only for epoch 1. For
  17041. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  17042. * cipher parameters. This function checks if the message currently being
  17043. * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  17044. */
  17045. int DtlsUseSCRKeys(WOLFSSL* ssl)
  17046. {
  17047. return DtlsSCRKeysSet(ssl) &&
  17048. ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
  17049. ssl->keys.dtls_epoch;
  17050. }
  17051. /**
  17052. * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
  17053. * then PREV_ORDER refers to the current epoch.
  17054. * */
  17055. int DtlsCheckOrder(WOLFSSL* ssl, int order)
  17056. {
  17057. if (order == PREV_ORDER && ssl->secure_renegotiation &&
  17058. ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
  17059. return CUR_ORDER;
  17060. }
  17061. else {
  17062. return order;
  17063. }
  17064. }
  17065. #endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
  17066. /* If secure renegotiation is disabled, this will always return false.
  17067. * Otherwise it checks to see if we are currently renegotiating. */
  17068. int IsSCR(WOLFSSL* ssl)
  17069. {
  17070. #ifndef HAVE_SECURE_RENEGOTIATION
  17071. (void)ssl;
  17072. #else /* HAVE_SECURE_RENEGOTIATION */
  17073. if (ssl->secure_renegotiation &&
  17074. ssl->secure_renegotiation->enabled && /* Is SCR enabled? */
  17075. ssl->options.handShakeDone && /* At least one handshake done? */
  17076. ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
  17077. return 1;
  17078. #endif /* HAVE_SECURE_RENEGOTIATION */
  17079. return 0;
  17080. }
  17081. #ifdef WOLFSSL_DTLS
  17082. static int ModifyForMTU(WOLFSSL* ssl, int buffSz, int outputSz, int mtuSz)
  17083. {
  17084. int recordExtra = outputSz - buffSz;
  17085. (void)ssl;
  17086. if (recordExtra > 0 && outputSz > mtuSz) {
  17087. buffSz = mtuSz - recordExtra;
  17088. #ifndef WOLFSSL_AEAD_ONLY
  17089. /* Subtract a block size to be certain that returned fragment
  17090. * size won't get more padding. */
  17091. if (ssl->specs.cipher_type == block)
  17092. buffSz -= ssl->specs.block_size;
  17093. #endif
  17094. }
  17095. return buffSz;
  17096. }
  17097. #endif
  17098. int SendData(WOLFSSL* ssl, const void* data, int sz)
  17099. {
  17100. int sent = 0, /* plainText size */
  17101. sendSz,
  17102. ret;
  17103. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  17104. int groupMsgs = 0;
  17105. #endif
  17106. if (ssl->error == WANT_WRITE
  17107. #ifdef WOLFSSL_ASYNC_CRYPT
  17108. || ssl->error == WC_PENDING_E
  17109. #endif
  17110. ) {
  17111. ssl->error = 0;
  17112. }
  17113. /* don't allow write after decrypt or mac error */
  17114. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  17115. /* For DTLS allow these possible errors and allow the session
  17116. to continue despite them */
  17117. if (ssl->options.dtls) {
  17118. ssl->error = 0;
  17119. }
  17120. else {
  17121. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  17122. return WOLFSSL_FATAL_ERROR;
  17123. }
  17124. }
  17125. #ifdef WOLFSSL_EARLY_DATA
  17126. if (ssl->earlyData != no_early_data) {
  17127. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  17128. WOLFSSL_MSG("handshake complete, trying to send early data");
  17129. ssl->error = BUILD_MSG_ERROR;
  17130. return WOLFSSL_FATAL_ERROR;
  17131. }
  17132. #ifdef WOLFSSL_EARLY_DATA_GROUP
  17133. groupMsgs = 1;
  17134. #endif
  17135. }
  17136. else
  17137. #endif
  17138. if (ssl->options.handShakeState != HANDSHAKE_DONE && !IsSCR(ssl)) {
  17139. int err;
  17140. WOLFSSL_MSG("handshake not complete, trying to finish");
  17141. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  17142. #ifdef WOLFSSL_ASYNC_CRYPT
  17143. /* if async would block return WANT_WRITE */
  17144. if (ssl->error == WC_PENDING_E) {
  17145. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  17146. }
  17147. #endif
  17148. return err;
  17149. }
  17150. }
  17151. /* last time system socket output buffer was full, try again to send */
  17152. if (ssl->buffers.outputBuffer.length > 0
  17153. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  17154. && !groupMsgs
  17155. #endif
  17156. ) {
  17157. WOLFSSL_MSG("output buffer was full, trying to send again");
  17158. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  17159. WOLFSSL_ERROR(ssl->error);
  17160. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  17161. ssl->options.isClosed)) {
  17162. ssl->error = SOCKET_PEER_CLOSED_E;
  17163. WOLFSSL_ERROR(ssl->error);
  17164. return 0; /* peer reset or closed */
  17165. }
  17166. return ssl->error;
  17167. }
  17168. else {
  17169. /* advance sent to previous sent + plain size just sent */
  17170. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  17171. WOLFSSL_MSG("sent write buffered data");
  17172. if (sent > sz) {
  17173. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  17174. return ssl->error = BAD_FUNC_ARG;
  17175. }
  17176. }
  17177. }
  17178. for (;;) {
  17179. byte* out;
  17180. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  17181. int buffSz; /* may switch on comp */
  17182. int outputSz;
  17183. #ifdef HAVE_LIBZ
  17184. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  17185. #endif
  17186. #ifdef WOLFSSL_DTLS
  17187. if (ssl->options.dtls) {
  17188. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  17189. }
  17190. else
  17191. #endif
  17192. {
  17193. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  17194. }
  17195. if (sent == sz) break;
  17196. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
  17197. if (ssl->options.dtls && (buffSz < sz - sent)) {
  17198. ssl->error = DTLS_SIZE_ERROR;
  17199. WOLFSSL_ERROR(ssl->error);
  17200. return ssl->error;
  17201. }
  17202. #endif
  17203. outputSz = buffSz + COMP_EXTRA + DTLS_RECORD_HEADER_SZ;
  17204. if (IsEncryptionOn(ssl, 1) || ssl->options.tls1_3)
  17205. outputSz += cipherExtraData(ssl);
  17206. /* check for available size */
  17207. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  17208. return ssl->error = ret;
  17209. /* get output buffer */
  17210. out = ssl->buffers.outputBuffer.buffer +
  17211. ssl->buffers.outputBuffer.length;
  17212. #ifdef HAVE_LIBZ
  17213. if (ssl->options.usingCompression) {
  17214. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  17215. if (buffSz < 0) {
  17216. return buffSz;
  17217. }
  17218. sendBuffer = comp;
  17219. }
  17220. #endif
  17221. if (!ssl->options.tls1_3) {
  17222. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  17223. application_data, 0, 0, 1, CUR_ORDER);
  17224. }
  17225. else {
  17226. #ifdef WOLFSSL_TLS13
  17227. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  17228. application_data, 0, 0, 1);
  17229. #else
  17230. sendSz = BUFFER_ERROR;
  17231. #endif
  17232. }
  17233. if (sendSz < 0) {
  17234. #ifdef WOLFSSL_ASYNC_CRYPT
  17235. if (sendSz == WC_PENDING_E)
  17236. ssl->error = sendSz;
  17237. #endif
  17238. return BUILD_MSG_ERROR;
  17239. }
  17240. ssl->buffers.outputBuffer.length += sendSz;
  17241. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  17242. WOLFSSL_ERROR(ssl->error);
  17243. /* store for next call if WANT_WRITE or user embedSend() that
  17244. doesn't present like WANT_WRITE */
  17245. ssl->buffers.plainSz = buffSz;
  17246. ssl->buffers.prevSent = sent;
  17247. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  17248. ssl->options.isClosed)) {
  17249. ssl->error = SOCKET_PEER_CLOSED_E;
  17250. WOLFSSL_ERROR(ssl->error);
  17251. return 0; /* peer reset or closed */
  17252. }
  17253. return ssl->error;
  17254. }
  17255. sent += buffSz;
  17256. /* only one message per attempt */
  17257. if (ssl->options.partialWrite == 1) {
  17258. WOLFSSL_MSG("Partial Write on, only sending one record");
  17259. break;
  17260. }
  17261. }
  17262. return sent;
  17263. }
  17264. /* process input data */
  17265. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  17266. {
  17267. int size;
  17268. WOLFSSL_ENTER("ReceiveData()");
  17269. /* reset error state */
  17270. if (ssl->error == WANT_READ || ssl->error == WOLFSSL_ERROR_WANT_READ) {
  17271. ssl->error = 0;
  17272. }
  17273. #ifdef WOLFSSL_DTLS
  17274. if (ssl->options.dtls) {
  17275. /* In DTLS mode, we forgive some errors and allow the session
  17276. * to continue despite them. */
  17277. if (ssl->error == VERIFY_MAC_ERROR ||
  17278. ssl->error == DECRYPT_ERROR ||
  17279. ssl->error == DTLS_SIZE_ERROR) {
  17280. ssl->error = 0;
  17281. }
  17282. }
  17283. #endif /* WOLFSSL_DTLS */
  17284. if (ssl->error != 0 && ssl->error != WANT_WRITE
  17285. #ifdef WOLFSSL_ASYNC_CRYPT
  17286. && ssl->error != WC_PENDING_E
  17287. #endif
  17288. #ifdef HAVE_SECURE_RENEGOTIATION
  17289. && ssl->error != APP_DATA_READY
  17290. #endif
  17291. ) {
  17292. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  17293. return ssl->error;
  17294. }
  17295. #ifdef WOLFSSL_EARLY_DATA
  17296. if (ssl->earlyData != no_early_data) {
  17297. }
  17298. else
  17299. #endif
  17300. {
  17301. int negotiate = 0;
  17302. #ifdef HAVE_SECURE_RENEGOTIATION
  17303. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  17304. if (ssl->options.handShakeState != HANDSHAKE_DONE
  17305. && ssl->buffers.clearOutputBuffer.length == 0)
  17306. negotiate = 1;
  17307. }
  17308. else
  17309. #endif
  17310. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  17311. negotiate = 1;
  17312. if (negotiate) {
  17313. int err;
  17314. WOLFSSL_MSG("Handshake not complete, trying to finish");
  17315. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  17316. #ifdef WOLFSSL_ASYNC_CRYPT
  17317. /* if async would block return WANT_WRITE */
  17318. if (ssl->error == WC_PENDING_E) {
  17319. return WOLFSSL_CBIO_ERR_WANT_READ;
  17320. }
  17321. #endif
  17322. return err;
  17323. }
  17324. }
  17325. }
  17326. #ifdef HAVE_SECURE_RENEGOTIATION
  17327. startScr:
  17328. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  17329. int ret;
  17330. WOLFSSL_MSG("Need to start scr, server requested");
  17331. ret = wolfSSL_Rehandshake(ssl);
  17332. ssl->secure_renegotiation->startScr = 0; /* only start once */
  17333. if (ret != WOLFSSL_SUCCESS)
  17334. return ret;
  17335. }
  17336. #endif
  17337. while (ssl->buffers.clearOutputBuffer.length == 0) {
  17338. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  17339. WOLFSSL_ERROR(ssl->error);
  17340. if (ssl->error == ZERO_RETURN) {
  17341. WOLFSSL_MSG("Zero return, no more data coming");
  17342. return 0; /* no more data coming */
  17343. }
  17344. if (ssl->error == SOCKET_ERROR_E) {
  17345. if (ssl->options.connReset || ssl->options.isClosed) {
  17346. WOLFSSL_MSG("Peer reset or closed, connection done");
  17347. ssl->error = SOCKET_PEER_CLOSED_E;
  17348. WOLFSSL_ERROR(ssl->error);
  17349. return 0; /* peer reset or closed */
  17350. }
  17351. }
  17352. return ssl->error;
  17353. }
  17354. #ifdef HAVE_SECURE_RENEGOTIATION
  17355. if (ssl->secure_renegotiation &&
  17356. ssl->secure_renegotiation->startScr) {
  17357. goto startScr;
  17358. }
  17359. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  17360. ssl->options.handShakeState != HANDSHAKE_DONE
  17361. && ssl->buffers.clearOutputBuffer.length == 0) {
  17362. /* ProcessReply processed a handshake packet and not any APP DATA
  17363. * so let's move the handshake along */
  17364. int err;
  17365. WOLFSSL_MSG("Handshake not complete, trying to finish");
  17366. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  17367. #ifdef WOLFSSL_ASYNC_CRYPT
  17368. /* if async would block return WANT_WRITE */
  17369. if (ssl->error == WC_PENDING_E) {
  17370. return WOLFSSL_CBIO_ERR_WANT_READ;
  17371. }
  17372. #endif
  17373. return err;
  17374. }
  17375. }
  17376. #endif
  17377. #ifndef WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
  17378. #ifdef WOLFSSL_TLS13
  17379. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
  17380. ssl->curRL.type == handshake && peek) {
  17381. WOLFSSL_MSG("Got Handshake Messge in APP data");
  17382. if (ssl->buffers.inputBuffer.length == 0) {
  17383. ssl->error = WOLFSSL_ERROR_WANT_READ;
  17384. return 0;
  17385. }
  17386. }
  17387. #endif
  17388. #endif
  17389. }
  17390. size = min(sz, (int)ssl->buffers.clearOutputBuffer.length);
  17391. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  17392. if (peek == 0) {
  17393. ssl->buffers.clearOutputBuffer.length -= size;
  17394. ssl->buffers.clearOutputBuffer.buffer += size;
  17395. }
  17396. if (ssl->buffers.clearOutputBuffer.length == 0 &&
  17397. ssl->buffers.inputBuffer.dynamicFlag)
  17398. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  17399. WOLFSSL_LEAVE("ReceiveData()", size);
  17400. return size;
  17401. }
  17402. /* send alert message */
  17403. int SendAlert(WOLFSSL* ssl, int severity, int type)
  17404. {
  17405. byte input[ALERT_SIZE];
  17406. byte *output;
  17407. int sendSz;
  17408. int ret;
  17409. int outputSz;
  17410. int dtlsExtra = 0;
  17411. WOLFSSL_ENTER("SendAlert");
  17412. #ifdef HAVE_WRITE_DUP
  17413. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  17414. int notifyErr = 0;
  17415. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  17416. if (type == close_notify) {
  17417. notifyErr = ZERO_RETURN;
  17418. } else if (severity == alert_fatal) {
  17419. notifyErr = FATAL_ERROR;
  17420. }
  17421. if (notifyErr != 0) {
  17422. return NotifyWriteSide(ssl, notifyErr);
  17423. }
  17424. return 0;
  17425. }
  17426. #endif
  17427. /* if sendalert is called again for nonblocking */
  17428. if (ssl->options.sendAlertState != 0) {
  17429. ret = SendBuffered(ssl);
  17430. if (ret == 0)
  17431. ssl->options.sendAlertState = 0;
  17432. return ret;
  17433. }
  17434. #ifdef OPENSSL_EXTRA
  17435. if (ssl->CBIS != NULL) {
  17436. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  17437. }
  17438. #endif
  17439. #ifdef WOLFSSL_DTLS
  17440. if (ssl->options.dtls)
  17441. dtlsExtra = DTLS_RECORD_EXTRA;
  17442. #endif
  17443. /* check for available size */
  17444. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  17445. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  17446. return ret;
  17447. /* Check output buffer */
  17448. if (ssl->buffers.outputBuffer.buffer == NULL)
  17449. return BUFFER_E;
  17450. /* get output buffer */
  17451. output = ssl->buffers.outputBuffer.buffer +
  17452. ssl->buffers.outputBuffer.length;
  17453. input[0] = (byte)severity;
  17454. input[1] = (byte)type;
  17455. ssl->alert_history.last_tx.code = type;
  17456. ssl->alert_history.last_tx.level = severity;
  17457. if (severity == alert_fatal) {
  17458. ssl->options.isClosed = 1; /* Don't send close_notify */
  17459. }
  17460. /* send encrypted alert if encryption is on - can be a rehandshake over
  17461. * an existing encrypted channel.
  17462. * TLS 1.3 encrypts handshake packets after the ServerHello
  17463. */
  17464. if (IsEncryptionOn(ssl, 1)) {
  17465. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  17466. 0, 0, 0, CUR_ORDER);
  17467. }
  17468. else {
  17469. AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
  17470. output += RECORD_HEADER_SZ;
  17471. #ifdef WOLFSSL_DTLS
  17472. if (ssl->options.dtls)
  17473. output += DTLS_RECORD_EXTRA;
  17474. #endif
  17475. XMEMCPY(output, input, ALERT_SIZE);
  17476. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  17477. #ifdef WOLFSSL_DTLS
  17478. if (ssl->options.dtls)
  17479. sendSz += DTLS_RECORD_EXTRA;
  17480. #endif
  17481. }
  17482. if (sendSz < 0)
  17483. return BUILD_MSG_ERROR;
  17484. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17485. if (ssl->hsInfoOn)
  17486. AddPacketName(ssl, "Alert");
  17487. if (ssl->toInfoOn)
  17488. AddPacketInfo(ssl, "Alert", alert, output, sendSz, WRITE_PROTO,
  17489. ssl->heap);
  17490. #endif
  17491. ssl->buffers.outputBuffer.length += sendSz;
  17492. ssl->options.sendAlertState = 1;
  17493. ret = SendBuffered(ssl);
  17494. WOLFSSL_LEAVE("SendAlert", ret);
  17495. return ret;
  17496. }
  17497. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  17498. {
  17499. #ifdef NO_ERROR_STRINGS
  17500. (void)e;
  17501. return "no support for error strings built in";
  17502. #else
  17503. int error = (int)e;
  17504. #ifdef OPENSSL_EXTRA
  17505. /* OpenSSL uses positive error codes */
  17506. if (error > 0) {
  17507. error = -error;
  17508. }
  17509. #endif
  17510. /* pass to wolfCrypt */
  17511. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  17512. return wc_GetErrorString(error);
  17513. }
  17514. switch (error) {
  17515. #ifdef WOLFSSL_WPAS
  17516. case 0 :
  17517. return "ok";
  17518. #endif
  17519. case UNSUPPORTED_SUITE :
  17520. return "unsupported cipher suite";
  17521. case INPUT_CASE_ERROR :
  17522. return "input state error";
  17523. case PREFIX_ERROR :
  17524. return "bad index to key rounds";
  17525. case MEMORY_ERROR :
  17526. return "out of memory";
  17527. case VERIFY_FINISHED_ERROR :
  17528. return "verify problem on finished";
  17529. case VERIFY_MAC_ERROR :
  17530. return "verify mac problem";
  17531. case PARSE_ERROR :
  17532. return "parse error on header";
  17533. case SIDE_ERROR :
  17534. return "wrong client/server type";
  17535. case NO_PEER_CERT :
  17536. return "peer didn't send cert";
  17537. case UNKNOWN_HANDSHAKE_TYPE :
  17538. return "weird handshake type";
  17539. case SOCKET_ERROR_E :
  17540. return "error state on socket";
  17541. case SOCKET_NODATA :
  17542. return "expected data, not there";
  17543. case INCOMPLETE_DATA :
  17544. return "don't have enough data to complete task";
  17545. case UNKNOWN_RECORD_TYPE :
  17546. return "unknown type in record hdr";
  17547. case DECRYPT_ERROR :
  17548. return "error during decryption";
  17549. case FATAL_ERROR :
  17550. return "received alert fatal error";
  17551. case ENCRYPT_ERROR :
  17552. return "error during encryption";
  17553. case FREAD_ERROR :
  17554. return "fread problem";
  17555. case NO_PEER_KEY :
  17556. return "need peer's key";
  17557. case NO_PRIVATE_KEY :
  17558. return "need the private key";
  17559. case NO_DH_PARAMS :
  17560. return "server missing DH params";
  17561. case RSA_PRIVATE_ERROR :
  17562. return "error during rsa priv op";
  17563. case MATCH_SUITE_ERROR :
  17564. return "can't match cipher suite";
  17565. case COMPRESSION_ERROR :
  17566. return "compression mismatch error";
  17567. case BUILD_MSG_ERROR :
  17568. return "build message failure";
  17569. case BAD_HELLO :
  17570. return "client hello malformed";
  17571. case DOMAIN_NAME_MISMATCH :
  17572. return "peer subject name mismatch";
  17573. case IPADDR_MISMATCH :
  17574. return "peer ip address mismatch";
  17575. case WANT_READ :
  17576. case WOLFSSL_ERROR_WANT_READ :
  17577. return "non-blocking socket wants data to be read";
  17578. case NOT_READY_ERROR :
  17579. return "handshake layer not ready yet, complete first";
  17580. case VERSION_ERROR :
  17581. return "record layer version error";
  17582. case WANT_WRITE :
  17583. case WOLFSSL_ERROR_WANT_WRITE :
  17584. return "non-blocking socket write buffer full";
  17585. case BUFFER_ERROR :
  17586. return "malformed buffer input error";
  17587. case VERIFY_CERT_ERROR :
  17588. return "verify problem on certificate";
  17589. case VERIFY_SIGN_ERROR :
  17590. return "verify problem based on signature";
  17591. case CLIENT_ID_ERROR :
  17592. return "psk client identity error";
  17593. case SERVER_HINT_ERROR:
  17594. return "psk server hint error";
  17595. case PSK_KEY_ERROR:
  17596. return "psk key callback error";
  17597. case GETTIME_ERROR:
  17598. return "gettimeofday() error";
  17599. case GETITIMER_ERROR:
  17600. return "getitimer() error";
  17601. case SIGACT_ERROR:
  17602. return "sigaction() error";
  17603. case SETITIMER_ERROR:
  17604. return "setitimer() error";
  17605. case LENGTH_ERROR:
  17606. return "record layer length error";
  17607. case PEER_KEY_ERROR:
  17608. return "cant decode peer key";
  17609. case ZERO_RETURN:
  17610. case WOLFSSL_ERROR_ZERO_RETURN:
  17611. return "peer sent close notify alert";
  17612. case ECC_CURVETYPE_ERROR:
  17613. return "Bad ECC Curve Type or unsupported";
  17614. case ECC_CURVE_ERROR:
  17615. return "Bad ECC Curve or unsupported";
  17616. case ECC_PEERKEY_ERROR:
  17617. return "Bad ECC Peer Key";
  17618. case ECC_MAKEKEY_ERROR:
  17619. return "ECC Make Key failure";
  17620. case ECC_EXPORT_ERROR:
  17621. return "ECC Export Key failure";
  17622. case ECC_SHARED_ERROR:
  17623. return "ECC DHE shared failure";
  17624. case NOT_CA_ERROR:
  17625. return "Not a CA by basic constraint error";
  17626. case BAD_CERT_MANAGER_ERROR:
  17627. return "Bad Cert Manager error";
  17628. case OCSP_CERT_REVOKED:
  17629. return "OCSP Cert revoked";
  17630. case CRL_CERT_REVOKED:
  17631. return "CRL Cert revoked";
  17632. case CRL_MISSING:
  17633. return "CRL missing, not loaded";
  17634. case MONITOR_SETUP_E:
  17635. return "CRL monitor setup error";
  17636. case THREAD_CREATE_E:
  17637. return "Thread creation problem";
  17638. case OCSP_NEED_URL:
  17639. return "OCSP need URL";
  17640. case OCSP_CERT_UNKNOWN:
  17641. return "OCSP Cert unknown";
  17642. case OCSP_LOOKUP_FAIL:
  17643. return "OCSP Responder lookup fail";
  17644. case MAX_CHAIN_ERROR:
  17645. return "Maximum Chain Depth Exceeded";
  17646. case COOKIE_ERROR:
  17647. return "DTLS Cookie Error";
  17648. case SEQUENCE_ERROR:
  17649. return "DTLS Sequence Error";
  17650. case SUITES_ERROR:
  17651. return "Suites Pointer Error";
  17652. case OUT_OF_ORDER_E:
  17653. return "Out of order message, fatal";
  17654. case BAD_KEA_TYPE_E:
  17655. return "Bad KEA type found";
  17656. case SANITY_CIPHER_E:
  17657. return "Sanity check on ciphertext failed";
  17658. case RECV_OVERFLOW_E:
  17659. return "Receive callback returned more than requested";
  17660. case GEN_COOKIE_E:
  17661. return "Generate Cookie Error";
  17662. case NO_PEER_VERIFY:
  17663. return "Need peer certificate verify Error";
  17664. case FWRITE_ERROR:
  17665. return "fwrite Error";
  17666. case CACHE_MATCH_ERROR:
  17667. return "Cache restore header match Error";
  17668. case UNKNOWN_SNI_HOST_NAME_E:
  17669. return "Unrecognized host name Error";
  17670. case UNKNOWN_MAX_FRAG_LEN_E:
  17671. return "Unrecognized max frag len Error";
  17672. case KEYUSE_SIGNATURE_E:
  17673. return "Key Use digitalSignature not set Error";
  17674. case KEYUSE_ENCIPHER_E:
  17675. return "Key Use keyEncipherment not set Error";
  17676. case EXTKEYUSE_AUTH_E:
  17677. return "Ext Key Use server/client auth not set Error";
  17678. case SEND_OOB_READ_E:
  17679. return "Send Callback Out of Bounds Read Error";
  17680. case SECURE_RENEGOTIATION_E:
  17681. return "Invalid Renegotiation Error";
  17682. case SESSION_TICKET_LEN_E:
  17683. return "Session Ticket Too Long Error";
  17684. case SESSION_TICKET_EXPECT_E:
  17685. return "Session Ticket Error";
  17686. case SESSION_SECRET_CB_E:
  17687. return "Session Secret Callback Error";
  17688. case NO_CHANGE_CIPHER_E:
  17689. return "Finished received from peer before Change Cipher Error";
  17690. case SANITY_MSG_E:
  17691. return "Sanity Check on message order Error";
  17692. case DUPLICATE_MSG_E:
  17693. return "Duplicate HandShake message Error";
  17694. case SNI_UNSUPPORTED:
  17695. return "Protocol version does not support SNI Error";
  17696. case SOCKET_PEER_CLOSED_E:
  17697. return "Peer closed underlying transport Error";
  17698. case BAD_TICKET_KEY_CB_SZ:
  17699. return "Bad user session ticket key callback Size Error";
  17700. case BAD_TICKET_MSG_SZ:
  17701. return "Bad session ticket message Size Error";
  17702. case BAD_TICKET_ENCRYPT:
  17703. return "Bad user ticket callback encrypt Error";
  17704. case DH_KEY_SIZE_E:
  17705. return "DH key too small Error";
  17706. case SNI_ABSENT_ERROR:
  17707. return "No Server Name Indication extension Error";
  17708. case RSA_SIGN_FAULT:
  17709. return "RSA Signature Fault Error";
  17710. case HANDSHAKE_SIZE_ERROR:
  17711. return "Handshake message too large Error";
  17712. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  17713. return "Unrecognized protocol name Error";
  17714. case BAD_CERTIFICATE_STATUS_ERROR:
  17715. return "Bad Certificate Status Message Error";
  17716. case OCSP_INVALID_STATUS:
  17717. return "Invalid OCSP Status Error";
  17718. case OCSP_WANT_READ:
  17719. return "OCSP nonblock wants read";
  17720. case RSA_KEY_SIZE_E:
  17721. return "RSA key too small";
  17722. case ECC_KEY_SIZE_E:
  17723. return "ECC key too small";
  17724. case DTLS_EXPORT_VER_E:
  17725. return "Version needs updated after code change or version mismatch";
  17726. case INPUT_SIZE_E:
  17727. return "Input size too large Error";
  17728. case CTX_INIT_MUTEX_E:
  17729. return "Initialize ctx mutex error";
  17730. case EXT_MASTER_SECRET_NEEDED_E:
  17731. return "Extended Master Secret must be enabled to resume EMS session";
  17732. case DTLS_POOL_SZ_E:
  17733. return "Maximum DTLS pool size exceeded";
  17734. case DECODE_E:
  17735. return "Decode handshake message error";
  17736. case WRITE_DUP_READ_E:
  17737. return "Write dup write side can't read error";
  17738. case WRITE_DUP_WRITE_E:
  17739. return "Write dup read side can't write error";
  17740. case INVALID_CERT_CTX_E:
  17741. return "Certificate context does not match request or not empty";
  17742. case BAD_KEY_SHARE_DATA:
  17743. return "The Key Share data contains group that wasn't in Client Hello";
  17744. case MISSING_HANDSHAKE_DATA:
  17745. return "The handshake message is missing required data";
  17746. case BAD_BINDER:
  17747. return "Binder value does not match value server calculated";
  17748. case EXT_NOT_ALLOWED:
  17749. return "Extension type not allowed in handshake message type";
  17750. case INVALID_PARAMETER:
  17751. return "The security parameter is invalid";
  17752. case UNSUPPORTED_EXTENSION:
  17753. return "TLS Extension not requested by the client";
  17754. case PRF_MISSING:
  17755. return "Pseudo-random function is not enabled";
  17756. case KEY_SHARE_ERROR:
  17757. return "Key share extension did not contain a valid named group";
  17758. case POST_HAND_AUTH_ERROR:
  17759. return "Client will not do post handshake authentication";
  17760. case HRR_COOKIE_ERROR:
  17761. return "Cookie does not match one sent in HelloRetryRequest";
  17762. case MCAST_HIGHWATER_CB_E:
  17763. return "Multicast highwater callback returned error";
  17764. case ALERT_COUNT_E:
  17765. return "Alert Count exceeded error";
  17766. case EXT_MISSING:
  17767. return "Required TLS extension missing";
  17768. case DTLS_RETX_OVER_TX:
  17769. return "DTLS interrupting flight transmit with retransmit";
  17770. case DH_PARAMS_NOT_FFDHE_E:
  17771. return "Server DH parameters were not from the FFDHE set as required";
  17772. case TCA_INVALID_ID_TYPE:
  17773. return "TLS Extension Trusted CA ID type invalid";
  17774. case TCA_ABSENT_ERROR:
  17775. return "TLS Extension Trusted CA ID response absent";
  17776. case TSIP_MAC_DIGSZ_E:
  17777. return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
  17778. case CLIENT_CERT_CB_ERROR:
  17779. return "Error importing client cert or key from callback";
  17780. case SSL_SHUTDOWN_ALREADY_DONE_E:
  17781. return "Shutdown has already occurred";
  17782. case TLS13_SECRET_CB_E:
  17783. return "TLS1.3 Secret Callback Error";
  17784. case DTLS_SIZE_ERROR:
  17785. return "DTLS trying to send too much in single datagram error";
  17786. case NO_CERT_ERROR:
  17787. return "TLS1.3 No Certificate Set Error";
  17788. case APP_DATA_READY:
  17789. return "Application data is available for reading";
  17790. case TOO_MUCH_EARLY_DATA:
  17791. return "Too much early data";
  17792. case SOCKET_FILTERED_E:
  17793. return "Session stopped by network filter";
  17794. #ifdef HAVE_HTTP_CLIENT
  17795. case HTTP_TIMEOUT:
  17796. return "HTTP timeout for OCSP or CRL req";
  17797. case HTTP_RECV_ERR:
  17798. return "HTTP Receive error";
  17799. case HTTP_HEADER_ERR:
  17800. return "HTTP Header error";
  17801. case HTTP_PROTO_ERR:
  17802. return "HTTP Protocol error";
  17803. case HTTP_STATUS_ERR:
  17804. return "HTTP Status error";
  17805. case HTTP_VERSION_ERR:
  17806. return "HTTP Version error";
  17807. case HTTP_APPSTR_ERR:
  17808. return "HTTP Application string error";
  17809. #endif
  17810. case UNSUPPORTED_PROTO_VERSION:
  17811. #ifdef OPENSSL_ALL
  17812. return "WRONG_SSL_VERSION";
  17813. #else
  17814. return "bad/unsupported protocol version";
  17815. #endif
  17816. default :
  17817. return "unknown error number";
  17818. }
  17819. #endif /* NO_ERROR_STRINGS */
  17820. }
  17821. const char* wolfSSL_ERR_func_error_string(unsigned long e)
  17822. {
  17823. (void)e;
  17824. WOLFSSL_MSG("wolfSSL_ERR_func_error_string does not return the name of "
  17825. "the function that failed. Please inspect the wolfSSL debug "
  17826. "logs to determine where the error occurred.");
  17827. return "";
  17828. }
  17829. /* return library name
  17830. * @param e error code
  17831. * @return text library name,
  17832. * if there is no suitable library found, returns empty string
  17833. */
  17834. const char* wolfSSL_ERR_lib_error_string(unsigned long e)
  17835. {
  17836. int libe = 0;
  17837. (void)libe;
  17838. (void)e;
  17839. #if defined(OPENSSL_EXTRA)
  17840. libe = wolfSSL_ERR_GET_LIB(e);
  17841. switch (libe) {
  17842. case ERR_LIB_PEM:
  17843. return "wolfSSL PEM routines";
  17844. case ERR_LIB_EVP:
  17845. return "wolfSSL digital envelope routines";
  17846. default:
  17847. return "";
  17848. }
  17849. #else
  17850. return "";
  17851. #endif
  17852. }
  17853. void SetErrorString(int error, char* str)
  17854. {
  17855. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  17856. str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
  17857. }
  17858. #ifdef NO_CIPHER_SUITE_ALIASES
  17859. #ifndef NO_ERROR_STRINGS
  17860. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17861. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17862. #define SUITE_ALIAS(x,z,w,v,u)
  17863. #else
  17864. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17865. #define SUITE_ALIAS(x,z,w,v,u)
  17866. #endif
  17867. #else
  17868. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  17869. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17870. #define SUITE_ALIAS(x,z,w,v,u)
  17871. #else
  17872. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17873. #define SUITE_ALIAS(x,z,w,v,u)
  17874. #endif
  17875. #endif
  17876. #else /* !NO_CIPHER_SUITE_ALIASES */
  17877. /* note that the comma is included at the end of the SUITE_ALIAS() macro
  17878. * definitions, to allow aliases to be gated out by the above null macros
  17879. * in the NO_CIPHER_SUITE_ALIASES section.
  17880. */
  17881. #ifndef NO_ERROR_STRINGS
  17882. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  17883. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  17884. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17885. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  17886. #else
  17887. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17888. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  17889. #endif
  17890. #else
  17891. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  17892. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  17893. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17894. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  17895. #else
  17896. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  17897. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  17898. #endif
  17899. #endif
  17900. #endif /* NO_CIPHER_SUITE_ALIASES */
  17901. static const CipherSuiteInfo cipher_names[] =
  17902. {
  17903. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  17904. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  17905. #endif
  17906. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  17907. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
  17908. #endif
  17909. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  17910. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  17911. #endif
  17912. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  17913. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  17914. #endif
  17915. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  17916. 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),
  17917. SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
  17918. #endif
  17919. #ifdef BUILD_TLS_SHA256_SHA256
  17920. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  17921. #endif
  17922. #ifdef BUILD_TLS_SHA384_SHA384
  17923. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
  17924. #endif
  17925. #ifndef WOLFSSL_NO_TLS12
  17926. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  17927. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  17928. #endif
  17929. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  17930. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  17931. #endif
  17932. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  17933. 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),
  17934. #endif
  17935. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  17936. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  17937. #endif
  17938. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  17939. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  17940. #endif
  17941. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  17942. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  17943. #endif
  17944. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  17945. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  17946. #endif
  17947. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  17948. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  17949. #endif
  17950. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  17951. 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),
  17952. #endif
  17953. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  17954. 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),
  17955. #endif
  17956. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  17957. 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),
  17958. #endif
  17959. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  17960. 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),
  17961. #endif
  17962. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  17963. 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),
  17964. #endif
  17965. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  17966. 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),
  17967. #endif
  17968. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  17969. 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),
  17970. #endif
  17971. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  17972. 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),
  17973. #endif
  17974. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  17975. 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),
  17976. #endif
  17977. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  17978. 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),
  17979. #endif
  17980. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  17981. 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),
  17982. #endif
  17983. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  17984. 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),
  17985. #endif
  17986. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  17987. 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),
  17988. #endif
  17989. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  17990. 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),
  17991. #endif
  17992. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  17993. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  17994. #endif
  17995. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  17996. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  17997. #endif
  17998. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  17999. 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),
  18000. SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  18001. #endif
  18002. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  18003. 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),
  18004. SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  18005. #endif
  18006. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  18007. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  18008. #endif
  18009. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  18010. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  18011. #endif
  18012. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  18013. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  18014. #endif
  18015. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  18016. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  18017. #endif
  18018. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  18019. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  18020. #endif
  18021. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  18022. SUITE_INFO("HC128-MD5","TLS_RSA_WITH_HC_128_MD5",CIPHER_BYTE,TLS_RSA_WITH_HC_128_MD5,TLSv1_MINOR,SSLv3_MAJOR),
  18023. #endif
  18024. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  18025. SUITE_INFO("HC128-SHA","TLS_RSA_WITH_HC_128_SHA",CIPHER_BYTE,TLS_RSA_WITH_HC_128_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  18026. #endif
  18027. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  18028. SUITE_INFO("RABBIT-SHA","TLS_RSA_WITH_RABBIT_SHA",CIPHER_BYTE,TLS_RSA_WITH_RABBIT_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  18029. #endif
  18030. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  18031. 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),
  18032. SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  18033. #endif
  18034. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  18035. 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),
  18036. SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  18037. #endif
  18038. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  18039. 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),
  18040. #endif
  18041. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  18042. 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),
  18043. SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  18044. #endif
  18045. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  18046. 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),
  18047. SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  18048. #endif
  18049. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  18050. 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),
  18051. #endif
  18052. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  18053. 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),
  18054. #endif
  18055. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  18056. 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),
  18057. #endif
  18058. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  18059. 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),
  18060. #endif
  18061. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  18062. 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),
  18063. #endif
  18064. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  18065. 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),
  18066. #endif
  18067. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  18068. 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),
  18069. #endif
  18070. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  18071. 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),
  18072. #endif
  18073. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  18074. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
  18075. #endif
  18076. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  18077. 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),
  18078. #endif
  18079. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  18080. 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),
  18081. #endif
  18082. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  18083. 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),
  18084. #endif
  18085. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  18086. 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),
  18087. #endif
  18088. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  18089. 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),
  18090. #endif
  18091. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  18092. 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),
  18093. #endif
  18094. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  18095. 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),
  18096. #endif
  18097. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  18098. 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),
  18099. #endif
  18100. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  18101. 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),
  18102. #endif
  18103. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  18104. 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),
  18105. #endif
  18106. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  18107. 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),
  18108. #endif
  18109. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  18110. 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),
  18111. #endif
  18112. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  18113. 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),
  18114. #endif
  18115. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  18116. 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),
  18117. #endif
  18118. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  18119. 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),
  18120. #endif
  18121. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  18122. 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),
  18123. #endif
  18124. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  18125. 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),
  18126. #endif
  18127. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  18128. 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),
  18129. #endif
  18130. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  18131. 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),
  18132. #endif
  18133. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  18134. 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),
  18135. #endif
  18136. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  18137. 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),
  18138. #endif
  18139. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  18140. 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),
  18141. #endif
  18142. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  18143. 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),
  18144. #endif
  18145. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  18146. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  18147. #endif
  18148. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  18149. 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),
  18150. #endif
  18151. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  18152. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  18153. #endif
  18154. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  18155. 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),
  18156. #endif
  18157. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  18158. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  18159. #endif
  18160. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  18161. 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),
  18162. #endif
  18163. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  18164. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  18165. #endif
  18166. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  18167. 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),
  18168. #endif
  18169. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  18170. 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),
  18171. #endif
  18172. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  18173. 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),
  18174. #endif
  18175. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  18176. 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),
  18177. #endif
  18178. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  18179. 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),
  18180. #endif
  18181. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  18182. 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),
  18183. #endif
  18184. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  18185. 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),
  18186. #endif
  18187. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  18188. 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),
  18189. #endif
  18190. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  18191. 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),
  18192. #endif
  18193. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  18194. 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),
  18195. #endif
  18196. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  18197. 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),
  18198. #endif
  18199. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  18200. 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),
  18201. #endif
  18202. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  18203. 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),
  18204. #endif
  18205. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  18206. 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),
  18207. #endif
  18208. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  18209. 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),
  18210. #endif
  18211. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  18212. 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),
  18213. #endif
  18214. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  18215. 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),
  18216. #endif
  18217. #ifdef HAVE_RENEGOTIATION_INDICATION
  18218. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
  18219. #endif
  18220. #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA
  18221. SUITE_INFO("IDEA-CBC-SHA","SSL_RSA_WITH_IDEA_CBC_SHA",CIPHER_BYTE,SSL_RSA_WITH_IDEA_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  18222. #endif
  18223. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  18224. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  18225. #endif
  18226. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  18227. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  18228. #endif
  18229. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  18230. 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),
  18231. #endif
  18232. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  18233. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  18234. #endif
  18235. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  18236. 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),
  18237. #endif
  18238. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  18239. 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),
  18240. #endif
  18241. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  18242. 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),
  18243. #endif
  18244. #ifdef BUILD_WDM_WITH_NULL_SHA256
  18245. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
  18246. #endif
  18247. #endif /* WOLFSSL_NO_TLS12 */
  18248. };
  18249. /* returns the cipher_names array */
  18250. const CipherSuiteInfo* GetCipherNames(void)
  18251. {
  18252. return cipher_names;
  18253. }
  18254. /* returns the number of elements in the cipher_names array */
  18255. int GetCipherNamesSize(void)
  18256. {
  18257. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  18258. }
  18259. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  18260. {
  18261. int i;
  18262. const char* nameInternal = "None";
  18263. for (i = 0; i < GetCipherNamesSize(); i++) {
  18264. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  18265. (cipher_names[i].cipherSuite == cipherSuite)
  18266. #ifndef NO_CIPHER_SUITE_ALIASES
  18267. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  18268. #endif
  18269. ) {
  18270. nameInternal = cipher_names[i].name;
  18271. break;
  18272. }
  18273. }
  18274. return nameInternal;
  18275. }
  18276. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  18277. /* Segment cipher name into n[n0,n1,n2,n4]
  18278. * @param cipher a pointer to WOLFSSL_CIPHER
  18279. * @param n return segment cipher name
  18280. * return cipher name if cipher is in the list,
  18281. * otherwise NULL
  18282. */
  18283. const char* GetCipherSegment(const WOLFSSL_CIPHER* cipher, char n[][MAX_SEGMENT_SZ])
  18284. {
  18285. int i,j,k;
  18286. int strLen;
  18287. unsigned long offset;
  18288. const char* name;
  18289. /* sanity check */
  18290. if (cipher == NULL || n == NULL)
  18291. return NULL;
  18292. offset = cipher->offset;
  18293. if (offset >= (unsigned long)GetCipherNamesSize())
  18294. return NULL;
  18295. name = cipher_names[offset].name;
  18296. if (name == NULL)
  18297. return NULL;
  18298. /* Segment cipher name into n[n0,n1,n2,n4]
  18299. * These are used later for comparisons to create:
  18300. * keaStr, authStr, encStr, macStr
  18301. *
  18302. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  18303. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  18304. * and n = [n0,n1,n2,n3,0]
  18305. */
  18306. strLen = (int)XSTRLEN(name);
  18307. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  18308. if (k >= MAX_SEGMENTS || j >= MAX_SEGMENT_SZ)
  18309. break;
  18310. if (name[i] != '-' && name[i] != '\0') {
  18311. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  18312. j++;
  18313. }
  18314. else {
  18315. n[k][j] = '\0';
  18316. j = 0;
  18317. k++;
  18318. }
  18319. }
  18320. return name;
  18321. }
  18322. const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
  18323. const char* keaStr = NULL;
  18324. const char *n0,*n1,*n2,*n3,*n4;
  18325. n0 = n[0];
  18326. n1 = n[1];
  18327. n2 = n[2];
  18328. n3 = n[3];
  18329. n4 = n[4];
  18330. if (XSTRNCMP(n0,"ECDHE",5) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  18331. keaStr = "ECDHEPSK";
  18332. else if (XSTRNCMP(n0,"ECDH",4) == 0)
  18333. keaStr = "ECDH";
  18334. else if (XSTRNCMP(n0,"DHE",3) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  18335. keaStr = "DHEPSK";
  18336. else if (XSTRNCMP(n0,"DHE",3) == 0)
  18337. keaStr = "DH";
  18338. else if (XSTRNCMP(n0,"RSA",3) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  18339. keaStr = "RSAPSK";
  18340. else if (XSTRNCMP(n0,"SRP",3) == 0)
  18341. keaStr = "SRP";
  18342. else if (XSTRNCMP(n0,"PSK",3) == 0)
  18343. keaStr = "PSK";
  18344. else if (XSTRNCMP(n0,"EDH",3) == 0)
  18345. keaStr = "EDH";
  18346. else if ((XSTRNCMP(n1,"SHA",3) == 0) || (XSTRNCMP(n2,"SHA",3) == 0) ||
  18347. (XSTRNCMP(n3,"SHA",3) == 0) || (XSTRNCMP(n4,"SHA",3) == 0) ||
  18348. (XSTRNCMP(n2,"RSA",3) == 0) || (XSTRNCMP(n0,"AES128",6) == 0) ||
  18349. (XSTRNCMP(n0,"AES256",6) == 0) || (XSTRNCMP(n1,"MD5",3) == 0))
  18350. keaStr = "RSA";
  18351. else
  18352. keaStr = "unknown";
  18353. return keaStr;
  18354. }
  18355. const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
  18356. const char* authStr = NULL;
  18357. const char *n0,*n1,*n2;
  18358. n0 = n[0];
  18359. n1 = n[1];
  18360. n2 = n[2];
  18361. if ((XSTRNCMP(n0,"AES128",6) == 0) || (XSTRNCMP(n0,"AES256",6) == 0) ||
  18362. ((XSTRNCMP(n0,"TLS13",5) == 0) && ((XSTRNCMP(n1,"AES128",6) == 0) ||
  18363. (XSTRNCMP(n1,"AES256",6) == 0) || (XSTRNCMP(n1,"CHACHA20",8) == 0))) ||
  18364. (XSTRNCMP(n0,"RSA",3) == 0) || (XSTRNCMP(n1,"RSA",3) == 0) ||
  18365. (XSTRNCMP(n1,"SHA",3) == 0) || (XSTRNCMP(n2,"SHA",3) == 0) ||
  18366. (XSTRNCMP(n1,"MD5",3) == 0))
  18367. authStr = "RSA";
  18368. else if (XSTRNCMP(n0,"PSK",3) == 0 || XSTRNCMP(n1,"PSK",3) == 0)
  18369. authStr = "PSK";
  18370. else if (XSTRNCMP(n0,"SRP",3) == 0 && XSTRNCMP(n1,"AES",3) == 0)
  18371. authStr = "SRP";
  18372. else if (XSTRNCMP(n1,"ECDSA",5) == 0)
  18373. authStr = "ECDSA";
  18374. else if (XSTRNCMP(n0,"ADH",3) == 0)
  18375. authStr = "None";
  18376. else
  18377. authStr = "unknown";
  18378. return authStr;
  18379. }
  18380. const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
  18381. const char* encStr = NULL;
  18382. const char *n0,*n1,*n2,*n3;
  18383. n0 = n[0];
  18384. n1 = n[1];
  18385. n2 = n[2];
  18386. n3 = n[3];
  18387. if ((XSTRNCMP(n0,"AES256",6) == 0 && XSTRNCMP(n1,"GCM",3) == 0) ||
  18388. (XSTRNCMP(n1,"AES256",6) == 0 && XSTRNCMP(n2,"GCM",3) == 0) ||
  18389. (XSTRNCMP(n2,"AES256",6) == 0 && XSTRNCMP(n3,"GCM",3) == 0))
  18390. encStr = "AESGCM(256)";
  18391. else if ((XSTRNCMP(n0,"AES128",6) == 0 && XSTRNCMP(n1,"GCM",3) == 0) ||
  18392. (XSTRNCMP(n1,"AES128",6) == 0 && XSTRNCMP(n2,"GCM",3) == 0) ||
  18393. (XSTRNCMP(n2,"AES128",6) == 0 && XSTRNCMP(n3,"GCM",3) == 0))
  18394. encStr = "AESGCM(128)";
  18395. else if ((XSTRNCMP(n0,"AES128",6) == 0 && XSTRNCMP(n1,"CCM",3) == 0) ||
  18396. (XSTRNCMP(n1,"AES128",6) == 0 && XSTRNCMP(n2,"CCM",3) == 0) ||
  18397. (XSTRNCMP(n2,"AES128",6) == 0 && XSTRNCMP(n3,"CCM",3) == 0))
  18398. encStr = "AESCCM(128)";
  18399. else if ((XSTRNCMP(n0,"AES128",6) == 0) ||
  18400. (XSTRNCMP(n1,"AES128",6) == 0) ||
  18401. (XSTRNCMP(n2,"AES128",6) == 0) ||
  18402. (XSTRNCMP(n1,"AES",3) == 0 && XSTRNCMP(n2,"128",3) == 0) ||
  18403. (XSTRNCMP(n2,"AES",3) == 0 && XSTRNCMP(n3,"128",3) == 0))
  18404. encStr = "AES(128)";
  18405. else if ((XSTRNCMP(n0,"AES256",6) == 0) ||
  18406. (XSTRNCMP(n1,"AES256",6) == 0) ||
  18407. (XSTRNCMP(n2,"AES256",6) == 0) ||
  18408. (XSTRNCMP(n1,"AES",3) == 0 && XSTRNCMP(n2,"256",3) == 0) ||
  18409. (XSTRNCMP(n2,"AES",3) == 0 && XSTRNCMP(n3,"256",3) == 0))
  18410. encStr = "AES(256)";
  18411. else if ((XSTRNCMP(n0,"CAMELLIA256",11) == 0) ||
  18412. (XSTRNCMP(n2,"CAMELLIA256",11) == 0))
  18413. encStr = "CAMELLIA(256)";
  18414. else if ((XSTRNCMP(n0,"CAMELLIA128",11) == 0) ||
  18415. (XSTRNCMP(n2,"CAMELLIA128",11) == 0))
  18416. encStr = "CAMELLIA(128)";
  18417. else if ((XSTRNCMP(n0,"RC4",3) == 0) || (XSTRNCMP(n1,"RC4",3) == 0) ||
  18418. (XSTRNCMP(n2,"RC4",3) == 0))
  18419. encStr = "RC4";
  18420. else if (((XSTRNCMP(n0,"DES",3) == 0) || (XSTRNCMP(n1,"DES",3) == 0) ||
  18421. (XSTRNCMP(n2,"DES",3) == 0)) &&
  18422. ((XSTRNCMP(n1,"CBC3",4) == 0) || (XSTRNCMP(n2,"CBC3",4) == 0) ||
  18423. (XSTRNCMP(n3,"CBC3",4) == 0)))
  18424. encStr = "3DES";
  18425. else if ((XSTRNCMP(n1,"CHACHA20",8) == 0 && XSTRNCMP(n2,"POLY1305",8) == 0) ||
  18426. (XSTRNCMP(n2,"CHACHA20",8) == 0 && XSTRNCMP(n3,"POLY1305",8) == 0))
  18427. encStr = "CHACHA20/POLY1305(256)";
  18428. else if ((XSTRNCMP(n0,"NULL",4) == 0) || (XSTRNCMP(n1,"NULL",4) == 0) ||
  18429. (XSTRNCMP(n2,"NULL",4) == 0) ||
  18430. ((XSTRNCMP(n0,"TLS13",5) == 0) && (XSTRNCMP(n3,"",0) == 0)))
  18431. encStr = "None";
  18432. else if ((XSTRNCMP(n0,"IDEA",4) == 0))
  18433. encStr = "IDEA";
  18434. else if ((XSTRNCMP(n0,"RABBIT",4) == 0))
  18435. encStr = "RABBIT";
  18436. else if ((XSTRNCMP(n0,"HC128",5) == 0))
  18437. encStr = "HC128";
  18438. else
  18439. encStr = "unknown";
  18440. return encStr;
  18441. }
  18442. /* Check if a cipher is AEAD
  18443. * @param n return segment cipher name
  18444. * return 1 if the cipher is AEAD, otherwise 0
  18445. */
  18446. int IsCipherAEAD(char n[][MAX_SEGMENT_SZ])
  18447. {
  18448. const char *n1,*n2,*n3;
  18449. n1 = n[1];
  18450. n2 = n[2];
  18451. n3 = n[3];
  18452. WOLFSSL_ENTER("IsCipherAEAD");
  18453. if (n == NULL) {
  18454. WOLFSSL_MSG("bad function argumet. n is NULL.");
  18455. return 0;
  18456. }
  18457. if ((XSTRNCMP(n2,"GCM",3) == 0) || (XSTRNCMP(n3,"GCM",3) == 0) ||
  18458. (XSTRNCMP(n1,"CCM",3) == 0) ||
  18459. (XSTRNCMP(n2,"CCM",3) == 0) || (XSTRNCMP(n3,"CCM",3) == 0) ||
  18460. (XSTRNCMP(n1,"CHACHA20",8) == 0 && XSTRNCMP(n2,"POLY1305",8) == 0) ||
  18461. (XSTRNCMP(n2,"CHACHA20",8) == 0 && XSTRNCMP(n3,"POLY1305",8) == 0))
  18462. return 1;
  18463. return 0;
  18464. }
  18465. /* Returns the MAC string of a cipher or "unknown" on failure */
  18466. const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
  18467. const char* macStr = NULL;
  18468. const char *n1,*n2,*n3,*n4;
  18469. n1 = n[1];
  18470. n2 = n[2];
  18471. n3 = n[3];
  18472. n4 = n[4];
  18473. if ((XSTRNCMP(n4,"SHA256",6) == 0) || (XSTRNCMP(n3,"SHA256",6) == 0) ||
  18474. (XSTRNCMP(n2,"SHA256",6) == 0) || (XSTRNCMP(n1,"SHA256",6) == 0))
  18475. macStr = "SHA256";
  18476. else if ((XSTRNCMP(n4,"SHA384",6) == 0) ||
  18477. (XSTRNCMP(n3,"SHA384",6) == 0) ||
  18478. (XSTRNCMP(n2,"SHA384",6) == 0) ||
  18479. (XSTRNCMP(n1,"SHA384",6) == 0))
  18480. macStr = "SHA384";
  18481. else if ((XSTRNCMP(n4,"SHA",3) == 0) || (XSTRNCMP(n3,"SHA",3) == 0) ||
  18482. (XSTRNCMP(n2,"SHA",3) == 0) || (XSTRNCMP(n1,"SHA",3) == 0) ||
  18483. (XSTRNCMP(n1,"MD5",3) == 0))
  18484. macStr = "SHA1";
  18485. else if ((XSTRNCMP(n3,"GCM",3) == 0) ||
  18486. (XSTRNCMP(n1,"CCM",3) == 0) ||
  18487. (XSTRNCMP(n2,"CCM",3) == 0) || (XSTRNCMP(n3,"CCM",3) == 0) ||
  18488. (XSTRNCMP(n1,"CHACHA20",8) == 0 && XSTRNCMP(n2,"POLY1305",8) == 0) ||
  18489. (XSTRNCMP(n2,"CHACHA20",8) == 0 && XSTRNCMP(n3,"POLY1305",8) == 0))
  18490. macStr = "AEAD";
  18491. else
  18492. macStr = "unknown";
  18493. return macStr;
  18494. }
  18495. /* Returns the number of bits based on the cipher enc string, or 0 on failure */
  18496. int SetCipherBits(const char* enc) {
  18497. int ret = WOLFSSL_FAILURE;
  18498. if ((XSTRNCMP(enc,"AESGCM(256)",11) == 0) ||
  18499. (XSTRNCMP(enc,"AES(256)",8) == 0) ||
  18500. (XSTRNCMP(enc,"CAMELLIA(256)",13) == 0) ||
  18501. (XSTRNCMP(enc,"CHACHA20/POLY1305(256)",22) == 0))
  18502. ret = 256;
  18503. else if
  18504. ((XSTRNCMP(enc,"3DES",4) == 0))
  18505. ret = 168;
  18506. else if
  18507. ((XSTRNCMP(enc,"AESGCM(128)",11) == 0) ||
  18508. (XSTRNCMP(enc,"AES(128)",8) == 0) ||
  18509. (XSTRNCMP(enc,"CAMELLIA(128)",13) == 0) ||
  18510. (XSTRNCMP(enc,"IDEA",4) == 0) ||
  18511. (XSTRNCMP(enc,"RC4",3) == 0))
  18512. ret = 128;
  18513. else if
  18514. ((XSTRNCMP(enc,"DES",3) == 0))
  18515. ret = 56;
  18516. return ret;
  18517. }
  18518. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  18519. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  18520. {
  18521. #ifndef NO_ERROR_STRINGS
  18522. int i;
  18523. const char* nameIana = "NONE";
  18524. for (i = 0; i < GetCipherNamesSize(); i++) {
  18525. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  18526. (cipher_names[i].cipherSuite == cipherSuite)
  18527. #ifndef NO_CIPHER_SUITE_ALIASES
  18528. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  18529. #endif
  18530. ) {
  18531. nameIana = cipher_names[i].name_iana;
  18532. break;
  18533. }
  18534. }
  18535. return nameIana;
  18536. #else
  18537. (void)cipherSuite0;
  18538. (void)cipherSuite;
  18539. return NULL;
  18540. #endif
  18541. }
  18542. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  18543. {
  18544. if (ssl == NULL) {
  18545. return NULL;
  18546. }
  18547. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  18548. }
  18549. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  18550. {
  18551. if (ssl == NULL) {
  18552. return NULL;
  18553. }
  18554. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  18555. }
  18556. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  18557. byte* cipherSuite, int* flags)
  18558. {
  18559. int ret = BAD_FUNC_ARG;
  18560. int i;
  18561. unsigned long len;
  18562. const char* nameDelim;
  18563. /* Support trailing : */
  18564. nameDelim = XSTRSTR(name, ":");
  18565. if (nameDelim)
  18566. len = (unsigned long)(nameDelim - name);
  18567. else
  18568. len = (unsigned long)XSTRLEN(name);
  18569. for (i = 0; i < GetCipherNamesSize(); i++) {
  18570. if ((XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
  18571. (cipher_names[i].name[len] == 0)) {
  18572. *cipherSuite0 = cipher_names[i].cipherSuite0;
  18573. *cipherSuite = cipher_names[i].cipherSuite;
  18574. *flags = cipher_names[i].flags;
  18575. ret = 0;
  18576. break;
  18577. }
  18578. }
  18579. return ret;
  18580. }
  18581. /**
  18582. Set the enabled cipher suites.
  18583. @param [out] suites Suites structure.
  18584. @param [in] list List of cipher suites, only supports full name from
  18585. cipher_names[] delimited by ':'.
  18586. @return true on success, else false.
  18587. */
  18588. int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list)
  18589. {
  18590. int ret = 0;
  18591. int idx = 0;
  18592. int haveRSAsig = 0;
  18593. int haveECDSAsig = 0;
  18594. int haveAnon = 0;
  18595. const int suiteSz = GetCipherNamesSize();
  18596. char* next = (char*)list;
  18597. if (suites == NULL || list == NULL) {
  18598. WOLFSSL_MSG("SetCipherList parameter error");
  18599. return 0;
  18600. }
  18601. if (next[0] == 0 || XSTRNCMP(next, "ALL", 3) == 0 ||
  18602. XSTRNCMP(next, "DEFAULT", 7) == 0 || XSTRNCMP(next, "HIGH", 4) == 0)
  18603. return 1; /* wolfSSL default */
  18604. do {
  18605. char* current = next;
  18606. char name[MAX_SUITE_NAME + 1];
  18607. int i;
  18608. word32 length;
  18609. next = XSTRSTR(next, ":");
  18610. length = MAX_SUITE_NAME;
  18611. if (next != NULL) {
  18612. word32 currLen = (word32)(next - current);
  18613. if (length > currLen) {
  18614. length = currLen;
  18615. }
  18616. }
  18617. XSTRNCPY(name, current, length);
  18618. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  18619. for (i = 0; i < suiteSz; i++) {
  18620. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  18621. #ifndef NO_ERROR_STRINGS
  18622. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  18623. #endif
  18624. ) {
  18625. #ifdef WOLFSSL_DTLS
  18626. /* don't allow stream ciphers with DTLS */
  18627. if (ctx->method->version.major == DTLS_MAJOR) {
  18628. if (XSTRSTR(name, "RC4") ||
  18629. XSTRSTR(name, "HC128") ||
  18630. XSTRSTR(name, "RABBIT"))
  18631. {
  18632. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  18633. continue;
  18634. }
  18635. }
  18636. #endif /* WOLFSSL_DTLS */
  18637. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  18638. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  18639. return 0; /* suites buffer not large enough, error out */
  18640. }
  18641. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  18642. suites->suites[idx++] = cipher_names[i].cipherSuite;
  18643. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  18644. * suites don't necessarily have RSA in the name. */
  18645. #ifdef WOLFSSL_TLS13
  18646. if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
  18647. (cipher_names[i].cipherSuite0 == ECC_BYTE &&
  18648. (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
  18649. cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
  18650. #ifndef NO_RSA
  18651. haveRSAsig = 1;
  18652. #endif
  18653. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  18654. defined(HAVE_ED448)
  18655. haveECDSAsig = 1;
  18656. #endif
  18657. }
  18658. else
  18659. #endif
  18660. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  18661. defined(HAVE_ED448)
  18662. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  18663. haveECDSAsig = 1;
  18664. else
  18665. #endif
  18666. #ifdef HAVE_ANON
  18667. if (XSTRSTR(name, "ADH"))
  18668. haveAnon = 1;
  18669. else
  18670. #endif
  18671. if (haveRSAsig == 0
  18672. #ifndef NO_PSK
  18673. && (XSTRSTR(name, "PSK") == NULL)
  18674. #endif
  18675. ) {
  18676. haveRSAsig = 1;
  18677. }
  18678. ret = 1; /* found at least one */
  18679. break;
  18680. }
  18681. }
  18682. }
  18683. while (next++); /* ++ needed to skip ':' */
  18684. if (ret) {
  18685. int keySz = 0;
  18686. #ifndef NO_CERTS
  18687. keySz = ctx->privateKeySz;
  18688. #endif
  18689. suites->setSuites = 1;
  18690. suites->suiteSz = (word16)idx;
  18691. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig, haveAnon, 1,
  18692. keySz);
  18693. }
  18694. (void)ctx;
  18695. return ret;
  18696. }
  18697. #ifdef OPENSSL_EXTRA
  18698. struct mac_algs {
  18699. byte alg;
  18700. const char* name;
  18701. } mac_names[] = {
  18702. #ifndef NO_SHA256
  18703. { sha256_mac, "SHA256" },
  18704. #endif
  18705. #ifdef WOLFSSL_SHA384
  18706. { sha384_mac, "SHA384" },
  18707. #endif
  18708. #ifdef WOLFSSL_SHA512
  18709. { sha512_mac, "SHA512" },
  18710. #endif
  18711. #ifdef WOLFSSL_SHA224
  18712. { sha224_mac, "SHA224" },
  18713. #endif
  18714. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  18715. defined(WOLFSSL_ALLOW_TLS_SHA1))
  18716. { sha_mac, "SHA1" },
  18717. #endif
  18718. };
  18719. #define MAC_NAMES_SZ (int)(sizeof(mac_names)/sizeof(*mac_names))
  18720. /* Convert the hash algorithm string to a TLS MAC algorithm num. */
  18721. static byte GetMacAlgFromName(const char* name, int len)
  18722. {
  18723. byte alg = no_mac;
  18724. int i;
  18725. for (i = 0; i < MAC_NAMES_SZ; i++) {
  18726. if (((int)XSTRLEN(mac_names[i].name) == len) &&
  18727. (XMEMCMP(mac_names[i].name, name, len) == 0)) {
  18728. alg = mac_names[i].alg;
  18729. break;
  18730. }
  18731. }
  18732. return alg;
  18733. }
  18734. struct sig_algs {
  18735. byte alg;
  18736. const char* name;
  18737. } sig_names[] = {
  18738. #ifndef NO_RSA
  18739. { rsa_sa_algo, "RSA" },
  18740. #ifdef WC_RSA_PSS
  18741. { rsa_pss_sa_algo, "RSA-PSS" },
  18742. { rsa_pss_sa_algo, "PSS" },
  18743. #endif
  18744. #endif
  18745. #ifdef HAVE_ECC
  18746. { ecc_dsa_sa_algo, "ECDSA" },
  18747. #endif
  18748. #ifdef HAVE_ED25519
  18749. { ed25519_sa_algo, "ED25519" },
  18750. #endif
  18751. #ifdef HAVE_ED448
  18752. { ed448_sa_algo, "ED448" },
  18753. #endif
  18754. #ifndef NO_DSA
  18755. { dsa_sa_algo, "DSA" },
  18756. #endif
  18757. };
  18758. #define SIG_NAMES_SZ (int)(sizeof(sig_names)/sizeof(*sig_names))
  18759. /* Convert the signature algorithm string to a TLS signature algorithm num. */
  18760. static byte GetSigAlgFromName(const char* name, int len)
  18761. {
  18762. byte alg = anonymous_sa_algo;
  18763. int i;
  18764. for (i = 0; i < SIG_NAMES_SZ; i++) {
  18765. if (((int)XSTRLEN(sig_names[i].name) == len) &&
  18766. (XMEMCMP(sig_names[i].name, name, len) == 0)) {
  18767. alg = sig_names[i].alg;
  18768. break;
  18769. }
  18770. }
  18771. return alg;
  18772. }
  18773. /* Set the hash/signature algorithms that are supported for certificate signing.
  18774. *
  18775. * suites [in,out] Cipher suites and signature algorithms.
  18776. * list [in] String representing hash/signature algorithms to set.
  18777. * returns 0 on failure.
  18778. * 1 on success.
  18779. */
  18780. int SetSuitesHashSigAlgo(Suites* suites, const char* list)
  18781. {
  18782. int ret = 1;
  18783. word16 idx = 0;
  18784. const char* s = list;
  18785. byte sig_alg = 0;
  18786. byte mac_alg = no_mac;
  18787. /* Setting is destructive on error. */
  18788. suites->hashSigAlgoSz = 0;
  18789. do {
  18790. if (*list == '+') {
  18791. if (mac_alg != 0) {
  18792. ret = 0;
  18793. break;
  18794. }
  18795. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  18796. if (sig_alg == 0) {
  18797. ret = 0;
  18798. break;
  18799. }
  18800. s = list + 1;
  18801. }
  18802. else if (*list == ':' || *list == '\0') {
  18803. if (sig_alg == 0) {
  18804. /* No signature algorithm set yet.
  18805. * Ed25519 and Ed448 have implied MAC algorithm.
  18806. */
  18807. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  18808. if (sig_alg != ed25519_sa_algo && sig_alg != ed448_sa_algo) {
  18809. ret = 0;
  18810. break;
  18811. }
  18812. }
  18813. else {
  18814. mac_alg = GetMacAlgFromName(s, (int)(list - s));
  18815. if (mac_alg == 0) {
  18816. ret = 0;
  18817. break;
  18818. }
  18819. }
  18820. AddSuiteHashSigAlgo(suites, mac_alg, sig_alg, 0, &idx);
  18821. sig_alg = 0;
  18822. mac_alg = no_mac;
  18823. s = list + 1;
  18824. }
  18825. list++;
  18826. }
  18827. while (*(list-1) != '\0');
  18828. if (s != list && (sig_alg != 0 || mac_alg != 0)) {
  18829. ret = 0;
  18830. }
  18831. else {
  18832. suites->hashSigAlgoSz = idx;
  18833. }
  18834. return ret;
  18835. }
  18836. #endif /* OPENSSL_EXTRA */
  18837. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  18838. static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
  18839. {
  18840. #ifdef HAVE_ED25519
  18841. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  18842. /* Certificate has Ed25519 key, only match with Ed25519 sig alg */
  18843. return sigAlgo == ed25519_sa_algo;
  18844. }
  18845. #endif
  18846. #ifdef HAVE_ED448
  18847. if (ssl->pkCurveOID == ECC_ED448_OID) {
  18848. /* Certificate has Ed448 key, only match with Ed448 sig alg */
  18849. return sigAlgo == ed448_sa_algo;
  18850. }
  18851. #endif
  18852. #ifdef WC_RSA_PSS
  18853. /* RSA certificate and PSS sig alg. */
  18854. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  18855. #if defined(WOLFSSL_TLS13)
  18856. /* TLS 1.3 only supports RSA-PSS. */
  18857. if (IsAtLeastTLSv1_3(ssl->version))
  18858. return sigAlgo == rsa_pss_sa_algo;
  18859. #endif
  18860. /* TLS 1.2 and below - RSA-PSS allowed. */
  18861. if (sigAlgo == rsa_pss_sa_algo)
  18862. return 1;
  18863. }
  18864. #endif
  18865. /* Signature algorithm matches certificate. */
  18866. return sigAlgo == ssl->suites->sigAlgo;
  18867. }
  18868. #if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
  18869. defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  18870. static int CmpEccStrength(int hashAlgo, int curveSz)
  18871. {
  18872. int dgstSz = GetMacDigestSize((byte)hashAlgo);
  18873. if (dgstSz <= 0)
  18874. return -1;
  18875. return dgstSz - (curveSz & (~0x3));
  18876. }
  18877. #endif
  18878. static byte MinHashAlgo(WOLFSSL* ssl)
  18879. {
  18880. #ifdef WOLFSSL_TLS13
  18881. if (IsAtLeastTLSv1_3(ssl->version)) {
  18882. return sha256_mac;
  18883. }
  18884. #endif
  18885. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
  18886. if (IsAtLeastTLSv1_2(ssl)) {
  18887. return sha256_mac;
  18888. }
  18889. #endif /* WOLFSSL_NO_TLS12 */
  18890. (void)ssl;
  18891. return sha_mac;
  18892. }
  18893. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  18894. {
  18895. word32 i;
  18896. int ret = MATCH_SUITE_ERROR;
  18897. byte minHash;
  18898. /* set defaults */
  18899. if (IsAtLeastTLSv1_3(ssl->version)) {
  18900. #ifndef NO_CERTS
  18901. /* TLS 1.3 cipher suites don't have public key algorithms in them.
  18902. * Using the one in the certificate - if any.
  18903. */
  18904. ssl->suites->sigAlgo = ssl->buffers.keyType;
  18905. #endif
  18906. }
  18907. else
  18908. ssl->suites->sigAlgo = ssl->specs.sig_algo;
  18909. if (ssl->suites->sigAlgo == 0) {
  18910. /* PSK ciphersuite - get digest to use from cipher suite */
  18911. ssl->suites->hashAlgo = ssl->specs.mac_algorithm;
  18912. return 0;
  18913. }
  18914. ssl->suites->hashAlgo = minHash = MinHashAlgo(ssl);
  18915. /* No list means go with the defaults. */
  18916. if (hashSigAlgoSz == 0)
  18917. return 0;
  18918. /* i+1 since two bytes used to describe hash and signature algorithm */
  18919. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  18920. byte hashAlgo = 0, sigAlgo = 0;
  18921. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  18922. /* Keep looking if hash algorithm not strong enough. */
  18923. if (hashAlgo < minHash)
  18924. continue;
  18925. /* Keep looking if signature algorithm isn't supported by cert. */
  18926. if (!MatchSigAlgo(ssl, sigAlgo))
  18927. continue;
  18928. #ifdef HAVE_ED25519
  18929. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  18930. /* Matched Ed25519 - set chosen and finished. */
  18931. ssl->suites->sigAlgo = sigAlgo;
  18932. ssl->suites->hashAlgo = hashAlgo;
  18933. ret = 0;
  18934. break;
  18935. }
  18936. #endif
  18937. #ifdef HAVE_ED448
  18938. if (ssl->pkCurveOID == ECC_ED448_OID) {
  18939. /* Matched Ed448 - set chosen and finished. */
  18940. ssl->suites->sigAlgo = sigAlgo;
  18941. ssl->suites->hashAlgo = hashAlgo;
  18942. ret = 0;
  18943. break;
  18944. }
  18945. #endif
  18946. #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  18947. #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
  18948. "be used together"
  18949. #endif
  18950. #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
  18951. defined(WOLFSSL_ECDSA_MATCH_HASH))
  18952. if (sigAlgo == ecc_dsa_sa_algo
  18953. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  18954. && IsAtLeastTLSv1_3(ssl->version)
  18955. #endif
  18956. ) {
  18957. /* Must be exact match. */
  18958. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  18959. continue;
  18960. /* Matched ECDSA exaclty - set chosen and finished. */
  18961. ssl->suites->hashAlgo = hashAlgo;
  18962. ssl->suites->sigAlgo = sigAlgo;
  18963. ret = 0;
  18964. break;
  18965. }
  18966. #endif
  18967. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  18968. * algorithm that matches the ephemeral ECDHE key size or the next highest
  18969. * available. This workaround resolves issue with some peer's that do not
  18970. * properly support scenarios such as a P-256 key hashed with SHA512.
  18971. */
  18972. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  18973. if (sigAlgo == ecc_dsa_sa_algo) {
  18974. int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
  18975. /* Keep looking if digest not strong enough. */
  18976. if (cmp < 0)
  18977. continue;
  18978. /* Looking for exact match or next highest. */
  18979. if (ret != 0 || hashAlgo <= ssl->suites->hashAlgo) {
  18980. ssl->suites->hashAlgo = hashAlgo;
  18981. ssl->suites->sigAlgo = sigAlgo;
  18982. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  18983. ssl->namedGroup = 0;
  18984. #endif
  18985. ret = 0;
  18986. }
  18987. /* Continue looking if not the same strength. */
  18988. if (cmp > 0)
  18989. continue;
  18990. /* Exact match - finished. */
  18991. break;
  18992. }
  18993. #endif
  18994. switch (hashAlgo) {
  18995. #ifndef NO_SHA
  18996. case sha_mac:
  18997. #endif
  18998. #ifdef WOLFSSL_SHA224
  18999. case sha224_mac:
  19000. #endif
  19001. #ifndef NO_SHA256
  19002. case sha256_mac:
  19003. #endif
  19004. #ifdef WOLFSSL_SHA384
  19005. case sha384_mac:
  19006. #endif
  19007. #ifdef WOLFSSL_SHA512
  19008. case sha512_mac:
  19009. #endif
  19010. #ifdef WOLFSSL_STRONGEST_HASH_SIG
  19011. /* Is hash algorithm weaker than chosen/min? */
  19012. if (hashAlgo < ssl->suites->hashAlgo)
  19013. break;
  19014. #else
  19015. /* Is hash algorithm stonger than last chosen? */
  19016. if (ret == 0 && hashAlgo > ssl->suites->hashAlgo)
  19017. break;
  19018. #endif
  19019. /* The chosen one - but keep looking. */
  19020. ssl->suites->hashAlgo = hashAlgo;
  19021. ssl->suites->sigAlgo = sigAlgo;
  19022. ret = 0;
  19023. break;
  19024. default:
  19025. /* Support for hash algorithm not compiled in. */
  19026. break;
  19027. }
  19028. }
  19029. return ret;
  19030. }
  19031. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  19032. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19033. /* Initialize HandShakeInfo */
  19034. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  19035. {
  19036. int i;
  19037. info->ssl = ssl;
  19038. info->cipherName[0] = 0;
  19039. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  19040. info->packetNames[i][0] = 0;
  19041. info->numberPackets = 0;
  19042. info->negotiationError = 0;
  19043. }
  19044. /* Set Final HandShakeInfo parameters */
  19045. void FinishHandShakeInfo(HandShakeInfo* info)
  19046. {
  19047. int i;
  19048. int sz = GetCipherNamesSize();
  19049. for (i = 0; i < sz; i++) {
  19050. #ifndef NO_CIPHER_SUITE_ALIASES
  19051. if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  19052. continue;
  19053. #endif
  19054. if (info->ssl->options.cipherSuite ==
  19055. (byte)cipher_names[i].cipherSuite) {
  19056. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  19057. continue; /* ECC suites at end */
  19058. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  19059. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  19060. break;
  19061. }
  19062. }
  19063. /* error max and min are negative numbers */
  19064. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  19065. info->negotiationError = info->ssl->error;
  19066. }
  19067. /* Add name to info packet names, increase packet name count */
  19068. void AddPacketName(WOLFSSL* ssl, const char* name)
  19069. {
  19070. #ifdef WOLFSSL_CALLBACKS
  19071. HandShakeInfo* info = &ssl->handShakeInfo;
  19072. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  19073. char* packetName = info->packetNames[info->numberPackets];
  19074. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  19075. packetName[MAX_PACKETNAME_SZ] = '\0';
  19076. info->numberPackets++;
  19077. }
  19078. #endif
  19079. (void)ssl;
  19080. (void)name;
  19081. }
  19082. #ifdef WOLFSSL_CALLBACKS
  19083. /* Initialize TimeoutInfo */
  19084. void InitTimeoutInfo(TimeoutInfo* info)
  19085. {
  19086. int i;
  19087. info->timeoutName[0] = 0;
  19088. info->flags = 0;
  19089. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  19090. info->packets[i].packetName[0] = 0;
  19091. info->packets[i].timestamp.tv_sec = 0;
  19092. info->packets[i].timestamp.tv_usec = 0;
  19093. info->packets[i].bufferValue = 0;
  19094. info->packets[i].valueSz = 0;
  19095. }
  19096. info->numberPackets = 0;
  19097. info->timeoutValue.tv_sec = 0;
  19098. info->timeoutValue.tv_usec = 0;
  19099. }
  19100. /* Free TimeoutInfo */
  19101. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  19102. {
  19103. int i;
  19104. (void)heap;
  19105. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  19106. if (info->packets[i].bufferValue) {
  19107. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  19108. info->packets[i].bufferValue = 0;
  19109. }
  19110. }
  19111. /* Add packet name to previously added packet info */
  19112. void AddLateName(const char* name, TimeoutInfo* info)
  19113. {
  19114. /* make sure we have a valid previous one */
  19115. if (info->numberPackets > 0 && info->numberPackets <
  19116. MAX_PACKETS_HANDSHAKE) {
  19117. char* packetName = info->packets[info->numberPackets-1].packetName;
  19118. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  19119. packetName[MAX_PACKETNAME_SZ] = '\0';
  19120. }
  19121. }
  19122. /* Add record header to previously added packet info */
  19123. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  19124. {
  19125. /* make sure we have a valid previous one */
  19126. if (info->numberPackets > 0 && info->numberPackets <
  19127. MAX_PACKETS_HANDSHAKE) {
  19128. if (info->packets[info->numberPackets - 1].bufferValue)
  19129. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  19130. RECORD_HEADER_SZ);
  19131. else
  19132. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  19133. RECORD_HEADER_SZ);
  19134. }
  19135. }
  19136. #endif /* WOLFSSL_CALLBACKS */
  19137. /* Add PacketInfo to TimeoutInfo
  19138. *
  19139. * ssl WOLFSSL structure sending or receiving packet
  19140. * name name of packet being sent
  19141. * type type of packet being sent
  19142. * data data bing sent with packet
  19143. * sz size of data buffer
  19144. * written 1 if this packet is being written to wire, 0 if being read
  19145. * heap custom heap to use for mallocs/frees
  19146. */
  19147. void AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  19148. const byte* data, int sz, int written, void* heap)
  19149. {
  19150. #ifdef WOLFSSL_CALLBACKS
  19151. TimeoutInfo* info = &ssl->timeoutInfo;
  19152. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  19153. WOLFSSL_TIMEVAL currTime;
  19154. /* may add name after */
  19155. if (name) {
  19156. char* packetName = info->packets[info->numberPackets].packetName;
  19157. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  19158. packetName[MAX_PACKETNAME_SZ] = '\0';
  19159. }
  19160. /* add data, put in buffer if bigger than static buffer */
  19161. info->packets[info->numberPackets].valueSz = sz;
  19162. if (sz < MAX_VALUE_SZ)
  19163. XMEMCPY(info->packets[info->numberPackets].value, data, sz);
  19164. else {
  19165. info->packets[info->numberPackets].bufferValue =
  19166. (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_INFO);
  19167. if (!info->packets[info->numberPackets].bufferValue)
  19168. /* let next alloc catch, just don't fill, not fatal here */
  19169. info->packets[info->numberPackets].valueSz = 0;
  19170. else
  19171. XMEMCPY(info->packets[info->numberPackets].bufferValue,
  19172. data, sz);
  19173. }
  19174. gettimeofday(&currTime, 0);
  19175. info->packets[info->numberPackets].timestamp.tv_sec =
  19176. currTime.tv_sec;
  19177. info->packets[info->numberPackets].timestamp.tv_usec =
  19178. currTime.tv_usec;
  19179. info->numberPackets++;
  19180. }
  19181. #endif /* WOLFSSL_CALLBACKS */
  19182. #ifdef OPENSSL_EXTRA
  19183. if (ssl->protoMsgCb != NULL && sz > RECORD_HEADER_SZ) {
  19184. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  19185. 4096 from 16^3 */
  19186. int version = (ssl->version.minor & 0x0F) +
  19187. ((ssl->version.minor & 0xF0) << 4) +
  19188. ((ssl->version.major & 0x0F) << 8) +
  19189. ((ssl->version.major & 0xF0) << 12);
  19190. ssl->protoMsgCb(written, version, type,
  19191. (const void *)(data + RECORD_HEADER_SZ),
  19192. (size_t)(sz - RECORD_HEADER_SZ),
  19193. ssl, ssl->protoMsgCtx);
  19194. }
  19195. #endif /* OPENSSL_EXTRA */
  19196. (void)written;
  19197. (void)name;
  19198. (void)heap;
  19199. (void)type;
  19200. (void)ssl;
  19201. }
  19202. #endif /* WOLFSSL_CALLBACKS */
  19203. #if !defined(NO_CERTS)
  19204. #if defined(WOLF_CRYPTO_CB) && !defined(NO_CHECK_PRIVATE_KEY)
  19205. /* Create a private key for a device.
  19206. *
  19207. * pkey Key object.
  19208. * data Data to identify key.
  19209. * length Length of data.
  19210. * hsType Type of the key to create.
  19211. * heap Custom heap to use for mallocs/frees
  19212. * devId Id for device.
  19213. * return 0 on success.
  19214. * return NOT_COMPILED_IN if algorithm type not supported.
  19215. * return MEMORY_E on memory allocation failure.
  19216. * return other internal error
  19217. */
  19218. int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
  19219. int label, int id, void* heap, int devId)
  19220. {
  19221. int ret = NOT_COMPILED_IN;
  19222. if (hsType == DYNAMIC_TYPE_RSA) {
  19223. #ifndef NO_RSA
  19224. RsaKey* rsaKey;
  19225. rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  19226. if (rsaKey == NULL) {
  19227. return MEMORY_E;
  19228. }
  19229. if (label) {
  19230. ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
  19231. }
  19232. else if (id) {
  19233. ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId);
  19234. }
  19235. if (ret == 0) {
  19236. *pkey = (void*)rsaKey;
  19237. }
  19238. else {
  19239. XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
  19240. }
  19241. #endif
  19242. }
  19243. else if (hsType == DYNAMIC_TYPE_ECC) {
  19244. #ifdef HAVE_ECC
  19245. ecc_key* ecKey;
  19246. ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  19247. if (ecKey == NULL) {
  19248. return MEMORY_E;
  19249. }
  19250. if (label) {
  19251. ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
  19252. }
  19253. else if (id) {
  19254. ret = wc_ecc_init_id(ecKey, data, length, heap, devId);
  19255. }
  19256. if (ret == 0) {
  19257. *pkey = (void*)ecKey;
  19258. }
  19259. else {
  19260. XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
  19261. }
  19262. #endif
  19263. }
  19264. return ret;
  19265. }
  19266. #endif
  19267. /* Decode the private key - RSA/ECC/Ed25519/Ed448 - and creates a key object.
  19268. * The signature type is set as well.
  19269. * The maximum length of a signature is returned.
  19270. *
  19271. * ssl The SSL/TLS object.
  19272. * length The length of a signature.
  19273. * returns 0 on success, otherwise failure.
  19274. */
  19275. int DecodePrivateKey(WOLFSSL *ssl, word16* length)
  19276. {
  19277. int ret = BAD_FUNC_ARG;
  19278. int keySz;
  19279. word32 idx;
  19280. #ifdef HAVE_PK_CALLBACKS
  19281. /* allow no private key if using PK callbacks and CB is set */
  19282. if (wolfSSL_IsPrivatePkSet(ssl)) {
  19283. *length = GetPrivateKeySigSize(ssl);
  19284. return 0;
  19285. }
  19286. else
  19287. #endif
  19288. /* make sure private key exists */
  19289. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  19290. WOLFSSL_MSG("Private key missing!");
  19291. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  19292. }
  19293. #ifdef HAVE_PKCS11
  19294. if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
  19295. ssl->buffers.keyLabel)) {
  19296. if (ssl->buffers.keyType == rsa_sa_algo)
  19297. ssl->hsType = DYNAMIC_TYPE_RSA;
  19298. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  19299. ssl->hsType = DYNAMIC_TYPE_ECC;
  19300. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19301. if (ret != 0) {
  19302. goto exit_dpk;
  19303. }
  19304. if (ssl->buffers.keyType == rsa_sa_algo) {
  19305. #ifndef NO_RSA
  19306. if (ssl->buffers.keyLabel) {
  19307. ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
  19308. (char*)ssl->buffers.key->buffer,
  19309. ssl->heap, ssl->buffers.keyDevId);
  19310. }
  19311. else if (ssl->buffers.keyId) {
  19312. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  19313. ssl->buffers.key->buffer,
  19314. ssl->buffers.key->length, ssl->heap,
  19315. ssl->buffers.keyDevId);
  19316. }
  19317. if (ret == 0) {
  19318. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  19319. WOLFSSL_MSG("RSA key size too small");
  19320. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  19321. }
  19322. /* Return the maximum signature length. */
  19323. *length = (word16)ssl->buffers.keySz;
  19324. }
  19325. #else
  19326. ret = NOT_COMPILED_IN;
  19327. #endif
  19328. }
  19329. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  19330. #ifdef HAVE_ECC
  19331. if (ssl->buffers.keyLabel) {
  19332. ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
  19333. (char*)ssl->buffers.key->buffer,
  19334. ssl->heap, ssl->buffers.keyDevId);
  19335. }
  19336. else if (ssl->buffers.keyId) {
  19337. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
  19338. ssl->buffers.key->buffer,
  19339. ssl->buffers.key->length, ssl->heap,
  19340. ssl->buffers.keyDevId);
  19341. }
  19342. if (ret == 0) {
  19343. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  19344. WOLFSSL_MSG("ECC key size too small");
  19345. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  19346. }
  19347. /* Return the maximum signature length. */
  19348. *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz);
  19349. }
  19350. #else
  19351. ret = NOT_COMPILED_IN;
  19352. #endif
  19353. }
  19354. goto exit_dpk;
  19355. }
  19356. #endif
  19357. #ifndef NO_RSA
  19358. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  19359. ssl->hsType = DYNAMIC_TYPE_RSA;
  19360. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19361. if (ret != 0) {
  19362. goto exit_dpk;
  19363. }
  19364. WOLFSSL_MSG("Trying RSA private key");
  19365. /* Set start of data to beginning of buffer. */
  19366. idx = 0;
  19367. /* Decode the key assuming it is an RSA private key. */
  19368. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  19369. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  19370. #if defined(WOLF_CRYPTO_CB) || defined(HAVE_PK_CALLBACKS)
  19371. /* if using crypto or PK callbacks allow using a public key */
  19372. if (ret != 0 && ssl->devId != INVALID_DEVID) {
  19373. WOLFSSL_MSG("Trying RSA public key with crypto callbacks");
  19374. idx = 0;
  19375. ret = wc_RsaPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  19376. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  19377. }
  19378. #endif
  19379. if (ret == 0) {
  19380. WOLFSSL_MSG("Using RSA private key");
  19381. /* It worked so check it meets minimum key size requirements. */
  19382. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  19383. if (keySz < 0) { /* check if keySz has error case */
  19384. ERROR_OUT(keySz, exit_dpk);
  19385. }
  19386. if (keySz < ssl->options.minRsaKeySz) {
  19387. WOLFSSL_MSG("RSA key size too small");
  19388. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  19389. }
  19390. /* Return the maximum signature length. */
  19391. *length = (word16)keySz;
  19392. goto exit_dpk;
  19393. }
  19394. }
  19395. #endif /* !NO_RSA */
  19396. #ifdef HAVE_ECC
  19397. #ifndef NO_RSA
  19398. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  19399. #endif /* !NO_RSA */
  19400. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0) {
  19401. ssl->hsType = DYNAMIC_TYPE_ECC;
  19402. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19403. if (ret != 0) {
  19404. goto exit_dpk;
  19405. }
  19406. #ifndef NO_RSA
  19407. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  19408. #else
  19409. WOLFSSL_MSG("Trying ECC private key");
  19410. #endif
  19411. /* Set start of data to beginning of buffer. */
  19412. idx = 0;
  19413. /* Decode the key assuming it is an ECC private key. */
  19414. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  19415. (ecc_key*)ssl->hsKey,
  19416. ssl->buffers.key->length);
  19417. #if defined(WOLF_CRYPTO_CB) || defined(HAVE_PK_CALLBACKS)
  19418. /* if using crypto or PK callbacks allow using a public key */
  19419. if (ret != 0 && ssl->devId != INVALID_DEVID) {
  19420. WOLFSSL_MSG("Trying ECC public key with crypto callbacks");
  19421. idx = 0;
  19422. ret = wc_EccPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  19423. (ecc_key*)ssl->hsKey,
  19424. ssl->buffers.key->length);
  19425. }
  19426. #endif
  19427. if (ret == 0) {
  19428. WOLFSSL_MSG("Using ECC private key");
  19429. /* Check it meets the minimum ECC key size requirements. */
  19430. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  19431. if (keySz < ssl->options.minEccKeySz) {
  19432. WOLFSSL_MSG("ECC key size too small");
  19433. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  19434. }
  19435. /* Return the maximum signature length. */
  19436. *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  19437. goto exit_dpk;
  19438. }
  19439. }
  19440. #endif
  19441. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  19442. #if !defined(NO_RSA) || defined(HAVE_ECC)
  19443. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  19444. #endif
  19445. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  19446. ssl->hsType = DYNAMIC_TYPE_ED25519;
  19447. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19448. if (ret != 0) {
  19449. goto exit_dpk;
  19450. }
  19451. #ifdef HAVE_ECC
  19452. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  19453. #elif !defined(NO_RSA)
  19454. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  19455. #else
  19456. WOLFSSL_MSG("Trying ED25519 private key");
  19457. #endif
  19458. /* Set start of data to beginning of buffer. */
  19459. idx = 0;
  19460. /* Decode the key assuming it is an ED25519 private key. */
  19461. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  19462. (ed25519_key*)ssl->hsKey,
  19463. ssl->buffers.key->length);
  19464. #if defined(WOLF_CRYPTO_CB) || defined(HAVE_PK_CALLBACKS)
  19465. /* if using crypto or PK callbacks allow using a public key */
  19466. if (ret != 0 && ssl->devId != INVALID_DEVID) {
  19467. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  19468. idx = 0;
  19469. ret = wc_Ed25519PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  19470. (ed25519_key*)ssl->hsKey,
  19471. ssl->buffers.key->length);
  19472. }
  19473. #endif
  19474. if (ret == 0) {
  19475. WOLFSSL_MSG("Using ED25519 private key");
  19476. /* Check it meets the minimum ECC key size requirements. */
  19477. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  19478. WOLFSSL_MSG("ED25519 key size too small");
  19479. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  19480. }
  19481. /* Return the maximum signature length. */
  19482. *length = ED25519_SIG_SIZE;
  19483. goto exit_dpk;
  19484. }
  19485. }
  19486. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  19487. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  19488. #if !defined(NO_RSA) || defined(HAVE_ECC)
  19489. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  19490. #endif
  19491. if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
  19492. ssl->hsType = DYNAMIC_TYPE_ED448;
  19493. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19494. if (ret != 0) {
  19495. goto exit_dpk;
  19496. }
  19497. #ifdef HAVE_ED25519
  19498. WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
  19499. #elif defined(HAVE_ECC)
  19500. WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
  19501. #elif !defined(NO_RSA)
  19502. WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
  19503. #else
  19504. WOLFSSL_MSG("Trying ED448 private key");
  19505. #endif
  19506. /* Set start of data to beginning of buffer. */
  19507. idx = 0;
  19508. /* Decode the key assuming it is an ED448 private key. */
  19509. ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  19510. (ed448_key*)ssl->hsKey,
  19511. ssl->buffers.key->length);
  19512. if (ret == 0) {
  19513. WOLFSSL_MSG("Using ED448 private key");
  19514. /* Check it meets the minimum ECC key size requirements. */
  19515. if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  19516. WOLFSSL_MSG("ED448 key size too small");
  19517. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  19518. }
  19519. /* Return the maximum signature length. */
  19520. *length = ED448_SIG_SIZE;
  19521. goto exit_dpk;
  19522. }
  19523. }
  19524. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  19525. (void)idx;
  19526. (void)keySz;
  19527. (void)length;
  19528. exit_dpk:
  19529. return ret;
  19530. }
  19531. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  19532. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  19533. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  19534. int TLSv1_3_Capable(WOLFSSL* ssl)
  19535. {
  19536. #ifndef WOLFSSL_TLS13
  19537. return 0;
  19538. #else
  19539. int ret = 0;
  19540. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  19541. ret = 1;
  19542. }
  19543. #ifdef OPENSSL_EXTRA
  19544. if ((wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_3)) {
  19545. /* option set at run time to disable TLS 1.3 */
  19546. ret = 0;
  19547. }
  19548. #endif
  19549. return ret;
  19550. #endif
  19551. }
  19552. #endif /* WOLFSSL_TLS13 */
  19553. /* client only parts */
  19554. #ifndef NO_WOLFSSL_CLIENT
  19555. #ifndef WOLFSSL_NO_TLS12
  19556. /* handle generation of client_hello (1) */
  19557. int SendClientHello(WOLFSSL* ssl)
  19558. {
  19559. byte *output;
  19560. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  19561. int sendSz;
  19562. int idSz = ssl->options.resuming
  19563. ? ssl->session.sessionIDSz
  19564. : 0;
  19565. int ret;
  19566. word16 extSz = 0;
  19567. #ifdef WOLFSSL_TLS13
  19568. if (IsAtLeastTLSv1_3(ssl->version))
  19569. return SendTls13ClientHello(ssl);
  19570. #endif
  19571. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  19572. WOLFSSL_ENTER("SendClientHello");
  19573. if (ssl->suites == NULL) {
  19574. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  19575. return SUITES_ERROR;
  19576. }
  19577. #ifdef HAVE_SESSION_TICKET
  19578. if (ssl->options.resuming && ssl->session.ticketLen > 0) {
  19579. SessionTicket* ticket;
  19580. ticket = TLSX_SessionTicket_Create(0, ssl->session.ticket,
  19581. ssl->session.ticketLen, ssl->heap);
  19582. if (ticket == NULL) return MEMORY_E;
  19583. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  19584. if (ret != WOLFSSL_SUCCESS) {
  19585. TLSX_SessionTicket_Free(ticket, ssl->heap);
  19586. return ret;
  19587. }
  19588. idSz = 0;
  19589. }
  19590. #endif
  19591. length = VERSION_SZ + RAN_LEN
  19592. + idSz + ENUM_LEN
  19593. + ssl->suites->suiteSz + SUITE_LEN
  19594. + COMP_LEN + ENUM_LEN;
  19595. #ifdef HAVE_TLS_EXTENSIONS
  19596. /* auto populate extensions supported unless user defined */
  19597. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  19598. return ret;
  19599. extSz = 0;
  19600. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  19601. if (ret != 0)
  19602. return ret;
  19603. length += extSz;
  19604. #else
  19605. if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
  19606. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  19607. + ssl->suites->hashSigAlgoSz;
  19608. #ifdef HAVE_EXTENDED_MASTER
  19609. if (ssl->options.haveEMS)
  19610. extSz += HELLO_EXT_SZ;
  19611. #endif
  19612. if (extSz != 0)
  19613. length += extSz + HELLO_EXT_SZ_SZ;
  19614. #endif
  19615. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  19616. #ifdef WOLFSSL_DTLS
  19617. if (ssl->options.dtls) {
  19618. length += ENUM_LEN; /* cookie */
  19619. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  19620. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  19621. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  19622. }
  19623. #endif
  19624. if (IsEncryptionOn(ssl, 1))
  19625. sendSz += MAX_MSG_EXTRA;
  19626. /* check for available size */
  19627. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  19628. return ret;
  19629. /* get output buffer */
  19630. output = ssl->buffers.outputBuffer.buffer +
  19631. ssl->buffers.outputBuffer.length;
  19632. AddHeaders(output, length, client_hello, ssl);
  19633. /* client hello, first version */
  19634. output[idx++] = ssl->version.major;
  19635. output[idx++] = ssl->version.minor;
  19636. ssl->chVersion = ssl->version; /* store in case changed */
  19637. /* then random */
  19638. if (ssl->options.connectState == CONNECT_BEGIN) {
  19639. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  19640. if (ret != 0)
  19641. return ret;
  19642. /* store random */
  19643. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  19644. } else {
  19645. #ifdef WOLFSSL_DTLS
  19646. /* send same random on hello again */
  19647. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  19648. #endif
  19649. }
  19650. idx += RAN_LEN;
  19651. /* then session id */
  19652. output[idx++] = (byte)idSz;
  19653. if (idSz) {
  19654. XMEMCPY(output + idx, ssl->session.sessionID,
  19655. ssl->session.sessionIDSz);
  19656. idx += ssl->session.sessionIDSz;
  19657. }
  19658. /* then DTLS cookie */
  19659. #ifdef WOLFSSL_DTLS
  19660. if (ssl->options.dtls) {
  19661. byte cookieSz = ssl->arrays->cookieSz;
  19662. output[idx++] = cookieSz;
  19663. if (cookieSz) {
  19664. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  19665. idx += cookieSz;
  19666. }
  19667. }
  19668. #endif
  19669. /* then cipher suites */
  19670. c16toa(ssl->suites->suiteSz, output + idx);
  19671. idx += OPAQUE16_LEN;
  19672. XMEMCPY(output + idx, &ssl->suites->suites, ssl->suites->suiteSz);
  19673. idx += ssl->suites->suiteSz;
  19674. /* last, compression */
  19675. output[idx++] = COMP_LEN;
  19676. if (ssl->options.usingCompression)
  19677. output[idx++] = ZLIB_COMPRESSION;
  19678. else
  19679. output[idx++] = NO_COMPRESSION;
  19680. #ifdef HAVE_TLS_EXTENSIONS
  19681. extSz = 0;
  19682. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  19683. if (ret != 0)
  19684. return ret;
  19685. idx += extSz;
  19686. (void)idx; /* suppress analyzer warning, keep idx current */
  19687. #else
  19688. if (extSz != 0) {
  19689. c16toa(extSz, output + idx);
  19690. idx += HELLO_EXT_SZ_SZ;
  19691. if (IsAtLeastTLSv1_2(ssl)) {
  19692. if (ssl->suites->hashSigAlgoSz) {
  19693. word16 i;
  19694. /* extension type */
  19695. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  19696. idx += HELLO_EXT_TYPE_SZ;
  19697. /* extension data length */
  19698. c16toa(HELLO_EXT_SIGALGO_SZ + ssl->suites->hashSigAlgoSz,
  19699. output + idx);
  19700. idx += HELLO_EXT_SZ_SZ;
  19701. /* sig algos length */
  19702. c16toa(ssl->suites->hashSigAlgoSz, output + idx);
  19703. idx += HELLO_EXT_SIGALGO_SZ;
  19704. for (i=0; i < ssl->suites->hashSigAlgoSz; i++, idx++) {
  19705. output[idx] = ssl->suites->hashSigAlgo[i];
  19706. }
  19707. }
  19708. }
  19709. #ifdef HAVE_EXTENDED_MASTER
  19710. if (ssl->options.haveEMS) {
  19711. c16toa(HELLO_EXT_EXTMS, output + idx);
  19712. idx += HELLO_EXT_TYPE_SZ;
  19713. c16toa(0, output + idx);
  19714. idx += HELLO_EXT_SZ_SZ;
  19715. }
  19716. #endif
  19717. }
  19718. #endif
  19719. if (IsEncryptionOn(ssl, 1)) {
  19720. byte* input;
  19721. int inputSz = idx; /* build msg adds rec hdr */
  19722. int recordHeaderSz = RECORD_HEADER_SZ;
  19723. if (ssl->options.dtls)
  19724. recordHeaderSz += DTLS_RECORD_EXTRA;
  19725. inputSz -= recordHeaderSz;
  19726. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19727. if (input == NULL)
  19728. return MEMORY_E;
  19729. XMEMCPY(input, output + recordHeaderSz, inputSz);
  19730. #ifdef WOLFSSL_DTLS
  19731. if (IsDtlsNotSctpMode(ssl) &&
  19732. (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
  19733. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19734. return ret;
  19735. }
  19736. #endif
  19737. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19738. handshake, 1, 0, 0, CUR_ORDER);
  19739. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19740. if (sendSz < 0)
  19741. return sendSz;
  19742. } else {
  19743. #ifdef WOLFSSL_DTLS
  19744. if (IsDtlsNotSctpMode(ssl)) {
  19745. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
  19746. return ret;
  19747. }
  19748. if (ssl->options.dtls)
  19749. DtlsSEQIncrement(ssl, CUR_ORDER);
  19750. #endif
  19751. ret = HashOutput(ssl, output, sendSz, 0);
  19752. if (ret != 0)
  19753. return ret;
  19754. }
  19755. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  19756. #ifdef OPENSSL_EXTRA
  19757. ssl->cbmode = SSL_CB_MODE_WRITE;
  19758. if (ssl->CBIS != NULL)
  19759. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  19760. #endif
  19761. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19762. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  19763. if (ssl->toInfoOn)
  19764. AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  19765. WRITE_PROTO, ssl->heap);
  19766. #endif
  19767. ssl->buffers.outputBuffer.length += sendSz;
  19768. ret = SendBuffered(ssl);
  19769. WOLFSSL_LEAVE("SendClientHello", ret);
  19770. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  19771. return ret;
  19772. }
  19773. /* handle processing of DTLS hello_verify_request (3) */
  19774. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input,
  19775. word32* inOutIdx, word32 size)
  19776. {
  19777. ProtocolVersion pv;
  19778. byte cookieSz;
  19779. word32 begin = *inOutIdx;
  19780. #ifdef WOLFSSL_CALLBACKS
  19781. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  19782. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  19783. #endif
  19784. #ifdef WOLFSSL_DTLS
  19785. if (ssl->options.dtls) {
  19786. DtlsMsgPoolReset(ssl);
  19787. }
  19788. #endif
  19789. if (OPAQUE16_LEN + OPAQUE8_LEN > size)
  19790. return BUFFER_ERROR;
  19791. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  19792. *inOutIdx += OPAQUE16_LEN;
  19793. if (pv.major != DTLS_MAJOR ||
  19794. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  19795. return VERSION_ERROR;
  19796. cookieSz = input[(*inOutIdx)++];
  19797. if (cookieSz) {
  19798. if ((*inOutIdx - begin) + cookieSz > size)
  19799. return BUFFER_ERROR;
  19800. #ifdef WOLFSSL_DTLS
  19801. if (cookieSz <= MAX_COOKIE_LEN) {
  19802. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  19803. ssl->arrays->cookieSz = cookieSz;
  19804. }
  19805. #endif
  19806. *inOutIdx += cookieSz;
  19807. }
  19808. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  19809. return 0;
  19810. }
  19811. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  19812. {
  19813. int ret = 0;
  19814. #ifdef HAVE_SECRET_CALLBACK
  19815. /* If a session secret callback exists, we are using that
  19816. * key instead of the saved session key. */
  19817. ret = ret || (ssl->sessionSecretCb != NULL);
  19818. #endif
  19819. #ifdef HAVE_SESSION_TICKET
  19820. /* server may send blank ticket which may not be expected to indicate
  19821. * existing one ok but will also be sending a new one */
  19822. ret = ret || (ssl->session.ticketLen > 0);
  19823. #endif
  19824. ret = ret ||
  19825. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  19826. ssl->session.sessionID, ID_LEN) == 0);
  19827. return ret;
  19828. }
  19829. /* Check the version in the received message is valid and set protocol
  19830. * version to use.
  19831. *
  19832. * ssl The SSL/TLS object.
  19833. * pv The protocol version from the packet.
  19834. * returns 0 on success, otherwise failure.
  19835. */
  19836. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  19837. {
  19838. #ifdef WOLFSSL_TLS13_DRAFT
  19839. if (pv.major == TLS_DRAFT_MAJOR) {
  19840. pv.major = SSLv3_MAJOR;
  19841. pv.minor = TLSv1_3_MINOR;
  19842. }
  19843. #endif
  19844. #ifdef OPENSSL_EXTRA
  19845. if (ssl->CBIS != NULL) {
  19846. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, SSL_SUCCESS);
  19847. }
  19848. #endif
  19849. if (pv.minor > ssl->version.minor) {
  19850. WOLFSSL_MSG("Server using higher version, fatal error");
  19851. return VERSION_ERROR;
  19852. }
  19853. if (pv.minor < ssl->version.minor) {
  19854. WOLFSSL_MSG("server using lower version");
  19855. /* Check for downgrade attack. */
  19856. if (!ssl->options.downgrade) {
  19857. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  19858. return VERSION_ERROR;
  19859. }
  19860. if (pv.minor < ssl->options.minDowngrade) {
  19861. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  19862. return VERSION_ERROR;
  19863. }
  19864. #ifdef HAVE_SECURE_RENEGOTIATION
  19865. if (ssl->secure_renegotiation &&
  19866. ssl->secure_renegotiation->enabled &&
  19867. ssl->options.handShakeDone) {
  19868. WOLFSSL_MSG("Server changed version during scr");
  19869. return VERSION_ERROR;
  19870. }
  19871. #endif
  19872. /* Checks made - OK to downgrade. */
  19873. if (pv.minor == SSLv3_MINOR) {
  19874. /* turn off tls */
  19875. WOLFSSL_MSG("\tdowngrading to SSLv3");
  19876. ssl->options.tls = 0;
  19877. ssl->options.tls1_1 = 0;
  19878. ssl->version.minor = SSLv3_MINOR;
  19879. }
  19880. else if (pv.minor == TLSv1_MINOR) {
  19881. /* turn off tls 1.1+ */
  19882. WOLFSSL_MSG("\tdowngrading to TLSv1");
  19883. ssl->options.tls1_1 = 0;
  19884. ssl->version.minor = TLSv1_MINOR;
  19885. }
  19886. else if (pv.minor == TLSv1_1_MINOR) {
  19887. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  19888. ssl->version.minor = TLSv1_1_MINOR;
  19889. }
  19890. else if (pv.minor == TLSv1_2_MINOR) {
  19891. WOLFSSL_MSG(" downgrading to TLSv1.2");
  19892. ssl->version.minor = TLSv1_2_MINOR;
  19893. }
  19894. }
  19895. #ifdef OPENSSL_EXTRA
  19896. /* check if option is set to not allow the current version
  19897. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  19898. if (!ssl->options.dtls && ssl->options.downgrade &&
  19899. ssl->options.mask > 0) {
  19900. if (ssl->version.minor == TLSv1_2_MINOR &&
  19901. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  19902. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  19903. ssl->version.minor = TLSv1_1_MINOR;
  19904. }
  19905. if (ssl->version.minor == TLSv1_1_MINOR &&
  19906. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  19907. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  19908. ssl->options.tls1_1 = 0;
  19909. ssl->version.minor = TLSv1_MINOR;
  19910. }
  19911. if (ssl->version.minor == TLSv1_MINOR &&
  19912. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  19913. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  19914. ssl->options.tls = 0;
  19915. ssl->options.tls1_1 = 0;
  19916. ssl->version.minor = SSLv3_MINOR;
  19917. }
  19918. if (ssl->version.minor == SSLv3_MINOR &&
  19919. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  19920. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  19921. return VERSION_ERROR;
  19922. }
  19923. if (ssl->version.minor < ssl->options.minDowngrade) {
  19924. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  19925. return VERSION_ERROR;
  19926. }
  19927. }
  19928. #endif
  19929. return 0;
  19930. }
  19931. /* handle processing of server_hello (2) */
  19932. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  19933. word32 helloSz)
  19934. {
  19935. byte cs0; /* cipher suite bytes 0, 1 */
  19936. byte cs1;
  19937. ProtocolVersion pv;
  19938. byte compression;
  19939. word32 i = *inOutIdx;
  19940. word32 begin = i;
  19941. int ret;
  19942. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  19943. WOLFSSL_ENTER("DoServerHello");
  19944. #ifdef WOLFSSL_CALLBACKS
  19945. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  19946. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  19947. #endif
  19948. /* protocol version, random and session id length check */
  19949. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  19950. return BUFFER_ERROR;
  19951. /* protocol version */
  19952. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  19953. i += OPAQUE16_LEN;
  19954. ret = CheckVersion(ssl, pv);
  19955. if (ret != 0)
  19956. return ret;
  19957. #ifdef WOLFSSL_TLS13
  19958. if (IsAtLeastTLSv1_3(pv)) {
  19959. byte type = server_hello;
  19960. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  19961. }
  19962. #endif
  19963. /* random */
  19964. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  19965. i += RAN_LEN;
  19966. /* session id */
  19967. ssl->arrays->sessionIDSz = input[i++];
  19968. if (ssl->arrays->sessionIDSz > ID_LEN) {
  19969. WOLFSSL_MSG("Invalid session ID size");
  19970. ssl->arrays->sessionIDSz = 0;
  19971. return BUFFER_ERROR;
  19972. }
  19973. else if (ssl->arrays->sessionIDSz) {
  19974. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  19975. return BUFFER_ERROR;
  19976. XMEMCPY(ssl->arrays->sessionID, input + i,
  19977. ssl->arrays->sessionIDSz);
  19978. i += ssl->arrays->sessionIDSz;
  19979. ssl->options.haveSessionId = 1;
  19980. }
  19981. /* suite and compression */
  19982. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  19983. return BUFFER_ERROR;
  19984. cs0 = input[i++];
  19985. cs1 = input[i++];
  19986. #ifdef HAVE_SECURE_RENEGOTIATION
  19987. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  19988. ssl->options.handShakeDone) {
  19989. if (ssl->options.cipherSuite0 != cs0 ||
  19990. ssl->options.cipherSuite != cs1) {
  19991. WOLFSSL_MSG("Server changed cipher suite during scr");
  19992. return MATCH_SUITE_ERROR;
  19993. }
  19994. }
  19995. #endif
  19996. ssl->options.cipherSuite0 = cs0;
  19997. ssl->options.cipherSuite = cs1;
  19998. #ifdef WOLFSSL_DEBUG_TLS
  19999. WOLFSSL_MSG("Chosen cipher suite:");
  20000. WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
  20001. ssl->options.cipherSuite));
  20002. #endif
  20003. compression = input[i++];
  20004. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  20005. {
  20006. word32 idx, found = 0;
  20007. /* confirm server_hello cipher suite is one sent in client_hello */
  20008. for (idx = 0; idx < ssl->suites->suiteSz; idx += 2) {
  20009. if (ssl->suites->suites[idx] == cs0 &&
  20010. ssl->suites->suites[idx+1] == cs1) {
  20011. found = 1;
  20012. break;
  20013. }
  20014. }
  20015. if (!found) {
  20016. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  20017. return MATCH_SUITE_ERROR;
  20018. }
  20019. }
  20020. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  20021. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  20022. WOLFSSL_MSG("Server forcing compression w/o support");
  20023. return COMPRESSION_ERROR;
  20024. }
  20025. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  20026. WOLFSSL_MSG("Server refused compression, turning off");
  20027. ssl->options.usingCompression = 0; /* turn off if server refused */
  20028. }
  20029. *inOutIdx = i;
  20030. #ifdef HAVE_TLS_EXTENSIONS
  20031. if ( (i - begin) < helloSz) {
  20032. if (TLSX_SupportExtensions(ssl)) {
  20033. word16 totalExtSz;
  20034. if ((i - begin) + OPAQUE16_LEN > helloSz)
  20035. return BUFFER_ERROR;
  20036. ato16(&input[i], &totalExtSz);
  20037. i += OPAQUE16_LEN;
  20038. if ((i - begin) + totalExtSz > helloSz)
  20039. return BUFFER_ERROR;
  20040. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  20041. server_hello, NULL)))
  20042. return ret;
  20043. i += totalExtSz;
  20044. *inOutIdx = i;
  20045. }
  20046. else
  20047. *inOutIdx = begin + helloSz; /* skip extensions */
  20048. }
  20049. else
  20050. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  20051. #else
  20052. {
  20053. int allowExt = 0;
  20054. byte pendingEMS = 0;
  20055. if ( (i - begin) < helloSz) {
  20056. if (ssl->version.major == SSLv3_MAJOR &&
  20057. ssl->version.minor >= TLSv1_MINOR) {
  20058. allowExt = 1;
  20059. }
  20060. #ifdef WOLFSSL_DTLS
  20061. if (ssl->version.major == DTLS_MAJOR)
  20062. allowExt = 1;
  20063. #endif
  20064. if (allowExt) {
  20065. word16 totalExtSz;
  20066. if ((i - begin) + OPAQUE16_LEN > helloSz)
  20067. return BUFFER_ERROR;
  20068. ato16(&input[i], &totalExtSz);
  20069. i += OPAQUE16_LEN;
  20070. if ((i - begin) + totalExtSz > helloSz)
  20071. return BUFFER_ERROR;
  20072. while (totalExtSz) {
  20073. word16 extId, extSz;
  20074. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  20075. return BUFFER_ERROR;
  20076. ato16(&input[i], &extId);
  20077. i += OPAQUE16_LEN;
  20078. ato16(&input[i], &extSz);
  20079. i += OPAQUE16_LEN;
  20080. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  20081. return BUFFER_ERROR;
  20082. if (extId == HELLO_EXT_EXTMS)
  20083. pendingEMS = 1;
  20084. else
  20085. i += extSz;
  20086. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  20087. }
  20088. *inOutIdx = i;
  20089. }
  20090. else
  20091. *inOutIdx = begin + helloSz; /* skip extensions */
  20092. }
  20093. if (!pendingEMS && ssl->options.haveEMS)
  20094. ssl->options.haveEMS = 0;
  20095. }
  20096. #endif
  20097. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  20098. if (IsEncryptionOn(ssl, 0)) {
  20099. *inOutIdx += ssl->keys.padSz;
  20100. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  20101. if (ssl->options.startedETMWrite &&
  20102. ssl->specs.cipher_type == block) {
  20103. *inOutIdx += MacSize(ssl);
  20104. }
  20105. #endif
  20106. }
  20107. #ifdef HAVE_SECRET_CALLBACK
  20108. if (ssl->sessionSecretCb != NULL) {
  20109. int secretSz = SECRET_LEN;
  20110. ret = ssl->sessionSecretCb(ssl, ssl->session.masterSecret,
  20111. &secretSz, ssl->sessionSecretCtx);
  20112. if (ret != 0 || secretSz != SECRET_LEN)
  20113. return SESSION_SECRET_CB_E;
  20114. }
  20115. #endif /* HAVE_SECRET_CALLBACK */
  20116. ret = CompleteServerHello(ssl);
  20117. WOLFSSL_LEAVE("DoServerHello", ret);
  20118. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  20119. return ret;
  20120. }
  20121. int CompleteServerHello(WOLFSSL* ssl)
  20122. {
  20123. int ret;
  20124. if (!ssl->options.resuming) {
  20125. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  20126. TLS13_DOWNGRADE_SZ - 1;
  20127. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  20128. #ifdef WOLFSSL_TLS13
  20129. if (TLSv1_3_Capable(ssl)) {
  20130. /* TLS v1.3 capable client not allowed to downgrade when
  20131. * connecting to TLS v1.3 capable server unless cipher suite
  20132. * demands it.
  20133. */
  20134. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  20135. (vers == 0 || vers == 1)) {
  20136. SendAlert(ssl, alert_fatal, illegal_parameter);
  20137. return VERSION_ERROR;
  20138. }
  20139. }
  20140. else
  20141. #endif
  20142. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  20143. ssl->ctx->method->version.minor == TLSv1_2_MINOR
  20144. #ifdef OPENSSL_EXTRA
  20145. && (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0
  20146. #endif
  20147. ) {
  20148. /* TLS v1.2 capable client not allowed to downgrade when
  20149. * connecting to TLS v1.2 capable server.
  20150. */
  20151. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  20152. vers == 0) {
  20153. SendAlert(ssl, alert_fatal, illegal_parameter);
  20154. return VERSION_ERROR;
  20155. }
  20156. }
  20157. }
  20158. else {
  20159. if (DSH_CheckSessionId(ssl)) {
  20160. if (SetCipherSpecs(ssl) == 0) {
  20161. XMEMCPY(ssl->arrays->masterSecret,
  20162. ssl->session.masterSecret, SECRET_LEN);
  20163. #ifdef NO_OLD_TLS
  20164. ret = DeriveTlsKeys(ssl);
  20165. #else
  20166. ret = -1; /* default value */
  20167. #ifndef NO_TLS
  20168. if (ssl->options.tls)
  20169. ret = DeriveTlsKeys(ssl);
  20170. #endif
  20171. if (!ssl->options.tls)
  20172. ret = DeriveKeys(ssl);
  20173. #endif /* NO_OLD_TLS */
  20174. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  20175. return ret;
  20176. }
  20177. else {
  20178. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  20179. return UNSUPPORTED_SUITE;
  20180. }
  20181. }
  20182. else {
  20183. WOLFSSL_MSG("Server denied resumption attempt");
  20184. ssl->options.resuming = 0; /* server denied resumption try */
  20185. }
  20186. }
  20187. return SetCipherSpecs(ssl);
  20188. }
  20189. #endif /* !WOLFSSL_NO_TLS12 */
  20190. /* Make sure client setup is valid for this suite, true on success */
  20191. int VerifyClientSuite(WOLFSSL* ssl)
  20192. {
  20193. #ifndef NO_PSK
  20194. int havePSK = ssl->options.havePSK;
  20195. #endif
  20196. byte first = ssl->options.cipherSuite0;
  20197. byte second = ssl->options.cipherSuite;
  20198. WOLFSSL_ENTER("VerifyClientSuite");
  20199. if (CipherRequires(first, second, REQUIRES_PSK)) {
  20200. WOLFSSL_MSG("Requires PSK");
  20201. #ifndef NO_PSK
  20202. if (havePSK == 0)
  20203. #endif
  20204. {
  20205. WOLFSSL_MSG("Don't have PSK");
  20206. return 0;
  20207. }
  20208. }
  20209. return 1; /* success */
  20210. }
  20211. #ifndef WOLFSSL_NO_TLS12
  20212. #ifndef NO_CERTS
  20213. /* handle processing of certificate_request (13) */
  20214. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  20215. inOutIdx, word32 size)
  20216. {
  20217. word16 len;
  20218. word32 begin = *inOutIdx;
  20219. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
  20220. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  20221. int ret;
  20222. #endif
  20223. #ifdef OPENSSL_EXTRA
  20224. WOLFSSL_X509* x509 = NULL;
  20225. WOLFSSL_EVP_PKEY* pkey = NULL;
  20226. #endif
  20227. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  20228. WOLFSSL_ENTER("DoCertificateRequest");
  20229. #ifdef WOLFSSL_CALLBACKS
  20230. if (ssl->hsInfoOn)
  20231. AddPacketName(ssl, "CertificateRequest");
  20232. if (ssl->toInfoOn)
  20233. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  20234. #endif
  20235. if (OPAQUE8_LEN > size)
  20236. return BUFFER_ERROR;
  20237. len = input[(*inOutIdx)++];
  20238. if ((*inOutIdx - begin) + len > size)
  20239. return BUFFER_ERROR;
  20240. /* types, read in here */
  20241. *inOutIdx += len;
  20242. /* signature and hash signature algorithm */
  20243. if (IsAtLeastTLSv1_2(ssl)) {
  20244. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  20245. return BUFFER_ERROR;
  20246. ato16(input + *inOutIdx, &len);
  20247. *inOutIdx += OPAQUE16_LEN;
  20248. if ((len > size) || ((*inOutIdx - begin) + len > size))
  20249. return BUFFER_ERROR;
  20250. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  20251. ssl->buffers.certificate &&
  20252. ssl->buffers.certificate->buffer) {
  20253. #ifdef HAVE_PK_CALLBACKS
  20254. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  20255. WOLFSSL_MSG("Using PK for client private key");
  20256. return INVALID_PARAMETER;
  20257. }
  20258. #endif
  20259. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  20260. return INVALID_PARAMETER;
  20261. }
  20262. }
  20263. *inOutIdx += len;
  20264. #ifdef WC_RSA_PSS
  20265. ssl->pssAlgo = 0;
  20266. if (ssl->suites->sigAlgo == rsa_pss_sa_algo)
  20267. ssl->pssAlgo |= 1 << ssl->suites->hashAlgo;
  20268. #endif
  20269. }
  20270. /* authorities */
  20271. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  20272. return BUFFER_ERROR;
  20273. /* DN seq length */
  20274. ato16(input + *inOutIdx, &len);
  20275. *inOutIdx += OPAQUE16_LEN;
  20276. if ((*inOutIdx - begin) + len > size)
  20277. return BUFFER_ERROR;
  20278. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  20279. if (ssl->ca_names != ssl->ctx->ca_names)
  20280. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  20281. ssl->ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  20282. if (ssl->ca_names == NULL) {
  20283. return MEMORY_ERROR;
  20284. }
  20285. #endif
  20286. while (len) {
  20287. word16 dnSz;
  20288. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  20289. return BUFFER_ERROR;
  20290. ato16(input + *inOutIdx, &dnSz);
  20291. *inOutIdx += OPAQUE16_LEN;
  20292. if ((*inOutIdx - begin) + dnSz > size)
  20293. return BUFFER_ERROR;
  20294. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  20295. {
  20296. /* Use a DecodedCert struct to get access to GetName to
  20297. * parse DN name */
  20298. DecodedCert cert;
  20299. WOLFSSL_X509_NAME* name;
  20300. InitDecodedCert(&cert, input + *inOutIdx, dnSz, ssl->heap);
  20301. if ((ret = GetName(&cert, SUBJECT, dnSz)) != 0) {
  20302. FreeDecodedCert(&cert);
  20303. return ret;
  20304. }
  20305. if ((name = wolfSSL_X509_NAME_new()) == NULL) {
  20306. FreeDecodedCert(&cert);
  20307. return MEMORY_ERROR;
  20308. }
  20309. CopyDecodedName(name, &cert, SUBJECT);
  20310. if (wolfSSL_sk_X509_NAME_push(ssl->ca_names, name)
  20311. == WOLFSSL_FAILURE) {
  20312. FreeDecodedCert(&cert);
  20313. wolfSSL_X509_NAME_free(name);
  20314. return MEMORY_ERROR;
  20315. }
  20316. FreeDecodedCert(&cert);
  20317. }
  20318. #endif
  20319. *inOutIdx += dnSz;
  20320. len -= OPAQUE16_LEN + dnSz;
  20321. }
  20322. #ifdef OPENSSL_EXTRA
  20323. /* call client cert callback if no cert has been loaded */
  20324. if ((ssl->ctx->CBClientCert != NULL) &&
  20325. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  20326. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  20327. if (ret == 1) {
  20328. if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
  20329. (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
  20330. return CLIENT_CERT_CB_ERROR;
  20331. }
  20332. wolfSSL_X509_free(x509);
  20333. wolfSSL_EVP_PKEY_free(pkey);
  20334. } else if (ret < 0) {
  20335. return WOLFSSL_ERROR_WANT_X509_LOOKUP;
  20336. }
  20337. }
  20338. if ((ret = CertSetupCbWrapper(ssl)) != 0)
  20339. return ret;
  20340. #endif
  20341. /* don't send client cert or cert verify if user hasn't provided
  20342. cert and private key */
  20343. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  20344. #ifdef HAVE_PK_CALLBACKS
  20345. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  20346. WOLFSSL_MSG("Using PK for client private key");
  20347. ssl->options.sendVerify = SEND_CERT;
  20348. }
  20349. #endif
  20350. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  20351. ssl->options.sendVerify = SEND_CERT;
  20352. }
  20353. }
  20354. #ifdef OPENSSL_EXTRA
  20355. else
  20356. #else
  20357. else if (IsTLS(ssl))
  20358. #endif
  20359. {
  20360. ssl->options.sendVerify = SEND_BLANK_CERT;
  20361. }
  20362. if (IsEncryptionOn(ssl, 0)) {
  20363. *inOutIdx += ssl->keys.padSz;
  20364. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  20365. if (ssl->options.startedETMRead)
  20366. *inOutIdx += MacSize(ssl);
  20367. #endif
  20368. }
  20369. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  20370. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  20371. return 0;
  20372. }
  20373. #endif /* !NO_CERTS */
  20374. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  20375. static int CheckCurveId(int tlsCurveId)
  20376. {
  20377. int ret = ECC_CURVE_ERROR;
  20378. switch (tlsCurveId) {
  20379. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  20380. #ifndef NO_ECC_SECP
  20381. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  20382. #endif /* !NO_ECC_SECP */
  20383. #ifdef HAVE_ECC_SECPR2
  20384. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  20385. #endif /* HAVE_ECC_SECPR2 */
  20386. #ifdef HAVE_ECC_KOBLITZ
  20387. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  20388. #endif /* HAVE_ECC_KOBLITZ */
  20389. #endif
  20390. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  20391. #ifndef NO_ECC_SECP
  20392. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  20393. #endif /* !NO_ECC_SECP */
  20394. #ifdef HAVE_ECC_KOBLITZ
  20395. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  20396. #endif /* HAVE_ECC_KOBLITZ */
  20397. #endif
  20398. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  20399. #ifndef NO_ECC_SECP
  20400. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  20401. #endif /* !NO_ECC_SECP */
  20402. #ifdef HAVE_ECC_KOBLITZ
  20403. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  20404. #endif /* HAVE_ECC_KOBLITZ */
  20405. #endif
  20406. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  20407. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  20408. #endif
  20409. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  20410. #ifndef NO_ECC_SECP
  20411. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  20412. #endif /* !NO_ECC_SECP */
  20413. #ifdef HAVE_ECC_KOBLITZ
  20414. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  20415. #endif /* HAVE_ECC_KOBLITZ */
  20416. #ifdef HAVE_ECC_BRAINPOOL
  20417. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  20418. #endif /* HAVE_ECC_BRAINPOOL */
  20419. #endif
  20420. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  20421. case WOLFSSL_ECC_X448: return ECC_X448_OID;
  20422. #endif
  20423. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  20424. #ifndef NO_ECC_SECP
  20425. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  20426. #endif /* !NO_ECC_SECP */
  20427. #ifdef HAVE_ECC_BRAINPOOL
  20428. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  20429. #endif /* HAVE_ECC_BRAINPOOL */
  20430. #endif
  20431. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  20432. #ifdef HAVE_ECC_BRAINPOOL
  20433. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  20434. #endif /* HAVE_ECC_BRAINPOOL */
  20435. #endif
  20436. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  20437. #ifndef NO_ECC_SECP
  20438. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  20439. #endif /* !NO_ECC_SECP */
  20440. #endif
  20441. default: break;
  20442. }
  20443. return ret;
  20444. }
  20445. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  20446. /* Persistable DoServerKeyExchange arguments */
  20447. typedef struct DskeArgs {
  20448. byte* output; /* not allocated */
  20449. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20450. defined(HAVE_CURVE448)
  20451. byte* verifySig;
  20452. #endif
  20453. word32 idx;
  20454. word32 begin;
  20455. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20456. defined(HAVE_CURVE448)
  20457. word16 verifySigSz;
  20458. #endif
  20459. word16 sigSz;
  20460. byte sigAlgo;
  20461. byte hashAlgo;
  20462. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  20463. int bits;
  20464. #endif
  20465. } DskeArgs;
  20466. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  20467. {
  20468. DskeArgs* args = (DskeArgs*)pArgs;
  20469. (void)ssl;
  20470. (void)args;
  20471. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20472. defined(HAVE_CURVE448)
  20473. if (args->verifySig) {
  20474. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20475. args->verifySig = NULL;
  20476. }
  20477. #endif
  20478. }
  20479. #ifndef NO_DH
  20480. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  20481. DskeArgs* args)
  20482. {
  20483. int ret = 0;
  20484. word16 length;
  20485. #ifdef HAVE_FFDHE
  20486. #ifdef HAVE_PUBLIC_FFDHE
  20487. const DhParams* params = NULL;
  20488. #endif
  20489. word16 group = 0;
  20490. #endif
  20491. if (ssl->buffers.weOwnDH) {
  20492. if (ssl->buffers.serverDH_P.buffer) {
  20493. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  20494. DYNAMIC_TYPE_PUBLIC_KEY);
  20495. ssl->buffers.serverDH_P.buffer = NULL;
  20496. }
  20497. if (ssl->buffers.serverDH_G.buffer) {
  20498. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  20499. DYNAMIC_TYPE_PUBLIC_KEY);
  20500. ssl->buffers.serverDH_G.buffer = NULL;
  20501. }
  20502. }
  20503. if (ssl->buffers.serverDH_Pub.buffer) {
  20504. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
  20505. DYNAMIC_TYPE_PUBLIC_KEY);
  20506. ssl->buffers.serverDH_Pub.buffer = NULL;
  20507. }
  20508. /* p */
  20509. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  20510. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  20511. }
  20512. ato16(input + args->idx, &length);
  20513. args->idx += OPAQUE16_LEN;
  20514. if ((args->idx - args->begin) + length > size) {
  20515. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  20516. }
  20517. if (length < ssl->options.minDhKeySz) {
  20518. WOLFSSL_MSG("Server using a DH key that is too small");
  20519. SendAlert(ssl, alert_fatal, handshake_failure);
  20520. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  20521. }
  20522. if (length > ssl->options.maxDhKeySz) {
  20523. WOLFSSL_MSG("Server using a DH key that is too big");
  20524. SendAlert(ssl, alert_fatal, handshake_failure);
  20525. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  20526. }
  20527. ssl->buffers.serverDH_P.buffer =
  20528. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  20529. if (ssl->buffers.serverDH_P.buffer) {
  20530. ssl->buffers.serverDH_P.length = length;
  20531. }
  20532. else {
  20533. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  20534. }
  20535. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  20536. length);
  20537. args->idx += length;
  20538. ssl->options.dhKeySz = length;
  20539. /* g */
  20540. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  20541. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  20542. DYNAMIC_TYPE_PUBLIC_KEY);
  20543. ssl->buffers.serverDH_P.buffer = NULL;
  20544. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  20545. }
  20546. ato16(input + args->idx, &length);
  20547. args->idx += OPAQUE16_LEN;
  20548. if ((args->idx - args->begin) + length > size) {
  20549. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  20550. DYNAMIC_TYPE_PUBLIC_KEY);
  20551. ssl->buffers.serverDH_P.buffer = NULL;
  20552. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  20553. }
  20554. if (length > ssl->options.maxDhKeySz) {
  20555. WOLFSSL_MSG("Server using a DH key generator that is too big");
  20556. SendAlert(ssl, alert_fatal, handshake_failure);
  20557. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  20558. DYNAMIC_TYPE_PUBLIC_KEY);
  20559. ssl->buffers.serverDH_P.buffer = NULL;
  20560. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  20561. }
  20562. ssl->buffers.serverDH_G.buffer =
  20563. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  20564. if (ssl->buffers.serverDH_G.buffer) {
  20565. ssl->buffers.serverDH_G.length = length;
  20566. }
  20567. else {
  20568. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  20569. DYNAMIC_TYPE_PUBLIC_KEY);
  20570. ssl->buffers.serverDH_P.buffer = NULL;
  20571. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  20572. }
  20573. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  20574. length);
  20575. args->idx += length;
  20576. /* pub */
  20577. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  20578. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  20579. DYNAMIC_TYPE_PUBLIC_KEY);
  20580. ssl->buffers.serverDH_P.buffer = NULL;
  20581. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  20582. DYNAMIC_TYPE_PUBLIC_KEY);
  20583. ssl->buffers.serverDH_G.buffer = NULL;
  20584. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  20585. }
  20586. ato16(input + args->idx, &length);
  20587. args->idx += OPAQUE16_LEN;
  20588. if ((args->idx - args->begin) + length > size) {
  20589. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  20590. DYNAMIC_TYPE_PUBLIC_KEY);
  20591. ssl->buffers.serverDH_P.buffer = NULL;
  20592. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  20593. DYNAMIC_TYPE_PUBLIC_KEY);
  20594. ssl->buffers.serverDH_G.buffer = NULL;
  20595. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  20596. }
  20597. if (length > ssl->options.maxDhKeySz) {
  20598. WOLFSSL_MSG("Server using a public DH key that is too big");
  20599. SendAlert(ssl, alert_fatal, handshake_failure);
  20600. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  20601. DYNAMIC_TYPE_PUBLIC_KEY);
  20602. ssl->buffers.serverDH_P.buffer = NULL;
  20603. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  20604. DYNAMIC_TYPE_PUBLIC_KEY);
  20605. ssl->buffers.serverDH_G.buffer = NULL;
  20606. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  20607. }
  20608. ssl->buffers.serverDH_Pub.buffer =
  20609. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  20610. if (ssl->buffers.serverDH_Pub.buffer) {
  20611. ssl->buffers.serverDH_Pub.length = length;
  20612. }
  20613. else {
  20614. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  20615. DYNAMIC_TYPE_PUBLIC_KEY);
  20616. ssl->buffers.serverDH_P.buffer = NULL;
  20617. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  20618. DYNAMIC_TYPE_PUBLIC_KEY);
  20619. ssl->buffers.serverDH_G.buffer = NULL;
  20620. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  20621. }
  20622. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  20623. length);
  20624. ssl->buffers.weOwnDH = 1;
  20625. args->idx += length;
  20626. #ifdef HAVE_FFDHE
  20627. switch (ssl->options.dhKeySz) {
  20628. #ifdef HAVE_FFDHE_2048
  20629. case 2048/8:
  20630. #ifdef HAVE_PUBLIC_FFDHE
  20631. params = wc_Dh_ffdhe2048_Get();
  20632. #endif
  20633. group = WOLFSSL_FFDHE_2048;
  20634. break;
  20635. #endif
  20636. #ifdef HAVE_FFDHE_3072
  20637. case 3072/8:
  20638. #ifdef HAVE_PUBLIC_FFDHE
  20639. params = wc_Dh_ffdhe3072_Get();
  20640. #endif
  20641. group = WOLFSSL_FFDHE_3072;
  20642. break;
  20643. #endif
  20644. #ifdef HAVE_FFDHE_4096
  20645. case 4096/8:
  20646. #ifdef HAVE_PUBLIC_FFDHE
  20647. params = wc_Dh_ffdhe4096_Get();
  20648. #endif
  20649. group = WOLFSSL_FFDHE_4096;
  20650. break;
  20651. #endif
  20652. #ifdef HAVE_FFDHE_6144
  20653. case 6144/8:
  20654. #ifdef HAVE_PUBLIC_FFDHE
  20655. params = wc_Dh_ffdhe6144_Get();
  20656. #endif
  20657. group = WOLFSSL_FFDHE_6144;
  20658. break;
  20659. #endif
  20660. #ifdef HAVE_FFDHE_8192
  20661. case 8192/8:
  20662. #ifdef HAVE_PUBLIC_FFDHE
  20663. params = wc_Dh_ffdhe8192_Get();
  20664. #endif
  20665. group = WOLFSSL_FFDHE_8192;
  20666. break;
  20667. #endif
  20668. default:
  20669. break;
  20670. }
  20671. #ifdef HAVE_PUBLIC_FFDHE
  20672. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  20673. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  20674. params->g_len) != 0) ||
  20675. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  20676. params->p_len) != 0))
  20677. #else
  20678. if (!wc_DhCmpNamedKey(group, 1,
  20679. ssl->buffers.serverDH_P.buffer, ssl->buffers.serverDH_P.length,
  20680. ssl->buffers.serverDH_G.buffer, ssl->buffers.serverDH_G.length,
  20681. NULL, 0))
  20682. #endif
  20683. {
  20684. WOLFSSL_MSG("Server not using FFDHE parameters");
  20685. #ifdef WOLFSSL_REQUIRE_FFDHE
  20686. SendAlert(ssl, alert_fatal, handshake_failure);
  20687. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  20688. #endif
  20689. }
  20690. else {
  20691. ssl->namedGroup = group;
  20692. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  20693. !defined(HAVE_SELFTEST)
  20694. ssl->options.dhDoKeyTest = 0;
  20695. #endif
  20696. }
  20697. #endif /* HAVE_FFDHE */
  20698. exit_gdpk:
  20699. return ret;
  20700. }
  20701. #endif
  20702. /* handle processing of server_key_exchange (12) */
  20703. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  20704. word32* inOutIdx, word32 size)
  20705. {
  20706. int ret = 0;
  20707. #ifdef WOLFSSL_ASYNC_CRYPT
  20708. DskeArgs* args = (DskeArgs*)ssl->async.args;
  20709. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  20710. (void)sizeof(args_test);
  20711. #else
  20712. DskeArgs args[1];
  20713. #endif
  20714. (void)input;
  20715. (void)size;
  20716. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  20717. WOLFSSL_ENTER("DoServerKeyExchange");
  20718. #ifdef WOLFSSL_ASYNC_CRYPT
  20719. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  20720. if (ret != WC_NOT_PENDING_E) {
  20721. /* Check for error */
  20722. if (ret < 0)
  20723. goto exit_dske;
  20724. }
  20725. else
  20726. #endif
  20727. {
  20728. /* Reset state */
  20729. ret = 0;
  20730. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  20731. XMEMSET(args, 0, sizeof(DskeArgs));
  20732. args->idx = *inOutIdx;
  20733. args->begin = *inOutIdx;
  20734. args->sigAlgo = ssl->specs.sig_algo;
  20735. args->hashAlgo = sha_mac;
  20736. #ifdef WOLFSSL_ASYNC_CRYPT
  20737. ssl->async.freeArgs = FreeDskeArgs;
  20738. #endif
  20739. }
  20740. switch(ssl->options.asyncState)
  20741. {
  20742. case TLS_ASYNC_BEGIN:
  20743. {
  20744. #ifdef WOLFSSL_CALLBACKS
  20745. if (ssl->hsInfoOn)
  20746. AddPacketName(ssl, "ServerKeyExchange");
  20747. if (ssl->toInfoOn)
  20748. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  20749. #endif
  20750. switch(ssl->specs.kea)
  20751. {
  20752. #ifndef NO_PSK
  20753. case psk_kea:
  20754. {
  20755. int srvHintLen;
  20756. word16 length;
  20757. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  20758. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20759. }
  20760. ato16(input + args->idx, &length);
  20761. args->idx += OPAQUE16_LEN;
  20762. if ((args->idx - args->begin) + length > size) {
  20763. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20764. }
  20765. /* get PSK server hint from the wire */
  20766. srvHintLen = min(length, MAX_PSK_ID_LEN);
  20767. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  20768. srvHintLen);
  20769. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  20770. args->idx += length;
  20771. break;
  20772. }
  20773. #endif /* !NO_PSK */
  20774. #ifndef NO_DH
  20775. case diffie_hellman_kea:
  20776. {
  20777. ret = GetDhPublicKey(ssl, input, size, args);
  20778. if (ret != 0)
  20779. goto exit_dske;
  20780. break;
  20781. }
  20782. #endif /* !NO_DH */
  20783. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20784. defined(HAVE_CURVE448)
  20785. case ecc_diffie_hellman_kea:
  20786. {
  20787. byte b;
  20788. #ifdef HAVE_ECC
  20789. int curveId;
  20790. #endif
  20791. int curveOid;
  20792. word16 length;
  20793. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  20794. OPAQUE8_LEN > size) {
  20795. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20796. }
  20797. b = input[args->idx++];
  20798. if (b != named_curve) {
  20799. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  20800. }
  20801. args->idx += 1; /* curve type, eat leading 0 */
  20802. b = input[args->idx++];
  20803. if ((curveOid = CheckCurveId(b)) < 0) {
  20804. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  20805. }
  20806. ssl->ecdhCurveOID = curveOid;
  20807. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  20808. ssl->namedGroup = 0;
  20809. #endif
  20810. length = input[args->idx++];
  20811. if ((args->idx - args->begin) + length > size) {
  20812. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20813. }
  20814. #ifdef HAVE_CURVE25519
  20815. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  20816. if (ssl->peerX25519Key == NULL) {
  20817. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  20818. (void**)&ssl->peerX25519Key);
  20819. if (ret != 0) {
  20820. goto exit_dske;
  20821. }
  20822. } else if (ssl->peerX25519KeyPresent) {
  20823. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  20824. ssl->peerX25519Key);
  20825. ssl->peerX25519KeyPresent = 0;
  20826. if (ret != 0) {
  20827. goto exit_dske;
  20828. }
  20829. }
  20830. if ((ret = wc_curve25519_check_public(
  20831. input + args->idx, length,
  20832. EC25519_LITTLE_ENDIAN)) != 0) {
  20833. #ifdef WOLFSSL_EXTRA_ALERTS
  20834. if (ret == BUFFER_E)
  20835. SendAlert(ssl, alert_fatal, decode_error);
  20836. else if (ret == ECC_OUT_OF_RANGE_E)
  20837. SendAlert(ssl, alert_fatal, bad_record_mac);
  20838. else {
  20839. SendAlert(ssl, alert_fatal, illegal_parameter);
  20840. }
  20841. #endif
  20842. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  20843. }
  20844. if (wc_curve25519_import_public_ex(input + args->idx,
  20845. length, ssl->peerX25519Key,
  20846. EC25519_LITTLE_ENDIAN) != 0) {
  20847. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  20848. }
  20849. args->idx += length;
  20850. ssl->peerX25519KeyPresent = 1;
  20851. break;
  20852. }
  20853. #endif
  20854. #ifdef HAVE_CURVE448
  20855. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  20856. if (ssl->peerX448Key == NULL) {
  20857. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  20858. (void**)&ssl->peerX448Key);
  20859. if (ret != 0) {
  20860. goto exit_dske;
  20861. }
  20862. } else if (ssl->peerX448KeyPresent) {
  20863. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  20864. ssl->peerX448Key);
  20865. ssl->peerX448KeyPresent = 0;
  20866. if (ret != 0) {
  20867. goto exit_dske;
  20868. }
  20869. }
  20870. if ((ret = wc_curve448_check_public(
  20871. input + args->idx, length,
  20872. EC448_LITTLE_ENDIAN)) != 0) {
  20873. #ifdef WOLFSSL_EXTRA_ALERTS
  20874. if (ret == BUFFER_E)
  20875. SendAlert(ssl, alert_fatal, decode_error);
  20876. else if (ret == ECC_OUT_OF_RANGE_E)
  20877. SendAlert(ssl, alert_fatal, bad_record_mac);
  20878. else {
  20879. SendAlert(ssl, alert_fatal, illegal_parameter);
  20880. }
  20881. #endif
  20882. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  20883. }
  20884. if (wc_curve448_import_public_ex(input + args->idx,
  20885. length, ssl->peerX448Key,
  20886. EC448_LITTLE_ENDIAN) != 0) {
  20887. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  20888. }
  20889. args->idx += length;
  20890. ssl->peerX448KeyPresent = 1;
  20891. break;
  20892. }
  20893. #endif
  20894. #ifdef HAVE_ECC
  20895. if (ssl->peerEccKey == NULL) {
  20896. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  20897. (void**)&ssl->peerEccKey);
  20898. if (ret != 0) {
  20899. goto exit_dske;
  20900. }
  20901. } else if (ssl->peerEccKeyPresent) {
  20902. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  20903. ssl->peerEccKeyPresent = 0;
  20904. if (ret != 0) {
  20905. goto exit_dske;
  20906. }
  20907. }
  20908. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  20909. if (wc_ecc_import_x963_ex(input + args->idx, length,
  20910. ssl->peerEccKey, curveId) != 0) {
  20911. #ifdef WOLFSSL_EXTRA_ALERTS
  20912. SendAlert(ssl, alert_fatal, illegal_parameter);
  20913. #endif
  20914. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  20915. }
  20916. args->idx += length;
  20917. ssl->peerEccKeyPresent = 1;
  20918. #endif
  20919. break;
  20920. }
  20921. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  20922. #if !defined(NO_DH) && !defined(NO_PSK)
  20923. case dhe_psk_kea:
  20924. {
  20925. int srvHintLen;
  20926. word16 length;
  20927. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  20928. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20929. }
  20930. ato16(input + args->idx, &length);
  20931. args->idx += OPAQUE16_LEN;
  20932. if ((args->idx - args->begin) + length > size) {
  20933. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20934. }
  20935. /* get PSK server hint from the wire */
  20936. srvHintLen = min(length, MAX_PSK_ID_LEN);
  20937. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  20938. srvHintLen);
  20939. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  20940. args->idx += length;
  20941. ret = GetDhPublicKey(ssl, input, size, args);
  20942. if (ret != 0)
  20943. goto exit_dske;
  20944. break;
  20945. }
  20946. #endif /* !NO_DH && !NO_PSK */
  20947. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20948. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  20949. case ecdhe_psk_kea:
  20950. {
  20951. byte b;
  20952. int curveOid, curveId;
  20953. int srvHintLen;
  20954. word16 length;
  20955. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  20956. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20957. }
  20958. ato16(input + args->idx, &length);
  20959. args->idx += OPAQUE16_LEN;
  20960. if ((args->idx - args->begin) + length > size) {
  20961. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20962. }
  20963. /* get PSK server hint from the wire */
  20964. srvHintLen = min(length, MAX_PSK_ID_LEN);
  20965. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  20966. srvHintLen);
  20967. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  20968. args->idx += length;
  20969. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  20970. OPAQUE8_LEN > size) {
  20971. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20972. }
  20973. /* Check curve name and ID */
  20974. b = input[args->idx++];
  20975. if (b != named_curve) {
  20976. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  20977. }
  20978. args->idx += 1; /* curve type, eat leading 0 */
  20979. b = input[args->idx++];
  20980. if ((curveOid = CheckCurveId(b)) < 0) {
  20981. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  20982. }
  20983. length = input[args->idx++];
  20984. if ((args->idx - args->begin) + length > size) {
  20985. ERROR_OUT(BUFFER_ERROR, exit_dske);
  20986. }
  20987. #ifdef HAVE_CURVE25519
  20988. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  20989. if (ssl->peerX25519Key == NULL) {
  20990. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  20991. (void**)&ssl->peerX25519Key);
  20992. if (ret != 0) {
  20993. goto exit_dske;
  20994. }
  20995. } else if (ssl->peerEccKeyPresent) {
  20996. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  20997. ssl->peerX25519Key);
  20998. ssl->peerX25519KeyPresent = 0;
  20999. if (ret != 0) {
  21000. goto exit_dske;
  21001. }
  21002. }
  21003. if ((ret = wc_curve25519_check_public(
  21004. input + args->idx, length,
  21005. EC25519_LITTLE_ENDIAN)) != 0) {
  21006. #ifdef WOLFSSL_EXTRA_ALERTS
  21007. if (ret == BUFFER_E)
  21008. SendAlert(ssl, alert_fatal, decode_error);
  21009. else if (ret == ECC_OUT_OF_RANGE_E)
  21010. SendAlert(ssl, alert_fatal, bad_record_mac);
  21011. else {
  21012. SendAlert(ssl, alert_fatal, illegal_parameter);
  21013. }
  21014. #endif
  21015. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21016. }
  21017. if (wc_curve25519_import_public_ex(input + args->idx,
  21018. length, ssl->peerX25519Key,
  21019. EC25519_LITTLE_ENDIAN) != 0) {
  21020. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21021. }
  21022. args->idx += length;
  21023. ssl->peerX25519KeyPresent = 1;
  21024. break;
  21025. }
  21026. #endif
  21027. #ifdef HAVE_CURVE448
  21028. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  21029. if (ssl->peerX448Key == NULL) {
  21030. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  21031. (void**)&ssl->peerX448Key);
  21032. if (ret != 0) {
  21033. goto exit_dske;
  21034. }
  21035. } else if (ssl->peerEccKeyPresent) {
  21036. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  21037. ssl->peerX448Key);
  21038. ssl->peerX448KeyPresent = 0;
  21039. if (ret != 0) {
  21040. goto exit_dske;
  21041. }
  21042. }
  21043. if ((ret = wc_curve448_check_public(
  21044. input + args->idx, length,
  21045. EC448_LITTLE_ENDIAN)) != 0) {
  21046. #ifdef WOLFSSL_EXTRA_ALERTS
  21047. if (ret == BUFFER_E)
  21048. SendAlert(ssl, alert_fatal, decode_error);
  21049. else if (ret == ECC_OUT_OF_RANGE_E)
  21050. SendAlert(ssl, alert_fatal, bad_record_mac);
  21051. else {
  21052. SendAlert(ssl, alert_fatal, illegal_parameter);
  21053. }
  21054. #endif
  21055. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21056. }
  21057. if (wc_curve448_import_public_ex(input + args->idx,
  21058. length, ssl->peerX448Key,
  21059. EC448_LITTLE_ENDIAN) != 0) {
  21060. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21061. }
  21062. args->idx += length;
  21063. ssl->peerX448KeyPresent = 1;
  21064. break;
  21065. }
  21066. #endif
  21067. if (ssl->peerEccKey == NULL) {
  21068. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  21069. (void**)&ssl->peerEccKey);
  21070. if (ret != 0) {
  21071. goto exit_dske;
  21072. }
  21073. } else if (ssl->peerEccKeyPresent) {
  21074. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  21075. ssl->peerEccKeyPresent = 0;
  21076. if (ret != 0) {
  21077. goto exit_dske;
  21078. }
  21079. }
  21080. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  21081. if (wc_ecc_import_x963_ex(input + args->idx, length,
  21082. ssl->peerEccKey, curveId) != 0) {
  21083. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21084. }
  21085. args->idx += length;
  21086. ssl->peerEccKeyPresent = 1;
  21087. break;
  21088. }
  21089. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  21090. default:
  21091. ret = BAD_KEA_TYPE_E;
  21092. } /* switch(ssl->specs.kea) */
  21093. /* Check for error */
  21094. if (ret != 0) {
  21095. goto exit_dske;
  21096. }
  21097. /* Advance state and proceed */
  21098. ssl->options.asyncState = TLS_ASYNC_BUILD;
  21099. } /* case TLS_ASYNC_BEGIN */
  21100. FALL_THROUGH;
  21101. case TLS_ASYNC_BUILD:
  21102. {
  21103. switch(ssl->specs.kea)
  21104. {
  21105. case psk_kea:
  21106. case dhe_psk_kea:
  21107. case ecdhe_psk_kea:
  21108. {
  21109. /* Nothing to do in this sub-state */
  21110. break;
  21111. }
  21112. case diffie_hellman_kea:
  21113. case ecc_diffie_hellman_kea:
  21114. {
  21115. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  21116. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  21117. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  21118. #else
  21119. enum wc_HashType hashType;
  21120. word16 verifySz;
  21121. if (ssl->options.usingAnon_cipher) {
  21122. break;
  21123. }
  21124. verifySz = (word16)(args->idx - args->begin);
  21125. if (verifySz > MAX_DH_SZ) {
  21126. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21127. }
  21128. if (IsAtLeastTLSv1_2(ssl)) {
  21129. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  21130. size) {
  21131. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21132. }
  21133. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  21134. &args->sigAlgo);
  21135. args->idx += 2;
  21136. hashType = HashAlgoToType(args->hashAlgo);
  21137. if (hashType == WC_HASH_TYPE_NONE) {
  21138. ERROR_OUT(ALGO_ID_E, exit_dske);
  21139. }
  21140. } else {
  21141. /* only using sha and md5 for rsa */
  21142. #ifndef NO_OLD_TLS
  21143. hashType = WC_HASH_TYPE_SHA;
  21144. if (args->sigAlgo == rsa_sa_algo) {
  21145. hashType = WC_HASH_TYPE_MD5_SHA;
  21146. }
  21147. #else
  21148. ERROR_OUT(ALGO_ID_E, exit_dske);
  21149. #endif
  21150. }
  21151. /* signature */
  21152. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  21153. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21154. }
  21155. ato16(input + args->idx, &args->verifySigSz);
  21156. args->idx += OPAQUE16_LEN;
  21157. if ((args->idx - args->begin) + args->verifySigSz > size) {
  21158. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21159. }
  21160. /* buffer for signature */
  21161. ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + verifySz,
  21162. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21163. if (ssl->buffers.sig.buffer == NULL) {
  21164. ERROR_OUT(MEMORY_E, exit_dske);
  21165. }
  21166. ssl->buffers.sig.length = SEED_LEN + verifySz;
  21167. /* build message to hash */
  21168. XMEMCPY(ssl->buffers.sig.buffer,
  21169. ssl->arrays->clientRandom, RAN_LEN);
  21170. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN],
  21171. ssl->arrays->serverRandom, RAN_LEN);
  21172. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2],
  21173. input + args->begin, verifySz); /* message */
  21174. if (args->sigAlgo != ed25519_sa_algo) {
  21175. int digest_sz = wc_HashGetDigestSize(hashType);
  21176. if (digest_sz <= 0) {
  21177. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21178. }
  21179. ssl->buffers.digest.length = (unsigned int)digest_sz;
  21180. /* buffer for hash */
  21181. ssl->buffers.digest.buffer = (byte*)XMALLOC(
  21182. ssl->buffers.digest.length, ssl->heap,
  21183. DYNAMIC_TYPE_DIGEST);
  21184. if (ssl->buffers.digest.buffer == NULL) {
  21185. ERROR_OUT(MEMORY_E, exit_dske);
  21186. }
  21187. /* Perform hash */
  21188. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  21189. ssl->buffers.sig.length,
  21190. ssl->buffers.digest.buffer,
  21191. ssl->buffers.digest.length);
  21192. if (ret != 0) {
  21193. goto exit_dske;
  21194. }
  21195. }
  21196. switch (args->sigAlgo)
  21197. {
  21198. #ifndef NO_RSA
  21199. #ifdef WC_RSA_PSS
  21200. case rsa_pss_sa_algo:
  21201. #endif
  21202. case rsa_sa_algo:
  21203. {
  21204. if (ssl->peerRsaKey == NULL ||
  21205. !ssl->peerRsaKeyPresent) {
  21206. ERROR_OUT(NO_PEER_KEY, exit_dske);
  21207. }
  21208. break;
  21209. }
  21210. #endif /* !NO_RSA */
  21211. #ifdef HAVE_ECC
  21212. case ecc_dsa_sa_algo:
  21213. {
  21214. if (!ssl->peerEccDsaKeyPresent) {
  21215. ERROR_OUT(NO_PEER_KEY, exit_dske);
  21216. }
  21217. break;
  21218. }
  21219. #endif /* HAVE_ECC */
  21220. #if defined(HAVE_ED25519)
  21221. case ed25519_sa_algo:
  21222. {
  21223. if (!ssl->peerEd25519KeyPresent) {
  21224. ERROR_OUT(NO_PEER_KEY, exit_dske);
  21225. }
  21226. break;
  21227. }
  21228. #endif /* HAVE_ED25519 */
  21229. #if defined(HAVE_ED448)
  21230. case ed448_sa_algo:
  21231. {
  21232. if (!ssl->peerEd448KeyPresent) {
  21233. ERROR_OUT(NO_PEER_KEY, exit_dske);
  21234. }
  21235. break;
  21236. }
  21237. #endif /* HAVE_ED448 */
  21238. default:
  21239. ret = ALGO_ID_E;
  21240. } /* switch (args->sigAlgo) */
  21241. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  21242. break;
  21243. }
  21244. default:
  21245. ret = BAD_KEA_TYPE_E;
  21246. } /* switch(ssl->specs.kea) */
  21247. /* Check for error */
  21248. if (ret != 0) {
  21249. goto exit_dske;
  21250. }
  21251. /* Advance state and proceed */
  21252. ssl->options.asyncState = TLS_ASYNC_DO;
  21253. } /* case TLS_ASYNC_BUILD */
  21254. FALL_THROUGH;
  21255. case TLS_ASYNC_DO:
  21256. {
  21257. switch(ssl->specs.kea)
  21258. {
  21259. case psk_kea:
  21260. case dhe_psk_kea:
  21261. case ecdhe_psk_kea:
  21262. {
  21263. /* Nothing to do in this sub-state */
  21264. break;
  21265. }
  21266. case diffie_hellman_kea:
  21267. case ecc_diffie_hellman_kea:
  21268. {
  21269. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  21270. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  21271. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  21272. #else
  21273. if (ssl->options.usingAnon_cipher) {
  21274. break;
  21275. }
  21276. if (args->verifySig == NULL) {
  21277. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  21278. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21279. if (args->verifySig == NULL) {
  21280. ERROR_OUT(MEMORY_E, exit_dske);
  21281. }
  21282. XMEMCPY(args->verifySig, input + args->idx,
  21283. args->verifySigSz);
  21284. }
  21285. switch (args->sigAlgo)
  21286. {
  21287. #ifndef NO_RSA
  21288. #ifdef WC_RSA_PSS
  21289. case rsa_pss_sa_algo:
  21290. #endif
  21291. case rsa_sa_algo:
  21292. {
  21293. ret = RsaVerify(ssl,
  21294. args->verifySig, args->verifySigSz,
  21295. &args->output,
  21296. args->sigAlgo, args->hashAlgo,
  21297. ssl->peerRsaKey,
  21298. #ifdef HAVE_PK_CALLBACKS
  21299. &ssl->buffers.peerRsaKey
  21300. #else
  21301. NULL
  21302. #endif
  21303. );
  21304. if (ret >= 0) {
  21305. args->sigSz = (word16)ret;
  21306. #ifdef WC_RSA_PSS
  21307. args->bits = mp_count_bits(&ssl->peerRsaKey->n);
  21308. #endif
  21309. ret = 0;
  21310. }
  21311. #ifdef WOLFSSL_ASYNC_CRYPT
  21312. if (ret != WC_PENDING_E)
  21313. #endif
  21314. {
  21315. /* peerRsaKey */
  21316. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  21317. (void**)&ssl->peerRsaKey);
  21318. ssl->peerRsaKeyPresent = 0;
  21319. }
  21320. break;
  21321. }
  21322. #endif /* !NO_RSA */
  21323. #ifdef HAVE_ECC
  21324. case ecc_dsa_sa_algo:
  21325. {
  21326. ret = EccVerify(ssl,
  21327. args->verifySig, args->verifySigSz,
  21328. ssl->buffers.digest.buffer,
  21329. ssl->buffers.digest.length,
  21330. ssl->peerEccDsaKey,
  21331. #ifdef HAVE_PK_CALLBACKS
  21332. &ssl->buffers.peerEccDsaKey
  21333. #else
  21334. NULL
  21335. #endif
  21336. );
  21337. #ifdef WOLFSSL_ASYNC_CRYPT
  21338. if (ret != WC_PENDING_E)
  21339. #endif
  21340. {
  21341. /* peerEccDsaKey */
  21342. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  21343. (void**)&ssl->peerEccDsaKey);
  21344. ssl->peerEccDsaKeyPresent = 0;
  21345. }
  21346. break;
  21347. }
  21348. #endif /* HAVE_ECC */
  21349. #if defined(HAVE_ED25519)
  21350. case ed25519_sa_algo:
  21351. {
  21352. ret = Ed25519Verify(ssl,
  21353. args->verifySig, args->verifySigSz,
  21354. ssl->buffers.sig.buffer,
  21355. ssl->buffers.sig.length,
  21356. ssl->peerEd25519Key,
  21357. #ifdef HAVE_PK_CALLBACKS
  21358. &ssl->buffers.peerEd25519Key
  21359. #else
  21360. NULL
  21361. #endif
  21362. );
  21363. #ifdef WOLFSSL_ASYNC_CRYPT
  21364. if (ret != WC_PENDING_E)
  21365. #endif
  21366. {
  21367. /* peerEccDsaKey */
  21368. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  21369. (void**)&ssl->peerEd25519Key);
  21370. ssl->peerEd25519KeyPresent = 0;
  21371. }
  21372. break;
  21373. }
  21374. #endif /* HAVE_ED25519 */
  21375. #if defined(HAVE_ED448)
  21376. case ed448_sa_algo:
  21377. {
  21378. ret = Ed448Verify(ssl,
  21379. args->verifySig, args->verifySigSz,
  21380. ssl->buffers.sig.buffer,
  21381. ssl->buffers.sig.length,
  21382. ssl->peerEd448Key,
  21383. #ifdef HAVE_PK_CALLBACKS
  21384. &ssl->buffers.peerEd448Key
  21385. #else
  21386. NULL
  21387. #endif
  21388. );
  21389. #ifdef WOLFSSL_ASYNC_CRYPT
  21390. if (ret != WC_PENDING_E)
  21391. #endif
  21392. {
  21393. /* peerEccDsaKey */
  21394. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  21395. (void**)&ssl->peerEd448Key);
  21396. ssl->peerEd448KeyPresent = 0;
  21397. }
  21398. break;
  21399. }
  21400. #endif /* HAVE_ED448 */
  21401. default:
  21402. ret = ALGO_ID_E;
  21403. } /* switch (sigAlgo) */
  21404. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  21405. break;
  21406. }
  21407. default:
  21408. ret = BAD_KEA_TYPE_E;
  21409. } /* switch(ssl->specs.kea) */
  21410. /* Check for error */
  21411. if (ret != 0) {
  21412. goto exit_dske;
  21413. }
  21414. /* Advance state and proceed */
  21415. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  21416. } /* case TLS_ASYNC_DO */
  21417. FALL_THROUGH;
  21418. case TLS_ASYNC_VERIFY:
  21419. {
  21420. switch(ssl->specs.kea)
  21421. {
  21422. case psk_kea:
  21423. case dhe_psk_kea:
  21424. case ecdhe_psk_kea:
  21425. {
  21426. /* Nothing to do in this sub-state */
  21427. break;
  21428. }
  21429. case diffie_hellman_kea:
  21430. case ecc_diffie_hellman_kea:
  21431. {
  21432. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  21433. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  21434. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  21435. #else
  21436. if (ssl->options.usingAnon_cipher) {
  21437. break;
  21438. }
  21439. /* increment index after verify is done */
  21440. args->idx += args->verifySigSz;
  21441. switch(args->sigAlgo)
  21442. {
  21443. #ifndef NO_RSA
  21444. #ifdef WC_RSA_PSS
  21445. case rsa_pss_sa_algo:
  21446. #ifdef HAVE_SELFTEST
  21447. ret = wc_RsaPSS_CheckPadding(
  21448. ssl->buffers.digest.buffer,
  21449. ssl->buffers.digest.length,
  21450. args->output, args->sigSz,
  21451. HashAlgoToType(args->hashAlgo));
  21452. #else
  21453. ret = wc_RsaPSS_CheckPadding_ex(
  21454. ssl->buffers.digest.buffer,
  21455. ssl->buffers.digest.length,
  21456. args->output, args->sigSz,
  21457. HashAlgoToType(args->hashAlgo),
  21458. -1, args->bits);
  21459. #endif
  21460. if (ret != 0)
  21461. return ret;
  21462. break;
  21463. #endif
  21464. case rsa_sa_algo:
  21465. {
  21466. if (IsAtLeastTLSv1_2(ssl)) {
  21467. #ifdef WOLFSSL_SMALL_STACK
  21468. byte* encodedSig;
  21469. #else
  21470. byte encodedSig[MAX_ENCODED_SIG_SZ];
  21471. #endif
  21472. word32 encSigSz;
  21473. #ifdef WOLFSSL_SMALL_STACK
  21474. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  21475. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21476. if (encodedSig == NULL) {
  21477. ERROR_OUT(MEMORY_E, exit_dske);
  21478. }
  21479. #endif
  21480. encSigSz = wc_EncodeSignature(encodedSig,
  21481. ssl->buffers.digest.buffer,
  21482. ssl->buffers.digest.length,
  21483. TypeHash(args->hashAlgo));
  21484. if (encSigSz != args->sigSz || !args->output ||
  21485. XMEMCMP(args->output, encodedSig,
  21486. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  21487. ret = VERIFY_SIGN_ERROR;
  21488. }
  21489. #ifdef WOLFSSL_SMALL_STACK
  21490. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21491. #endif
  21492. if (ret != 0) {
  21493. goto exit_dske;
  21494. }
  21495. }
  21496. else if (args->sigSz != FINISHED_SZ ||
  21497. !args->output ||
  21498. XMEMCMP(args->output,
  21499. ssl->buffers.digest.buffer,
  21500. FINISHED_SZ) != 0) {
  21501. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  21502. }
  21503. break;
  21504. }
  21505. #endif /* !NO_RSA */
  21506. #ifdef HAVE_ECC
  21507. case ecc_dsa_sa_algo:
  21508. /* Nothing to do in this algo */
  21509. break;
  21510. #endif /* HAVE_ECC */
  21511. #if defined(HAVE_ED25519)
  21512. case ed25519_sa_algo:
  21513. /* Nothing to do in this algo */
  21514. break;
  21515. #endif /* HAVE_ED25519 */
  21516. #if defined(HAVE_ED448)
  21517. case ed448_sa_algo:
  21518. /* Nothing to do in this algo */
  21519. break;
  21520. #endif /* HAVE_ED448 */
  21521. default:
  21522. ret = ALGO_ID_E;
  21523. } /* switch (sigAlgo) */
  21524. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  21525. break;
  21526. }
  21527. default:
  21528. ret = BAD_KEA_TYPE_E;
  21529. } /* switch(ssl->specs.kea) */
  21530. /* Check for error */
  21531. if (ret != 0) {
  21532. goto exit_dske;
  21533. }
  21534. /* Advance state and proceed */
  21535. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  21536. } /* case TLS_ASYNC_VERIFY */
  21537. FALL_THROUGH;
  21538. case TLS_ASYNC_FINALIZE:
  21539. {
  21540. if (IsEncryptionOn(ssl, 0)) {
  21541. args->idx += ssl->keys.padSz;
  21542. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  21543. if (ssl->options.startedETMRead)
  21544. args->idx += MacSize(ssl);
  21545. #endif
  21546. }
  21547. /* Advance state and proceed */
  21548. ssl->options.asyncState = TLS_ASYNC_END;
  21549. } /* case TLS_ASYNC_FINALIZE */
  21550. FALL_THROUGH;
  21551. case TLS_ASYNC_END:
  21552. {
  21553. /* return index */
  21554. *inOutIdx = args->idx;
  21555. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  21556. break;
  21557. }
  21558. default:
  21559. ret = INPUT_CASE_ERROR;
  21560. } /* switch(ssl->options.asyncState) */
  21561. exit_dske:
  21562. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  21563. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  21564. #ifdef WOLFSSL_ASYNC_CRYPT
  21565. /* Handle async operation */
  21566. if (ret == WC_PENDING_E) {
  21567. /* Mark message as not received so it can process again */
  21568. ssl->msgsReceived.got_server_key_exchange = 0;
  21569. return ret;
  21570. }
  21571. #endif /* WOLFSSL_ASYNC_CRYPT */
  21572. /* Final cleanup */
  21573. FreeDskeArgs(ssl, args);
  21574. FreeKeyExchange(ssl);
  21575. return ret;
  21576. }
  21577. typedef struct SckeArgs {
  21578. byte* output; /* not allocated */
  21579. byte* encSecret;
  21580. byte* input;
  21581. word32 encSz;
  21582. word32 length;
  21583. int sendSz;
  21584. int inputSz;
  21585. } SckeArgs;
  21586. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  21587. {
  21588. SckeArgs* args = (SckeArgs*)pArgs;
  21589. (void)ssl;
  21590. if (args->encSecret) {
  21591. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  21592. args->encSecret = NULL;
  21593. }
  21594. if (args->input) {
  21595. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21596. args->input = NULL;
  21597. }
  21598. }
  21599. /* handle generation client_key_exchange (16) */
  21600. int SendClientKeyExchange(WOLFSSL* ssl)
  21601. {
  21602. int ret = 0;
  21603. #ifdef WOLFSSL_ASYNC_CRYPT
  21604. SckeArgs* args = (SckeArgs*)ssl->async.args;
  21605. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  21606. (void)sizeof(args_test);
  21607. #else
  21608. SckeArgs args[1];
  21609. #endif
  21610. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  21611. WOLFSSL_ENTER("SendClientKeyExchange");
  21612. #ifdef OPENSSL_EXTRA
  21613. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  21614. ssl->cbmode = SSL_CB_MODE_WRITE;
  21615. if (ssl->CBIS != NULL)
  21616. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  21617. #endif
  21618. #ifdef WOLFSSL_ASYNC_CRYPT
  21619. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  21620. if (ret != WC_NOT_PENDING_E) {
  21621. /* Check for error */
  21622. if (ret < 0)
  21623. goto exit_scke;
  21624. }
  21625. else
  21626. #endif
  21627. {
  21628. /* Reset state */
  21629. ret = 0;
  21630. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  21631. XMEMSET(args, 0, sizeof(SckeArgs));
  21632. #ifdef WOLFSSL_ASYNC_CRYPT
  21633. ssl->async.freeArgs = FreeSckeArgs;
  21634. #endif
  21635. }
  21636. switch(ssl->options.asyncState)
  21637. {
  21638. case TLS_ASYNC_BEGIN:
  21639. {
  21640. switch (ssl->specs.kea) {
  21641. #ifndef NO_RSA
  21642. case rsa_kea:
  21643. if (ssl->peerRsaKey == NULL ||
  21644. ssl->peerRsaKeyPresent == 0) {
  21645. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21646. }
  21647. break;
  21648. #endif
  21649. #ifndef NO_DH
  21650. case diffie_hellman_kea:
  21651. if (ssl->buffers.serverDH_P.buffer == NULL ||
  21652. ssl->buffers.serverDH_G.buffer == NULL ||
  21653. ssl->buffers.serverDH_Pub.buffer == NULL) {
  21654. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21655. }
  21656. break;
  21657. #endif /* NO_DH */
  21658. #ifndef NO_PSK
  21659. case psk_kea:
  21660. /* sanity check that PSK client callback has been set */
  21661. if (ssl->options.client_psk_cb == NULL) {
  21662. WOLFSSL_MSG("No client PSK callback set");
  21663. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  21664. }
  21665. break;
  21666. #endif /* NO_PSK */
  21667. #if !defined(NO_DH) && !defined(NO_PSK)
  21668. case dhe_psk_kea:
  21669. if (ssl->buffers.serverDH_P.buffer == NULL ||
  21670. ssl->buffers.serverDH_G.buffer == NULL ||
  21671. ssl->buffers.serverDH_Pub.buffer == NULL) {
  21672. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21673. }
  21674. /* sanity check that PSK client callback has been set */
  21675. if (ssl->options.client_psk_cb == NULL) {
  21676. WOLFSSL_MSG("No client PSK callback set");
  21677. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  21678. }
  21679. break;
  21680. #endif /* !NO_DH && !NO_PSK */
  21681. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21682. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  21683. case ecdhe_psk_kea:
  21684. /* sanity check that PSK client callback has been set */
  21685. if (ssl->options.client_psk_cb == NULL) {
  21686. WOLFSSL_MSG("No client PSK callback set");
  21687. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  21688. }
  21689. #ifdef HAVE_CURVE25519
  21690. if (ssl->peerX25519KeyPresent) {
  21691. /* Check client ECC public key */
  21692. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  21693. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21694. }
  21695. #ifdef HAVE_PK_CALLBACKS
  21696. /* if callback then use it for shared secret */
  21697. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  21698. break;
  21699. }
  21700. #endif
  21701. /* create private key */
  21702. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  21703. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21704. if (ret != 0) {
  21705. goto exit_scke;
  21706. }
  21707. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  21708. ssl->peerX25519Key);
  21709. break;
  21710. }
  21711. #endif
  21712. #ifdef HAVE_CURVE448
  21713. if (ssl->peerX448KeyPresent) {
  21714. /* Check client ECC public key */
  21715. if (!ssl->peerX448Key) {
  21716. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21717. }
  21718. #ifdef HAVE_PK_CALLBACKS
  21719. /* if callback then use it for shared secret */
  21720. if (ssl->ctx->X448SharedSecretCb != NULL) {
  21721. break;
  21722. }
  21723. #endif
  21724. /* create private key */
  21725. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  21726. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21727. if (ret != 0) {
  21728. goto exit_scke;
  21729. }
  21730. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  21731. ssl->peerX448Key);
  21732. break;
  21733. }
  21734. #endif
  21735. /* Check client ECC public key */
  21736. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  21737. !ssl->peerEccKey->dp) {
  21738. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21739. }
  21740. #ifdef HAVE_PK_CALLBACKS
  21741. /* if callback then use it for shared secret */
  21742. if (ssl->ctx->EccSharedSecretCb != NULL) {
  21743. break;
  21744. }
  21745. #endif
  21746. /* create ephemeral private key */
  21747. ssl->hsType = DYNAMIC_TYPE_ECC;
  21748. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21749. if (ret != 0) {
  21750. goto exit_scke;
  21751. }
  21752. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  21753. break;
  21754. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  21755. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21756. defined(HAVE_CURVE448)
  21757. case ecc_diffie_hellman_kea:
  21758. {
  21759. #ifdef HAVE_ECC
  21760. ecc_key* peerKey;
  21761. #endif
  21762. #ifdef HAVE_PK_CALLBACKS
  21763. /* if callback then use it for shared secret */
  21764. #ifdef HAVE_CURVE25519
  21765. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  21766. if (ssl->ctx->X25519SharedSecretCb != NULL)
  21767. break;
  21768. }
  21769. else
  21770. #endif
  21771. #ifdef HAVE_CURVE448
  21772. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  21773. if (ssl->ctx->X448SharedSecretCb != NULL)
  21774. break;
  21775. }
  21776. else
  21777. #endif
  21778. #ifdef HAVE_ECC
  21779. if (ssl->ctx->EccSharedSecretCb != NULL) {
  21780. break;
  21781. }
  21782. else
  21783. #endif
  21784. {
  21785. }
  21786. #endif /* HAVE_PK_CALLBACKS */
  21787. #ifdef HAVE_CURVE25519
  21788. if (ssl->peerX25519KeyPresent) {
  21789. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  21790. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21791. }
  21792. /* create private key */
  21793. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  21794. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21795. if (ret != 0) {
  21796. goto exit_scke;
  21797. }
  21798. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  21799. ssl->peerX25519Key);
  21800. break;
  21801. }
  21802. #endif
  21803. #ifdef HAVE_CURVE448
  21804. if (ssl->peerX448KeyPresent) {
  21805. if (!ssl->peerX448Key) {
  21806. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21807. }
  21808. /* create private key */
  21809. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  21810. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21811. if (ret != 0) {
  21812. goto exit_scke;
  21813. }
  21814. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  21815. ssl->peerX448Key);
  21816. break;
  21817. }
  21818. #endif
  21819. #ifdef HAVE_ECC
  21820. if (ssl->specs.static_ecdh) {
  21821. /* Note: EccDsa is really fixed Ecc key here */
  21822. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
  21823. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21824. }
  21825. peerKey = ssl->peerEccDsaKey;
  21826. }
  21827. else {
  21828. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
  21829. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21830. }
  21831. peerKey = ssl->peerEccKey;
  21832. }
  21833. if (peerKey == NULL) {
  21834. ERROR_OUT(NO_PEER_KEY, exit_scke);
  21835. }
  21836. /* create ephemeral private key */
  21837. ssl->hsType = DYNAMIC_TYPE_ECC;
  21838. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21839. if (ret != 0) {
  21840. goto exit_scke;
  21841. }
  21842. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  21843. #endif
  21844. break;
  21845. }
  21846. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  21847. default:
  21848. ret = BAD_KEA_TYPE_E;
  21849. } /* switch(ssl->specs.kea) */
  21850. /* Check for error */
  21851. if (ret != 0) {
  21852. goto exit_scke;
  21853. }
  21854. /* Advance state and proceed */
  21855. ssl->options.asyncState = TLS_ASYNC_BUILD;
  21856. } /* case TLS_ASYNC_BEGIN */
  21857. FALL_THROUGH;
  21858. case TLS_ASYNC_BUILD:
  21859. {
  21860. args->encSz = MAX_ENCRYPT_SZ;
  21861. args->encSecret = (byte*)XMALLOC(MAX_ENCRYPT_SZ, ssl->heap,
  21862. DYNAMIC_TYPE_SECRET);
  21863. if (args->encSecret == NULL) {
  21864. ERROR_OUT(MEMORY_E, exit_scke);
  21865. }
  21866. if (ssl->arrays->preMasterSecret == NULL) {
  21867. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  21868. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  21869. ssl->heap, DYNAMIC_TYPE_SECRET);
  21870. if (ssl->arrays->preMasterSecret == NULL) {
  21871. ERROR_OUT(MEMORY_E, exit_scke);
  21872. }
  21873. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  21874. }
  21875. switch(ssl->specs.kea)
  21876. {
  21877. #ifndef NO_RSA
  21878. case rsa_kea:
  21879. {
  21880. /* build PreMasterSecret with RNG data */
  21881. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  21882. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  21883. if (tsip_useable(ssl)) {
  21884. ret = tsip_generatePremasterSecret(
  21885. &ssl->arrays->preMasterSecret[VERSION_SZ],
  21886. ENCRYPT_LEN - VERSION_SZ);
  21887. } else {
  21888. #endif
  21889. ret = wc_RNG_GenerateBlock(ssl->rng,
  21890. &ssl->arrays->preMasterSecret[VERSION_SZ],
  21891. SECRET_LEN - VERSION_SZ);
  21892. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  21893. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  21894. }
  21895. #endif
  21896. if (ret != 0) {
  21897. goto exit_scke;
  21898. }
  21899. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  21900. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  21901. ssl->arrays->preMasterSz = SECRET_LEN;
  21902. break;
  21903. }
  21904. #endif /* !NO_RSA */
  21905. #ifndef NO_DH
  21906. case diffie_hellman_kea:
  21907. {
  21908. ssl->buffers.sig.length = ENCRYPT_LEN;
  21909. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  21910. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21911. if (ssl->buffers.sig.buffer == NULL) {
  21912. ERROR_OUT(MEMORY_E, exit_scke);
  21913. }
  21914. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  21915. (void**)&ssl->buffers.serverDH_Key);
  21916. if (ret != 0) {
  21917. goto exit_scke;
  21918. }
  21919. #if defined(HAVE_FFDHE) && !defined(HAVE_PUBLIC_FFDHE)
  21920. if (ssl->namedGroup) {
  21921. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  21922. ssl->namedGroup);
  21923. if (ret != 0) {
  21924. goto exit_scke;
  21925. }
  21926. ssl->buffers.sig.length =
  21927. wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  21928. }
  21929. else
  21930. #endif
  21931. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  21932. !defined(WOLFSSL_OLD_PRIME_CHECK)
  21933. if (ssl->options.dhDoKeyTest &&
  21934. !ssl->options.dhKeyTested)
  21935. {
  21936. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  21937. ssl->buffers.serverDH_P.buffer,
  21938. ssl->buffers.serverDH_P.length,
  21939. ssl->buffers.serverDH_G.buffer,
  21940. ssl->buffers.serverDH_G.length,
  21941. NULL, 0, 0, ssl->rng);
  21942. if (ret != 0) {
  21943. goto exit_scke;
  21944. }
  21945. ssl->options.dhKeyTested = 1;
  21946. }
  21947. else
  21948. #endif
  21949. {
  21950. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  21951. ssl->buffers.serverDH_P.buffer,
  21952. ssl->buffers.serverDH_P.length,
  21953. ssl->buffers.serverDH_G.buffer,
  21954. ssl->buffers.serverDH_G.length);
  21955. if (ret != 0) {
  21956. goto exit_scke;
  21957. }
  21958. }
  21959. /* for DH, encSecret is Yc, agree is pre-master */
  21960. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  21961. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  21962. args->encSecret, &args->encSz);
  21963. /* set the max agree result size */
  21964. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  21965. break;
  21966. }
  21967. #endif /* !NO_DH */
  21968. #ifndef NO_PSK
  21969. case psk_kea:
  21970. {
  21971. byte* pms = ssl->arrays->preMasterSecret;
  21972. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  21973. ssl->arrays->server_hint, ssl->arrays->client_identity,
  21974. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  21975. if (ssl->arrays->psk_keySz == 0 ||
  21976. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  21977. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  21978. }
  21979. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  21980. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  21981. if (args->encSz > MAX_PSK_ID_LEN) {
  21982. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  21983. }
  21984. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  21985. args->encSz);
  21986. /* make psk pre master secret */
  21987. /* length of key + length 0s + length of key + key */
  21988. c16toa((word16)ssl->arrays->psk_keySz, pms);
  21989. pms += OPAQUE16_LEN;
  21990. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  21991. pms += ssl->arrays->psk_keySz;
  21992. c16toa((word16)ssl->arrays->psk_keySz, pms);
  21993. pms += OPAQUE16_LEN;
  21994. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21995. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
  21996. (2 * OPAQUE16_LEN);
  21997. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21998. ssl->arrays->psk_keySz = 0; /* No further need */
  21999. break;
  22000. }
  22001. #endif /* !NO_PSK */
  22002. #if !defined(NO_DH) && !defined(NO_PSK)
  22003. case dhe_psk_kea:
  22004. {
  22005. word32 esSz = 0;
  22006. args->output = args->encSecret;
  22007. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  22008. ssl->arrays->server_hint, ssl->arrays->client_identity,
  22009. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  22010. if (ssl->arrays->psk_keySz == 0 ||
  22011. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  22012. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  22013. }
  22014. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  22015. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  22016. if (esSz > MAX_PSK_ID_LEN) {
  22017. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  22018. }
  22019. ssl->buffers.sig.length = ENCRYPT_LEN;
  22020. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  22021. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22022. if (ssl->buffers.sig.buffer == NULL) {
  22023. ERROR_OUT(MEMORY_E, exit_scke);
  22024. }
  22025. c16toa((word16)esSz, args->output);
  22026. args->output += OPAQUE16_LEN;
  22027. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  22028. args->output += esSz;
  22029. args->length = args->encSz - esSz - OPAQUE16_LEN;
  22030. args->encSz = esSz + OPAQUE16_LEN;
  22031. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  22032. (void**)&ssl->buffers.serverDH_Key);
  22033. if (ret != 0) {
  22034. goto exit_scke;
  22035. }
  22036. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  22037. !defined(WOLFSSL_OLD_PRIME_CHECK)
  22038. if (ssl->options.dhDoKeyTest &&
  22039. !ssl->options.dhKeyTested)
  22040. {
  22041. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  22042. ssl->buffers.serverDH_P.buffer,
  22043. ssl->buffers.serverDH_P.length,
  22044. ssl->buffers.serverDH_G.buffer,
  22045. ssl->buffers.serverDH_G.length,
  22046. NULL, 0, 0, ssl->rng);
  22047. if (ret != 0) {
  22048. goto exit_scke;
  22049. }
  22050. ssl->options.dhKeyTested = 1;
  22051. }
  22052. else
  22053. #endif
  22054. {
  22055. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  22056. ssl->buffers.serverDH_P.buffer,
  22057. ssl->buffers.serverDH_P.length,
  22058. ssl->buffers.serverDH_G.buffer,
  22059. ssl->buffers.serverDH_G.length);
  22060. if (ret != 0) {
  22061. goto exit_scke;
  22062. }
  22063. }
  22064. /* for DH, encSecret is Yc, agree is pre-master */
  22065. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  22066. ssl->buffers.sig.buffer,
  22067. (word32*)&ssl->buffers.sig.length,
  22068. args->output + OPAQUE16_LEN, &args->length);
  22069. break;
  22070. }
  22071. #endif /* !NO_DH && !NO_PSK */
  22072. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22073. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22074. case ecdhe_psk_kea:
  22075. {
  22076. word32 esSz = 0;
  22077. args->output = args->encSecret;
  22078. /* Send PSK client identity */
  22079. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  22080. ssl->arrays->server_hint, ssl->arrays->client_identity,
  22081. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  22082. if (ssl->arrays->psk_keySz == 0 ||
  22083. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  22084. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  22085. }
  22086. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  22087. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  22088. if (esSz > MAX_PSK_ID_LEN) {
  22089. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  22090. }
  22091. /* place size and identity in output buffer sz:identity */
  22092. c16toa((word16)esSz, args->output);
  22093. args->output += OPAQUE16_LEN;
  22094. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  22095. args->output += esSz;
  22096. args->encSz = esSz + OPAQUE16_LEN;
  22097. /* length is used for public key size */
  22098. args->length = MAX_ENCRYPT_SZ;
  22099. /* Create shared ECC key leaving room at the beginning
  22100. of buffer for size of shared key. */
  22101. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  22102. #ifdef HAVE_CURVE25519
  22103. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22104. #ifdef HAVE_PK_CALLBACKS
  22105. /* if callback then use it for shared secret */
  22106. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  22107. break;
  22108. }
  22109. #endif
  22110. ret = wc_curve25519_export_public_ex(
  22111. (curve25519_key*)ssl->hsKey,
  22112. args->output + OPAQUE8_LEN, &args->length,
  22113. EC25519_LITTLE_ENDIAN);
  22114. if (ret != 0) {
  22115. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  22116. }
  22117. break;
  22118. }
  22119. #endif
  22120. #ifdef HAVE_CURVE448
  22121. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  22122. #ifdef HAVE_PK_CALLBACKS
  22123. /* if callback then use it for shared secret */
  22124. if (ssl->ctx->X448SharedSecretCb != NULL) {
  22125. break;
  22126. }
  22127. #endif
  22128. ret = wc_curve448_export_public_ex(
  22129. (curve448_key*)ssl->hsKey,
  22130. args->output + OPAQUE8_LEN, &args->length,
  22131. EC448_LITTLE_ENDIAN);
  22132. if (ret != 0) {
  22133. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  22134. }
  22135. break;
  22136. }
  22137. #endif
  22138. #ifdef HAVE_PK_CALLBACKS
  22139. /* if callback then use it for shared secret */
  22140. if (ssl->ctx->EccSharedSecretCb != NULL) {
  22141. break;
  22142. }
  22143. #endif
  22144. /* Place ECC key in output buffer, leaving room for size */
  22145. PRIVATE_KEY_UNLOCK();
  22146. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  22147. args->output + OPAQUE8_LEN, &args->length);
  22148. PRIVATE_KEY_LOCK();
  22149. if (ret != 0) {
  22150. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  22151. }
  22152. break;
  22153. }
  22154. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  22155. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22156. defined(HAVE_CURVE448)
  22157. case ecc_diffie_hellman_kea:
  22158. {
  22159. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  22160. #ifdef HAVE_CURVE25519
  22161. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  22162. #ifdef HAVE_PK_CALLBACKS
  22163. /* if callback then use it for shared secret */
  22164. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  22165. break;
  22166. }
  22167. #endif
  22168. ret = wc_curve25519_export_public_ex(
  22169. (curve25519_key*)ssl->hsKey,
  22170. args->encSecret + OPAQUE8_LEN, &args->encSz,
  22171. EC25519_LITTLE_ENDIAN);
  22172. if (ret != 0) {
  22173. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  22174. }
  22175. break;
  22176. }
  22177. #endif
  22178. #ifdef HAVE_CURVE448
  22179. if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
  22180. #ifdef HAVE_PK_CALLBACKS
  22181. /* if callback then use it for shared secret */
  22182. if (ssl->ctx->X448SharedSecretCb != NULL) {
  22183. break;
  22184. }
  22185. #endif
  22186. ret = wc_curve448_export_public_ex(
  22187. (curve448_key*)ssl->hsKey,
  22188. args->encSecret + OPAQUE8_LEN, &args->encSz,
  22189. EC448_LITTLE_ENDIAN);
  22190. if (ret != 0) {
  22191. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  22192. }
  22193. break;
  22194. }
  22195. #endif
  22196. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  22197. #ifdef HAVE_PK_CALLBACKS
  22198. /* if callback then use it for shared secret */
  22199. if (ssl->ctx->EccSharedSecretCb != NULL) {
  22200. break;
  22201. }
  22202. #endif
  22203. /* Place ECC key in buffer, leaving room for size */
  22204. PRIVATE_KEY_UNLOCK();
  22205. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  22206. args->encSecret + OPAQUE8_LEN, &args->encSz);
  22207. PRIVATE_KEY_LOCK();
  22208. if (ret != 0) {
  22209. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  22210. }
  22211. #endif /* HAVE_ECC */
  22212. break;
  22213. }
  22214. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  22215. default:
  22216. ret = BAD_KEA_TYPE_E;
  22217. } /* switch(ssl->specs.kea) */
  22218. /* Check for error */
  22219. if (ret != 0) {
  22220. goto exit_scke;
  22221. }
  22222. /* Advance state and proceed */
  22223. ssl->options.asyncState = TLS_ASYNC_DO;
  22224. } /* case TLS_ASYNC_BUILD */
  22225. FALL_THROUGH;
  22226. case TLS_ASYNC_DO:
  22227. {
  22228. switch(ssl->specs.kea)
  22229. {
  22230. #ifndef NO_RSA
  22231. case rsa_kea:
  22232. {
  22233. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  22234. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  22235. if (tsip_useable(ssl) &&
  22236. wc_RsaEncryptSize(ssl->peerRsaKey) == 256) {
  22237. ret = tsip_generateEncryptPreMasterSecret(ssl,
  22238. args->encSecret,
  22239. &args->encSz);
  22240. } else
  22241. #endif
  22242. ret = RsaEnc(ssl,
  22243. ssl->arrays->preMasterSecret, SECRET_LEN,
  22244. args->encSecret, &args->encSz,
  22245. ssl->peerRsaKey,
  22246. #if defined(HAVE_PK_CALLBACKS)
  22247. &ssl->buffers.peerRsaKey
  22248. #else
  22249. NULL
  22250. #endif
  22251. );
  22252. break;
  22253. }
  22254. #endif /* !NO_RSA */
  22255. #ifndef NO_DH
  22256. case diffie_hellman_kea:
  22257. {
  22258. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  22259. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  22260. ssl->buffers.serverDH_Pub.buffer,
  22261. ssl->buffers.serverDH_Pub.length,
  22262. ssl->arrays->preMasterSecret,
  22263. &ssl->arrays->preMasterSz,
  22264. ssl->buffers.serverDH_P.buffer,
  22265. ssl->buffers.serverDH_P.length);
  22266. break;
  22267. }
  22268. #endif /* !NO_DH */
  22269. #ifndef NO_PSK
  22270. case psk_kea:
  22271. {
  22272. break;
  22273. }
  22274. #endif /* !NO_PSK */
  22275. #if !defined(NO_DH) && !defined(NO_PSK)
  22276. case dhe_psk_kea:
  22277. {
  22278. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  22279. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  22280. ssl->buffers.serverDH_Pub.buffer,
  22281. ssl->buffers.serverDH_Pub.length,
  22282. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  22283. &ssl->arrays->preMasterSz,
  22284. ssl->buffers.serverDH_P.buffer,
  22285. ssl->buffers.serverDH_P.length);
  22286. break;
  22287. }
  22288. #endif /* !NO_DH && !NO_PSK */
  22289. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22290. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22291. case ecdhe_psk_kea:
  22292. {
  22293. #ifdef HAVE_CURVE25519
  22294. if (ssl->peerX25519KeyPresent) {
  22295. ret = X25519SharedSecret(ssl,
  22296. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  22297. args->output + OPAQUE8_LEN, &args->length,
  22298. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  22299. &ssl->arrays->preMasterSz,
  22300. WOLFSSL_CLIENT_END
  22301. );
  22302. if (!ssl->specs.static_ecdh
  22303. #ifdef WOLFSSL_ASYNC_CRYPT
  22304. && ret != WC_PENDING_E
  22305. #endif
  22306. ) {
  22307. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  22308. (void**)&ssl->peerX25519Key);
  22309. ssl->peerX25519KeyPresent = 0;
  22310. }
  22311. break;
  22312. }
  22313. #endif
  22314. #ifdef HAVE_CURVE448
  22315. if (ssl->peerX448KeyPresent) {
  22316. ret = X448SharedSecret(ssl,
  22317. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  22318. args->output + OPAQUE8_LEN, &args->length,
  22319. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  22320. &ssl->arrays->preMasterSz,
  22321. WOLFSSL_CLIENT_END
  22322. );
  22323. if (!ssl->specs.static_ecdh
  22324. #ifdef WOLFSSL_ASYNC_CRYPT
  22325. && ret != WC_PENDING_E
  22326. #endif
  22327. ) {
  22328. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  22329. (void**)&ssl->peerX448Key);
  22330. ssl->peerX448KeyPresent = 0;
  22331. }
  22332. break;
  22333. }
  22334. #endif
  22335. ret = EccSharedSecret(ssl,
  22336. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  22337. args->output + OPAQUE8_LEN, &args->length,
  22338. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  22339. &ssl->arrays->preMasterSz,
  22340. WOLFSSL_CLIENT_END
  22341. );
  22342. #ifdef WOLFSSL_ASYNC_CRYPT
  22343. if (ret != WC_PENDING_E)
  22344. #endif
  22345. {
  22346. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  22347. (void**)&ssl->peerEccKey);
  22348. ssl->peerEccKeyPresent = 0;
  22349. }
  22350. break;
  22351. }
  22352. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  22353. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22354. defined(HAVE_CURVE448)
  22355. case ecc_diffie_hellman_kea:
  22356. {
  22357. #ifdef HAVE_ECC
  22358. ecc_key* peerKey;
  22359. #endif
  22360. #ifdef HAVE_CURVE25519
  22361. if (ssl->peerX25519KeyPresent) {
  22362. ret = X25519SharedSecret(ssl,
  22363. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  22364. args->encSecret + OPAQUE8_LEN, &args->encSz,
  22365. ssl->arrays->preMasterSecret,
  22366. &ssl->arrays->preMasterSz,
  22367. WOLFSSL_CLIENT_END
  22368. );
  22369. if (!ssl->specs.static_ecdh
  22370. #ifdef WOLFSSL_ASYNC_CRYPT
  22371. && ret != WC_PENDING_E
  22372. #endif
  22373. ) {
  22374. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  22375. (void**)&ssl->peerX25519Key);
  22376. ssl->peerX25519KeyPresent = 0;
  22377. }
  22378. break;
  22379. }
  22380. #endif
  22381. #ifdef HAVE_CURVE448
  22382. if (ssl->peerX448KeyPresent) {
  22383. ret = X448SharedSecret(ssl,
  22384. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  22385. args->encSecret + OPAQUE8_LEN, &args->encSz,
  22386. ssl->arrays->preMasterSecret,
  22387. &ssl->arrays->preMasterSz,
  22388. WOLFSSL_CLIENT_END
  22389. );
  22390. if (!ssl->specs.static_ecdh
  22391. #ifdef WOLFSSL_ASYNC_CRYPT
  22392. && ret != WC_PENDING_E
  22393. #endif
  22394. ) {
  22395. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  22396. (void**)&ssl->peerX448Key);
  22397. ssl->peerX448KeyPresent = 0;
  22398. }
  22399. break;
  22400. }
  22401. #endif
  22402. #ifdef HAVE_ECC
  22403. peerKey = (ssl->specs.static_ecdh) ?
  22404. ssl->peerEccDsaKey : ssl->peerEccKey;
  22405. ret = EccSharedSecret(ssl,
  22406. (ecc_key*)ssl->hsKey, peerKey,
  22407. args->encSecret + OPAQUE8_LEN, &args->encSz,
  22408. ssl->arrays->preMasterSecret,
  22409. &ssl->arrays->preMasterSz,
  22410. WOLFSSL_CLIENT_END
  22411. );
  22412. if (!ssl->specs.static_ecdh
  22413. #ifdef WOLFSSL_ASYNC_CRYPT
  22414. && ret != WC_PENDING_E
  22415. #endif
  22416. && !ssl->options.keepResources) {
  22417. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  22418. (void**)&ssl->peerEccKey);
  22419. ssl->peerEccKeyPresent = 0;
  22420. }
  22421. #endif
  22422. break;
  22423. }
  22424. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  22425. default:
  22426. ret = BAD_KEA_TYPE_E;
  22427. } /* switch(ssl->specs.kea) */
  22428. /* Check for error */
  22429. if (ret != 0) {
  22430. goto exit_scke;
  22431. }
  22432. /* Advance state and proceed */
  22433. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  22434. } /* case TLS_ASYNC_DO */
  22435. FALL_THROUGH;
  22436. case TLS_ASYNC_VERIFY:
  22437. {
  22438. switch(ssl->specs.kea)
  22439. {
  22440. #ifndef NO_RSA
  22441. case rsa_kea:
  22442. {
  22443. break;
  22444. }
  22445. #endif /* !NO_RSA */
  22446. #ifndef NO_DH
  22447. case diffie_hellman_kea:
  22448. {
  22449. break;
  22450. }
  22451. #endif /* !NO_DH */
  22452. #ifndef NO_PSK
  22453. case psk_kea:
  22454. {
  22455. break;
  22456. }
  22457. #endif /* !NO_PSK */
  22458. #if !defined(NO_DH) && !defined(NO_PSK)
  22459. case dhe_psk_kea:
  22460. {
  22461. byte* pms = ssl->arrays->preMasterSecret;
  22462. /* validate args */
  22463. if (args->output == NULL || args->length == 0) {
  22464. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  22465. }
  22466. c16toa((word16)args->length, args->output);
  22467. args->encSz += args->length + OPAQUE16_LEN;
  22468. c16toa((word16)ssl->arrays->preMasterSz, pms);
  22469. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  22470. pms += ssl->arrays->preMasterSz;
  22471. /* make psk pre master secret */
  22472. /* length of key + length 0s + length of key + key */
  22473. c16toa((word16)ssl->arrays->psk_keySz, pms);
  22474. pms += OPAQUE16_LEN;
  22475. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  22476. ssl->arrays->preMasterSz +=
  22477. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  22478. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  22479. ssl->arrays->psk_keySz = 0; /* No further need */
  22480. break;
  22481. }
  22482. #endif /* !NO_DH && !NO_PSK */
  22483. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22484. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22485. case ecdhe_psk_kea:
  22486. {
  22487. byte* pms = ssl->arrays->preMasterSecret;
  22488. /* validate args */
  22489. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  22490. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  22491. }
  22492. /* place size of public key in output buffer */
  22493. *args->output = (byte)args->length;
  22494. args->encSz += args->length + OPAQUE8_LEN;
  22495. /* Create pre master secret is the concatenation of
  22496. eccSize + eccSharedKey + pskSize + pskKey */
  22497. c16toa((word16)ssl->arrays->preMasterSz, pms);
  22498. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  22499. pms += ssl->arrays->preMasterSz;
  22500. c16toa((word16)ssl->arrays->psk_keySz, pms);
  22501. pms += OPAQUE16_LEN;
  22502. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  22503. ssl->arrays->preMasterSz +=
  22504. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  22505. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  22506. ssl->arrays->psk_keySz = 0; /* No further need */
  22507. break;
  22508. }
  22509. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  22510. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22511. defined(HAVE_CURVE448)
  22512. case ecc_diffie_hellman_kea:
  22513. {
  22514. /* place size of public key in buffer */
  22515. *args->encSecret = (byte)args->encSz;
  22516. args->encSz += OPAQUE8_LEN;
  22517. break;
  22518. }
  22519. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  22520. default:
  22521. ret = BAD_KEA_TYPE_E;
  22522. } /* switch(ssl->specs.kea) */
  22523. /* Check for error */
  22524. if (ret != 0) {
  22525. goto exit_scke;
  22526. }
  22527. /* Advance state and proceed */
  22528. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  22529. } /* case TLS_ASYNC_VERIFY */
  22530. FALL_THROUGH;
  22531. case TLS_ASYNC_FINALIZE:
  22532. {
  22533. word32 tlsSz = 0;
  22534. word32 idx = 0;
  22535. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  22536. tlsSz = 2;
  22537. }
  22538. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  22539. ssl->specs.kea == dhe_psk_kea ||
  22540. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  22541. tlsSz = 0;
  22542. }
  22543. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  22544. args->sendSz = args->encSz + tlsSz + idx;
  22545. #ifdef WOLFSSL_DTLS
  22546. if (ssl->options.dtls) {
  22547. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  22548. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  22549. }
  22550. #endif
  22551. if (IsEncryptionOn(ssl, 1)) {
  22552. args->sendSz += MAX_MSG_EXTRA;
  22553. }
  22554. /* check for available size */
  22555. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  22556. goto exit_scke;
  22557. }
  22558. /* get output buffer */
  22559. args->output = ssl->buffers.outputBuffer.buffer +
  22560. ssl->buffers.outputBuffer.length;
  22561. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  22562. if (tlsSz) {
  22563. c16toa((word16)args->encSz, &args->output[idx]);
  22564. idx += OPAQUE16_LEN;
  22565. }
  22566. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  22567. idx += args->encSz;
  22568. if (IsEncryptionOn(ssl, 1)) {
  22569. int recordHeaderSz = RECORD_HEADER_SZ;
  22570. if (ssl->options.dtls)
  22571. recordHeaderSz += DTLS_RECORD_EXTRA;
  22572. args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
  22573. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  22574. DYNAMIC_TYPE_IN_BUFFER);
  22575. if (args->input == NULL) {
  22576. ERROR_OUT(MEMORY_E, exit_scke);
  22577. }
  22578. XMEMCPY(args->input, args->output + recordHeaderSz,
  22579. args->inputSz);
  22580. }
  22581. /* Advance state and proceed */
  22582. ssl->options.asyncState = TLS_ASYNC_END;
  22583. } /* case TLS_ASYNC_FINALIZE */
  22584. FALL_THROUGH;
  22585. case TLS_ASYNC_END:
  22586. {
  22587. if (IsEncryptionOn(ssl, 1)) {
  22588. #ifdef WOLFSSL_DTLS
  22589. if (IsDtlsNotSctpMode(ssl) &&
  22590. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
  22591. goto exit_scke;
  22592. }
  22593. #endif
  22594. ret = BuildMessage(ssl, args->output, args->sendSz,
  22595. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  22596. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22597. args->input = NULL; /* make sure its not double free'd on cleanup */
  22598. if (ret >= 0) {
  22599. args->sendSz = ret;
  22600. ret = 0;
  22601. }
  22602. }
  22603. else {
  22604. #ifdef WOLFSSL_DTLS
  22605. if (IsDtlsNotSctpMode(ssl)) {
  22606. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
  22607. goto exit_scke;
  22608. }
  22609. }
  22610. if (ssl->options.dtls)
  22611. DtlsSEQIncrement(ssl, CUR_ORDER);
  22612. #endif
  22613. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  22614. }
  22615. if (ret != 0) {
  22616. goto exit_scke;
  22617. }
  22618. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  22619. if (ssl->hsInfoOn)
  22620. AddPacketName(ssl, "ClientKeyExchange");
  22621. if (ssl->toInfoOn)
  22622. AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  22623. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  22624. #endif
  22625. ssl->buffers.outputBuffer.length += args->sendSz;
  22626. if (!ssl->options.groupMessages) {
  22627. ret = SendBuffered(ssl);
  22628. }
  22629. if (ret == 0 || ret == WANT_WRITE) {
  22630. int tmpRet = MakeMasterSecret(ssl);
  22631. if (tmpRet != 0) {
  22632. ret = tmpRet; /* save WANT_WRITE unless more serious */
  22633. }
  22634. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  22635. }
  22636. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  22637. if (ssl->keyLogCb != NULL) {
  22638. int secretSz = SECRET_LEN;
  22639. ret = ssl->keyLogCb(ssl, ssl->arrays->masterSecret, &secretSz,
  22640. NULL);
  22641. if (ret != 0 || secretSz != SECRET_LEN)
  22642. return SESSION_SECRET_CB_E;
  22643. }
  22644. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  22645. break;
  22646. }
  22647. default:
  22648. ret = INPUT_CASE_ERROR;
  22649. } /* switch(ssl->options.asyncState) */
  22650. exit_scke:
  22651. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  22652. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  22653. #ifdef WOLFSSL_ASYNC_CRYPT
  22654. /* Handle async operation */
  22655. if (ret == WC_PENDING_E)
  22656. return ret;
  22657. #endif
  22658. /* No further need for PMS */
  22659. if (ssl->arrays->preMasterSecret != NULL) {
  22660. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  22661. }
  22662. ssl->arrays->preMasterSz = 0;
  22663. /* Final cleanup */
  22664. FreeSckeArgs(ssl, args);
  22665. FreeKeyExchange(ssl);
  22666. return ret;
  22667. }
  22668. #endif /* !WOLFSSL_NO_TLS12 */
  22669. #ifndef NO_CERTS
  22670. #ifndef WOLFSSL_NO_TLS12
  22671. #ifndef WOLFSSL_NO_CLIENT_AUTH
  22672. typedef struct ScvArgs {
  22673. byte* output; /* not allocated */
  22674. #ifndef NO_RSA
  22675. byte* verifySig;
  22676. #endif
  22677. byte* verify; /* not allocated */
  22678. byte* input;
  22679. word32 idx;
  22680. word32 extraSz;
  22681. word32 sigSz;
  22682. int sendSz;
  22683. int inputSz;
  22684. word16 length;
  22685. byte sigAlgo;
  22686. } ScvArgs;
  22687. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  22688. {
  22689. ScvArgs* args = (ScvArgs*)pArgs;
  22690. (void)ssl;
  22691. #ifndef NO_RSA
  22692. if (args->verifySig) {
  22693. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22694. args->verifySig = NULL;
  22695. }
  22696. #endif
  22697. if (args->input) {
  22698. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22699. args->input = NULL;
  22700. }
  22701. }
  22702. /* handle generation of certificate_verify (15) */
  22703. int SendCertificateVerify(WOLFSSL* ssl)
  22704. {
  22705. int ret = 0;
  22706. #ifdef WOLFSSL_ASYNC_CRYPT
  22707. ScvArgs* args = (ScvArgs*)ssl->async.args;
  22708. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  22709. (void)sizeof(args_test);
  22710. #else
  22711. ScvArgs args[1];
  22712. #endif
  22713. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  22714. WOLFSSL_ENTER("SendCertificateVerify");
  22715. #ifdef WOLFSSL_ASYNC_CRYPT
  22716. /* BuildMessage does its own Pop */
  22717. if (ssl->error != WC_PENDING_E ||
  22718. ssl->options.asyncState != TLS_ASYNC_END)
  22719. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  22720. if (ret != WC_NOT_PENDING_E) {
  22721. /* Check for error */
  22722. if (ret < 0)
  22723. goto exit_scv;
  22724. }
  22725. else
  22726. #endif
  22727. {
  22728. /* Reset state */
  22729. ret = 0;
  22730. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  22731. XMEMSET(args, 0, sizeof(ScvArgs));
  22732. #ifdef WOLFSSL_ASYNC_CRYPT
  22733. ssl->async.freeArgs = FreeScvArgs;
  22734. #endif
  22735. }
  22736. switch(ssl->options.asyncState)
  22737. {
  22738. case TLS_ASYNC_BEGIN:
  22739. {
  22740. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  22741. return 0; /* sent blank cert, can't verify */
  22742. }
  22743. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  22744. if (IsEncryptionOn(ssl, 1)) {
  22745. args->sendSz += MAX_MSG_EXTRA;
  22746. }
  22747. /* Use tmp buffer */
  22748. args->input = (byte*)XMALLOC(args->sendSz,
  22749. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22750. if (args->input == NULL)
  22751. ERROR_OUT(MEMORY_E, exit_scv);
  22752. args->output = args->input;
  22753. /* Advance state and proceed */
  22754. ssl->options.asyncState = TLS_ASYNC_BUILD;
  22755. } /* case TLS_ASYNC_BEGIN */
  22756. FALL_THROUGH;
  22757. case TLS_ASYNC_BUILD:
  22758. {
  22759. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  22760. if (ret != 0) {
  22761. goto exit_scv;
  22762. }
  22763. if (ssl->buffers.key == NULL) {
  22764. #ifdef HAVE_PK_CALLBACKS
  22765. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  22766. args->length = GetPrivateKeySigSize(ssl);
  22767. else
  22768. #endif
  22769. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  22770. }
  22771. else {
  22772. /* Decode private key. */
  22773. ret = DecodePrivateKey(ssl, &args->length);
  22774. if (ret != 0) {
  22775. goto exit_scv;
  22776. }
  22777. }
  22778. if (args->length == 0) {
  22779. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  22780. }
  22781. /* idx is used to track verify pointer offset to output */
  22782. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22783. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  22784. args->extraSz = 0; /* tls 1.2 hash/sig */
  22785. /* build encoded signature buffer */
  22786. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  22787. ssl->buffers.sig.buffer = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  22788. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22789. if (ssl->buffers.sig.buffer == NULL) {
  22790. ERROR_OUT(MEMORY_E, exit_scv);
  22791. }
  22792. #ifdef WOLFSSL_DTLS
  22793. if (ssl->options.dtls) {
  22794. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22795. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22796. }
  22797. #endif
  22798. #ifndef NO_OLD_TLS
  22799. #ifndef NO_SHA
  22800. /* old tls default */
  22801. SetDigest(ssl, sha_mac);
  22802. #endif
  22803. #else
  22804. #ifndef NO_SHA256
  22805. /* new tls default */
  22806. SetDigest(ssl, sha256_mac);
  22807. #endif
  22808. #endif /* !NO_OLD_TLS */
  22809. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  22810. #ifdef WC_RSA_PSS
  22811. if (IsAtLeastTLSv1_2(ssl) &&
  22812. (ssl->pssAlgo & (1 << ssl->suites->hashAlgo))) {
  22813. args->sigAlgo = rsa_pss_sa_algo;
  22814. }
  22815. else
  22816. #endif
  22817. args->sigAlgo = rsa_sa_algo;
  22818. }
  22819. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  22820. args->sigAlgo = ecc_dsa_sa_algo;
  22821. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  22822. args->sigAlgo = ed25519_sa_algo;
  22823. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  22824. args->sigAlgo = ed448_sa_algo;
  22825. if (IsAtLeastTLSv1_2(ssl)) {
  22826. EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo,
  22827. args->verify);
  22828. args->extraSz = HASH_SIG_SIZE;
  22829. SetDigest(ssl, ssl->suites->hashAlgo);
  22830. }
  22831. #ifndef NO_OLD_TLS
  22832. else {
  22833. /* if old TLS load MD5 and SHA hash as value to sign
  22834. * MD5 and SHA must be first two buffers in stucture */
  22835. XMEMCPY(ssl->buffers.sig.buffer,
  22836. (byte*)&ssl->hsHashes->certHashes, FINISHED_SZ);
  22837. }
  22838. #endif
  22839. #ifndef NO_RSA
  22840. if (args->sigAlgo == rsa_sa_algo) {
  22841. ssl->buffers.sig.length = FINISHED_SZ;
  22842. args->sigSz = ENCRYPT_LEN;
  22843. if (IsAtLeastTLSv1_2(ssl)) {
  22844. ssl->buffers.sig.length = wc_EncodeSignature(
  22845. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  22846. ssl->buffers.digest.length,
  22847. TypeHash(ssl->suites->hashAlgo));
  22848. }
  22849. /* prepend hdr */
  22850. c16toa(args->length, args->verify + args->extraSz);
  22851. }
  22852. #ifdef WC_RSA_PSS
  22853. else if (args->sigAlgo == rsa_pss_sa_algo) {
  22854. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  22855. ssl->buffers.digest.length);
  22856. ssl->buffers.sig.length = ssl->buffers.digest.length;
  22857. args->sigSz = ENCRYPT_LEN;
  22858. /* prepend hdr */
  22859. c16toa(args->length, args->verify + args->extraSz);
  22860. }
  22861. #endif
  22862. #endif /* !NO_RSA */
  22863. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  22864. if (args->sigAlgo == ed25519_sa_algo) {
  22865. ret = Ed25519CheckPubKey(ssl);
  22866. if (ret != 0)
  22867. goto exit_scv;
  22868. }
  22869. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  22870. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  22871. if (args->sigAlgo == ed448_sa_algo) {
  22872. ret = Ed448CheckPubKey(ssl);
  22873. if (ret != 0)
  22874. goto exit_scv;
  22875. }
  22876. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  22877. /* Advance state and proceed */
  22878. ssl->options.asyncState = TLS_ASYNC_DO;
  22879. } /* case TLS_ASYNC_BUILD */
  22880. FALL_THROUGH;
  22881. case TLS_ASYNC_DO:
  22882. {
  22883. #ifdef HAVE_ECC
  22884. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  22885. ecc_key* key = (ecc_key*)ssl->hsKey;
  22886. ret = EccSign(ssl,
  22887. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  22888. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  22889. key,
  22890. #ifdef HAVE_PK_CALLBACKS
  22891. ssl->buffers.key
  22892. #else
  22893. NULL
  22894. #endif
  22895. );
  22896. }
  22897. #endif /* HAVE_ECC */
  22898. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  22899. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  22900. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  22901. ret = Ed25519Sign(ssl,
  22902. ssl->hsHashes->messages, ssl->hsHashes->length,
  22903. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  22904. key,
  22905. #ifdef HAVE_PK_CALLBACKS
  22906. ssl->buffers.key
  22907. #else
  22908. NULL
  22909. #endif
  22910. );
  22911. }
  22912. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  22913. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  22914. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  22915. ed448_key* key = (ed448_key*)ssl->hsKey;
  22916. ret = Ed448Sign(ssl,
  22917. ssl->hsHashes->messages, ssl->hsHashes->length,
  22918. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  22919. key,
  22920. #ifdef HAVE_PK_CALLBACKS
  22921. ssl->buffers.key
  22922. #else
  22923. NULL
  22924. #endif
  22925. );
  22926. }
  22927. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  22928. #ifndef NO_RSA
  22929. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  22930. RsaKey* key = (RsaKey*)ssl->hsKey;
  22931. /* restore verify pointer */
  22932. args->verify = &args->output[args->idx];
  22933. ret = RsaSign(ssl,
  22934. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  22935. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  22936. args->sigAlgo, ssl->suites->hashAlgo, key,
  22937. ssl->buffers.key
  22938. );
  22939. }
  22940. #endif /* !NO_RSA */
  22941. /* Check for error */
  22942. if (ret != 0) {
  22943. goto exit_scv;
  22944. }
  22945. /* Advance state and proceed */
  22946. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  22947. } /* case TLS_ASYNC_DO */
  22948. FALL_THROUGH;
  22949. case TLS_ASYNC_VERIFY:
  22950. {
  22951. /* restore verify pointer */
  22952. args->verify = &args->output[args->idx];
  22953. switch (ssl->hsType) {
  22954. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  22955. #ifdef HAVE_ECC
  22956. case DYNAMIC_TYPE_ECC:
  22957. #endif
  22958. #ifdef HAVE_ED25519
  22959. case DYNAMIC_TYPE_ED25519:
  22960. #endif
  22961. #ifdef HAVE_ED448
  22962. case DYNAMIC_TYPE_ED448:
  22963. #endif
  22964. args->length = (word16)ssl->buffers.sig.length;
  22965. /* prepend hdr */
  22966. c16toa(args->length, args->verify + args->extraSz);
  22967. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  22968. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  22969. break;
  22970. #endif
  22971. #ifndef NO_RSA
  22972. case DYNAMIC_TYPE_RSA:
  22973. {
  22974. RsaKey* key = (RsaKey*)ssl->hsKey;
  22975. if (args->verifySig == NULL) {
  22976. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  22977. DYNAMIC_TYPE_SIGNATURE);
  22978. if (args->verifySig == NULL) {
  22979. ERROR_OUT(MEMORY_E, exit_scv);
  22980. }
  22981. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  22982. VERIFY_HEADER, args->sigSz);
  22983. }
  22984. /* check for signature faults */
  22985. ret = VerifyRsaSign(ssl,
  22986. args->verifySig, args->sigSz,
  22987. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  22988. args->sigAlgo, ssl->suites->hashAlgo, key,
  22989. ssl->buffers.key
  22990. );
  22991. /* free temporary buffer now */
  22992. if (ret != WC_PENDING_E) {
  22993. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22994. args->verifySig = NULL;
  22995. }
  22996. break;
  22997. }
  22998. #endif /* !NO_RSA */
  22999. default:
  23000. break;
  23001. }
  23002. /* Check for error */
  23003. if (ret != 0) {
  23004. goto exit_scv;
  23005. }
  23006. /* Advance state and proceed */
  23007. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  23008. } /* case TLS_ASYNC_VERIFY */
  23009. FALL_THROUGH;
  23010. case TLS_ASYNC_FINALIZE:
  23011. {
  23012. if (args->output == NULL) {
  23013. ERROR_OUT(BUFFER_ERROR, exit_scv);
  23014. }
  23015. AddHeaders(args->output, (word32)args->length + args->extraSz +
  23016. VERIFY_HEADER, certificate_verify, ssl);
  23017. /* Advance state and proceed */
  23018. ssl->options.asyncState = TLS_ASYNC_END;
  23019. } /* case TLS_ASYNC_FINALIZE */
  23020. FALL_THROUGH;
  23021. case TLS_ASYNC_END:
  23022. {
  23023. ret = SendHandshakeMsg(ssl, args->output,
  23024. (word32)args->length + args->extraSz + VERIFY_HEADER,
  23025. certificate_verify, "CertificateVerify");
  23026. if (ret != 0)
  23027. goto exit_scv;
  23028. break;
  23029. }
  23030. default:
  23031. ret = INPUT_CASE_ERROR;
  23032. } /* switch(ssl->options.asyncState) */
  23033. exit_scv:
  23034. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  23035. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  23036. #ifdef WOLFSSL_ASYNC_CRYPT
  23037. /* Handle async operation */
  23038. if (ret == WC_PENDING_E) {
  23039. return ret;
  23040. }
  23041. #endif /* WOLFSSL_ASYNC_CRYPT */
  23042. /* Digest is not allocated, so do this to prevent free */
  23043. ssl->buffers.digest.buffer = NULL;
  23044. ssl->buffers.digest.length = 0;
  23045. /* Final cleanup */
  23046. FreeScvArgs(ssl, args);
  23047. FreeKeyExchange(ssl);
  23048. return ret;
  23049. }
  23050. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  23051. #endif /* WOLFSSL_NO_TLS12 */
  23052. #endif /* NO_CERTS */
  23053. #ifdef HAVE_SESSION_TICKET
  23054. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  23055. {
  23056. /* Free old dynamic ticket if we already had one */
  23057. if (ssl->session.isDynamic) {
  23058. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  23059. ssl->session.ticket = ssl->session.staticTicket;
  23060. ssl->session.isDynamic = 0;
  23061. }
  23062. if (length > sizeof(ssl->session.staticTicket)) {
  23063. byte* sessionTicket =
  23064. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  23065. if (sessionTicket == NULL)
  23066. return MEMORY_E;
  23067. ssl->session.ticket = sessionTicket;
  23068. ssl->session.isDynamic = 1;
  23069. }
  23070. ssl->session.ticketLen = (word16)length;
  23071. if (length > 0) {
  23072. XMEMCPY(ssl->session.ticket, ticket, length);
  23073. if (ssl->session_ticket_cb != NULL) {
  23074. ssl->session_ticket_cb(ssl,
  23075. ssl->session.ticket, ssl->session.ticketLen,
  23076. ssl->session_ticket_ctx);
  23077. }
  23078. /* Create a fake sessionID based on the ticket, this will
  23079. * supersede the existing session cache info. */
  23080. ssl->options.haveSessionId = 1;
  23081. #ifdef WOLFSSL_TLS13
  23082. if (ssl->options.tls1_3) {
  23083. XMEMCPY(ssl->session.sessionID,
  23084. ssl->session.ticket + length - ID_LEN, ID_LEN);
  23085. }
  23086. else
  23087. #endif
  23088. XMEMCPY(ssl->arrays->sessionID,
  23089. ssl->session.ticket + length - ID_LEN, ID_LEN);
  23090. }
  23091. return 0;
  23092. }
  23093. #ifndef WOLFSSL_NO_TLS12
  23094. /* handle processing of session_ticket (4) */
  23095. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  23096. word32 size)
  23097. {
  23098. word32 begin = *inOutIdx;
  23099. word32 lifetime;
  23100. word16 length;
  23101. int ret;
  23102. if (ssl->expect_session_ticket == 0) {
  23103. WOLFSSL_MSG("Unexpected session ticket");
  23104. return SESSION_TICKET_EXPECT_E;
  23105. }
  23106. if (OPAQUE32_LEN > size)
  23107. return BUFFER_ERROR;
  23108. ato32(input + *inOutIdx, &lifetime);
  23109. *inOutIdx += OPAQUE32_LEN;
  23110. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  23111. return BUFFER_ERROR;
  23112. ato16(input + *inOutIdx, &length);
  23113. *inOutIdx += OPAQUE16_LEN;
  23114. if ((*inOutIdx - begin) + length > size)
  23115. return BUFFER_ERROR;
  23116. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  23117. return ret;
  23118. *inOutIdx += length;
  23119. if (length > 0) {
  23120. ssl->timeout = lifetime;
  23121. #ifndef NO_SESSION_CACHE
  23122. AddSession(ssl);
  23123. #endif
  23124. }
  23125. if (IsEncryptionOn(ssl, 0)) {
  23126. *inOutIdx += ssl->keys.padSz;
  23127. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  23128. if (ssl->options.startedETMRead)
  23129. *inOutIdx += MacSize(ssl);
  23130. #endif
  23131. }
  23132. ssl->expect_session_ticket = 0;
  23133. return 0;
  23134. }
  23135. #endif /* !WOLFSSL_NO_TLS12 */
  23136. #endif /* HAVE_SESSION_TICKET */
  23137. #endif /* NO_WOLFSSL_CLIENT */
  23138. #ifndef NO_CERTS
  23139. #ifdef HAVE_PK_CALLBACKS
  23140. int GetPrivateKeySigSize(WOLFSSL* ssl)
  23141. {
  23142. int sigSz = 0;
  23143. if (ssl == NULL)
  23144. return 0;
  23145. switch (ssl->buffers.keyType) {
  23146. #ifndef NO_RSA
  23147. #ifdef WC_RSA_PSS
  23148. case rsa_pss_sa_algo:
  23149. #endif
  23150. case rsa_sa_algo:
  23151. sigSz = ssl->buffers.keySz;
  23152. ssl->hsType = DYNAMIC_TYPE_RSA;
  23153. break;
  23154. #endif
  23155. #ifdef HAVE_ECC
  23156. case ecc_dsa_sa_algo:
  23157. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  23158. ssl->hsType = DYNAMIC_TYPE_ECC;
  23159. break;
  23160. #endif
  23161. #ifdef HAVE_ED25519
  23162. case ed25519_sa_algo:
  23163. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  23164. ssl->hsType = DYNAMIC_TYPE_ED25519;
  23165. break;
  23166. #endif
  23167. #ifdef HAVE_ED448
  23168. case ed448_sa_algo:
  23169. sigSz = ED448_SIG_SIZE; /* fixed known value */
  23170. ssl->hsType = DYNAMIC_TYPE_ED448;
  23171. break;
  23172. #endif
  23173. default:
  23174. break;
  23175. }
  23176. return sigSz;
  23177. }
  23178. #endif /* HAVE_PK_CALLBACKS */
  23179. #endif /* NO_CERTS */
  23180. #ifdef HAVE_ECC
  23181. /* returns the WOLFSSL_* version of the curve from the OID sum */
  23182. word16 GetCurveByOID(int oidSum) {
  23183. switch(oidSum) {
  23184. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  23185. #ifndef NO_ECC_SECP
  23186. case ECC_SECP160R1_OID:
  23187. return WOLFSSL_ECC_SECP160R1;
  23188. #endif /* !NO_ECC_SECP */
  23189. #ifdef HAVE_ECC_SECPR2
  23190. case ECC_SECP160R2_OID:
  23191. return WOLFSSL_ECC_SECP160R2;
  23192. #endif /* HAVE_ECC_SECPR2 */
  23193. #ifdef HAVE_ECC_KOBLITZ
  23194. case ECC_SECP160K1_OID:
  23195. return WOLFSSL_ECC_SECP160K1;
  23196. #endif /* HAVE_ECC_KOBLITZ */
  23197. #endif
  23198. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  23199. #ifndef NO_ECC_SECP
  23200. case ECC_SECP192R1_OID:
  23201. return WOLFSSL_ECC_SECP192R1;
  23202. #endif /* !NO_ECC_SECP */
  23203. #ifdef HAVE_ECC_KOBLITZ
  23204. case ECC_SECP192K1_OID:
  23205. return WOLFSSL_ECC_SECP192K1;
  23206. #endif /* HAVE_ECC_KOBLITZ */
  23207. #endif
  23208. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  23209. #ifndef NO_ECC_SECP
  23210. case ECC_SECP224R1_OID:
  23211. return WOLFSSL_ECC_SECP224R1;
  23212. #endif /* !NO_ECC_SECP */
  23213. #ifdef HAVE_ECC_KOBLITZ
  23214. case ECC_SECP224K1_OID:
  23215. return WOLFSSL_ECC_SECP224K1;
  23216. #endif /* HAVE_ECC_KOBLITZ */
  23217. #endif
  23218. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  23219. #ifndef NO_ECC_SECP
  23220. case ECC_SECP256R1_OID:
  23221. return WOLFSSL_ECC_SECP256R1;
  23222. #endif /* !NO_ECC_SECP */
  23223. #ifdef HAVE_ECC_KOBLITZ
  23224. case ECC_SECP256K1_OID:
  23225. return WOLFSSL_ECC_SECP256K1;
  23226. #endif /* HAVE_ECC_KOBLITZ */
  23227. #ifdef HAVE_ECC_BRAINPOOL
  23228. case ECC_BRAINPOOLP256R1_OID:
  23229. return WOLFSSL_ECC_BRAINPOOLP256R1;
  23230. #endif /* HAVE_ECC_BRAINPOOL */
  23231. #endif
  23232. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  23233. #ifndef NO_ECC_SECP
  23234. case ECC_SECP384R1_OID:
  23235. return WOLFSSL_ECC_SECP384R1;
  23236. #endif /* !NO_ECC_SECP */
  23237. #ifdef HAVE_ECC_BRAINPOOL
  23238. case ECC_BRAINPOOLP384R1_OID:
  23239. return WOLFSSL_ECC_BRAINPOOLP384R1;
  23240. #endif /* HAVE_ECC_BRAINPOOL */
  23241. #endif
  23242. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  23243. #ifdef HAVE_ECC_BRAINPOOL
  23244. case ECC_BRAINPOOLP512R1_OID:
  23245. return WOLFSSL_ECC_BRAINPOOLP512R1;
  23246. #endif /* HAVE_ECC_BRAINPOOL */
  23247. #endif
  23248. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  23249. #ifndef NO_ECC_SECP
  23250. case ECC_SECP521R1_OID:
  23251. return WOLFSSL_ECC_SECP521R1;
  23252. #endif /* !NO_ECC_SECP */
  23253. #endif
  23254. default:
  23255. WOLFSSL_MSG("Curve OID not compiled in or implemented");
  23256. return 0;
  23257. }
  23258. }
  23259. #endif /* HAVE_ECC */
  23260. #ifndef NO_WOLFSSL_SERVER
  23261. #ifndef WOLFSSL_NO_TLS12
  23262. /* handle generation of server_hello (2) */
  23263. int SendServerHello(WOLFSSL* ssl)
  23264. {
  23265. int ret;
  23266. byte *output;
  23267. word16 length;
  23268. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23269. int sendSz;
  23270. byte sessIdSz = ID_LEN;
  23271. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  23272. byte echoId = 0; /* ticket echo id flag */
  23273. #endif
  23274. byte cacheOff = 0; /* session cache off flag */
  23275. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  23276. WOLFSSL_ENTER("SendServerHello");
  23277. length = VERSION_SZ + RAN_LEN
  23278. + ID_LEN + ENUM_LEN
  23279. + SUITE_LEN
  23280. + ENUM_LEN;
  23281. #ifdef HAVE_TLS_EXTENSIONS
  23282. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  23283. if (ret != 0)
  23284. return ret;
  23285. #ifdef HAVE_SESSION_TICKET
  23286. if (ssl->options.useTicket) {
  23287. /* echo session id sz can be 0,32 or bogus len in between */
  23288. sessIdSz = ssl->arrays->sessionIDSz;
  23289. if (sessIdSz > ID_LEN) {
  23290. WOLFSSL_MSG("Bad bogus session id len");
  23291. return BUFFER_ERROR;
  23292. }
  23293. if (!IsAtLeastTLSv1_3(ssl->version))
  23294. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  23295. echoId = 1;
  23296. }
  23297. #endif /* HAVE_SESSION_TICKET */
  23298. #else
  23299. if (ssl->options.haveEMS) {
  23300. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  23301. }
  23302. #endif
  23303. /* is the session cache off at build or runtime */
  23304. #ifdef NO_SESSION_CACHE
  23305. cacheOff = 1;
  23306. #else
  23307. if (ssl->options.sessionCacheOff == 1) {
  23308. cacheOff = 1;
  23309. }
  23310. #endif
  23311. /* if no session cache don't send a session ID unless we're echoing
  23312. * an ID as part of session tickets */
  23313. if (cacheOff == 1
  23314. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  23315. && echoId == 0
  23316. #endif
  23317. ) {
  23318. length -= ID_LEN; /* adjust ID_LEN assumption */
  23319. sessIdSz = 0;
  23320. }
  23321. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  23322. #ifdef WOLFSSL_DTLS
  23323. if (ssl->options.dtls) {
  23324. if (((ssl->keys.dtls_sequence_number_hi == ssl->keys.curSeq_hi &&
  23325. ssl->keys.dtls_sequence_number_lo < ssl->keys.curSeq_lo) ||
  23326. (ssl->keys.dtls_sequence_number_hi < ssl->keys.curSeq_hi))) {
  23327. /* Server Hello should use the same sequence number as the
  23328. * Client Hello if available. */
  23329. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  23330. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  23331. }
  23332. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23333. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23334. }
  23335. #endif /* WOLFSSL_DTLS */
  23336. if (IsEncryptionOn(ssl, 1))
  23337. sendSz += MAX_MSG_EXTRA;
  23338. /* check for available size */
  23339. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  23340. return ret;
  23341. /* get output buffer */
  23342. output = ssl->buffers.outputBuffer.buffer +
  23343. ssl->buffers.outputBuffer.length;
  23344. AddHeaders(output, length, server_hello, ssl);
  23345. /* now write to output */
  23346. /* first version */
  23347. output[idx++] = (byte)ssl->version.major;
  23348. output[idx++] = (byte)ssl->version.minor;
  23349. /* then random and session id */
  23350. if (!ssl->options.resuming) {
  23351. /* generate random part and session id */
  23352. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  23353. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  23354. if (ret != 0)
  23355. return ret;
  23356. #ifdef WOLFSSL_TLS13
  23357. if (TLSv1_3_Capable(ssl)) {
  23358. /* TLS v1.3 capable server downgraded. */
  23359. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  23360. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  23361. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  23362. }
  23363. else
  23364. #endif
  23365. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  23366. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  23367. #ifdef OPENSSL_EXTRA
  23368. (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0 &&
  23369. #endif
  23370. !IsAtLeastTLSv1_2(ssl)) {
  23371. /* TLS v1.2 capable server downgraded. */
  23372. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  23373. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  23374. output[idx + RAN_LEN - 1] = 0;
  23375. }
  23376. /* store info in SSL for later */
  23377. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  23378. idx += RAN_LEN;
  23379. output[idx++] = sessIdSz;
  23380. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  23381. ssl->arrays->sessionIDSz = sessIdSz;
  23382. }
  23383. else {
  23384. /* If resuming, use info from SSL */
  23385. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  23386. idx += RAN_LEN;
  23387. output[idx++] = sessIdSz;
  23388. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  23389. }
  23390. idx += sessIdSz;
  23391. #ifdef SHOW_SECRETS
  23392. {
  23393. int j;
  23394. printf("server random: ");
  23395. for (j = 0; j < RAN_LEN; j++)
  23396. printf("%02x", ssl->arrays->serverRandom[j]);
  23397. printf("\n");
  23398. }
  23399. #endif
  23400. /* then cipher suite */
  23401. output[idx++] = ssl->options.cipherSuite0;
  23402. output[idx++] = ssl->options.cipherSuite;
  23403. /* then compression */
  23404. if (ssl->options.usingCompression)
  23405. output[idx++] = ZLIB_COMPRESSION;
  23406. else
  23407. output[idx++] = NO_COMPRESSION;
  23408. /* last, extensions */
  23409. #ifdef HAVE_TLS_EXTENSIONS
  23410. {
  23411. word16 offset = 0;
  23412. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  23413. if (ret != 0)
  23414. return ret;
  23415. idx += offset;
  23416. }
  23417. #else
  23418. #ifdef HAVE_EXTENDED_MASTER
  23419. if (ssl->options.haveEMS) {
  23420. c16toa(HELLO_EXT_SZ, output + idx);
  23421. idx += HELLO_EXT_SZ_SZ;
  23422. c16toa(HELLO_EXT_EXTMS, output + idx);
  23423. idx += HELLO_EXT_TYPE_SZ;
  23424. c16toa(0, output + idx);
  23425. /*idx += HELLO_EXT_SZ_SZ;*/
  23426. /* idx is not used after this point. uncomment the line above
  23427. * if adding any more extensions in the future. */
  23428. }
  23429. #endif
  23430. #endif
  23431. if (IsEncryptionOn(ssl, 1)) {
  23432. byte* input;
  23433. int inputSz = idx; /* build msg adds rec hdr */
  23434. int recordHeaderSz = RECORD_HEADER_SZ;
  23435. if (ssl->options.dtls)
  23436. recordHeaderSz += DTLS_RECORD_EXTRA;
  23437. inputSz -= recordHeaderSz;
  23438. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23439. if (input == NULL)
  23440. return MEMORY_E;
  23441. XMEMCPY(input, output + recordHeaderSz, inputSz);
  23442. #ifdef WOLFSSL_DTLS
  23443. if (IsDtlsNotSctpMode(ssl) &&
  23444. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
  23445. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23446. return ret;
  23447. }
  23448. #endif
  23449. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  23450. handshake, 1, 0, 0, CUR_ORDER);
  23451. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23452. if (sendSz < 0)
  23453. return sendSz;
  23454. } else {
  23455. #ifdef WOLFSSL_DTLS
  23456. if (IsDtlsNotSctpMode(ssl)) {
  23457. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
  23458. return ret;
  23459. }
  23460. if (ssl->options.dtls)
  23461. DtlsSEQIncrement(ssl, CUR_ORDER);
  23462. #endif
  23463. ret = HashOutput(ssl, output, sendSz, 0);
  23464. if (ret != 0)
  23465. return ret;
  23466. }
  23467. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  23468. if (ssl->hsInfoOn)
  23469. AddPacketName(ssl, "ServerHello");
  23470. if (ssl->toInfoOn)
  23471. AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  23472. WRITE_PROTO, ssl->heap);
  23473. #endif
  23474. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  23475. ssl->buffers.outputBuffer.length += sendSz;
  23476. if (ssl->options.groupMessages)
  23477. ret = 0;
  23478. else
  23479. ret = SendBuffered(ssl);
  23480. WOLFSSL_LEAVE("SendServerHello", ret);
  23481. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  23482. return ret;
  23483. }
  23484. #if defined(HAVE_ECC)
  23485. static byte SetCurveId(ecc_key* key)
  23486. {
  23487. if (key == NULL || key->dp == NULL) {
  23488. WOLFSSL_MSG("SetCurveId: Invalid key!");
  23489. return 0;
  23490. }
  23491. return (byte)GetCurveByOID(key->dp->oidSum);
  23492. }
  23493. #endif /* HAVE_ECC */
  23494. typedef struct SskeArgs {
  23495. byte* output; /* not allocated */
  23496. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  23497. !defined(NO_RSA)
  23498. byte* sigDataBuf;
  23499. #endif
  23500. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  23501. byte* exportBuf;
  23502. #endif
  23503. #ifndef NO_RSA
  23504. byte* verifySig;
  23505. #endif
  23506. byte* input;
  23507. word32 idx;
  23508. word32 tmpSigSz;
  23509. word32 length;
  23510. word32 sigSz;
  23511. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  23512. !defined(NO_RSA)
  23513. word32 sigDataSz;
  23514. #endif
  23515. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  23516. word32 exportSz;
  23517. #endif
  23518. int sendSz;
  23519. int inputSz;
  23520. } SskeArgs;
  23521. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  23522. {
  23523. SskeArgs* args = (SskeArgs*)pArgs;
  23524. (void)ssl;
  23525. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  23526. if (args->exportBuf) {
  23527. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  23528. args->exportBuf = NULL;
  23529. }
  23530. #endif
  23531. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  23532. (!defined(NO_DH) && !defined(NO_RSA))
  23533. if (args->sigDataBuf) {
  23534. XFREE(args->sigDataBuf, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23535. args->sigDataBuf = NULL;
  23536. }
  23537. #endif
  23538. #ifndef NO_RSA
  23539. if (args->verifySig) {
  23540. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23541. args->verifySig = NULL;
  23542. }
  23543. #endif
  23544. (void)args;
  23545. }
  23546. /* handle generation of server_key_exchange (12) */
  23547. int SendServerKeyExchange(WOLFSSL* ssl)
  23548. {
  23549. int ret;
  23550. #ifdef WOLFSSL_ASYNC_CRYPT
  23551. SskeArgs* args = (SskeArgs*)ssl->async.args;
  23552. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  23553. (void)sizeof(args_test);
  23554. #else
  23555. SskeArgs args[1];
  23556. #endif
  23557. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  23558. WOLFSSL_ENTER("SendServerKeyExchange");
  23559. #ifdef WOLFSSL_ASYNC_CRYPT
  23560. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  23561. if (ret != WC_NOT_PENDING_E) {
  23562. /* Check for error */
  23563. if (ret < 0)
  23564. goto exit_sske;
  23565. }
  23566. else
  23567. #endif
  23568. {
  23569. /* Reset state */
  23570. ret = 0;
  23571. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  23572. XMEMSET(args, 0, sizeof(SskeArgs));
  23573. #ifdef WOLFSSL_ASYNC_CRYPT
  23574. ssl->async.freeArgs = FreeSskeArgs;
  23575. #endif
  23576. }
  23577. switch(ssl->options.asyncState)
  23578. {
  23579. case TLS_ASYNC_BEGIN:
  23580. {
  23581. /* Do some checks / debug msgs */
  23582. switch(ssl->specs.kea)
  23583. {
  23584. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23585. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23586. case ecdhe_psk_kea:
  23587. {
  23588. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  23589. break;
  23590. }
  23591. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  23592. #if defined(HAVE_ECC)
  23593. case ecc_diffie_hellman_kea:
  23594. {
  23595. if (ssl->specs.static_ecdh) {
  23596. WOLFSSL_MSG("Using Static ECDH, not sending "
  23597. "ServerKeyExchange");
  23598. ERROR_OUT(0, exit_sske);
  23599. }
  23600. WOLFSSL_MSG("Using ephemeral ECDH");
  23601. break;
  23602. }
  23603. #endif /* HAVE_ECC */
  23604. }
  23605. /* Preparing keys */
  23606. switch(ssl->specs.kea)
  23607. {
  23608. #ifndef NO_PSK
  23609. case psk_kea:
  23610. {
  23611. /* Nothing to do in this sub-state */
  23612. break;
  23613. }
  23614. #endif /* !NO_PSK */
  23615. #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA) \
  23616. || (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  23617. #if !defined(NO_PSK)
  23618. case dhe_psk_kea:
  23619. #endif
  23620. #if !defined(NO_RSA) || (defined(HAVE_ANON) && \
  23621. !defined(WOLFSSL_NO_TLS12))
  23622. case diffie_hellman_kea:
  23623. #endif
  23624. #if (defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)) && !defined(HAVE_PUBLIC_FFDHE)
  23625. if (ssl->namedGroup) {
  23626. word32 pSz = 0;
  23627. ret = wc_DhGetNamedKeyParamSize(ssl->namedGroup, &pSz,
  23628. NULL, NULL);
  23629. if (ret != 0)
  23630. goto exit_sske;
  23631. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  23632. /* Free'd in SSL_ResourceFree and
  23633. * FreeHandshakeResources */
  23634. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  23635. pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23636. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  23637. ERROR_OUT(MEMORY_E, exit_sske);
  23638. }
  23639. ssl->buffers.serverDH_Pub.length = pSz;
  23640. }
  23641. ssl->options.dhKeySz =(word16)pSz;
  23642. pSz = wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  23643. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  23644. /* Free'd in SSL_ResourceFree and
  23645. * FreeHandshakeResources */
  23646. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  23647. pSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  23648. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  23649. ERROR_OUT(MEMORY_E, exit_sske);
  23650. }
  23651. ssl->buffers.serverDH_Priv.length = pSz;
  23652. }
  23653. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  23654. (void**)&ssl->buffers.serverDH_Key);
  23655. if (ret != 0) {
  23656. goto exit_sske;
  23657. }
  23658. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  23659. ssl->namedGroup);
  23660. if (ret != 0) {
  23661. goto exit_sske;
  23662. }
  23663. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  23664. !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  23665. ssl->options.dhKeyTested = 1;
  23666. #endif
  23667. #ifdef HAVE_SECURE_RENEGOTIATION
  23668. /* Check that the DH public key buffer is large
  23669. * enough to hold the key. This may occur on a
  23670. * renegotiation when the key generated in the
  23671. * initial handshake is shorter than the key
  23672. * generated in the renegotiation. */
  23673. if (ssl->buffers.serverDH_Pub.length <
  23674. ssl->buffers.serverDH_P.length) {
  23675. byte* tmp = (byte*)XREALLOC(
  23676. ssl->buffers.serverDH_Pub.buffer,
  23677. ssl->buffers.serverDH_P.length +
  23678. OPAQUE16_LEN,
  23679. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23680. if (tmp == NULL)
  23681. ERROR_OUT(MEMORY_E, exit_sske);
  23682. ssl->buffers.serverDH_Pub.buffer = tmp;
  23683. ssl->buffers.serverDH_Pub.length =
  23684. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  23685. }
  23686. #endif
  23687. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  23688. ssl->buffers.serverDH_Priv.buffer,
  23689. (word32*)&ssl->buffers.serverDH_Priv.length,
  23690. ssl->buffers.serverDH_Pub.buffer,
  23691. (word32*)&ssl->buffers.serverDH_Pub.length);
  23692. break;
  23693. }
  23694. else
  23695. #endif
  23696. {
  23697. /* Allocate DH key buffers and generate key */
  23698. if (ssl->buffers.serverDH_P.buffer == NULL ||
  23699. ssl->buffers.serverDH_G.buffer == NULL) {
  23700. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  23701. }
  23702. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  23703. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  23704. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  23705. ssl->buffers.serverDH_P.length,
  23706. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23707. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  23708. ERROR_OUT(MEMORY_E, exit_sske);
  23709. }
  23710. ssl->buffers.serverDH_Pub.length =
  23711. ssl->buffers.serverDH_P.length;
  23712. }
  23713. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  23714. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  23715. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  23716. ssl->buffers.serverDH_P.length,
  23717. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  23718. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  23719. ERROR_OUT(MEMORY_E, exit_sske);
  23720. }
  23721. ssl->buffers.serverDH_Priv.length =
  23722. ssl->buffers.serverDH_P.length;
  23723. }
  23724. ssl->options.dhKeySz =
  23725. (word16)ssl->buffers.serverDH_P.length;
  23726. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  23727. (void**)&ssl->buffers.serverDH_Key);
  23728. if (ret != 0) {
  23729. goto exit_sske;
  23730. }
  23731. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  23732. !defined(HAVE_FIPS) && \
  23733. !defined(HAVE_SELFTEST)
  23734. if (ssl->options.dhDoKeyTest &&
  23735. !ssl->options.dhKeyTested)
  23736. {
  23737. ret = wc_DhSetCheckKey(
  23738. ssl->buffers.serverDH_Key,
  23739. ssl->buffers.serverDH_P.buffer,
  23740. ssl->buffers.serverDH_P.length,
  23741. ssl->buffers.serverDH_G.buffer,
  23742. ssl->buffers.serverDH_G.length,
  23743. NULL, 0, 0, ssl->rng);
  23744. if (ret != 0) {
  23745. goto exit_sske;
  23746. }
  23747. ssl->options.dhKeyTested = 1;
  23748. }
  23749. else
  23750. #endif
  23751. {
  23752. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  23753. ssl->buffers.serverDH_P.buffer,
  23754. ssl->buffers.serverDH_P.length,
  23755. ssl->buffers.serverDH_G.buffer,
  23756. ssl->buffers.serverDH_G.length);
  23757. if (ret != 0) {
  23758. goto exit_sske;
  23759. }
  23760. }
  23761. #ifdef HAVE_SECURE_RENEGOTIATION
  23762. /* Check that the DH public key buffer is large
  23763. * enough to hold the key. This may occur on a
  23764. * renegotiation when the key generated in the
  23765. * initial handshake is shorter than the key
  23766. * generated in the renegotiation. */
  23767. if (ssl->buffers.serverDH_Pub.length <
  23768. ssl->buffers.serverDH_P.length) {
  23769. byte* tmp = (byte*)XREALLOC(
  23770. ssl->buffers.serverDH_Pub.buffer,
  23771. ssl->buffers.serverDH_P.length +
  23772. OPAQUE16_LEN,
  23773. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23774. if (tmp == NULL)
  23775. ERROR_OUT(MEMORY_E, exit_sske);
  23776. ssl->buffers.serverDH_Pub.buffer = tmp;
  23777. ssl->buffers.serverDH_Pub.length =
  23778. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  23779. }
  23780. #endif
  23781. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  23782. ssl->buffers.serverDH_Priv.buffer,
  23783. (word32*)&ssl->buffers.serverDH_Priv.length,
  23784. ssl->buffers.serverDH_Pub.buffer,
  23785. (word32*)&ssl->buffers.serverDH_Pub.length);
  23786. break;
  23787. }
  23788. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  23789. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23790. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23791. case ecdhe_psk_kea:
  23792. /* Fall through to create temp ECC key */
  23793. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  23794. #if defined(HAVE_ECC) || \
  23795. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  23796. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  23797. !defined(NO_RSA)))
  23798. case ecc_diffie_hellman_kea:
  23799. {
  23800. #ifdef HAVE_CURVE25519
  23801. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  23802. /* need ephemeral key now, create it if missing */
  23803. if (ssl->eccTempKey == NULL) {
  23804. /* alloc/init on demand */
  23805. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  23806. (void**)&ssl->eccTempKey);
  23807. if (ret != 0) {
  23808. goto exit_sske;
  23809. }
  23810. }
  23811. if (ssl->eccTempKeyPresent == 0) {
  23812. ret = X25519MakeKey(ssl,
  23813. (curve25519_key*)ssl->eccTempKey, NULL);
  23814. if (ret == 0 || ret == WC_PENDING_E) {
  23815. ssl->eccTempKeyPresent =
  23816. DYNAMIC_TYPE_CURVE25519;
  23817. }
  23818. }
  23819. break;
  23820. }
  23821. #endif
  23822. #ifdef HAVE_CURVE448
  23823. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  23824. /* need ephemeral key now, create it if missing */
  23825. if (ssl->eccTempKey == NULL) {
  23826. /* alloc/init on demand */
  23827. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  23828. (void**)&ssl->eccTempKey);
  23829. if (ret != 0) {
  23830. goto exit_sske;
  23831. }
  23832. }
  23833. if (ssl->eccTempKeyPresent == 0) {
  23834. ret = X448MakeKey(ssl,
  23835. (curve448_key*)ssl->eccTempKey, NULL);
  23836. if (ret == 0 || ret == WC_PENDING_E) {
  23837. ssl->eccTempKeyPresent =
  23838. DYNAMIC_TYPE_CURVE448;
  23839. }
  23840. }
  23841. break;
  23842. }
  23843. #endif
  23844. #ifdef HAVE_ECC
  23845. /* need ephemeral key now, create it if missing */
  23846. if (ssl->eccTempKey == NULL) {
  23847. /* alloc/init on demand */
  23848. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  23849. (void**)&ssl->eccTempKey);
  23850. if (ret != 0) {
  23851. goto exit_sske;
  23852. }
  23853. }
  23854. if (ssl->eccTempKeyPresent == 0) {
  23855. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  23856. if (ret == 0 || ret == WC_PENDING_E) {
  23857. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  23858. }
  23859. }
  23860. #endif
  23861. break;
  23862. }
  23863. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23864. default:
  23865. /* Skip ServerKeyExchange */
  23866. goto exit_sske;
  23867. } /* switch(ssl->specs.kea) */
  23868. /* Check for error */
  23869. if (ret != 0) {
  23870. goto exit_sske;
  23871. }
  23872. /* Advance state and proceed */
  23873. ssl->options.asyncState = TLS_ASYNC_BUILD;
  23874. } /* case TLS_ASYNC_BEGIN */
  23875. FALL_THROUGH;
  23876. case TLS_ASYNC_BUILD:
  23877. {
  23878. switch(ssl->specs.kea)
  23879. {
  23880. #ifndef NO_PSK
  23881. case psk_kea:
  23882. {
  23883. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23884. if (ssl->arrays->server_hint[0] == 0) {
  23885. ERROR_OUT(0, exit_sske); /* don't send */
  23886. }
  23887. /* include size part */
  23888. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  23889. if (args->length > MAX_PSK_ID_LEN) {
  23890. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  23891. }
  23892. args->length += HINT_LEN_SZ;
  23893. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  23894. RECORD_HEADER_SZ;
  23895. #ifdef WOLFSSL_DTLS
  23896. if (ssl->options.dtls) {
  23897. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23898. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23899. }
  23900. #endif
  23901. if (IsEncryptionOn(ssl, 1)) {
  23902. args->sendSz += MAX_MSG_EXTRA;
  23903. }
  23904. /* Use tmp buffer */
  23905. args->input = (byte*)XMALLOC(args->sendSz,
  23906. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23907. if (args->input == NULL)
  23908. ERROR_OUT(MEMORY_E, exit_sske);
  23909. args->output = args->input;
  23910. AddHeaders(args->output, args->length,
  23911. server_key_exchange, ssl);
  23912. /* key data */
  23913. c16toa((word16)(args->length - HINT_LEN_SZ),
  23914. args->output + args->idx);
  23915. args->idx += HINT_LEN_SZ;
  23916. XMEMCPY(args->output + args->idx,
  23917. ssl->arrays->server_hint,
  23918. args->length - HINT_LEN_SZ);
  23919. break;
  23920. }
  23921. #endif /* !NO_PSK */
  23922. #if !defined(NO_DH) && !defined(NO_PSK)
  23923. case dhe_psk_kea:
  23924. {
  23925. word32 hintLen;
  23926. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23927. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  23928. ssl->buffers.serverDH_P.length +
  23929. ssl->buffers.serverDH_G.length +
  23930. ssl->buffers.serverDH_Pub.length;
  23931. /* include size part */
  23932. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  23933. if (hintLen > MAX_PSK_ID_LEN) {
  23934. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  23935. }
  23936. args->length += hintLen + HINT_LEN_SZ;
  23937. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  23938. RECORD_HEADER_SZ;
  23939. #ifdef WOLFSSL_DTLS
  23940. if (ssl->options.dtls) {
  23941. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23942. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23943. }
  23944. #endif
  23945. if (IsEncryptionOn(ssl, 1)) {
  23946. args->sendSz += MAX_MSG_EXTRA;
  23947. }
  23948. /* Use tmp buffer */
  23949. args->input = (byte*)XMALLOC(args->sendSz,
  23950. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23951. if (args->input == NULL)
  23952. ERROR_OUT(MEMORY_E, exit_sske);
  23953. args->output = args->input;
  23954. AddHeaders(args->output, args->length,
  23955. server_key_exchange, ssl);
  23956. /* key data */
  23957. c16toa((word16)hintLen, args->output + args->idx);
  23958. args->idx += HINT_LEN_SZ;
  23959. XMEMCPY(args->output + args->idx,
  23960. ssl->arrays->server_hint, hintLen);
  23961. args->idx += hintLen;
  23962. /* add p, g, pub */
  23963. c16toa((word16)ssl->buffers.serverDH_P.length,
  23964. args->output + args->idx);
  23965. args->idx += LENGTH_SZ;
  23966. XMEMCPY(args->output + args->idx,
  23967. ssl->buffers.serverDH_P.buffer,
  23968. ssl->buffers.serverDH_P.length);
  23969. args->idx += ssl->buffers.serverDH_P.length;
  23970. /* g */
  23971. c16toa((word16)ssl->buffers.serverDH_G.length,
  23972. args->output + args->idx);
  23973. args->idx += LENGTH_SZ;
  23974. XMEMCPY(args->output + args->idx,
  23975. ssl->buffers.serverDH_G.buffer,
  23976. ssl->buffers.serverDH_G.length);
  23977. args->idx += ssl->buffers.serverDH_G.length;
  23978. /* pub */
  23979. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  23980. args->output + args->idx);
  23981. args->idx += LENGTH_SZ;
  23982. XMEMCPY(args->output + args->idx,
  23983. ssl->buffers.serverDH_Pub.buffer,
  23984. ssl->buffers.serverDH_Pub.length);
  23985. /* No need to update idx, since sizes are already set */
  23986. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  23987. break;
  23988. }
  23989. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  23990. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23991. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23992. case ecdhe_psk_kea:
  23993. {
  23994. word32 hintLen;
  23995. /* curve type, named curve, length(1) */
  23996. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23997. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  23998. args->exportSz = MAX_EXPORT_ECC_SZ;
  23999. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  24000. ssl->heap, DYNAMIC_TYPE_DER);
  24001. if (args->exportBuf == NULL) {
  24002. ERROR_OUT(MEMORY_E, exit_sske);
  24003. }
  24004. #ifdef HAVE_CURVE25519
  24005. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  24006. if (wc_curve25519_export_public_ex(
  24007. (curve25519_key*)ssl->eccTempKey,
  24008. args->exportBuf, &args->exportSz,
  24009. EC25519_LITTLE_ENDIAN) != 0) {
  24010. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  24011. }
  24012. }
  24013. else
  24014. #endif
  24015. #ifdef HAVE_CURVE448
  24016. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  24017. if (wc_curve448_export_public_ex(
  24018. (curve448_key*)ssl->eccTempKey,
  24019. args->exportBuf, &args->exportSz,
  24020. EC448_LITTLE_ENDIAN) != 0) {
  24021. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  24022. }
  24023. }
  24024. else
  24025. #endif
  24026. {
  24027. PRIVATE_KEY_UNLOCK();
  24028. ret = wc_ecc_export_x963(ssl->eccTempKey,
  24029. args->exportBuf, &args->exportSz);
  24030. PRIVATE_KEY_LOCK();
  24031. if (ret != 0) {
  24032. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  24033. }
  24034. }
  24035. args->length += args->exportSz;
  24036. /* include size part */
  24037. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  24038. if (hintLen > MAX_PSK_ID_LEN) {
  24039. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  24040. }
  24041. args->length += hintLen + HINT_LEN_SZ;
  24042. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  24043. #ifdef WOLFSSL_DTLS
  24044. if (ssl->options.dtls) {
  24045. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24046. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24047. }
  24048. #endif
  24049. if (IsEncryptionOn(ssl, 1)) {
  24050. args->sendSz += MAX_MSG_EXTRA;
  24051. }
  24052. /* Use tmp buffer */
  24053. args->input = (byte*)XMALLOC(args->sendSz,
  24054. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24055. if (args->input == NULL)
  24056. ERROR_OUT(MEMORY_E, exit_sske);
  24057. args->output = args->input;
  24058. /* key data */
  24059. c16toa((word16)hintLen, args->output + args->idx);
  24060. args->idx += HINT_LEN_SZ;
  24061. XMEMCPY(args->output + args->idx,
  24062. ssl->arrays->server_hint, hintLen);
  24063. args->idx += hintLen;
  24064. /* ECC key exchange data */
  24065. args->output[args->idx++] = named_curve;
  24066. args->output[args->idx++] = 0x00; /* leading zero */
  24067. #ifdef HAVE_CURVE25519
  24068. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  24069. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  24070. else
  24071. #endif
  24072. #ifdef HAVE_CURVE448
  24073. if (ssl->ecdhCurveOID == ECC_X448_OID)
  24074. args->output[args->idx++] = WOLFSSL_ECC_X448;
  24075. else
  24076. #endif
  24077. {
  24078. #ifdef HAVE_ECC
  24079. args->output[args->idx++] =
  24080. SetCurveId(ssl->eccTempKey);
  24081. #endif
  24082. }
  24083. args->output[args->idx++] = (byte)args->exportSz;
  24084. XMEMCPY(args->output + args->idx, args->exportBuf,
  24085. args->exportSz);
  24086. break;
  24087. }
  24088. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  24089. #if defined(HAVE_ECC) || \
  24090. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  24091. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  24092. !defined(NO_RSA)))
  24093. case ecc_diffie_hellman_kea:
  24094. {
  24095. enum wc_HashType hashType;
  24096. word32 preSigSz, preSigIdx;
  24097. /* curve type, named curve, length(1) */
  24098. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  24099. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  24100. /* Export temp ECC key and add to length */
  24101. args->exportSz = MAX_EXPORT_ECC_SZ;
  24102. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  24103. ssl->heap, DYNAMIC_TYPE_DER);
  24104. if (args->exportBuf == NULL) {
  24105. ERROR_OUT(MEMORY_E, exit_sske);
  24106. }
  24107. #ifdef HAVE_CURVE25519
  24108. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  24109. if (wc_curve25519_export_public_ex(
  24110. (curve25519_key*)ssl->eccTempKey,
  24111. args->exportBuf, &args->exportSz,
  24112. EC25519_LITTLE_ENDIAN) != 0) {
  24113. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  24114. }
  24115. }
  24116. else
  24117. #endif
  24118. #ifdef HAVE_CURVE448
  24119. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  24120. if (wc_curve448_export_public_ex(
  24121. (curve448_key*)ssl->eccTempKey,
  24122. args->exportBuf, &args->exportSz,
  24123. EC448_LITTLE_ENDIAN) != 0) {
  24124. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  24125. }
  24126. }
  24127. else
  24128. #endif
  24129. {
  24130. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  24131. PRIVATE_KEY_UNLOCK();
  24132. ret = wc_ecc_export_x963(ssl->eccTempKey,
  24133. args->exportBuf, &args->exportSz);
  24134. PRIVATE_KEY_LOCK();
  24135. if (ret != 0) {
  24136. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  24137. }
  24138. #endif
  24139. }
  24140. args->length += args->exportSz;
  24141. preSigSz = args->length;
  24142. preSigIdx = args->idx;
  24143. if (ssl->buffers.key == NULL) {
  24144. #ifdef HAVE_PK_CALLBACKS
  24145. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  24146. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  24147. if (args->tmpSigSz == 0) {
  24148. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  24149. }
  24150. }
  24151. else
  24152. #endif
  24153. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  24154. }
  24155. else {
  24156. switch(ssl->suites->sigAlgo) {
  24157. #ifndef NO_RSA
  24158. #ifdef WC_RSA_PSS
  24159. case rsa_pss_sa_algo:
  24160. #endif
  24161. case rsa_sa_algo:
  24162. {
  24163. word16 keySz;
  24164. ssl->buffers.keyType = rsa_sa_algo;
  24165. ret = DecodePrivateKey(ssl, &keySz);
  24166. if (ret != 0) {
  24167. goto exit_sske;
  24168. }
  24169. args->tmpSigSz = (word32)keySz;
  24170. break;
  24171. }
  24172. #endif /* !NO_RSA */
  24173. #ifdef HAVE_ECC
  24174. case ecc_dsa_sa_algo:
  24175. {
  24176. word16 keySz;
  24177. ssl->buffers.keyType = ecc_dsa_sa_algo;
  24178. ret = DecodePrivateKey(ssl, &keySz);
  24179. if (ret != 0) {
  24180. goto exit_sske;
  24181. }
  24182. /* worst case estimate */
  24183. args->tmpSigSz = keySz;
  24184. break;
  24185. }
  24186. #endif
  24187. #ifdef HAVE_ED25519
  24188. case ed25519_sa_algo:
  24189. {
  24190. word16 keySz;
  24191. ssl->buffers.keyType = ed25519_sa_algo;
  24192. ret = DecodePrivateKey(ssl, &keySz);
  24193. if (ret != 0) {
  24194. goto exit_sske;
  24195. }
  24196. /* worst case estimate */
  24197. args->tmpSigSz = ED25519_SIG_SIZE;
  24198. break;
  24199. }
  24200. #endif /* HAVE_ED25519 */
  24201. #ifdef HAVE_ED448
  24202. case ed448_sa_algo:
  24203. {
  24204. word16 keySz;
  24205. ssl->buffers.keyType = ed448_sa_algo;
  24206. ret = DecodePrivateKey(ssl, &keySz);
  24207. if (ret != 0) {
  24208. goto exit_sske;
  24209. }
  24210. /* worst case estimate */
  24211. args->tmpSigSz = ED448_SIG_SIZE;
  24212. break;
  24213. }
  24214. #endif /* HAVE_ED448 */
  24215. default:
  24216. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  24217. } /* switch(ssl->specs.sig_algo) */
  24218. }
  24219. /* sig length */
  24220. args->length += LENGTH_SZ;
  24221. args->length += args->tmpSigSz;
  24222. if (IsAtLeastTLSv1_2(ssl)) {
  24223. args->length += HASH_SIG_SIZE;
  24224. }
  24225. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  24226. #ifdef WOLFSSL_DTLS
  24227. if (ssl->options.dtls) {
  24228. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24229. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24230. preSigIdx = args->idx;
  24231. }
  24232. #endif
  24233. if (IsEncryptionOn(ssl, 1)) {
  24234. args->sendSz += MAX_MSG_EXTRA;
  24235. }
  24236. /* Use tmp buffer */
  24237. args->input = (byte*)XMALLOC(args->sendSz,
  24238. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24239. if (args->input == NULL)
  24240. ERROR_OUT(MEMORY_E, exit_sske);
  24241. args->output = args->input;
  24242. /* record and message headers will be added below, when we're sure
  24243. of the sig length */
  24244. /* key exchange data */
  24245. args->output[args->idx++] = named_curve;
  24246. args->output[args->idx++] = 0x00; /* leading zero */
  24247. #ifdef HAVE_CURVE25519
  24248. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  24249. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  24250. else
  24251. #endif
  24252. #ifdef HAVE_CURVE448
  24253. if (ssl->ecdhCurveOID == ECC_X448_OID)
  24254. args->output[args->idx++] = WOLFSSL_ECC_X448;
  24255. else
  24256. #endif
  24257. {
  24258. #ifdef HAVE_ECC
  24259. args->output[args->idx++] =
  24260. SetCurveId(ssl->eccTempKey);
  24261. #endif
  24262. }
  24263. args->output[args->idx++] = (byte)args->exportSz;
  24264. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  24265. args->idx += args->exportSz;
  24266. /* Determine hash type */
  24267. if (IsAtLeastTLSv1_2(ssl)) {
  24268. EncodeSigAlg(ssl->suites->hashAlgo,
  24269. ssl->suites->sigAlgo,
  24270. &args->output[args->idx]);
  24271. args->idx += 2;
  24272. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  24273. if (hashType == WC_HASH_TYPE_NONE) {
  24274. ERROR_OUT(ALGO_ID_E, exit_sske);
  24275. }
  24276. } else {
  24277. /* only using sha and md5 for rsa */
  24278. #ifndef NO_OLD_TLS
  24279. hashType = WC_HASH_TYPE_SHA;
  24280. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  24281. hashType = WC_HASH_TYPE_MD5_SHA;
  24282. }
  24283. #else
  24284. ERROR_OUT(ALGO_ID_E, exit_sske);
  24285. #endif
  24286. }
  24287. /* Signature length will be written later, when we're sure what it is */
  24288. #ifdef HAVE_FUZZER
  24289. if (ssl->fuzzerCb) {
  24290. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  24291. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  24292. }
  24293. #endif
  24294. /* Assemble buffer to hash for signature */
  24295. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  24296. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  24297. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24298. if (args->sigDataBuf == NULL) {
  24299. ERROR_OUT(MEMORY_E, exit_sske);
  24300. }
  24301. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  24302. RAN_LEN);
  24303. XMEMCPY(args->sigDataBuf+RAN_LEN,
  24304. ssl->arrays->serverRandom, RAN_LEN);
  24305. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  24306. args->output + preSigIdx, preSigSz);
  24307. if (ssl->suites->sigAlgo != ed25519_sa_algo &&
  24308. ssl->suites->sigAlgo != ed448_sa_algo) {
  24309. ssl->buffers.sig.length =
  24310. wc_HashGetDigestSize(hashType);
  24311. if ((int)ssl->buffers.sig.length < 0) {
  24312. ERROR_OUT(HASH_TYPE_E, exit_sske);
  24313. }
  24314. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  24315. ssl->buffers.sig.length,
  24316. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24317. if (ssl->buffers.sig.buffer == NULL) {
  24318. ERROR_OUT(MEMORY_E, exit_sske);
  24319. }
  24320. /* Perform hash */
  24321. ret = wc_Hash(hashType, args->sigDataBuf,
  24322. args->sigDataSz,
  24323. ssl->buffers.sig.buffer,
  24324. ssl->buffers.sig.length);
  24325. if (ret != 0) {
  24326. goto exit_sske;
  24327. }
  24328. }
  24329. args->sigSz = args->tmpSigSz;
  24330. /* Sign hash to create signature */
  24331. switch (ssl->suites->sigAlgo)
  24332. {
  24333. #ifndef NO_RSA
  24334. case rsa_sa_algo:
  24335. {
  24336. /* For TLS 1.2 re-encode signature */
  24337. if (IsAtLeastTLSv1_2(ssl)) {
  24338. byte* encodedSig = (byte*)XMALLOC(
  24339. MAX_ENCODED_SIG_SZ, ssl->heap,
  24340. DYNAMIC_TYPE_SIGNATURE);
  24341. if (encodedSig == NULL) {
  24342. ERROR_OUT(MEMORY_E, exit_sske);
  24343. }
  24344. ssl->buffers.sig.length =
  24345. wc_EncodeSignature(encodedSig,
  24346. ssl->buffers.sig.buffer,
  24347. ssl->buffers.sig.length,
  24348. TypeHash(ssl->suites->hashAlgo));
  24349. /* Replace sig buffer with new one */
  24350. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  24351. DYNAMIC_TYPE_SIGNATURE);
  24352. ssl->buffers.sig.buffer = encodedSig;
  24353. }
  24354. /* write sig size here */
  24355. c16toa((word16)args->sigSz,
  24356. args->output + args->idx);
  24357. args->idx += LENGTH_SZ;
  24358. break;
  24359. }
  24360. #ifdef WC_RSA_PSS
  24361. case rsa_pss_sa_algo:
  24362. /* write sig size here */
  24363. c16toa((word16)args->sigSz,
  24364. args->output + args->idx);
  24365. args->idx += LENGTH_SZ;
  24366. break;
  24367. #endif
  24368. #endif /* !NO_RSA */
  24369. case ecc_dsa_sa_algo:
  24370. {
  24371. break;
  24372. }
  24373. #ifdef HAVE_ED25519
  24374. case ed25519_sa_algo:
  24375. ret = Ed25519CheckPubKey(ssl);
  24376. if (ret != 0)
  24377. goto exit_sske;
  24378. break;
  24379. #endif /* HAVE_ED25519 */
  24380. #ifdef HAVE_ED448
  24381. case ed448_sa_algo:
  24382. ret = Ed448CheckPubKey(ssl);
  24383. if (ret != 0)
  24384. goto exit_sske;
  24385. break;
  24386. #endif /* HAVE_ED448 */
  24387. default:
  24388. break;
  24389. } /* switch(ssl->specs.sig_algo) */
  24390. break;
  24391. }
  24392. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24393. #if !defined(NO_DH) && (!defined(NO_RSA) || \
  24394. (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  24395. case diffie_hellman_kea:
  24396. {
  24397. enum wc_HashType hashType;
  24398. word32 preSigSz, preSigIdx;
  24399. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  24400. args->length = LENGTH_SZ * 3; /* p, g, pub */
  24401. args->length += ssl->buffers.serverDH_P.length +
  24402. ssl->buffers.serverDH_G.length +
  24403. ssl->buffers.serverDH_Pub.length;
  24404. preSigIdx = args->idx;
  24405. preSigSz = args->length;
  24406. if (!ssl->options.usingAnon_cipher) {
  24407. word16 keySz = 0;
  24408. /* sig length */
  24409. args->length += LENGTH_SZ;
  24410. if (ssl->buffers.key == NULL) {
  24411. #ifdef HAVE_PK_CALLBACKS
  24412. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  24413. keySz = (word32)GetPrivateKeySigSize(ssl);
  24414. else
  24415. #endif
  24416. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  24417. }
  24418. else
  24419. {
  24420. if (ssl->buffers.keyType == 0)
  24421. ssl->buffers.keyType = rsa_sa_algo;
  24422. ret = DecodePrivateKey(ssl, &keySz);
  24423. if (ret != 0) {
  24424. goto exit_sske;
  24425. }
  24426. }
  24427. /* test if keySz has error */
  24428. if (keySz == 0) {
  24429. ERROR_OUT(keySz, exit_sske);
  24430. }
  24431. args->tmpSigSz = (word32)keySz;
  24432. args->length += args->tmpSigSz;
  24433. if (IsAtLeastTLSv1_2(ssl)) {
  24434. args->length += HASH_SIG_SIZE;
  24435. }
  24436. }
  24437. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  24438. RECORD_HEADER_SZ;
  24439. #ifdef WOLFSSL_DTLS
  24440. if (ssl->options.dtls) {
  24441. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24442. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24443. preSigIdx = args->idx;
  24444. }
  24445. #endif
  24446. if (IsEncryptionOn(ssl, 1)) {
  24447. args->sendSz += MAX_MSG_EXTRA;
  24448. }
  24449. /* Use tmp buffer */
  24450. args->input = (byte*)XMALLOC(args->sendSz,
  24451. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24452. if (args->input == NULL)
  24453. ERROR_OUT(MEMORY_E, exit_sske);
  24454. args->output = args->input;
  24455. AddHeaders(args->output, args->length,
  24456. server_key_exchange, ssl);
  24457. /* add p, g, pub */
  24458. c16toa((word16)ssl->buffers.serverDH_P.length,
  24459. args->output + args->idx);
  24460. args->idx += LENGTH_SZ;
  24461. XMEMCPY(args->output + args->idx,
  24462. ssl->buffers.serverDH_P.buffer,
  24463. ssl->buffers.serverDH_P.length);
  24464. args->idx += ssl->buffers.serverDH_P.length;
  24465. /* g */
  24466. c16toa((word16)ssl->buffers.serverDH_G.length,
  24467. args->output + args->idx);
  24468. args->idx += LENGTH_SZ;
  24469. XMEMCPY(args->output + args->idx,
  24470. ssl->buffers.serverDH_G.buffer,
  24471. ssl->buffers.serverDH_G.length);
  24472. args->idx += ssl->buffers.serverDH_G.length;
  24473. /* pub */
  24474. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  24475. args->output + args->idx);
  24476. args->idx += LENGTH_SZ;
  24477. XMEMCPY(args->output + args->idx,
  24478. ssl->buffers.serverDH_Pub.buffer,
  24479. ssl->buffers.serverDH_Pub.length);
  24480. args->idx += ssl->buffers.serverDH_Pub.length;
  24481. #ifdef HAVE_FUZZER
  24482. if (ssl->fuzzerCb) {
  24483. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  24484. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  24485. }
  24486. #endif
  24487. if (ssl->options.usingAnon_cipher) {
  24488. break;
  24489. }
  24490. /* Determine hash type */
  24491. if (IsAtLeastTLSv1_2(ssl)) {
  24492. EncodeSigAlg(ssl->suites->hashAlgo,
  24493. ssl->suites->sigAlgo,
  24494. &args->output[args->idx]);
  24495. args->idx += 2;
  24496. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  24497. if (hashType == WC_HASH_TYPE_NONE) {
  24498. ERROR_OUT(ALGO_ID_E, exit_sske);
  24499. }
  24500. } else {
  24501. /* only using sha and md5 for rsa */
  24502. #ifndef NO_OLD_TLS
  24503. hashType = WC_HASH_TYPE_SHA;
  24504. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  24505. hashType = WC_HASH_TYPE_MD5_SHA;
  24506. }
  24507. #else
  24508. ERROR_OUT(ALGO_ID_E, exit_sske);
  24509. #endif
  24510. }
  24511. /* signature size */
  24512. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  24513. args->idx += LENGTH_SZ;
  24514. /* Assemble buffer to hash for signature */
  24515. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  24516. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  24517. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24518. if (args->sigDataBuf == NULL) {
  24519. ERROR_OUT(MEMORY_E, exit_sske);
  24520. }
  24521. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  24522. RAN_LEN);
  24523. XMEMCPY(args->sigDataBuf+RAN_LEN,
  24524. ssl->arrays->serverRandom, RAN_LEN);
  24525. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  24526. args->output + preSigIdx, preSigSz);
  24527. if (ssl->suites->sigAlgo != ed25519_sa_algo &&
  24528. ssl->suites->sigAlgo != ed448_sa_algo) {
  24529. ssl->buffers.sig.length =
  24530. wc_HashGetDigestSize(hashType);
  24531. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  24532. ssl->buffers.sig.length, ssl->heap,
  24533. DYNAMIC_TYPE_SIGNATURE);
  24534. if (ssl->buffers.sig.buffer == NULL) {
  24535. ERROR_OUT(MEMORY_E, exit_sske);
  24536. }
  24537. /* Perform hash */
  24538. ret = wc_Hash(hashType, args->sigDataBuf,
  24539. args->sigDataSz,
  24540. ssl->buffers.sig.buffer,
  24541. ssl->buffers.sig.length);
  24542. if (ret != 0) {
  24543. goto exit_sske;
  24544. }
  24545. }
  24546. args->sigSz = args->tmpSigSz;
  24547. /* Sign hash to create signature */
  24548. switch (ssl->suites->sigAlgo)
  24549. {
  24550. #ifndef NO_RSA
  24551. case rsa_sa_algo:
  24552. {
  24553. /* For TLS 1.2 re-encode signature */
  24554. if (IsAtLeastTLSv1_2(ssl)) {
  24555. byte* encodedSig = (byte*)XMALLOC(
  24556. MAX_ENCODED_SIG_SZ, ssl->heap,
  24557. DYNAMIC_TYPE_SIGNATURE);
  24558. if (encodedSig == NULL) {
  24559. ERROR_OUT(MEMORY_E, exit_sske);
  24560. }
  24561. ssl->buffers.sig.length =
  24562. wc_EncodeSignature(encodedSig,
  24563. ssl->buffers.sig.buffer,
  24564. ssl->buffers.sig.length,
  24565. TypeHash(ssl->suites->hashAlgo));
  24566. /* Replace sig buffer with new one */
  24567. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  24568. DYNAMIC_TYPE_SIGNATURE);
  24569. ssl->buffers.sig.buffer = encodedSig;
  24570. }
  24571. break;
  24572. }
  24573. #endif /* NO_RSA */
  24574. default:
  24575. break;
  24576. } /* switch (ssl->suites->sigAlgo) */
  24577. break;
  24578. }
  24579. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  24580. default:
  24581. break;
  24582. } /* switch(ssl->specs.kea) */
  24583. /* Check for error */
  24584. if (ret != 0) {
  24585. goto exit_sske;
  24586. }
  24587. /* Advance state and proceed */
  24588. ssl->options.asyncState = TLS_ASYNC_DO;
  24589. } /* case TLS_ASYNC_BUILD */
  24590. FALL_THROUGH;
  24591. case TLS_ASYNC_DO:
  24592. {
  24593. switch(ssl->specs.kea)
  24594. {
  24595. #ifndef NO_PSK
  24596. case psk_kea:
  24597. {
  24598. break;
  24599. }
  24600. #endif /* !NO_PSK */
  24601. #if !defined(NO_DH) && !defined(NO_PSK)
  24602. case dhe_psk_kea:
  24603. {
  24604. break;
  24605. }
  24606. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  24607. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24608. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  24609. case ecdhe_psk_kea:
  24610. {
  24611. break;
  24612. }
  24613. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  24614. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24615. defined(HAVE_CURVE448)
  24616. case ecc_diffie_hellman_kea:
  24617. {
  24618. /* Sign hash to create signature */
  24619. switch (ssl->suites->sigAlgo)
  24620. {
  24621. #ifndef NO_RSA
  24622. #ifdef WC_RSA_PSS
  24623. case rsa_pss_sa_algo:
  24624. #endif
  24625. case rsa_sa_algo:
  24626. {
  24627. RsaKey* key = (RsaKey*)ssl->hsKey;
  24628. ret = RsaSign(ssl,
  24629. ssl->buffers.sig.buffer,
  24630. ssl->buffers.sig.length,
  24631. args->output + args->idx,
  24632. &args->sigSz,
  24633. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  24634. key,
  24635. ssl->buffers.key
  24636. );
  24637. break;
  24638. }
  24639. #endif /* !NO_RSA */
  24640. #ifdef HAVE_ECC
  24641. case ecc_dsa_sa_algo:
  24642. {
  24643. ecc_key* key = (ecc_key*)ssl->hsKey;
  24644. ret = EccSign(ssl,
  24645. ssl->buffers.sig.buffer,
  24646. ssl->buffers.sig.length,
  24647. args->output + LENGTH_SZ + args->idx,
  24648. &args->sigSz,
  24649. key,
  24650. #ifdef HAVE_PK_CALLBACKS
  24651. ssl->buffers.key
  24652. #else
  24653. NULL
  24654. #endif
  24655. );
  24656. break;
  24657. }
  24658. #endif /* HAVE_ECC */
  24659. #ifdef HAVE_ED25519
  24660. case ed25519_sa_algo:
  24661. {
  24662. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  24663. ret = Ed25519Sign(ssl,
  24664. args->sigDataBuf, args->sigDataSz,
  24665. args->output + LENGTH_SZ + args->idx,
  24666. &args->sigSz,
  24667. key,
  24668. #ifdef HAVE_PK_CALLBACKS
  24669. ssl->buffers.key
  24670. #else
  24671. NULL
  24672. #endif
  24673. );
  24674. break;
  24675. }
  24676. #endif
  24677. #ifdef HAVE_ED448
  24678. case ed448_sa_algo:
  24679. {
  24680. ed448_key* key = (ed448_key*)ssl->hsKey;
  24681. ret = Ed448Sign(ssl,
  24682. args->sigDataBuf, args->sigDataSz,
  24683. args->output + LENGTH_SZ + args->idx,
  24684. &args->sigSz,
  24685. key,
  24686. #ifdef HAVE_PK_CALLBACKS
  24687. ssl->buffers.key
  24688. #else
  24689. NULL
  24690. #endif
  24691. );
  24692. break;
  24693. }
  24694. #endif
  24695. default:
  24696. ERROR_OUT(ALGO_ID_E, exit_sske);
  24697. } /* switch(ssl->specs.sig_algo) */
  24698. break;
  24699. }
  24700. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24701. #if !defined(NO_DH) && !defined(NO_RSA)
  24702. case diffie_hellman_kea:
  24703. {
  24704. /* Sign hash to create signature */
  24705. switch (ssl->suites->sigAlgo)
  24706. {
  24707. #ifndef NO_RSA
  24708. #ifdef WC_RSA_PSS
  24709. case rsa_pss_sa_algo:
  24710. #endif
  24711. case rsa_sa_algo:
  24712. {
  24713. RsaKey* key = (RsaKey*)ssl->hsKey;
  24714. if (ssl->options.usingAnon_cipher) {
  24715. break;
  24716. }
  24717. ret = RsaSign(ssl,
  24718. ssl->buffers.sig.buffer,
  24719. ssl->buffers.sig.length,
  24720. args->output + args->idx,
  24721. &args->sigSz,
  24722. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  24723. key,
  24724. ssl->buffers.key
  24725. );
  24726. break;
  24727. }
  24728. #endif /* NO_RSA */
  24729. default:
  24730. break;
  24731. } /* switch (ssl->suites->sigAlgo) */
  24732. break;
  24733. }
  24734. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  24735. default:
  24736. break;
  24737. } /* switch(ssl->specs.kea) */
  24738. /* Check for error */
  24739. if (ret != 0) {
  24740. goto exit_sske;
  24741. }
  24742. /* Advance state and proceed */
  24743. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  24744. } /* case TLS_ASYNC_DO */
  24745. FALL_THROUGH;
  24746. case TLS_ASYNC_VERIFY:
  24747. {
  24748. switch(ssl->specs.kea)
  24749. {
  24750. #ifndef NO_PSK
  24751. case psk_kea:
  24752. {
  24753. /* Nothing to do in this sub-state */
  24754. break;
  24755. }
  24756. #endif /* !NO_PSK */
  24757. #if !defined(NO_DH) && !defined(NO_PSK)
  24758. case dhe_psk_kea:
  24759. {
  24760. /* Nothing to do in this sub-state */
  24761. break;
  24762. }
  24763. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  24764. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24765. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  24766. case ecdhe_psk_kea:
  24767. {
  24768. /* Nothing to do in this sub-state */
  24769. break;
  24770. }
  24771. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  24772. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24773. defined(HAVE_CURVE448)
  24774. case ecc_diffie_hellman_kea:
  24775. {
  24776. switch(ssl->suites->sigAlgo)
  24777. {
  24778. #ifndef NO_RSA
  24779. #ifdef WC_RSA_PSS
  24780. case rsa_pss_sa_algo:
  24781. #endif
  24782. case rsa_sa_algo:
  24783. {
  24784. RsaKey* key = (RsaKey*)ssl->hsKey;
  24785. if (args->verifySig == NULL) {
  24786. if (args->sigSz == 0) {
  24787. ERROR_OUT(BAD_COND_E, exit_sske);
  24788. }
  24789. args->verifySig = (byte*)XMALLOC(
  24790. args->sigSz, ssl->heap,
  24791. DYNAMIC_TYPE_SIGNATURE);
  24792. if (!args->verifySig) {
  24793. ERROR_OUT(MEMORY_E, exit_sske);
  24794. }
  24795. XMEMCPY(args->verifySig,
  24796. args->output + args->idx, args->sigSz);
  24797. }
  24798. /* check for signature faults */
  24799. ret = VerifyRsaSign(ssl,
  24800. args->verifySig, args->sigSz,
  24801. ssl->buffers.sig.buffer,
  24802. ssl->buffers.sig.length,
  24803. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  24804. key, ssl->buffers.key
  24805. );
  24806. break;
  24807. }
  24808. #endif
  24809. case ecc_dsa_sa_algo:
  24810. #ifdef HAVE_ED25519
  24811. case ed25519_sa_algo:
  24812. #endif
  24813. #ifdef HAVE_ED448
  24814. case ed448_sa_algo:
  24815. #endif
  24816. {
  24817. /* Now that we know the real sig size, write it. */
  24818. c16toa((word16)args->sigSz,
  24819. args->output + args->idx);
  24820. /* And adjust length and sendSz from estimates */
  24821. args->length += args->sigSz - args->tmpSigSz;
  24822. args->sendSz += args->sigSz - args->tmpSigSz;
  24823. break;
  24824. }
  24825. default:
  24826. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  24827. } /* switch(ssl->specs.sig_algo) */
  24828. break;
  24829. }
  24830. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24831. #if !defined(NO_DH) && !defined(NO_RSA)
  24832. case diffie_hellman_kea:
  24833. {
  24834. switch (ssl->suites->sigAlgo)
  24835. {
  24836. #ifndef NO_RSA
  24837. #ifndef WC_RSA_PSS
  24838. case rsa_pss_sa_algo:
  24839. #endif
  24840. case rsa_sa_algo:
  24841. {
  24842. RsaKey* key = (RsaKey*)ssl->hsKey;
  24843. if (ssl->options.usingAnon_cipher) {
  24844. break;
  24845. }
  24846. if (args->verifySig == NULL) {
  24847. if (args->sigSz == 0) {
  24848. ERROR_OUT(BAD_COND_E, exit_sske);
  24849. }
  24850. args->verifySig = (byte*)XMALLOC(
  24851. args->sigSz, ssl->heap,
  24852. DYNAMIC_TYPE_SIGNATURE);
  24853. if (!args->verifySig) {
  24854. ERROR_OUT(MEMORY_E, exit_sske);
  24855. }
  24856. XMEMCPY(args->verifySig,
  24857. args->output + args->idx, args->sigSz);
  24858. }
  24859. /* check for signature faults */
  24860. ret = VerifyRsaSign(ssl,
  24861. args->verifySig, args->sigSz,
  24862. ssl->buffers.sig.buffer,
  24863. ssl->buffers.sig.length,
  24864. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  24865. key, ssl->buffers.key
  24866. );
  24867. break;
  24868. }
  24869. #endif
  24870. } /* switch (ssl->suites->sigAlgo) */
  24871. break;
  24872. }
  24873. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  24874. default:
  24875. break;
  24876. } /* switch(ssl->specs.kea) */
  24877. /* Check for error */
  24878. if (ret != 0) {
  24879. goto exit_sske;
  24880. }
  24881. /* Advance state and proceed */
  24882. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  24883. } /* case TLS_ASYNC_VERIFY */
  24884. FALL_THROUGH;
  24885. case TLS_ASYNC_FINALIZE:
  24886. {
  24887. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24888. defined(HAVE_CURVE448)
  24889. if (ssl->specs.kea == ecdhe_psk_kea ||
  24890. ssl->specs.kea == ecc_diffie_hellman_kea) {
  24891. /* Check output to make sure it was set */
  24892. if (args->output) {
  24893. AddHeaders(args->output, args->length,
  24894. server_key_exchange, ssl);
  24895. }
  24896. else {
  24897. ERROR_OUT(BUFFER_ERROR, exit_sske);
  24898. }
  24899. }
  24900. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24901. ret = SendHandshakeMsg(ssl, args->output, args->length,
  24902. server_key_exchange, "ServerKeyExchange");
  24903. if (ret != 0)
  24904. goto exit_sske;
  24905. /* Advance state and proceed */
  24906. ssl->options.asyncState = TLS_ASYNC_END;
  24907. } /* case TLS_ASYNC_FINALIZE */
  24908. FALL_THROUGH;
  24909. case TLS_ASYNC_END:
  24910. {
  24911. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  24912. break;
  24913. }
  24914. default:
  24915. ret = INPUT_CASE_ERROR;
  24916. } /* switch(ssl->options.asyncState) */
  24917. exit_sske:
  24918. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  24919. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  24920. #ifdef WOLFSSL_ASYNC_CRYPT
  24921. /* Handle async operation */
  24922. if (ret == WC_PENDING_E)
  24923. return ret;
  24924. #endif /* WOLFSSL_ASYNC_CRYPT */
  24925. /* Final cleanup */
  24926. if (args->input != NULL) {
  24927. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24928. args->input = NULL;
  24929. }
  24930. FreeSskeArgs(ssl, args);
  24931. FreeKeyExchange(ssl);
  24932. return ret;
  24933. }
  24934. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  24935. defined(OPENSSL_ALL)
  24936. /* search suites for specific one, idx on success, negative on error */
  24937. static int FindSuite(Suites* suites, byte first, byte second)
  24938. {
  24939. int i;
  24940. if (suites == NULL || suites->suiteSz == 0) {
  24941. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  24942. return SUITES_ERROR;
  24943. }
  24944. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  24945. if (suites->suites[i] == first &&
  24946. suites->suites[i+1] == second )
  24947. return i;
  24948. }
  24949. return MATCH_SUITE_ERROR;
  24950. }
  24951. #endif
  24952. #endif /* !WOLFSSL_NO_TLS12 */
  24953. /* Make sure server cert/key are valid for this suite, true on success
  24954. * Returns 1 for valid server suite or 0 if not found
  24955. * For asynchronous this can return WC_PENDING_E
  24956. */
  24957. static int VerifyServerSuite(WOLFSSL* ssl, word16 idx)
  24958. {
  24959. int haveRSA = !ssl->options.haveStaticECC;
  24960. #ifndef NO_PSK
  24961. int havePSK = ssl->options.havePSK;
  24962. #endif
  24963. byte first;
  24964. byte second;
  24965. WOLFSSL_ENTER("VerifyServerSuite");
  24966. if (ssl->suites == NULL) {
  24967. WOLFSSL_MSG("Suites pointer error");
  24968. return 0;
  24969. }
  24970. first = ssl->suites->suites[idx];
  24971. second = ssl->suites->suites[idx+1];
  24972. if (CipherRequires(first, second, REQUIRES_RSA)) {
  24973. WOLFSSL_MSG("Requires RSA");
  24974. if (haveRSA == 0) {
  24975. WOLFSSL_MSG("Don't have RSA");
  24976. return 0;
  24977. }
  24978. }
  24979. if (CipherRequires(first, second, REQUIRES_DHE)) {
  24980. WOLFSSL_MSG("Requires DHE");
  24981. if (ssl->options.haveDH == 0) {
  24982. WOLFSSL_MSG("Don't have DHE");
  24983. return 0;
  24984. }
  24985. }
  24986. if (CipherRequires(first, second, REQUIRES_ECC)) {
  24987. WOLFSSL_MSG("Requires ECC");
  24988. if (ssl->options.haveECC == 0) {
  24989. WOLFSSL_MSG("Don't have ECC");
  24990. return 0;
  24991. }
  24992. }
  24993. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  24994. WOLFSSL_MSG("Requires static ECC");
  24995. if (ssl->options.haveStaticECC == 0) {
  24996. WOLFSSL_MSG("Don't have static ECC");
  24997. return 0;
  24998. }
  24999. }
  25000. if (CipherRequires(first, second, REQUIRES_PSK)) {
  25001. WOLFSSL_MSG("Requires PSK");
  25002. #ifndef NO_PSK
  25003. if (havePSK == 0)
  25004. #endif
  25005. {
  25006. WOLFSSL_MSG("Don't have PSK");
  25007. return 0;
  25008. }
  25009. }
  25010. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  25011. WOLFSSL_MSG("Requires RSA Signature");
  25012. if (ssl->options.side == WOLFSSL_SERVER_END &&
  25013. ssl->options.haveECDSAsig == 1) {
  25014. WOLFSSL_MSG("Don't have RSA Signature");
  25015. return 0;
  25016. }
  25017. }
  25018. #if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
  25019. if (CipherRequires(first, second, REQUIRES_AEAD)) {
  25020. WOLFSSL_MSG("Requires AEAD");
  25021. if (ssl->version.major == SSLv3_MAJOR &&
  25022. ssl->version.minor < TLSv1_2_MINOR) {
  25023. WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
  25024. return 0;
  25025. }
  25026. }
  25027. #endif
  25028. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25029. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  25030. if (!TLSX_ValidateSupportedCurves(ssl, first, second)) {
  25031. WOLFSSL_MSG("Don't have matching curves");
  25032. return 0;
  25033. }
  25034. #endif
  25035. #ifdef WOLFSSL_TLS13
  25036. if (IsAtLeastTLSv1_3(ssl->version) &&
  25037. ssl->options.side == WOLFSSL_SERVER_END) {
  25038. #ifdef HAVE_SUPPORTED_CURVES
  25039. int doHelloRetry = 0;
  25040. /* Try to establish a key share. */
  25041. int ret = TLSX_KeyShare_Establish(ssl, &doHelloRetry);
  25042. if (doHelloRetry) {
  25043. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  25044. }
  25045. #ifdef WOLFSSL_ASYNC_CRYPT
  25046. if (ret == WC_PENDING_E)
  25047. return ret;
  25048. #endif
  25049. if (!doHelloRetry && ret != 0) {
  25050. return 0; /* not found */
  25051. }
  25052. #endif /* HAVE_SUPPORTED_CURVES */
  25053. }
  25054. else if (first == TLS13_BYTE || (first == ECC_BYTE &&
  25055. (second == TLS_SHA256_SHA256 || second == TLS_SHA384_SHA384))) {
  25056. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  25057. * version. */
  25058. return 0;
  25059. }
  25060. #endif /* WOLFSSL_TLS13 */
  25061. return 1;
  25062. }
  25063. #ifndef NO_WOLFSSL_SERVER
  25064. static int CompareSuites(WOLFSSL* ssl, Suites* peerSuites, word16 i,
  25065. word16 j)
  25066. {
  25067. if (ssl->suites->suites[i] == peerSuites->suites[j] &&
  25068. ssl->suites->suites[i+1] == peerSuites->suites[j+1] ) {
  25069. int ret = VerifyServerSuite(ssl, i);
  25070. #ifdef WOLFSSL_ASYNC_CRYPT
  25071. if (ret == WC_PENDING_E)
  25072. return ret;
  25073. #endif
  25074. if (ret) {
  25075. WOLFSSL_MSG("Verified suite validity");
  25076. ssl->options.cipherSuite0 = ssl->suites->suites[i];
  25077. ssl->options.cipherSuite = ssl->suites->suites[i+1];
  25078. ret = SetCipherSpecs(ssl);
  25079. if (ret == 0) {
  25080. ret = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  25081. peerSuites->hashSigAlgoSz);
  25082. }
  25083. return ret;
  25084. }
  25085. else {
  25086. WOLFSSL_MSG("Could not verify suite validity, continue");
  25087. }
  25088. }
  25089. return MATCH_SUITE_ERROR;
  25090. }
  25091. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  25092. {
  25093. int ret;
  25094. word16 i, j;
  25095. WOLFSSL_ENTER("MatchSuite");
  25096. /* & 0x1 equivalent % 2 */
  25097. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  25098. return BUFFER_ERROR;
  25099. if (ssl->suites == NULL)
  25100. return SUITES_ERROR;
  25101. if (!ssl->options.useClientOrder) {
  25102. /* Server order */
  25103. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  25104. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  25105. ret = CompareSuites(ssl, peerSuites, i, j);
  25106. if (ret != MATCH_SUITE_ERROR)
  25107. return ret;
  25108. }
  25109. }
  25110. }
  25111. else {
  25112. /* Client order */
  25113. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  25114. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  25115. ret = CompareSuites(ssl, peerSuites, i, j);
  25116. if (ret != MATCH_SUITE_ERROR)
  25117. return ret;
  25118. }
  25119. }
  25120. }
  25121. return MATCH_SUITE_ERROR;
  25122. }
  25123. #endif
  25124. #ifdef OLD_HELLO_ALLOWED
  25125. /* process old style client hello, deprecate? */
  25126. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  25127. word32 inSz, word16 sz)
  25128. {
  25129. word32 idx = *inOutIdx;
  25130. word16 sessionSz;
  25131. word16 randomSz;
  25132. word16 i, j;
  25133. ProtocolVersion pv;
  25134. Suites clSuites;
  25135. int ret = -1;
  25136. (void)inSz;
  25137. WOLFSSL_MSG("Got old format client hello");
  25138. #ifdef WOLFSSL_CALLBACKS
  25139. if (ssl->hsInfoOn)
  25140. AddPacketName(ssl, "ClientHello");
  25141. if (ssl->toInfoOn)
  25142. AddLateName("ClientHello", &ssl->timeoutInfo);
  25143. #endif
  25144. /* manually hash input since different format */
  25145. #ifndef NO_OLD_TLS
  25146. #ifndef NO_MD5
  25147. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  25148. #endif
  25149. #ifndef NO_SHA
  25150. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  25151. #endif
  25152. #endif
  25153. #ifndef NO_SHA256
  25154. if (IsAtLeastTLSv1_2(ssl)) {
  25155. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  25156. input + idx, sz);
  25157. if (shaRet != 0)
  25158. return shaRet;
  25159. }
  25160. #endif
  25161. /* does this value mean client_hello? */
  25162. idx++;
  25163. /* version */
  25164. pv.major = input[idx++];
  25165. pv.minor = input[idx++];
  25166. ssl->chVersion = pv; /* store */
  25167. if (ssl->version.minor > pv.minor) {
  25168. byte haveRSA = 0;
  25169. byte havePSK = 0;
  25170. int keySz = 0;
  25171. if (!ssl->options.downgrade) {
  25172. WOLFSSL_MSG("Client trying to connect with lesser version");
  25173. return VERSION_ERROR;
  25174. }
  25175. if (pv.minor < ssl->options.minDowngrade) {
  25176. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  25177. return VERSION_ERROR;
  25178. }
  25179. if (pv.minor == SSLv3_MINOR) {
  25180. /* turn off tls */
  25181. WOLFSSL_MSG("\tdowngrading to SSLv3");
  25182. ssl->options.tls = 0;
  25183. ssl->options.tls1_1 = 0;
  25184. ssl->version.minor = SSLv3_MINOR;
  25185. }
  25186. else if (pv.minor == TLSv1_MINOR) {
  25187. WOLFSSL_MSG("\tdowngrading to TLSv1");
  25188. /* turn off tls 1.1+ */
  25189. ssl->options.tls1_1 = 0;
  25190. ssl->version.minor = TLSv1_MINOR;
  25191. }
  25192. else if (pv.minor == TLSv1_1_MINOR) {
  25193. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  25194. ssl->version.minor = TLSv1_1_MINOR;
  25195. }
  25196. else if (pv.minor == TLSv1_2_MINOR) {
  25197. WOLFSSL_MSG(" downgrading to TLSv1.2");
  25198. ssl->version.minor = TLSv1_2_MINOR;
  25199. }
  25200. #ifndef NO_RSA
  25201. haveRSA = 1;
  25202. #endif
  25203. #ifndef NO_PSK
  25204. havePSK = ssl->options.havePSK;
  25205. #endif
  25206. #ifndef NO_CERTS
  25207. keySz = ssl->buffers.keySz;
  25208. #endif
  25209. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  25210. ssl->options.haveDH, ssl->options.haveECDSAsig,
  25211. ssl->options.haveECC, ssl->options.haveStaticECC,
  25212. ssl->options.haveAnon, ssl->options.side);
  25213. }
  25214. /* suite size */
  25215. ato16(&input[idx], &clSuites.suiteSz);
  25216. idx += OPAQUE16_LEN;
  25217. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  25218. return BUFFER_ERROR;
  25219. /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
  25220. if (clSuites.suiteSz % 3 != 0)
  25221. return BUFFER_ERROR;
  25222. clSuites.hashSigAlgoSz = 0;
  25223. /* session size */
  25224. ato16(&input[idx], &sessionSz);
  25225. idx += OPAQUE16_LEN;
  25226. if (sessionSz > ID_LEN)
  25227. return BUFFER_ERROR;
  25228. /* random size */
  25229. ato16(&input[idx], &randomSz);
  25230. idx += OPAQUE16_LEN;
  25231. if (randomSz > RAN_LEN)
  25232. return BUFFER_ERROR;
  25233. /* suites */
  25234. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  25235. byte first = input[idx++];
  25236. if (!first) { /* implicit: skip sslv2 type */
  25237. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  25238. j += SUITE_LEN;
  25239. }
  25240. idx += SUITE_LEN;
  25241. }
  25242. clSuites.suiteSz = j;
  25243. /* session id */
  25244. if (sessionSz) {
  25245. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  25246. ssl->arrays->sessionIDSz = (byte)sessionSz;
  25247. idx += sessionSz;
  25248. ssl->options.resuming = 1;
  25249. }
  25250. /* random */
  25251. if (randomSz < RAN_LEN)
  25252. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  25253. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  25254. randomSz);
  25255. idx += randomSz;
  25256. if (ssl->options.usingCompression)
  25257. ssl->options.usingCompression = 0; /* turn off */
  25258. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  25259. ssl->cbmode = SSL_CB_MODE_WRITE;
  25260. *inOutIdx = idx;
  25261. ssl->options.haveSessionId = 1;
  25262. /* DoClientHello uses same resume code */
  25263. if (ssl->options.resuming) { /* let's try */
  25264. WOLFSSL_SESSION* session = GetSession(ssl,
  25265. ssl->arrays->masterSecret, 1);
  25266. #ifdef HAVE_SESSION_TICKET
  25267. if (ssl->options.useTicket == 1) {
  25268. session = &ssl->session;
  25269. }
  25270. #endif
  25271. if (!session) {
  25272. WOLFSSL_MSG("Session lookup for resume failed");
  25273. ssl->options.resuming = 0;
  25274. } else {
  25275. #ifdef HAVE_EXT_CACHE
  25276. wolfSSL_SESSION_free(session);
  25277. #endif
  25278. if (MatchSuite(ssl, &clSuites) < 0) {
  25279. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  25280. return UNSUPPORTED_SUITE;
  25281. }
  25282. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  25283. RAN_LEN);
  25284. if (ret != 0)
  25285. return ret;
  25286. #ifdef NO_OLD_TLS
  25287. ret = DeriveTlsKeys(ssl);
  25288. #else
  25289. #ifndef NO_TLS
  25290. if (ssl->options.tls)
  25291. ret = DeriveTlsKeys(ssl);
  25292. #endif
  25293. if (!ssl->options.tls)
  25294. ret = DeriveKeys(ssl);
  25295. #endif
  25296. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  25297. return ret;
  25298. }
  25299. }
  25300. ret = MatchSuite(ssl, &clSuites);
  25301. if (ret != 0)return ret;
  25302. return SanityCheckMsgReceived(ssl, client_hello);
  25303. }
  25304. #endif /* OLD_HELLO_ALLOWED */
  25305. #ifndef WOLFSSL_NO_TLS12
  25306. /**
  25307. * Handles session resumption.
  25308. * Session tickets are checked for validity based on the time each ticket
  25309. * was created, timeout value and the current time. If the tickets are
  25310. * judged expired, falls back to full-handshake. If you want disable this
  25311. * sessin ticket validation check in TLS1.2 and below, define
  25312. * WOLFSSL_NO_TICKET_EXPRE.
  25313. */
  25314. int HandleTlsResumption(WOLFSSL* ssl, int bogusID, Suites* clSuites)
  25315. {
  25316. int ret = 0;
  25317. WOLFSSL_SESSION* session;
  25318. (void)bogusID;
  25319. session = GetSession(ssl, ssl->arrays->masterSecret, 1);
  25320. #ifdef HAVE_SESSION_TICKET
  25321. if (ssl->options.useTicket == 1) {
  25322. session = &ssl->session;
  25323. } else if (bogusID == 1 && ssl->options.rejectTicket == 0) {
  25324. WOLFSSL_MSG("Bogus session ID without session ticket");
  25325. return BUFFER_ERROR;
  25326. }
  25327. #endif
  25328. if (!session) {
  25329. WOLFSSL_MSG("Session lookup for resume failed");
  25330. ssl->options.resuming = 0;
  25331. return ret;
  25332. }
  25333. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_TICKET_EXPIRE) && \
  25334. !defined(NO_ASN_TIME)
  25335. /* check if the ticket is valid */
  25336. if (LowResTimer() > session->bornOn + ssl->timeout) {
  25337. WOLFSSL_MSG("Expired session ticket, fall back to full handshake.");
  25338. ssl->options.resuming = 0;
  25339. }
  25340. #endif /* HAVE_SESSION_TICKET && !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
  25341. else if (session->haveEMS != ssl->options.haveEMS) {
  25342. /* RFC 7627, 5.3, server-side */
  25343. /* if old sess didn't have EMS, but new does, full handshake */
  25344. if (!session->haveEMS && ssl->options.haveEMS) {
  25345. WOLFSSL_MSG("Attempting to resume a session that didn't "
  25346. "use EMS with a new session with EMS. Do full "
  25347. "handshake.");
  25348. ssl->options.resuming = 0;
  25349. }
  25350. /* if old sess used EMS, but new doesn't, MUST abort */
  25351. else if (session->haveEMS && !ssl->options.haveEMS) {
  25352. WOLFSSL_MSG("Trying to resume a session with EMS without "
  25353. "using EMS");
  25354. #ifdef WOLFSSL_EXTRA_ALERTS
  25355. SendAlert(ssl, alert_fatal, handshake_failure);
  25356. #endif
  25357. #ifdef HAVE_EXT_CACHE
  25358. wolfSSL_SESSION_free(session);
  25359. #endif
  25360. return EXT_MASTER_SECRET_NEEDED_E;
  25361. }
  25362. #ifdef HAVE_EXT_CACHE
  25363. wolfSSL_SESSION_free(session);
  25364. #endif
  25365. }
  25366. else {
  25367. #ifndef NO_RESUME_SUITE_CHECK
  25368. int j;
  25369. /* Check client suites include the one in session */
  25370. for (j = 0; j < clSuites->suiteSz; j += 2) {
  25371. if (clSuites->suites[j] == session->cipherSuite0 &&
  25372. clSuites->suites[j+1] == session->cipherSuite) {
  25373. break;
  25374. }
  25375. }
  25376. if (j == clSuites->suiteSz) {
  25377. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  25378. #ifdef WOLFSSL_EXTRA_ALERTS
  25379. SendAlert(ssl, alert_fatal, illegal_parameter);
  25380. #endif
  25381. return UNSUPPORTED_SUITE;
  25382. }
  25383. #endif
  25384. #ifdef HAVE_EXT_CACHE
  25385. wolfSSL_SESSION_free(session);
  25386. #endif
  25387. if (MatchSuite(ssl, clSuites) < 0) {
  25388. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  25389. return UNSUPPORTED_SUITE;
  25390. }
  25391. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  25392. RAN_LEN);
  25393. if (ret != 0)
  25394. return ret;
  25395. #ifdef NO_OLD_TLS
  25396. ret = DeriveTlsKeys(ssl);
  25397. #else
  25398. #ifndef NO_TLS
  25399. if (ssl->options.tls)
  25400. ret = DeriveTlsKeys(ssl);
  25401. #endif
  25402. if (!ssl->options.tls)
  25403. ret = DeriveKeys(ssl);
  25404. #endif
  25405. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  25406. }
  25407. return ret;
  25408. }
  25409. /* handle processing of client_hello (1) */
  25410. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  25411. word32 helloSz)
  25412. {
  25413. byte b;
  25414. byte bogusID = 0; /* flag for a bogus session id */
  25415. ProtocolVersion pv;
  25416. Suites clSuites;
  25417. word32 i = *inOutIdx;
  25418. word32 begin = i;
  25419. int ret = 0;
  25420. #ifdef WOLFSSL_DTLS
  25421. Hmac cookieHmac;
  25422. byte peerCookie[MAX_COOKIE_LEN];
  25423. byte peerCookieSz = 0;
  25424. byte cookieType;
  25425. byte cookieSz = 0;
  25426. XMEMSET(&cookieHmac, 0, sizeof(Hmac));
  25427. #endif /* WOLFSSL_DTLS */
  25428. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  25429. WOLFSSL_ENTER("DoClientHello");
  25430. #ifdef WOLFSSL_CALLBACKS
  25431. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  25432. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  25433. #endif
  25434. /* protocol version, random and session id length check */
  25435. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  25436. return BUFFER_ERROR;
  25437. /* protocol version */
  25438. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  25439. ssl->chVersion = pv; /* store */
  25440. #ifdef WOLFSSL_DTLS
  25441. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  25442. #if defined(NO_SHA) && defined(NO_SHA256)
  25443. #error "DTLS needs either SHA or SHA-256"
  25444. #endif /* NO_SHA && NO_SHA256 */
  25445. #if !defined(NO_SHA) && defined(NO_SHA256)
  25446. cookieType = WC_SHA;
  25447. cookieSz = WC_SHA_DIGEST_SIZE;
  25448. #endif /* NO_SHA */
  25449. #ifndef NO_SHA256
  25450. cookieType = WC_SHA256;
  25451. cookieSz = WC_SHA256_DIGEST_SIZE;
  25452. #endif /* NO_SHA256 */
  25453. ret = wc_HmacSetKey(&cookieHmac, cookieType,
  25454. ssl->buffers.dtlsCookieSecret.buffer,
  25455. ssl->buffers.dtlsCookieSecret.length);
  25456. if (ret != 0) goto out;
  25457. ret = wc_HmacUpdate(&cookieHmac,
  25458. (const byte*)ssl->buffers.dtlsCtx.peer.sa,
  25459. ssl->buffers.dtlsCtx.peer.sz);
  25460. if (ret != 0) goto out;
  25461. ret = wc_HmacUpdate(&cookieHmac, input + i, OPAQUE16_LEN);
  25462. if (ret != 0) goto out;
  25463. }
  25464. #endif /* WOLFSSL_DTLS */
  25465. i += OPAQUE16_LEN;
  25466. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  25467. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  25468. pv.minor = TLSv1_2_MINOR;
  25469. if ((!ssl->options.dtls && ssl->version.minor > pv.minor) ||
  25470. (ssl->options.dtls && ssl->version.minor != DTLS_MINOR
  25471. && ssl->version.minor != DTLSv1_2_MINOR && pv.minor != DTLS_MINOR
  25472. && pv.minor != DTLSv1_2_MINOR)) {
  25473. word16 haveRSA = 0;
  25474. word16 havePSK = 0;
  25475. int keySz = 0;
  25476. if (!ssl->options.downgrade) {
  25477. WOLFSSL_MSG("Client trying to connect with lesser version");
  25478. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA)
  25479. SendAlert(ssl, alert_fatal, handshake_failure);
  25480. #endif
  25481. ret = VERSION_ERROR;
  25482. goto out;
  25483. }
  25484. if (pv.minor < ssl->options.minDowngrade) {
  25485. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  25486. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA)
  25487. SendAlert(ssl, alert_fatal, handshake_failure);
  25488. #endif
  25489. ret = VERSION_ERROR;
  25490. goto out;
  25491. }
  25492. if (pv.minor == SSLv3_MINOR) {
  25493. /* turn off tls */
  25494. WOLFSSL_MSG("\tdowngrading to SSLv3");
  25495. ssl->options.tls = 0;
  25496. ssl->options.tls1_1 = 0;
  25497. ssl->version.minor = SSLv3_MINOR;
  25498. }
  25499. else if (pv.minor == TLSv1_MINOR) {
  25500. /* turn off tls 1.1+ */
  25501. WOLFSSL_MSG("\tdowngrading to TLSv1");
  25502. ssl->options.tls1_1 = 0;
  25503. ssl->version.minor = TLSv1_MINOR;
  25504. }
  25505. else if (pv.minor == TLSv1_1_MINOR) {
  25506. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  25507. ssl->version.minor = TLSv1_1_MINOR;
  25508. }
  25509. else if (pv.minor == TLSv1_2_MINOR) {
  25510. WOLFSSL_MSG(" downgrading to TLSv1.2");
  25511. ssl->version.minor = TLSv1_2_MINOR;
  25512. }
  25513. #ifndef NO_RSA
  25514. haveRSA = 1;
  25515. #endif
  25516. #ifndef NO_PSK
  25517. havePSK = ssl->options.havePSK;
  25518. #endif
  25519. #ifndef NO_CERTS
  25520. keySz = ssl->buffers.keySz;
  25521. #endif
  25522. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  25523. ssl->options.haveDH, ssl->options.haveECDSAsig,
  25524. ssl->options.haveECC, ssl->options.haveStaticECC,
  25525. ssl->options.haveAnon, ssl->options.side);
  25526. }
  25527. #ifdef OPENSSL_EXTRA
  25528. /* check if option is set to not allow the current version
  25529. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  25530. if (!ssl->options.dtls && ssl->options.downgrade &&
  25531. ssl->options.mask > 0) {
  25532. int reset = 0;
  25533. if (ssl->version.minor == TLSv1_2_MINOR &&
  25534. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  25535. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  25536. ssl->version.minor = TLSv1_1_MINOR;
  25537. reset = 1;
  25538. }
  25539. if (ssl->version.minor == TLSv1_1_MINOR &&
  25540. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  25541. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  25542. ssl->options.tls1_1 = 0;
  25543. ssl->version.minor = TLSv1_MINOR;
  25544. reset = 1;
  25545. }
  25546. if (ssl->version.minor == TLSv1_MINOR &&
  25547. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  25548. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  25549. ssl->options.tls = 0;
  25550. ssl->options.tls1_1 = 0;
  25551. ssl->version.minor = SSLv3_MINOR;
  25552. reset = 1;
  25553. }
  25554. if (ssl->version.minor == SSLv3_MINOR &&
  25555. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  25556. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  25557. ret = VERSION_ERROR;
  25558. goto out;
  25559. }
  25560. if (ssl->version.minor < ssl->options.minDowngrade) {
  25561. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  25562. ret = VERSION_ERROR;
  25563. goto out;
  25564. }
  25565. if (reset) {
  25566. word16 haveRSA = 0;
  25567. word16 havePSK = 0;
  25568. int keySz = 0;
  25569. #ifndef NO_RSA
  25570. haveRSA = 1;
  25571. #endif
  25572. #ifndef NO_PSK
  25573. havePSK = ssl->options.havePSK;
  25574. #endif
  25575. #ifndef NO_CERTS
  25576. keySz = ssl->buffers.keySz;
  25577. #endif
  25578. /* reset cipher suites to account for TLS version change */
  25579. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  25580. ssl->options.haveDH, ssl->options.haveECDSAsig,
  25581. ssl->options.haveECC, ssl->options.haveStaticECC,
  25582. ssl->options.haveAnon, ssl->options.side);
  25583. }
  25584. }
  25585. #endif
  25586. /* random */
  25587. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  25588. #ifdef WOLFSSL_DTLS
  25589. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  25590. ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN);
  25591. if (ret != 0) goto out;
  25592. }
  25593. #endif /* WOLFSSL_DTLS */
  25594. i += RAN_LEN;
  25595. #ifdef SHOW_SECRETS
  25596. {
  25597. int j;
  25598. printf("client random: ");
  25599. for (j = 0; j < RAN_LEN; j++)
  25600. printf("%02x", ssl->arrays->clientRandom[j]);
  25601. printf("\n");
  25602. }
  25603. #endif
  25604. /* session id */
  25605. b = input[i++];
  25606. #ifdef HAVE_SESSION_TICKET
  25607. if (b > 0 && b < ID_LEN) {
  25608. bogusID = 1;
  25609. WOLFSSL_MSG("Client sent bogus session id, let's allow for echo");
  25610. }
  25611. #endif
  25612. if (b == ID_LEN || bogusID) {
  25613. if ((i - begin) + b > helloSz) {
  25614. ret = BUFFER_ERROR;
  25615. goto out;
  25616. }
  25617. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  25618. #ifdef WOLFSSL_DTLS
  25619. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) &&
  25620. !ssl->options.resuming) {
  25621. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  25622. if (ret != 0) goto out;
  25623. }
  25624. #endif /* WOLFSSL_DTLS */
  25625. ssl->arrays->sessionIDSz = b;
  25626. i += b;
  25627. ssl->options.resuming = 1; /* client wants to resume */
  25628. WOLFSSL_MSG("Client wants to resume session");
  25629. }
  25630. else if (b) {
  25631. WOLFSSL_MSG("Invalid session ID size");
  25632. ret = BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
  25633. goto out;
  25634. }
  25635. #ifdef WOLFSSL_DTLS
  25636. /* cookie */
  25637. if (ssl->options.dtls) {
  25638. if ((i - begin) + OPAQUE8_LEN > helloSz) {
  25639. ret = BUFFER_ERROR;
  25640. goto out;
  25641. }
  25642. peerCookieSz = input[i++];
  25643. if (peerCookieSz) {
  25644. if (peerCookieSz > MAX_COOKIE_LEN) {
  25645. ret = BUFFER_ERROR;
  25646. goto out;
  25647. }
  25648. if ((i - begin) + peerCookieSz > helloSz) {
  25649. ret = BUFFER_ERROR;
  25650. goto out;
  25651. }
  25652. XMEMCPY(peerCookie, input + i, peerCookieSz);
  25653. i += peerCookieSz;
  25654. }
  25655. }
  25656. #endif
  25657. /* suites */
  25658. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  25659. ret = BUFFER_ERROR;
  25660. goto out;
  25661. }
  25662. ato16(&input[i], &clSuites.suiteSz);
  25663. i += OPAQUE16_LEN;
  25664. /* Cipher suite lists are always multiples of two in length. */
  25665. if (clSuites.suiteSz % 2 != 0) {
  25666. ret = BUFFER_ERROR;
  25667. goto out;
  25668. }
  25669. /* suites and compression length check */
  25670. if ((i - begin) + clSuites.suiteSz + OPAQUE8_LEN > helloSz) {
  25671. ret = BUFFER_ERROR;
  25672. goto out;
  25673. }
  25674. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ) {
  25675. ret = BUFFER_ERROR;
  25676. goto out;
  25677. }
  25678. XMEMCPY(clSuites.suites, input + i, clSuites.suiteSz);
  25679. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  25680. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  25681. if (FindSuite(&clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  25682. TLSX* extension;
  25683. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  25684. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  25685. if (ret != WOLFSSL_SUCCESS)
  25686. goto out;
  25687. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  25688. if (extension) {
  25689. ssl->secure_renegotiation =
  25690. (SecureRenegotiation*)extension->data;
  25691. ssl->secure_renegotiation->enabled = 1;
  25692. }
  25693. }
  25694. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  25695. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  25696. /* check for TLS_FALLBACK_SCSV suite */
  25697. if (FindSuite(&clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  25698. WOLFSSL_MSG("Found Fallback SCSV");
  25699. if (ssl->ctx->method->version.minor > pv.minor) {
  25700. WOLFSSL_MSG("Client trying to connect with lesser version");
  25701. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  25702. ret = VERSION_ERROR;
  25703. goto out;
  25704. }
  25705. }
  25706. #endif
  25707. #ifdef WOLFSSL_DTLS
  25708. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  25709. ret = wc_HmacUpdate(&cookieHmac,
  25710. input + i - OPAQUE16_LEN,
  25711. clSuites.suiteSz + OPAQUE16_LEN);
  25712. if (ret != 0) goto out;
  25713. }
  25714. #endif /* WOLFSSL_DTLS */
  25715. i += clSuites.suiteSz;
  25716. clSuites.hashSigAlgoSz = 0;
  25717. /* compression length */
  25718. b = input[i++];
  25719. if ((i - begin) + b > helloSz) {
  25720. ret = BUFFER_ERROR;
  25721. goto out;
  25722. }
  25723. if (b == 0) {
  25724. WOLFSSL_MSG("No compression types in list");
  25725. #ifdef WOLFSSL_EXTRA_ALERTS
  25726. SendAlert(ssl, alert_fatal, decode_error);
  25727. #endif
  25728. ret = COMPRESSION_ERROR;
  25729. goto out;
  25730. }
  25731. #ifdef WOLFSSL_DTLS
  25732. if (IsDtlsNotSctpMode(ssl)) {
  25733. if (!IsSCR(ssl) && !ssl->options.resuming) {
  25734. byte newCookie[MAX_COOKIE_LEN];
  25735. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  25736. if (ret != 0) goto out;
  25737. ret = wc_HmacFinal(&cookieHmac, newCookie);
  25738. if (ret != 0) goto out;
  25739. /* If a cookie callback is set, call it to overwrite the cookie.
  25740. * This should be deprecated. The code now calculates the cookie
  25741. * using an HMAC as expected. */
  25742. if (ssl->ctx->CBIOCookie != NULL &&
  25743. ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz,
  25744. ssl->IOCB_CookieCtx) != cookieSz) {
  25745. ret = COOKIE_ERROR;
  25746. goto out;
  25747. }
  25748. /* Check the cookie, see if we progress the state machine. */
  25749. if (peerCookieSz != cookieSz ||
  25750. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  25751. /* Send newCookie to client in a HelloVerifyRequest message
  25752. * and let the state machine alone. */
  25753. ssl->msgsReceived.got_client_hello = 0;
  25754. ssl->keys.dtls_handshake_number = 0;
  25755. ssl->keys.dtls_expected_peer_handshake_number = 0;
  25756. *inOutIdx += helloSz;
  25757. ret = SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  25758. goto out;
  25759. }
  25760. }
  25761. /* This was skipped in the DTLS case so we could handle the hello
  25762. * verify request. */
  25763. ret = HashInput(ssl, input + *inOutIdx, helloSz);
  25764. if (ret != 0) goto out;
  25765. }
  25766. #endif /* WOLFSSL_DTLS */
  25767. {
  25768. /* compression match types */
  25769. int matchNo = 0;
  25770. int matchZlib = 0;
  25771. while (b--) {
  25772. byte comp = input[i++];
  25773. if (comp == NO_COMPRESSION) {
  25774. matchNo = 1;
  25775. }
  25776. if (comp == ZLIB_COMPRESSION) {
  25777. matchZlib = 1;
  25778. }
  25779. }
  25780. if (ssl->options.usingCompression == 0 && matchNo) {
  25781. WOLFSSL_MSG("Matched No Compression");
  25782. } else if (ssl->options.usingCompression && matchZlib) {
  25783. WOLFSSL_MSG("Matched zlib Compression");
  25784. } else if (ssl->options.usingCompression && matchNo) {
  25785. WOLFSSL_MSG("Could only match no compression, turning off");
  25786. ssl->options.usingCompression = 0; /* turn off */
  25787. } else {
  25788. WOLFSSL_MSG("Could not match compression");
  25789. #ifdef WOLFSSL_EXTRA_ALERTS
  25790. SendAlert(ssl, alert_fatal, illegal_parameter);
  25791. #endif
  25792. ret = COMPRESSION_ERROR;
  25793. goto out;
  25794. }
  25795. }
  25796. *inOutIdx = i;
  25797. /* tls extensions */
  25798. if ((i - begin) < helloSz) {
  25799. #ifdef HAVE_TLS_EXTENSIONS
  25800. if (TLSX_SupportExtensions(ssl))
  25801. #else
  25802. if (IsAtLeastTLSv1_2(ssl))
  25803. #endif
  25804. {
  25805. /* Process the hello extension. Skip unsupported. */
  25806. word16 totalExtSz;
  25807. #ifdef HAVE_TLS_EXTENSIONS
  25808. /* auto populate extensions supported unless user defined */
  25809. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  25810. goto out;
  25811. #endif
  25812. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  25813. ret = BUFFER_ERROR;
  25814. goto out;
  25815. }
  25816. ato16(&input[i], &totalExtSz);
  25817. i += OPAQUE16_LEN;
  25818. if ((i - begin) + totalExtSz > helloSz) {
  25819. ret = BUFFER_ERROR;
  25820. goto out;
  25821. }
  25822. #ifdef HAVE_TLS_EXTENSIONS
  25823. /* tls extensions */
  25824. if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, client_hello,
  25825. &clSuites)))
  25826. goto out;
  25827. #ifdef WOLFSSL_TLS13
  25828. if (TLSX_Find(ssl->extensions,
  25829. TLSX_SUPPORTED_VERSIONS) != NULL) {
  25830. WOLFSSL_MSG(
  25831. "Client attempting to connect with higher version");
  25832. ret = VERSION_ERROR;
  25833. goto out;
  25834. }
  25835. #endif
  25836. #ifdef HAVE_SNI
  25837. if((ret=SNI_Callback(ssl)))
  25838. goto out;
  25839. ssl->options.side = WOLFSSL_SERVER_END;
  25840. #endif
  25841. i += totalExtSz;
  25842. #else
  25843. while (totalExtSz) {
  25844. word16 extId, extSz;
  25845. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
  25846. ret = BUFFER_ERROR;
  25847. goto out;
  25848. }
  25849. ato16(&input[i], &extId);
  25850. i += OPAQUE16_LEN;
  25851. ato16(&input[i], &extSz);
  25852. i += OPAQUE16_LEN;
  25853. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
  25854. ret = BUFFER_ERROR;
  25855. goto out;
  25856. }
  25857. if (extId == HELLO_EXT_SIG_ALGO) {
  25858. word16 hashSigAlgoSz;
  25859. ato16(&input[i], &hashSigAlgoSz);
  25860. i += OPAQUE16_LEN;
  25861. if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
  25862. ret = BUFFER_ERROR;
  25863. goto out;
  25864. }
  25865. if (hashSigAlgoSz % 2 != 0) {
  25866. ret = BUFFER_ERROR;
  25867. goto out;
  25868. }
  25869. clSuites.hashSigAlgoSz = hashSigAlgoSz;
  25870. if (clSuites.hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  25871. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  25872. "truncating");
  25873. clSuites.hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  25874. }
  25875. XMEMCPY(clSuites.hashSigAlgo, &input[i],
  25876. clSuites.hashSigAlgoSz);
  25877. i += hashSigAlgoSz;
  25878. }
  25879. #ifdef HAVE_EXTENDED_MASTER
  25880. else if (extId == HELLO_EXT_EXTMS)
  25881. ssl->options.haveEMS = 1;
  25882. #endif
  25883. else
  25884. i += extSz;
  25885. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  25886. }
  25887. #endif
  25888. *inOutIdx = i;
  25889. }
  25890. else
  25891. *inOutIdx = begin + helloSz; /* skip extensions */
  25892. }
  25893. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  25894. ssl->options.haveSessionId = 1;
  25895. /* ProcessOld uses same resume code */
  25896. if (ssl->options.resuming) {
  25897. ret = HandleTlsResumption(ssl, bogusID, &clSuites);
  25898. if (ret != 0)
  25899. goto out;
  25900. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  25901. WOLFSSL_LEAVE("DoClientHello", ret);
  25902. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  25903. goto out;
  25904. }
  25905. }
  25906. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
  25907. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  25908. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  25909. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  25910. * present and no matches in the server's list. */
  25911. ret = TLSX_SupportedFFDHE_Set(ssl);
  25912. if (ret != 0)
  25913. goto out;
  25914. }
  25915. #endif
  25916. #endif
  25917. ret = MatchSuite(ssl, &clSuites);
  25918. #ifdef WOLFSSL_EXTRA_ALERTS
  25919. if (ret == BUFFER_ERROR)
  25920. SendAlert(ssl, alert_fatal, decode_error);
  25921. else if (ret < 0)
  25922. SendAlert(ssl, alert_fatal, handshake_failure);
  25923. #endif
  25924. #ifdef WOLFSSL_DTLS
  25925. if (ret == 0 && ssl->options.dtls)
  25926. DtlsMsgPoolReset(ssl);
  25927. #endif
  25928. WOLFSSL_LEAVE("DoClientHello", ret);
  25929. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  25930. out:
  25931. #ifdef WOLFSSL_DTLS
  25932. wc_HmacFree(&cookieHmac);
  25933. #endif
  25934. #ifdef OPENSSL_EXTRA
  25935. if (ret == 0)
  25936. ret = CertSetupCbWrapper(ssl);
  25937. #endif
  25938. return ret;
  25939. }
  25940. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  25941. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  25942. typedef struct DcvArgs {
  25943. byte* output; /* not allocated */
  25944. word32 sendSz;
  25945. word16 sz;
  25946. word32 sigSz;
  25947. word32 idx;
  25948. word32 begin;
  25949. byte hashAlgo;
  25950. byte sigAlgo;
  25951. } DcvArgs;
  25952. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  25953. {
  25954. DcvArgs* args = (DcvArgs*)pArgs;
  25955. (void)ssl;
  25956. (void)args;
  25957. }
  25958. /* handle processing of certificate_verify (15) */
  25959. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  25960. word32* inOutIdx, word32 size)
  25961. {
  25962. int ret = 0;
  25963. #ifdef WOLFSSL_ASYNC_CRYPT
  25964. DcvArgs* args = (DcvArgs*)ssl->async.args;
  25965. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  25966. (void)sizeof(args_test);
  25967. #else
  25968. DcvArgs args[1];
  25969. #endif
  25970. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  25971. WOLFSSL_ENTER("DoCertificateVerify");
  25972. #ifdef WOLFSSL_ASYNC_CRYPT
  25973. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  25974. if (ret != WC_NOT_PENDING_E) {
  25975. /* Check for error */
  25976. if (ret < 0)
  25977. goto exit_dcv;
  25978. }
  25979. else
  25980. #endif
  25981. {
  25982. /* Reset state */
  25983. ret = 0;
  25984. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  25985. XMEMSET(args, 0, sizeof(DcvArgs));
  25986. args->hashAlgo = sha_mac;
  25987. args->sigAlgo = anonymous_sa_algo;
  25988. args->idx = *inOutIdx;
  25989. args->begin = *inOutIdx;
  25990. #ifdef WOLFSSL_ASYNC_CRYPT
  25991. ssl->async.freeArgs = FreeDcvArgs;
  25992. #endif
  25993. }
  25994. switch(ssl->options.asyncState)
  25995. {
  25996. case TLS_ASYNC_BEGIN:
  25997. {
  25998. #ifdef WOLFSSL_CALLBACKS
  25999. if (ssl->hsInfoOn)
  26000. AddPacketName(ssl, "CertificateVerify");
  26001. if (ssl->toInfoOn)
  26002. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  26003. #endif
  26004. /* Advance state and proceed */
  26005. ssl->options.asyncState = TLS_ASYNC_BUILD;
  26006. } /* case TLS_ASYNC_BEGIN */
  26007. FALL_THROUGH;
  26008. case TLS_ASYNC_BUILD:
  26009. {
  26010. if (IsAtLeastTLSv1_2(ssl)) {
  26011. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  26012. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  26013. }
  26014. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  26015. &args->sigAlgo);
  26016. args->idx += 2;
  26017. }
  26018. #ifndef NO_RSA
  26019. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  26020. args->sigAlgo = rsa_sa_algo;
  26021. #endif
  26022. #ifdef HAVE_ECC
  26023. else if (ssl->peerEccDsaKeyPresent)
  26024. args->sigAlgo = ecc_dsa_sa_algo;
  26025. #endif
  26026. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  26027. else if (ssl->peerEd25519KeyPresent)
  26028. args->sigAlgo = ed25519_sa_algo;
  26029. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  26030. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  26031. else if (ssl->peerEd448KeyPresent)
  26032. args->sigAlgo = ed448_sa_algo;
  26033. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  26034. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26035. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  26036. }
  26037. ato16(input + args->idx, &args->sz);
  26038. args->idx += OPAQUE16_LEN;
  26039. if ((args->idx - args->begin) + args->sz > size ||
  26040. args->sz > ENCRYPT_LEN) {
  26041. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  26042. }
  26043. #ifdef HAVE_ECC
  26044. if (ssl->peerEccDsaKeyPresent) {
  26045. WOLFSSL_MSG("Doing ECC peer cert verify");
  26046. /* make sure a default is defined */
  26047. #if !defined(NO_SHA)
  26048. SetDigest(ssl, sha_mac);
  26049. #elif !defined(NO_SHA256)
  26050. SetDigest(ssl, sha256_mac);
  26051. #elif defined(WOLFSSL_SHA384)
  26052. SetDigest(ssl, sha384_mac);
  26053. #elif defined(WOLFSSL_SHA512)
  26054. SetDigest(ssl, sha512_mac);
  26055. #else
  26056. #error No digest enabled for ECC sig verify
  26057. #endif
  26058. if (IsAtLeastTLSv1_2(ssl)) {
  26059. if (args->sigAlgo != ecc_dsa_sa_algo) {
  26060. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  26061. }
  26062. SetDigest(ssl, args->hashAlgo);
  26063. }
  26064. }
  26065. #endif /* HAVE_ECC */
  26066. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  26067. if (ssl->peerEd25519KeyPresent) {
  26068. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  26069. if (IsAtLeastTLSv1_2(ssl) &&
  26070. args->sigAlgo != ed25519_sa_algo) {
  26071. WOLFSSL_MSG(
  26072. "Oops, peer sent ED25519 key but not in verify");
  26073. }
  26074. }
  26075. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  26076. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  26077. if (ssl->peerEd448KeyPresent) {
  26078. WOLFSSL_MSG("Doing ED448 peer cert verify");
  26079. if (IsAtLeastTLSv1_2(ssl) &&
  26080. args->sigAlgo != ed448_sa_algo) {
  26081. WOLFSSL_MSG(
  26082. "Oops, peer sent ED448 key but not in verify");
  26083. }
  26084. }
  26085. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  26086. /* Advance state and proceed */
  26087. ssl->options.asyncState = TLS_ASYNC_DO;
  26088. } /* case TLS_ASYNC_BUILD */
  26089. FALL_THROUGH;
  26090. case TLS_ASYNC_DO:
  26091. {
  26092. #ifndef NO_RSA
  26093. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  26094. WOLFSSL_MSG("Doing RSA peer cert verify");
  26095. ret = RsaVerify(ssl,
  26096. input + args->idx,
  26097. args->sz,
  26098. &args->output,
  26099. args->sigAlgo, args->hashAlgo,
  26100. ssl->peerRsaKey,
  26101. #ifdef HAVE_PK_CALLBACKS
  26102. &ssl->buffers.peerRsaKey
  26103. #else
  26104. NULL
  26105. #endif
  26106. );
  26107. if (ret >= 0) {
  26108. if (args->sigAlgo == rsa_sa_algo)
  26109. args->sendSz = ret;
  26110. else {
  26111. args->sigSz = ret;
  26112. args->sendSz = ssl->buffers.digest.length;
  26113. }
  26114. ret = 0;
  26115. }
  26116. }
  26117. #endif /* !NO_RSA */
  26118. #ifdef HAVE_ECC
  26119. if (ssl->peerEccDsaKeyPresent) {
  26120. WOLFSSL_MSG("Doing ECC peer cert verify");
  26121. ret = EccVerify(ssl,
  26122. input + args->idx, args->sz,
  26123. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  26124. ssl->peerEccDsaKey,
  26125. #ifdef HAVE_PK_CALLBACKS
  26126. &ssl->buffers.peerEccDsaKey
  26127. #else
  26128. NULL
  26129. #endif
  26130. );
  26131. }
  26132. #endif /* HAVE_ECC */
  26133. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  26134. if (ssl->peerEd25519KeyPresent) {
  26135. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  26136. ret = Ed25519Verify(ssl,
  26137. input + args->idx, args->sz,
  26138. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  26139. ssl->peerEd25519Key,
  26140. #ifdef HAVE_PK_CALLBACKS
  26141. &ssl->buffers.peerEd25519Key
  26142. #else
  26143. NULL
  26144. #endif
  26145. );
  26146. }
  26147. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  26148. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  26149. if (ssl->peerEd448KeyPresent) {
  26150. WOLFSSL_MSG("Doing Ed448 peer cert verify");
  26151. ret = Ed448Verify(ssl,
  26152. input + args->idx, args->sz,
  26153. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  26154. ssl->peerEd448Key,
  26155. #ifdef HAVE_PK_CALLBACKS
  26156. &ssl->buffers.peerEd448Key
  26157. #else
  26158. NULL
  26159. #endif
  26160. );
  26161. }
  26162. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  26163. #ifdef WOLFSSL_ASYNC_CRYPT
  26164. /* handle async pending */
  26165. if (ret == WC_PENDING_E)
  26166. goto exit_dcv;
  26167. #endif
  26168. /* Check for error */
  26169. if (ret != 0) {
  26170. ret = SIG_VERIFY_E;
  26171. goto exit_dcv;
  26172. }
  26173. /* Advance state and proceed */
  26174. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  26175. } /* case TLS_ASYNC_DO */
  26176. FALL_THROUGH;
  26177. case TLS_ASYNC_VERIFY:
  26178. {
  26179. #ifndef NO_RSA
  26180. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  26181. if (IsAtLeastTLSv1_2(ssl)) {
  26182. #ifdef WC_RSA_PSS
  26183. if (args->sigAlgo == rsa_pss_sa_algo) {
  26184. SetDigest(ssl, args->hashAlgo);
  26185. #ifdef HAVE_SELFTEST
  26186. ret = wc_RsaPSS_CheckPadding(
  26187. ssl->buffers.digest.buffer,
  26188. ssl->buffers.digest.length,
  26189. args->output, args->sigSz,
  26190. HashAlgoToType(args->hashAlgo));
  26191. #else
  26192. ret = wc_RsaPSS_CheckPadding_ex(
  26193. ssl->buffers.digest.buffer,
  26194. ssl->buffers.digest.length,
  26195. args->output, args->sigSz,
  26196. HashAlgoToType(args->hashAlgo), -1,
  26197. mp_count_bits(&ssl->peerRsaKey->n));
  26198. #endif
  26199. if (ret != 0) {
  26200. ret = SIG_VERIFY_E;
  26201. goto exit_dcv;
  26202. }
  26203. }
  26204. else
  26205. #endif
  26206. {
  26207. #ifndef WOLFSSL_SMALL_STACK
  26208. byte encodedSig[MAX_ENCODED_SIG_SZ];
  26209. #else
  26210. byte* encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  26211. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26212. if (encodedSig == NULL) {
  26213. ERROR_OUT(MEMORY_E, exit_dcv);
  26214. }
  26215. #endif
  26216. if (args->sigAlgo != rsa_sa_algo) {
  26217. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  26218. "in verify");
  26219. }
  26220. SetDigest(ssl, args->hashAlgo);
  26221. args->sigSz = wc_EncodeSignature(encodedSig,
  26222. ssl->buffers.digest.buffer,
  26223. ssl->buffers.digest.length,
  26224. TypeHash(args->hashAlgo));
  26225. if (args->sendSz != args->sigSz || !args->output ||
  26226. XMEMCMP(args->output, encodedSig,
  26227. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  26228. ret = VERIFY_CERT_ERROR;
  26229. }
  26230. #ifdef WOLFSSL_SMALL_STACK
  26231. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26232. #endif
  26233. }
  26234. }
  26235. else {
  26236. if (args->sendSz != FINISHED_SZ || !args->output ||
  26237. XMEMCMP(args->output,
  26238. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  26239. ret = VERIFY_CERT_ERROR;
  26240. }
  26241. }
  26242. }
  26243. #endif /* !NO_RSA */
  26244. /* Advance state and proceed */
  26245. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  26246. } /* case TLS_ASYNC_VERIFY */
  26247. FALL_THROUGH;
  26248. case TLS_ASYNC_FINALIZE:
  26249. {
  26250. if (IsEncryptionOn(ssl, 0)) {
  26251. args->idx += ssl->keys.padSz;
  26252. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  26253. if (ssl->options.startedETMRead)
  26254. args->idx += MacSize(ssl);
  26255. #endif
  26256. }
  26257. ssl->options.havePeerVerify = 1;
  26258. /* Set final index */
  26259. args->idx += args->sz;
  26260. *inOutIdx = args->idx;
  26261. /* Advance state and proceed */
  26262. ssl->options.asyncState = TLS_ASYNC_END;
  26263. } /* case TLS_ASYNC_FINALIZE */
  26264. FALL_THROUGH;
  26265. case TLS_ASYNC_END:
  26266. {
  26267. break;
  26268. }
  26269. default:
  26270. ret = INPUT_CASE_ERROR;
  26271. } /* switch(ssl->options.asyncState) */
  26272. exit_dcv:
  26273. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  26274. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  26275. #ifdef WOLFSSL_ASYNC_CRYPT
  26276. /* Handle async operation */
  26277. if (ret == WC_PENDING_E) {
  26278. /* Mark message as not received so it can process again */
  26279. ssl->msgsReceived.got_certificate_verify = 0;
  26280. return ret;
  26281. }
  26282. #endif /* WOLFSSL_ASYNC_CRYPT */
  26283. #ifdef WOLFSSL_EXTRA_ALERTS
  26284. if (ret == BUFFER_ERROR)
  26285. SendAlert(ssl, alert_fatal, decode_error);
  26286. else if (ret == SIG_VERIFY_E)
  26287. SendAlert(ssl, alert_fatal, decrypt_error);
  26288. else if (ret != 0)
  26289. SendAlert(ssl, alert_fatal, bad_certificate);
  26290. #endif
  26291. /* Digest is not allocated, so do this to prevent free */
  26292. ssl->buffers.digest.buffer = NULL;
  26293. ssl->buffers.digest.length = 0;
  26294. /* Final cleanup */
  26295. FreeDcvArgs(ssl, args);
  26296. FreeKeyExchange(ssl);
  26297. return ret;
  26298. }
  26299. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  26300. /* handle generation of server_hello_done (14) */
  26301. int SendServerHelloDone(WOLFSSL* ssl)
  26302. {
  26303. byte* output;
  26304. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  26305. int ret;
  26306. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  26307. WOLFSSL_ENTER("SendServerHelloDone");
  26308. #ifdef WOLFSSL_DTLS
  26309. if (ssl->options.dtls)
  26310. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26311. #endif
  26312. if (IsEncryptionOn(ssl, 1))
  26313. sendSz += MAX_MSG_EXTRA;
  26314. /* check for available size */
  26315. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  26316. return ret;
  26317. /* get output buffer */
  26318. output = ssl->buffers.outputBuffer.buffer +
  26319. ssl->buffers.outputBuffer.length;
  26320. AddHeaders(output, 0, server_hello_done, ssl);
  26321. if (IsEncryptionOn(ssl, 1)) {
  26322. byte* input;
  26323. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  26324. int recordHeaderSz = RECORD_HEADER_SZ;
  26325. if (ssl->options.dtls) {
  26326. recordHeaderSz += DTLS_RECORD_EXTRA;
  26327. inputSz += DTLS_HANDSHAKE_EXTRA;
  26328. }
  26329. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26330. if (input == NULL)
  26331. return MEMORY_E;
  26332. XMEMCPY(input, output + recordHeaderSz, inputSz);
  26333. #ifdef WOLFSSL_DTLS
  26334. if (IsDtlsNotSctpMode(ssl) &&
  26335. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
  26336. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26337. return ret;
  26338. }
  26339. #endif
  26340. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  26341. handshake, 1, 0, 0, CUR_ORDER);
  26342. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26343. if (sendSz < 0)
  26344. return sendSz;
  26345. } else {
  26346. #ifdef WOLFSSL_DTLS
  26347. if (IsDtlsNotSctpMode(ssl)) {
  26348. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
  26349. return ret;
  26350. }
  26351. if (ssl->options.dtls)
  26352. DtlsSEQIncrement(ssl, CUR_ORDER);
  26353. #endif
  26354. ret = HashOutput(ssl, output, sendSz, 0);
  26355. if (ret != 0)
  26356. return ret;
  26357. }
  26358. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  26359. if (ssl->hsInfoOn)
  26360. AddPacketName(ssl, "ServerHelloDone");
  26361. if (ssl->toInfoOn)
  26362. AddPacketInfo(ssl, "ServerHelloDone", handshake, output, sendSz,
  26363. WRITE_PROTO, ssl->heap);
  26364. #endif
  26365. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  26366. ssl->buffers.outputBuffer.length += sendSz;
  26367. ret = SendBuffered(ssl);
  26368. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  26369. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  26370. return ret;
  26371. }
  26372. #endif /* !WOLFSSL_NO_TLS12 */
  26373. #ifdef HAVE_SESSION_TICKET
  26374. #define WOLFSSL_TICKET_FIXED_SZ (WOLFSSL_TICKET_NAME_SZ + \
  26375. WOLFSSL_TICKET_IV_SZ + WOLFSSL_TICKET_MAC_SZ + LENGTH_SZ)
  26376. #define WOLFSSL_TICKET_ENC_SZ (SESSION_TICKET_LEN - WOLFSSL_TICKET_FIXED_SZ)
  26377. /* our ticket format */
  26378. typedef struct InternalTicket {
  26379. ProtocolVersion pv; /* version when ticket created */
  26380. byte suite[SUITE_LEN]; /* cipher suite when created */
  26381. byte msecret[SECRET_LEN]; /* master secret */
  26382. word32 timestamp; /* born on */
  26383. word16 haveEMS; /* have extended master secret */
  26384. #ifdef WOLFSSL_TLS13
  26385. word32 ageAdd; /* Obfuscation of age */
  26386. word16 namedGroup; /* Named group used */
  26387. TicketNonce ticketNonce; /* Ticket nonce */
  26388. #ifdef WOLFSSL_EARLY_DATA
  26389. word32 maxEarlyDataSz; /* Max size of early data */
  26390. #endif
  26391. #endif
  26392. } InternalTicket;
  26393. /* RFC 5077 defines this for session tickets */
  26394. /* fit within SESSION_TICKET_LEN */
  26395. typedef struct ExternalTicket {
  26396. byte key_name[WOLFSSL_TICKET_NAME_SZ]; /* key context name */
  26397. byte iv[WOLFSSL_TICKET_IV_SZ]; /* this ticket's iv */
  26398. byte enc_len[LENGTH_SZ]; /* encrypted length */
  26399. byte enc_ticket[WOLFSSL_TICKET_ENC_SZ]; /* encrypted internal ticket */
  26400. byte mac[WOLFSSL_TICKET_MAC_SZ]; /* total mac */
  26401. /* !! if add to structure, add to TICKET_FIXED_SZ !! */
  26402. } ExternalTicket;
  26403. /* create a new session ticket, 0 on success */
  26404. int CreateTicket(WOLFSSL* ssl)
  26405. {
  26406. InternalTicket it;
  26407. ExternalTicket* et = (ExternalTicket*)ssl->session.ticket;
  26408. int encLen;
  26409. int ret;
  26410. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  26411. XMEMSET(&it, 0, sizeof(it));
  26412. /* build internal */
  26413. it.pv.major = ssl->version.major;
  26414. it.pv.minor = ssl->version.minor;
  26415. it.suite[0] = ssl->options.cipherSuite0;
  26416. it.suite[1] = ssl->options.cipherSuite;
  26417. #ifdef WOLFSSL_EARLY_DATA
  26418. it.maxEarlyDataSz = ssl->options.maxEarlyDataSz;
  26419. #endif
  26420. if (!ssl->options.tls1_3) {
  26421. XMEMCPY(it.msecret, ssl->arrays->masterSecret, SECRET_LEN);
  26422. #ifndef NO_ASN_TIME
  26423. c32toa(LowResTimer(), (byte*)&it.timestamp);
  26424. #endif
  26425. it.haveEMS = ssl->options.haveEMS;
  26426. }
  26427. else {
  26428. #ifdef WOLFSSL_TLS13
  26429. /* Client adds to ticket age to obfuscate. */
  26430. ret = wc_RNG_GenerateBlock(ssl->rng, (byte*)&it.ageAdd,
  26431. sizeof(it.ageAdd));
  26432. if (ret != 0)
  26433. return BAD_TICKET_ENCRYPT;
  26434. ssl->session.ticketAdd = it.ageAdd;
  26435. it.namedGroup = ssl->session.namedGroup;
  26436. it.timestamp = TimeNowInMilliseconds();
  26437. /* Resumption master secret. */
  26438. XMEMCPY(it.msecret, ssl->session.masterSecret, SECRET_LEN);
  26439. XMEMCPY(&it.ticketNonce, &ssl->session.ticketNonce,
  26440. sizeof(TicketNonce));
  26441. #endif
  26442. }
  26443. /* encrypt */
  26444. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  26445. if (ssl->ctx->ticketEncCb == NULL) {
  26446. ret = WOLFSSL_TICKET_RET_FATAL;
  26447. }
  26448. else {
  26449. /* build external */
  26450. XMEMCPY(et->enc_ticket, &it, sizeof(InternalTicket));
  26451. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac, 1,
  26452. et->enc_ticket, sizeof(InternalTicket),
  26453. &encLen, ssl->ctx->ticketEncCtx);
  26454. if (ret != WOLFSSL_TICKET_RET_OK) {
  26455. ForceZero(et->enc_ticket, sizeof(it));
  26456. }
  26457. }
  26458. if (ret == WOLFSSL_TICKET_RET_OK) {
  26459. if (encLen < (int)sizeof(InternalTicket) ||
  26460. encLen > WOLFSSL_TICKET_ENC_SZ) {
  26461. ForceZero(&it, sizeof(it));
  26462. ForceZero(et->enc_ticket, sizeof(it));
  26463. WOLFSSL_MSG("Bad user ticket encrypt size");
  26464. return BAD_TICKET_KEY_CB_SZ;
  26465. }
  26466. /* sanity checks on encrypt callback */
  26467. /* internal ticket can't be the same if encrypted */
  26468. if (XMEMCMP(et->enc_ticket, &it, sizeof(InternalTicket)) == 0) {
  26469. ForceZero(&it, sizeof(it));
  26470. ForceZero(et->enc_ticket, sizeof(it));
  26471. WOLFSSL_MSG("User ticket encrypt didn't encrypt");
  26472. return BAD_TICKET_ENCRYPT;
  26473. }
  26474. ForceZero(&it, sizeof(it));
  26475. XMEMSET(zeros, 0, sizeof(zeros));
  26476. /* name */
  26477. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  26478. WOLFSSL_MSG("User ticket encrypt didn't set name");
  26479. return BAD_TICKET_ENCRYPT;
  26480. }
  26481. /* iv */
  26482. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  26483. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  26484. return BAD_TICKET_ENCRYPT;
  26485. }
  26486. /* mac */
  26487. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  26488. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  26489. return BAD_TICKET_ENCRYPT;
  26490. }
  26491. /* set size */
  26492. c16toa((word16)encLen, et->enc_len);
  26493. ssl->session.ticketLen = (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  26494. if (encLen < WOLFSSL_TICKET_ENC_SZ) {
  26495. /* move mac up since whole enc buffer not used */
  26496. XMEMMOVE(et->enc_ticket +encLen, et->mac,WOLFSSL_TICKET_MAC_SZ);
  26497. }
  26498. }
  26499. return ret;
  26500. }
  26501. /* Parse ticket sent by client, returns callback return value */
  26502. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  26503. {
  26504. ExternalTicket* et;
  26505. InternalTicket it;
  26506. int ret;
  26507. int outLen;
  26508. word16 inLen;
  26509. WOLFSSL_START(WC_FUNC_TICKET_DO);
  26510. WOLFSSL_ENTER("DoClientTicket");
  26511. if (len > SESSION_TICKET_LEN ||
  26512. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  26513. return BAD_TICKET_MSG_SZ;
  26514. }
  26515. et = (ExternalTicket*)input;
  26516. /* decrypt */
  26517. ato16(et->enc_len, &inLen);
  26518. if (inLen > (word16)(len - WOLFSSL_TICKET_FIXED_SZ)) {
  26519. return BAD_TICKET_MSG_SZ;
  26520. }
  26521. outLen = inLen; /* may be reduced by user padding */
  26522. if (ssl->ctx->ticketEncCb == NULL) {
  26523. ret = WOLFSSL_TICKET_RET_FATAL;
  26524. }
  26525. else {
  26526. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv,
  26527. et->enc_ticket + inLen, 0,
  26528. et->enc_ticket, inLen, &outLen,
  26529. ssl->ctx->ticketEncCtx);
  26530. }
  26531. if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) return ret;
  26532. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  26533. WOLFSSL_MSG("Bad user ticket decrypt len");
  26534. return BAD_TICKET_KEY_CB_SZ;
  26535. }
  26536. /* copy the decrypted ticket to avoid alignment issues */
  26537. XMEMCPY(&it, et->enc_ticket, sizeof(InternalTicket));
  26538. ForceZero(et->enc_ticket, sizeof(it));
  26539. /* get master secret */
  26540. if (ret == WOLFSSL_TICKET_RET_OK || ret == WOLFSSL_TICKET_RET_CREATE) {
  26541. if (ssl->version.minor < it.pv.minor) {
  26542. ForceZero(&it, sizeof(it));
  26543. WOLFSSL_MSG("Ticket has greater version");
  26544. return VERSION_ERROR;
  26545. }
  26546. else if (ssl->version.minor > it.pv.minor) {
  26547. if (IsAtLeastTLSv1_3(it.pv) != IsAtLeastTLSv1_3(ssl->version)) {
  26548. ForceZero(&it, sizeof(it));
  26549. WOLFSSL_MSG("Tickets cannot be shared between "
  26550. "TLS 1.3 and TLS 1.2 and lower");
  26551. return VERSION_ERROR;
  26552. }
  26553. if (!ssl->options.downgrade) {
  26554. ForceZero(&it, sizeof(it));
  26555. WOLFSSL_MSG("Ticket has lesser version");
  26556. return VERSION_ERROR;
  26557. }
  26558. WOLFSSL_MSG("Downgrading protocol due to ticket");
  26559. if (it.pv.minor < ssl->options.minDowngrade) {
  26560. ForceZero(&it, sizeof(it));
  26561. return VERSION_ERROR;
  26562. }
  26563. ssl->version.minor = it.pv.minor;
  26564. }
  26565. if (!IsAtLeastTLSv1_3(ssl->version)) {
  26566. XMEMCPY(ssl->arrays->masterSecret, it.msecret, SECRET_LEN);
  26567. /* Copy the haveExtendedMasterSecret property from the ticket to
  26568. * the saved session, so the property may be checked later. */
  26569. ssl->session.haveEMS = it.haveEMS;
  26570. ato32((const byte*)&it.timestamp, &ssl->session.bornOn);
  26571. #ifndef NO_RESUME_SUITE_CHECK
  26572. ssl->session.cipherSuite0 = it.suite[0];
  26573. ssl->session.cipherSuite = it.suite[1];
  26574. #endif
  26575. }
  26576. else {
  26577. #ifdef WOLFSSL_TLS13
  26578. /* Restore information to renegotiate. */
  26579. ssl->session.ticketSeen = it.timestamp;
  26580. ssl->session.ticketAdd = it.ageAdd;
  26581. ssl->session.cipherSuite0 = it.suite[0];
  26582. ssl->session.cipherSuite = it.suite[1];
  26583. #ifdef WOLFSSL_EARLY_DATA
  26584. ssl->session.maxEarlyDataSz = it.maxEarlyDataSz;
  26585. #endif
  26586. /* Resumption master secret. */
  26587. XMEMCPY(ssl->session.masterSecret, it.msecret, SECRET_LEN);
  26588. XMEMCPY(&ssl->session.ticketNonce, &it.ticketNonce,
  26589. sizeof(TicketNonce));
  26590. ssl->session.namedGroup = it.namedGroup;
  26591. #endif
  26592. }
  26593. }
  26594. ForceZero(&it, sizeof(it));
  26595. WOLFSSL_LEAVE("DoClientTicket", ret);
  26596. WOLFSSL_END(WC_FUNC_TICKET_DO);
  26597. return ret;
  26598. }
  26599. /* send Session Ticket */
  26600. int SendTicket(WOLFSSL* ssl)
  26601. {
  26602. byte* output;
  26603. int ret;
  26604. int sendSz;
  26605. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  26606. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  26607. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  26608. WOLFSSL_ENTER("SendTicket");
  26609. if (ssl->options.createTicket) {
  26610. ret = CreateTicket(ssl);
  26611. if (ret != 0) return ret;
  26612. }
  26613. length += ssl->session.ticketLen;
  26614. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  26615. if (!ssl->options.dtls) {
  26616. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  26617. sendSz += MAX_MSG_EXTRA;
  26618. }
  26619. else {
  26620. #ifdef WOLFSSL_DTLS
  26621. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26622. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26623. #endif
  26624. }
  26625. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  26626. sendSz += cipherExtraData(ssl);
  26627. /* check for available size */
  26628. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  26629. return ret;
  26630. /* get output buffer */
  26631. output = ssl->buffers.outputBuffer.buffer +
  26632. ssl->buffers.outputBuffer.length;
  26633. AddHeaders(output, length, session_ticket, ssl);
  26634. /* hint */
  26635. c32toa(ssl->ctx->ticketHint, output + idx);
  26636. idx += SESSION_HINT_SZ;
  26637. /* length */
  26638. c16toa(ssl->session.ticketLen, output + idx);
  26639. idx += LENGTH_SZ;
  26640. /* ticket */
  26641. XMEMCPY(output + idx, ssl->session.ticket, ssl->session.ticketLen);
  26642. idx += ssl->session.ticketLen;
  26643. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  26644. byte* input;
  26645. int inputSz = idx; /* build msg adds rec hdr */
  26646. int recordHeaderSz = RECORD_HEADER_SZ;
  26647. if (ssl->options.dtls)
  26648. recordHeaderSz += DTLS_RECORD_EXTRA;
  26649. inputSz -= recordHeaderSz;
  26650. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26651. if (input == NULL)
  26652. return MEMORY_E;
  26653. XMEMCPY(input, output + recordHeaderSz, inputSz);
  26654. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  26655. handshake, 1, 0, 0, CUR_ORDER);
  26656. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26657. if (sendSz < 0)
  26658. return sendSz;
  26659. }
  26660. else {
  26661. #ifdef WOLFSSL_DTLS
  26662. if (ssl->options.dtls) {
  26663. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
  26664. return ret;
  26665. DtlsSEQIncrement(ssl, CUR_ORDER);
  26666. }
  26667. #endif
  26668. ret = HashOutput(ssl, output, sendSz, 0);
  26669. if (ret != 0)
  26670. return ret;
  26671. }
  26672. ssl->buffers.outputBuffer.length += sendSz;
  26673. if (!ssl->options.groupMessages)
  26674. ret = SendBuffered(ssl);
  26675. WOLFSSL_LEAVE("SendTicket", ret);
  26676. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  26677. return ret;
  26678. }
  26679. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  26680. /* Initialize the context for session ticket encryption.
  26681. *
  26682. * @param [in] ctx SSL context.
  26683. * @param [in] keyCtx Context for session ticket encryption.
  26684. * @return 0 on success.
  26685. * @return BAD_MUTEX_E when initializing mutex fails.
  26686. */
  26687. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
  26688. {
  26689. int ret = 0;
  26690. XMEMSET(keyCtx, 0, sizeof(*keyCtx));
  26691. keyCtx->ctx = ctx;
  26692. #ifndef SINGLE_THREADED
  26693. ret = wc_InitMutex(&keyCtx->mutex);
  26694. #endif
  26695. return ret;
  26696. }
  26697. /* Setup the session ticket encryption context for this.
  26698. *
  26699. * Initialize RNG, generate name, generate primary key and set primary key
  26700. * expirary.
  26701. *
  26702. * @param [in] keyCtx Context for session ticket encryption.
  26703. * @param [in] heap Dynamic memory allocation hint.
  26704. * @param [in] devId Device identifier.
  26705. * @return 0 on success.
  26706. * @return Other value when random number generator fails.
  26707. */
  26708. static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
  26709. {
  26710. int ret;
  26711. #ifndef SINGLE_THREADED
  26712. ret = 0;
  26713. /* Check that key wasn't set up while waiting. */
  26714. if (keyCtx->expirary[0] == 0)
  26715. #endif
  26716. {
  26717. ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
  26718. if (ret == 0) {
  26719. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
  26720. sizeof(keyCtx->name));
  26721. }
  26722. if (ret == 0) {
  26723. /* Mask of the bottom bit - used for index of key. */
  26724. keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
  26725. /* Generate initial primary key. */
  26726. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
  26727. WOLFSSL_TICKET_KEY_SZ);
  26728. }
  26729. if (ret == 0) {
  26730. keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
  26731. }
  26732. }
  26733. return ret;
  26734. }
  26735. /* Free the context for session ticket encryption.
  26736. *
  26737. * Zeroize keys and name.
  26738. *
  26739. * @param [in] keyCtx Context for session ticket encryption.
  26740. */
  26741. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
  26742. {
  26743. /* Zeroize sensitive data. */
  26744. ForceZero(keyCtx->name, sizeof(keyCtx->name));
  26745. ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
  26746. ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
  26747. #ifndef SINGLE_THREADED
  26748. wc_FreeMutex(&keyCtx->mutex);
  26749. #endif
  26750. wc_FreeRng(&keyCtx->rng);
  26751. }
  26752. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  26753. !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
  26754. !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
  26755. /* Ticket encryption/decryption implementation.
  26756. *
  26757. * @param [in] key Key for encryption/decryption.
  26758. * @param [in] keyLen Length of key in bytes.
  26759. * @param [in] iv IV/Nonce for encryption/decryption.
  26760. * @param [in] aad Additional authentication data.
  26761. * @param [in] aadSz Length of additional authentication data.
  26762. * @param [in] in Data to encrypt/decrypt.
  26763. * @param [in] inLen Length of encrypted data.
  26764. * @param [out] out Resulting data from encrypt/decrypt.
  26765. * @param [out] outLen Size of resulting data.
  26766. * @param [in] tag Authentication tag for encrypted data.
  26767. * @param [in] heap Dynamic memory allocation data hint.
  26768. * @param [in] enc 1 when encrypting, 0 when decrypting.
  26769. * @return 0 on success.
  26770. * @return Other value when encryption/decryption fails.
  26771. */
  26772. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  26773. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  26774. void* heap, int enc)
  26775. {
  26776. int ret;
  26777. (void)keyLen;
  26778. (void)heap;
  26779. if (enc) {
  26780. ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
  26781. tag);
  26782. }
  26783. else {
  26784. ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
  26785. out);
  26786. }
  26787. *outLen = inLen;
  26788. return ret;
  26789. }
  26790. #elif defined(HAVE_AESGCM)
  26791. /* Ticket encryption/decryption implementation.
  26792. *
  26793. * @param [in] key Key for encryption/decryption.
  26794. * @param [in] keyLen Length of key in bytes.
  26795. * @param [in] iv IV/Nonce for encryption/decryption.
  26796. * @param [in] aad Additional authentication data.
  26797. * @param [in] aadSz Length of additional authentication data.
  26798. * @param [in] in Data to encrypt/decrypt.
  26799. * @param [in] inLen Length of encrypted data.
  26800. * @param [out] out Resulting data from encrypt/decrypt.
  26801. * @param [out] outLen Size of resulting data.
  26802. * @param [in] tag Authentication tag for encrypted data.
  26803. * @param [in] heap Dynamic memory allocation data hint.
  26804. * @param [in] enc 1 when encrypting, 0 when decrypting.
  26805. * @return 0 on success.
  26806. * @return MEMORY_E when dynamic memory allocation fails.
  26807. * @return Other value when encryption/decryption fails.
  26808. */
  26809. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  26810. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  26811. void* heap, int enc)
  26812. {
  26813. int ret;
  26814. #ifdef WOLFSSL_SMALL_STACK
  26815. Aes* aes;
  26816. #else
  26817. Aes aes[1];
  26818. #endif
  26819. (void)heap;
  26820. #ifdef WOLFSSL_SMALL_STACK
  26821. aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
  26822. if (aes == NULL)
  26823. return MEMORY_E;
  26824. #endif
  26825. if (enc) {
  26826. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  26827. if (ret == 0) {
  26828. ret = wc_AesGcmSetKey(aes, key, keyLen);
  26829. }
  26830. if (ret == 0) {
  26831. ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  26832. tag, AES_BLOCK_SIZE, aad, aadSz);
  26833. }
  26834. wc_AesFree(aes);
  26835. }
  26836. else {
  26837. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  26838. if (ret == 0) {
  26839. ret = wc_AesGcmSetKey(aes, key, keyLen);
  26840. }
  26841. if (ret == 0) {
  26842. ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  26843. tag, AES_BLOCK_SIZE, aad, aadSz);
  26844. }
  26845. wc_AesFree(aes);
  26846. }
  26847. #ifdef WOLFSSL_SMALL_STACK
  26848. XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
  26849. #endif
  26850. *outLen = inLen;
  26851. return ret;
  26852. }
  26853. #else
  26854. #error "No encryption algorithm available for default ticket encryption."
  26855. #endif
  26856. /* Choose a key to use for encryption.
  26857. *
  26858. * Generate a new key if the current ones are expired.
  26859. * If the secondary key has not been used and the primary key has expired then
  26860. * generate a new primary key.
  26861. *
  26862. * @param [in] Ticket encryption callback context.
  26863. * @param [in] Session ticket lifetime.
  26864. * @param [out] Index of key to use for encryption.
  26865. * @return 0 on success.
  26866. * @return Other value when random number generation fails.
  26867. */
  26868. static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
  26869. int* keyIdx)
  26870. {
  26871. int ret = 0;
  26872. /* Get new current time as lock may have taken some time. */
  26873. word32 now = LowResTimer();
  26874. /* Check expirary of primary key for encrypt. */
  26875. if (keyCtx->expirary[0] >= now + ticketHint) {
  26876. *keyIdx = 0;
  26877. }
  26878. /* Check expirary of primary key for encrypt. */
  26879. else if (keyCtx->expirary[1] >= now + ticketHint) {
  26880. *keyIdx = 1;
  26881. }
  26882. /* No key available to use. */
  26883. else {
  26884. int genKey;
  26885. /* Generate which ever key is expired for decrypt - primary first. */
  26886. if (keyCtx->expirary[0] < now) {
  26887. genKey = 0;
  26888. }
  26889. else if (keyCtx->expirary[1] < now) {
  26890. genKey = 1;
  26891. }
  26892. /* Timeouts and expirary should not allow this to happen. */
  26893. else {
  26894. return BAD_STATE_E;
  26895. }
  26896. /* Generate the required key */
  26897. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
  26898. WOLFSSL_TICKET_KEY_SZ);
  26899. if (ret == 0) {
  26900. keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
  26901. *keyIdx = genKey;
  26902. }
  26903. }
  26904. return ret;
  26905. }
  26906. /* Default Session Ticket encryption/decryption callback.
  26907. *
  26908. * Use ChaCha20-Poly1305 or AES-GCM to encrypt/decrypt the ticket.
  26909. * Two keys are used:
  26910. * - When the first expires for encryption, then use the other.
  26911. * - Don't encrypt with key if the ticket lifetime will go beyond expirary.
  26912. * - Generate a new primary key when primary key expired for decrypt and
  26913. * no secondary key is activate for encryption.
  26914. * - Generate a new secondary key when expired and needed.
  26915. * - Calculate expirary starting from first encrypted ticket.
  26916. * - Key name has last bit set to indicate index of key.
  26917. * Keys expire for decryption after ticket key lifetime from the first encrypted
  26918. * ticket.
  26919. * Keys can only be use for encryption while the ticket hint does not exceed
  26920. * the key lifetime.
  26921. * Lifetime of a key must be greater than the lifetime of a ticket. This means
  26922. * that if one ticket is only valid for decryption, then the other will be
  26923. * valid for encryption.
  26924. * AAD = key_name | iv | ticket len (16-bits network order)
  26925. *
  26926. * @param [in] ssl SSL connection.
  26927. * @param [in,out] key_name Name of key from client.
  26928. * Encrypt: name of key returned.
  26929. * Decrypt: name from ticket message to check.
  26930. * @param [in] iv IV to use in encryption/decryption.
  26931. * @param [in] mac MAC for authentication of encrypted data.
  26932. * @param [in] enc 1 when encrypting ticket, 0 when decrypting.
  26933. * @param [in,out] ticket Encrypted/decrypted session ticket bytes.
  26934. * @param [in] inLen Length of incoming ticket.
  26935. * @param [out] outLen Length of outgoing ticket.
  26936. * @param [in] userCtx Context for encryption/decryption of ticket.
  26937. * @return WOLFSSL_TICKET_RET_OK when successful.
  26938. * @return WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
  26939. * be created for TLS 1.2 and below.
  26940. * @return WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
  26941. * decrypted ticket.
  26942. * @return WOLFSSL_TICKET_RET_FATAL when key name does not match.
  26943. */
  26944. static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
  26945. byte iv[WOLFSSL_TICKET_IV_SZ],
  26946. byte mac[WOLFSSL_TICKET_MAC_SZ],
  26947. int enc, byte* ticket, int inLen, int* outLen,
  26948. void* userCtx)
  26949. {
  26950. int ret;
  26951. TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
  26952. WOLFSSL_CTX* ctx = keyCtx->ctx;
  26953. word16 sLen = XHTONS(inLen);
  26954. byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
  26955. int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
  26956. byte* p = aad;
  26957. int keyIdx = 0;
  26958. /* Check we have setup the RNG, name and primary key. */
  26959. if (keyCtx->expirary[0] == 0) {
  26960. #ifndef SINGLE_THREADED
  26961. /* Lock around access to expirary and key - stop initial key being
  26962. * generated twice at the same time. */
  26963. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  26964. WOLFSSL_MSG("Couldn't lock key context mutex");
  26965. return WOLFSSL_TICKET_RET_REJECT;
  26966. }
  26967. #endif
  26968. /* Sets expirary of primary key in setup. */
  26969. ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
  26970. #ifndef SINGLE_THREADED
  26971. wc_UnLockMutex(&keyCtx->mutex);
  26972. #endif
  26973. if (ret != 0)
  26974. return ret;
  26975. }
  26976. if (enc) {
  26977. /* Return the name of the key - missing key index. */
  26978. XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  26979. /* Generate a new IV into buffer to be returned.
  26980. * Don't use the RNG in keyCtx as it's for generating private data. */
  26981. ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
  26982. if (ret != 0) {
  26983. return WOLFSSL_TICKET_RET_REJECT;
  26984. }
  26985. }
  26986. else {
  26987. /* Mask of last bit that is the key index. */
  26988. byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
  26989. /* For decryption, see if we know this key - check all but last byte. */
  26990. if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
  26991. return WOLFSSL_TICKET_RET_FATAL;
  26992. }
  26993. /* Ensure last byte without index bit matches too. */
  26994. if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
  26995. return WOLFSSL_TICKET_RET_FATAL;
  26996. }
  26997. }
  26998. /* Build AAD from: key name, iv, and length of ticket. */
  26999. XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  27000. p += WOLFSSL_TICKET_NAME_SZ;
  27001. XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
  27002. p += WOLFSSL_TICKET_IV_SZ;
  27003. XMEMCPY(p, &sLen, sizeof(sLen));
  27004. /* Encrypt ticket. */
  27005. if (enc) {
  27006. word32 now;
  27007. now = LowResTimer();
  27008. /* As long as encryption expirary isn't imminent - no lock. */
  27009. if (keyCtx->expirary[0] > now + ctx->ticketHint) {
  27010. keyIdx = 0;
  27011. }
  27012. else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
  27013. keyIdx = 1;
  27014. }
  27015. else {
  27016. #ifndef SINGLE_THREADED
  27017. /* Lock around access to expirary and key - stop key being generated
  27018. * twice at the same time. */
  27019. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  27020. WOLFSSL_MSG("Couldn't lock key context mutex");
  27021. return WOLFSSL_TICKET_RET_REJECT;
  27022. }
  27023. #endif
  27024. ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
  27025. #ifndef SINGLE_THREADED
  27026. wc_UnLockMutex(&keyCtx->mutex);
  27027. #endif
  27028. if (ret != 0) {
  27029. return WOLFSSL_TICKET_RET_REJECT;
  27030. }
  27031. }
  27032. /* Set the name of the key to the index chosen. */
  27033. key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  27034. /* Update AAD too. */
  27035. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  27036. /* Encrypt ticket data. */
  27037. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  27038. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  27039. 1);
  27040. if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
  27041. }
  27042. /* Decrypt ticket. */
  27043. else {
  27044. /* Get index of key from name. */
  27045. keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
  27046. /* Update AAD with index. */
  27047. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  27048. /* Check expirary */
  27049. if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
  27050. return WOLFSSL_TICKET_RET_REJECT;
  27051. }
  27052. /* Decrypt ticket data. */
  27053. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  27054. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  27055. 0);
  27056. if (ret != 0) {
  27057. return WOLFSSL_TICKET_RET_REJECT;
  27058. }
  27059. }
  27060. #ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
  27061. if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
  27062. return WOLFSSL_TICKET_RET_CREATE;
  27063. #endif
  27064. return WOLFSSL_TICKET_RET_OK;
  27065. }
  27066. #endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
  27067. #endif /* HAVE_SESSION_TICKET */
  27068. #ifndef WOLFSSL_NO_TLS12
  27069. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  27070. defined(HAVE_SERVER_RENEGOTIATION_INFO) && \
  27071. !defined(WOLFSSL_NO_SERVER)
  27072. /* handle generation of server's hello_request (0) */
  27073. int SendHelloRequest(WOLFSSL* ssl)
  27074. {
  27075. byte* output;
  27076. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27077. int ret;
  27078. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  27079. WOLFSSL_ENTER("SendHelloRequest");
  27080. if (IsEncryptionOn(ssl, 1))
  27081. sendSz += MAX_MSG_EXTRA;
  27082. if (ssl->options.dtls)
  27083. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27084. /* check for available size */
  27085. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  27086. return ret;
  27087. /* get output buffer */
  27088. output = ssl->buffers.outputBuffer.buffer +
  27089. ssl->buffers.outputBuffer.length;
  27090. AddHeaders(output, 0, hello_request, ssl);
  27091. if (IsEncryptionOn(ssl, 1)) {
  27092. byte* input;
  27093. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  27094. int recordHeaderSz = RECORD_HEADER_SZ;
  27095. if (ssl->options.dtls) {
  27096. recordHeaderSz += DTLS_RECORD_EXTRA;
  27097. inputSz += DTLS_HANDSHAKE_EXTRA;
  27098. }
  27099. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27100. if (input == NULL)
  27101. return MEMORY_E;
  27102. XMEMCPY(input, output + recordHeaderSz, inputSz);
  27103. #ifdef WOLFSSL_DTLS
  27104. if (IsDtlsNotSctpMode(ssl) &&
  27105. (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
  27106. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27107. return ret;
  27108. }
  27109. #endif
  27110. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  27111. handshake, 0, 0, 0, CUR_ORDER);
  27112. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27113. if (sendSz < 0)
  27114. return sendSz;
  27115. }
  27116. ssl->buffers.outputBuffer.length += sendSz;
  27117. ret = SendBuffered(ssl);
  27118. WOLFSSL_LEAVE("SendHelloRequest", ret);
  27119. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  27120. return ret;
  27121. }
  27122. #endif /* HAVE_SECURE_RENEGOTIATION && HAVE_SERVER_RENEGOTIATION_INFO */
  27123. #ifdef WOLFSSL_DTLS
  27124. /* handle generation of DTLS hello_verify_request (3) */
  27125. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  27126. const byte* cookie, byte cookieSz)
  27127. {
  27128. byte* output;
  27129. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  27130. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  27131. int sendSz = length + idx;
  27132. int ret;
  27133. /* are we in scr */
  27134. if (IsEncryptionOn(ssl, 1)) {
  27135. sendSz += MAX_MSG_EXTRA;
  27136. }
  27137. /* check for available size */
  27138. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  27139. return ret;
  27140. /* get output buffer */
  27141. output = ssl->buffers.outputBuffer.buffer +
  27142. ssl->buffers.outputBuffer.length;
  27143. /* Hello Verify Request should use the same sequence number
  27144. * as the Client Hello unless we are in renegotiation then
  27145. * don't change numbers */
  27146. #ifdef HAVE_SECURE_RENEGOTIATION
  27147. if (!IsSCR(ssl))
  27148. #endif
  27149. {
  27150. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  27151. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  27152. }
  27153. AddHeaders(output, length, hello_verify_request, ssl);
  27154. #ifdef OPENSSL_EXTRA
  27155. output[idx++] = DTLS_MAJOR;
  27156. output[idx++] = DTLS_MINOR;
  27157. #else
  27158. output[idx++] = ssl->version.major;
  27159. output[idx++] = ssl->version.minor;
  27160. #endif
  27161. output[idx++] = cookieSz;
  27162. if (cookie == NULL || cookieSz == 0)
  27163. return COOKIE_ERROR;
  27164. XMEMCPY(output + idx, cookie, cookieSz);
  27165. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  27166. if (ssl->hsInfoOn)
  27167. AddPacketName(ssl, "HelloVerifyRequest");
  27168. if (ssl->toInfoOn)
  27169. AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  27170. sendSz, WRITE_PROTO, ssl->heap);
  27171. #endif
  27172. /* are we in scr */
  27173. if (IsEncryptionOn(ssl, 1)) {
  27174. byte* input;
  27175. int inputSz = DTLS_HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
  27176. int recordHeaderSz = DTLS_RECORD_HEADER_SZ;
  27177. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27178. if (input == NULL)
  27179. return MEMORY_E;
  27180. XMEMCPY(input, output + recordHeaderSz, inputSz);
  27181. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  27182. handshake, 0, 0, 0, CUR_ORDER);
  27183. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27184. if (sendSz < 0)
  27185. return sendSz;
  27186. }
  27187. ssl->buffers.outputBuffer.length += sendSz;
  27188. DtlsSEQIncrement(ssl, CUR_ORDER);
  27189. return SendBuffered(ssl);
  27190. }
  27191. #endif /* WOLFSSL_DTLS */
  27192. typedef struct DckeArgs {
  27193. byte* output; /* not allocated */
  27194. word32 length;
  27195. word32 idx;
  27196. word32 begin;
  27197. word32 sigSz;
  27198. #ifndef NO_RSA
  27199. int lastErr;
  27200. #endif
  27201. } DckeArgs;
  27202. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  27203. {
  27204. DckeArgs* args = (DckeArgs*)pArgs;
  27205. (void)ssl;
  27206. (void)args;
  27207. }
  27208. /* handle processing client_key_exchange (16) */
  27209. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  27210. word32 size)
  27211. {
  27212. int ret;
  27213. #ifdef WOLFSSL_ASYNC_CRYPT
  27214. DckeArgs* args = (DckeArgs*)ssl->async.args;
  27215. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  27216. (void)sizeof(args_test);
  27217. #else
  27218. DckeArgs args[1];
  27219. #endif
  27220. (void)size;
  27221. (void)input;
  27222. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  27223. WOLFSSL_ENTER("DoClientKeyExchange");
  27224. #ifdef WOLFSSL_ASYNC_CRYPT
  27225. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  27226. if (ret != WC_NOT_PENDING_E) {
  27227. /* Check for error */
  27228. if (ret < 0)
  27229. goto exit_dcke;
  27230. }
  27231. else
  27232. #endif /* WOLFSSL_ASYNC_CRYPT */
  27233. {
  27234. /* Reset state */
  27235. ret = 0;
  27236. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  27237. XMEMSET(args, 0, sizeof(DckeArgs));
  27238. args->idx = *inOutIdx;
  27239. args->begin = *inOutIdx;
  27240. #ifdef WOLFSSL_ASYNC_CRYPT
  27241. ssl->async.freeArgs = FreeDckeArgs;
  27242. #endif
  27243. }
  27244. /* Do Client Key Exchange State Machine */
  27245. switch(ssl->options.asyncState)
  27246. {
  27247. case TLS_ASYNC_BEGIN:
  27248. {
  27249. /* Sanity checks */
  27250. if (ssl->options.side != WOLFSSL_SERVER_END) {
  27251. WOLFSSL_MSG("Client received client keyexchange, attack?");
  27252. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  27253. ERROR_OUT(WOLFSSL_FATAL_ERROR, exit_dcke);
  27254. }
  27255. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  27256. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  27257. SendAlert(ssl, alert_fatal, unexpected_message);
  27258. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  27259. }
  27260. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  27261. if (ssl->options.verifyPeer && ssl->options.failNoCert) {
  27262. if (!ssl->options.havePeerCert) {
  27263. WOLFSSL_MSG("client didn't present peer cert");
  27264. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  27265. }
  27266. }
  27267. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  27268. if (!ssl->options.havePeerCert &&
  27269. !ssl->options.usingPSK_cipher) {
  27270. WOLFSSL_MSG("client didn't present peer cert");
  27271. return NO_PEER_CERT;
  27272. }
  27273. }
  27274. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  27275. #if defined(WOLFSSL_CALLBACKS)
  27276. if (ssl->hsInfoOn) {
  27277. AddPacketName(ssl, "ClientKeyExchange");
  27278. }
  27279. if (ssl->toInfoOn) {
  27280. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  27281. }
  27282. #endif
  27283. if (ssl->arrays->preMasterSecret == NULL) {
  27284. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  27285. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  27286. ssl->heap, DYNAMIC_TYPE_SECRET);
  27287. if (ssl->arrays->preMasterSecret == NULL) {
  27288. ERROR_OUT(MEMORY_E, exit_dcke);
  27289. }
  27290. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  27291. }
  27292. switch (ssl->specs.kea) {
  27293. #ifndef NO_RSA
  27294. case rsa_kea:
  27295. {
  27296. break;
  27297. } /* rsa_kea */
  27298. #endif /* !NO_RSA */
  27299. #ifndef NO_PSK
  27300. case psk_kea:
  27301. {
  27302. /* sanity check that PSK server callback has been set */
  27303. if (ssl->options.server_psk_cb == NULL) {
  27304. WOLFSSL_MSG("No server PSK callback set");
  27305. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  27306. }
  27307. break;
  27308. }
  27309. #endif /* !NO_PSK */
  27310. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27311. defined(HAVE_CURVE448)
  27312. case ecc_diffie_hellman_kea:
  27313. {
  27314. break;
  27315. }
  27316. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27317. #ifndef NO_DH
  27318. case diffie_hellman_kea:
  27319. {
  27320. break;
  27321. }
  27322. #endif /* !NO_DH */
  27323. #if !defined(NO_DH) && !defined(NO_PSK)
  27324. case dhe_psk_kea:
  27325. {
  27326. /* sanity check that PSK server callback has been set */
  27327. if (ssl->options.server_psk_cb == NULL) {
  27328. WOLFSSL_MSG("No server PSK callback set");
  27329. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  27330. }
  27331. break;
  27332. }
  27333. #endif /* !NO_DH && !NO_PSK */
  27334. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27335. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27336. case ecdhe_psk_kea:
  27337. {
  27338. /* sanity check that PSK server callback has been set */
  27339. if (ssl->options.server_psk_cb == NULL) {
  27340. WOLFSSL_MSG("No server PSK callback set");
  27341. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  27342. }
  27343. break;
  27344. }
  27345. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27346. default:
  27347. WOLFSSL_MSG("Bad kea type");
  27348. ret = BAD_KEA_TYPE_E;
  27349. } /* switch (ssl->specs.kea) */
  27350. /* Check for error */
  27351. if (ret != 0) {
  27352. goto exit_dcke;
  27353. }
  27354. /* Advance state and proceed */
  27355. ssl->options.asyncState = TLS_ASYNC_BUILD;
  27356. } /* TLS_ASYNC_BEGIN */
  27357. FALL_THROUGH;
  27358. case TLS_ASYNC_BUILD:
  27359. {
  27360. switch (ssl->specs.kea) {
  27361. #ifndef NO_RSA
  27362. case rsa_kea:
  27363. {
  27364. word16 keySz;
  27365. ssl->buffers.keyType = rsa_sa_algo;
  27366. ret = DecodePrivateKey(ssl, &keySz);
  27367. if (ret != 0) {
  27368. goto exit_dcke;
  27369. }
  27370. args->length = (word32)keySz;
  27371. ssl->arrays->preMasterSz = SECRET_LEN;
  27372. if (ssl->options.tls) {
  27373. word16 check;
  27374. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  27375. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27376. }
  27377. ato16(input + args->idx, &check);
  27378. args->idx += OPAQUE16_LEN;
  27379. if ((word32)check != args->length) {
  27380. WOLFSSL_MSG("RSA explicit size doesn't match");
  27381. #ifdef WOLFSSL_EXTRA_ALERTS
  27382. SendAlert(ssl, alert_fatal, bad_record_mac);
  27383. #endif
  27384. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  27385. }
  27386. }
  27387. if ((args->idx - args->begin) + args->length > size) {
  27388. WOLFSSL_MSG("RSA message too big");
  27389. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27390. }
  27391. /* pre-load PreMasterSecret with RNG data */
  27392. ret = wc_RNG_GenerateBlock(ssl->rng,
  27393. &ssl->arrays->preMasterSecret[VERSION_SZ],
  27394. SECRET_LEN - VERSION_SZ);
  27395. if (ret != 0) {
  27396. goto exit_dcke;
  27397. }
  27398. args->output = NULL;
  27399. break;
  27400. } /* rsa_kea */
  27401. #endif /* !NO_RSA */
  27402. #ifndef NO_PSK
  27403. case psk_kea:
  27404. {
  27405. byte* pms = ssl->arrays->preMasterSecret;
  27406. word16 ci_sz;
  27407. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  27408. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27409. }
  27410. ato16(input + args->idx, &ci_sz);
  27411. args->idx += OPAQUE16_LEN;
  27412. if (ci_sz > MAX_PSK_ID_LEN) {
  27413. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  27414. }
  27415. if ((args->idx - args->begin) + ci_sz > size) {
  27416. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27417. }
  27418. XMEMCPY(ssl->arrays->client_identity,
  27419. input + args->idx, ci_sz);
  27420. args->idx += ci_sz;
  27421. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  27422. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  27423. ssl->arrays->client_identity, ssl->arrays->psk_key,
  27424. MAX_PSK_KEY_LEN);
  27425. if (ssl->arrays->psk_keySz == 0 ||
  27426. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  27427. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  27428. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  27429. SendAlert(ssl, alert_fatal,
  27430. unknown_psk_identity);
  27431. #endif
  27432. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  27433. }
  27434. /* make psk pre master secret */
  27435. /* length of key + length 0s + length of key + key */
  27436. c16toa((word16) ssl->arrays->psk_keySz, pms);
  27437. pms += OPAQUE16_LEN;
  27438. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  27439. pms += ssl->arrays->psk_keySz;
  27440. c16toa((word16) ssl->arrays->psk_keySz, pms);
  27441. pms += OPAQUE16_LEN;
  27442. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  27443. ssl->arrays->preMasterSz =
  27444. (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
  27445. break;
  27446. }
  27447. #endif /* !NO_PSK */
  27448. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27449. defined(HAVE_CURVE448)
  27450. case ecc_diffie_hellman_kea:
  27451. {
  27452. #ifdef HAVE_ECC
  27453. ecc_key* private_key = ssl->eccTempKey;
  27454. /* handle static private key */
  27455. if (ssl->specs.static_ecdh &&
  27456. ssl->ecdhCurveOID != ECC_X25519_OID &&
  27457. ssl->ecdhCurveOID != ECC_X448_OID) {
  27458. word16 keySz;
  27459. ssl->buffers.keyType = ecc_dsa_sa_algo;
  27460. ret = DecodePrivateKey(ssl, &keySz);
  27461. if (ret != 0) {
  27462. goto exit_dcke;
  27463. }
  27464. private_key = (ecc_key*)ssl->hsKey;
  27465. }
  27466. #endif
  27467. /* import peer ECC key */
  27468. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  27469. #ifdef WOLFSSL_EXTRA_ALERTS
  27470. SendAlert(ssl, alert_fatal, decode_error);
  27471. #endif
  27472. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27473. }
  27474. args->length = input[args->idx++];
  27475. if ((args->idx - args->begin) + args->length > size) {
  27476. #ifdef WOLFSSL_EXTRA_ALERTS
  27477. SendAlert(ssl, alert_fatal, decode_error);
  27478. #endif
  27479. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27480. }
  27481. #ifdef HAVE_CURVE25519
  27482. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27483. #ifdef HAVE_PK_CALLBACKS
  27484. /* if callback then use it for shared secret */
  27485. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  27486. break;
  27487. }
  27488. #endif
  27489. if (ssl->peerX25519Key == NULL) {
  27490. /* alloc/init on demand */
  27491. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27492. (void**)&ssl->peerX25519Key);
  27493. if (ret != 0) {
  27494. goto exit_dcke;
  27495. }
  27496. } else if (ssl->peerX25519KeyPresent) {
  27497. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27498. ssl->peerX25519Key);
  27499. ssl->peerX25519KeyPresent = 0;
  27500. if (ret != 0) {
  27501. goto exit_dcke;
  27502. }
  27503. }
  27504. if ((ret = wc_curve25519_check_public(
  27505. input + args->idx, args->length,
  27506. EC25519_LITTLE_ENDIAN)) != 0) {
  27507. #ifdef WOLFSSL_EXTRA_ALERTS
  27508. if (ret == BUFFER_E)
  27509. SendAlert(ssl, alert_fatal, decode_error);
  27510. else if (ret == ECC_OUT_OF_RANGE_E)
  27511. SendAlert(ssl, alert_fatal, bad_record_mac);
  27512. else {
  27513. SendAlert(ssl, alert_fatal,
  27514. illegal_parameter);
  27515. }
  27516. #endif
  27517. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27518. }
  27519. if (wc_curve25519_import_public_ex(
  27520. input + args->idx, args->length,
  27521. ssl->peerX25519Key,
  27522. EC25519_LITTLE_ENDIAN)) {
  27523. #ifdef WOLFSSL_EXTRA_ALERTS
  27524. SendAlert(ssl, alert_fatal, illegal_parameter);
  27525. #endif
  27526. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27527. }
  27528. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  27529. ssl->peerX25519KeyPresent = 1;
  27530. break;
  27531. }
  27532. #endif
  27533. #ifdef HAVE_CURVE448
  27534. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27535. #ifdef HAVE_PK_CALLBACKS
  27536. /* if callback then use it for shared secret */
  27537. if (ssl->ctx->X448SharedSecretCb != NULL) {
  27538. break;
  27539. }
  27540. #endif
  27541. if (ssl->peerX448Key == NULL) {
  27542. /* alloc/init on demand */
  27543. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  27544. (void**)&ssl->peerX448Key);
  27545. if (ret != 0) {
  27546. goto exit_dcke;
  27547. }
  27548. } else if (ssl->peerX448KeyPresent) {
  27549. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  27550. ssl->peerX448Key);
  27551. ssl->peerX448KeyPresent = 0;
  27552. if (ret != 0) {
  27553. goto exit_dcke;
  27554. }
  27555. }
  27556. if ((ret = wc_curve448_check_public(
  27557. input + args->idx, args->length,
  27558. EC448_LITTLE_ENDIAN)) != 0) {
  27559. #ifdef WOLFSSL_EXTRA_ALERTS
  27560. if (ret == BUFFER_E)
  27561. SendAlert(ssl, alert_fatal, decode_error);
  27562. else if (ret == ECC_OUT_OF_RANGE_E)
  27563. SendAlert(ssl, alert_fatal, bad_record_mac);
  27564. else {
  27565. SendAlert(ssl, alert_fatal,
  27566. illegal_parameter);
  27567. }
  27568. #endif
  27569. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27570. }
  27571. if (wc_curve448_import_public_ex(
  27572. input + args->idx, args->length,
  27573. ssl->peerX448Key,
  27574. EC448_LITTLE_ENDIAN)) {
  27575. #ifdef WOLFSSL_EXTRA_ALERTS
  27576. SendAlert(ssl, alert_fatal, illegal_parameter);
  27577. #endif
  27578. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27579. }
  27580. ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
  27581. ssl->peerX448KeyPresent = 1;
  27582. break;
  27583. }
  27584. #endif
  27585. #ifdef HAVE_ECC
  27586. #ifdef HAVE_PK_CALLBACKS
  27587. /* if callback then use it for shared secret */
  27588. if (ssl->ctx->EccSharedSecretCb != NULL) {
  27589. break;
  27590. }
  27591. #endif
  27592. if (!ssl->specs.static_ecdh &&
  27593. ssl->eccTempKeyPresent == 0) {
  27594. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  27595. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  27596. }
  27597. if (ssl->peerEccKey == NULL) {
  27598. /* alloc/init on demand */
  27599. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  27600. (void**)&ssl->peerEccKey);
  27601. if (ret != 0) {
  27602. goto exit_dcke;
  27603. }
  27604. } else if (ssl->peerEccKeyPresent) {
  27605. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  27606. ssl->peerEccKey);
  27607. ssl->peerEccKeyPresent = 0;
  27608. if (ret != 0) {
  27609. goto exit_dcke;
  27610. }
  27611. }
  27612. if (wc_ecc_import_x963_ex(input + args->idx,
  27613. args->length, ssl->peerEccKey,
  27614. private_key->dp->id)) {
  27615. #ifdef WOLFSSL_EXTRA_ALERTS
  27616. SendAlert(ssl, alert_fatal, illegal_parameter);
  27617. #endif
  27618. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27619. }
  27620. ssl->arrays->preMasterSz = private_key->dp->size;
  27621. ssl->peerEccKeyPresent = 1;
  27622. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  27623. /* client_hello may have sent FFEDH2048, which sets namedGroup,
  27624. but that is not being used, so clear it */
  27625. /* resolves issue with server side wolfSSL_get_curve_name */
  27626. ssl->namedGroup = 0;
  27627. #endif
  27628. #endif /* HAVE_ECC */
  27629. break;
  27630. }
  27631. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27632. #ifndef NO_DH
  27633. case diffie_hellman_kea:
  27634. {
  27635. word16 clientPubSz;
  27636. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  27637. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27638. }
  27639. ato16(input + args->idx, &clientPubSz);
  27640. args->idx += OPAQUE16_LEN;
  27641. if ((args->idx - args->begin) + clientPubSz > size) {
  27642. #ifdef WOLFSSL_EXTRA_ALERTS
  27643. SendAlert(ssl, alert_fatal, decode_error);
  27644. #endif
  27645. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27646. }
  27647. args->sigSz = clientPubSz;
  27648. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  27649. (void**)&ssl->buffers.serverDH_Key);
  27650. if (ret != 0) {
  27651. goto exit_dcke;
  27652. }
  27653. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  27654. ssl->buffers.serverDH_P.buffer,
  27655. ssl->buffers.serverDH_P.length,
  27656. ssl->buffers.serverDH_G.buffer,
  27657. ssl->buffers.serverDH_G.length);
  27658. /* set the max agree result size */
  27659. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  27660. break;
  27661. }
  27662. #endif /* !NO_DH */
  27663. #if !defined(NO_DH) && !defined(NO_PSK)
  27664. case dhe_psk_kea:
  27665. {
  27666. word16 clientSz;
  27667. /* Read in the PSK hint */
  27668. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  27669. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27670. }
  27671. ato16(input + args->idx, &clientSz);
  27672. args->idx += OPAQUE16_LEN;
  27673. if (clientSz > MAX_PSK_ID_LEN) {
  27674. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  27675. }
  27676. if ((args->idx - args->begin) + clientSz > size) {
  27677. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27678. }
  27679. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  27680. clientSz);
  27681. args->idx += clientSz;
  27682. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  27683. /* Read in the DHE business */
  27684. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  27685. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27686. }
  27687. ato16(input + args->idx, &clientSz);
  27688. args->idx += OPAQUE16_LEN;
  27689. if ((args->idx - args->begin) + clientSz > size) {
  27690. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27691. }
  27692. args->sigSz = clientSz;
  27693. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  27694. (void**)&ssl->buffers.serverDH_Key);
  27695. if (ret != 0) {
  27696. goto exit_dcke;
  27697. }
  27698. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  27699. ssl->buffers.serverDH_P.buffer,
  27700. ssl->buffers.serverDH_P.length,
  27701. ssl->buffers.serverDH_G.buffer,
  27702. ssl->buffers.serverDH_G.length);
  27703. break;
  27704. }
  27705. #endif /* !NO_DH && !NO_PSK */
  27706. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27707. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27708. case ecdhe_psk_kea:
  27709. {
  27710. word16 clientSz;
  27711. /* Read in the PSK hint */
  27712. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  27713. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27714. }
  27715. ato16(input + args->idx, &clientSz);
  27716. args->idx += OPAQUE16_LEN;
  27717. if (clientSz > MAX_PSK_ID_LEN) {
  27718. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  27719. }
  27720. if ((args->idx - args->begin) + clientSz > size) {
  27721. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27722. }
  27723. XMEMCPY(ssl->arrays->client_identity,
  27724. input + args->idx, clientSz);
  27725. args->idx += clientSz;
  27726. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  27727. /* import peer ECC key */
  27728. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  27729. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27730. }
  27731. args->length = input[args->idx++];
  27732. if ((args->idx - args->begin) + args->length > size) {
  27733. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27734. }
  27735. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  27736. #ifdef HAVE_CURVE25519
  27737. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27738. #ifdef HAVE_PK_CALLBACKS
  27739. /* if callback then use it for shared secret */
  27740. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  27741. break;
  27742. }
  27743. #endif
  27744. if (ssl->eccTempKeyPresent == 0) {
  27745. WOLFSSL_MSG(
  27746. "X25519 ephemeral key not made correctly");
  27747. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  27748. }
  27749. if (ssl->peerX25519Key == NULL) {
  27750. /* alloc/init on demand */
  27751. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27752. (void**)&ssl->peerX25519Key);
  27753. if (ret != 0) {
  27754. goto exit_dcke;
  27755. }
  27756. } else if (ssl->peerX25519KeyPresent) {
  27757. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27758. ssl->peerX25519Key);
  27759. ssl->peerX25519KeyPresent = 0;
  27760. if (ret != 0) {
  27761. goto exit_dcke;
  27762. }
  27763. }
  27764. if ((ret = wc_curve25519_check_public(
  27765. input + args->idx, args->length,
  27766. EC25519_LITTLE_ENDIAN)) != 0) {
  27767. #ifdef WOLFSSL_EXTRA_ALERTS
  27768. if (ret == BUFFER_E)
  27769. SendAlert(ssl, alert_fatal, decode_error);
  27770. else if (ret == ECC_OUT_OF_RANGE_E)
  27771. SendAlert(ssl, alert_fatal, bad_record_mac);
  27772. else {
  27773. SendAlert(ssl, alert_fatal,
  27774. illegal_parameter);
  27775. }
  27776. #endif
  27777. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27778. }
  27779. if (wc_curve25519_import_public_ex(
  27780. input + args->idx, args->length,
  27781. ssl->peerX25519Key,
  27782. EC25519_LITTLE_ENDIAN)) {
  27783. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27784. }
  27785. ssl->peerX25519KeyPresent = 1;
  27786. break;
  27787. }
  27788. #endif
  27789. #ifdef HAVE_CURVE448
  27790. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27791. #ifdef HAVE_PK_CALLBACKS
  27792. /* if callback then use it for shared secret */
  27793. if (ssl->ctx->X448SharedSecretCb != NULL) {
  27794. break;
  27795. }
  27796. #endif
  27797. if (ssl->eccTempKeyPresent == 0) {
  27798. WOLFSSL_MSG(
  27799. "X448 ephemeral key not made correctly");
  27800. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  27801. }
  27802. if (ssl->peerX448Key == NULL) {
  27803. /* alloc/init on demand */
  27804. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  27805. (void**)&ssl->peerX448Key);
  27806. if (ret != 0) {
  27807. goto exit_dcke;
  27808. }
  27809. } else if (ssl->peerX448KeyPresent) {
  27810. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  27811. ssl->peerX448Key);
  27812. ssl->peerX448KeyPresent = 0;
  27813. if (ret != 0) {
  27814. goto exit_dcke;
  27815. }
  27816. }
  27817. if ((ret = wc_curve448_check_public(
  27818. input + args->idx, args->length,
  27819. EC448_LITTLE_ENDIAN)) != 0) {
  27820. #ifdef WOLFSSL_EXTRA_ALERTS
  27821. if (ret == BUFFER_E)
  27822. SendAlert(ssl, alert_fatal, decode_error);
  27823. else if (ret == ECC_OUT_OF_RANGE_E)
  27824. SendAlert(ssl, alert_fatal, bad_record_mac);
  27825. else {
  27826. SendAlert(ssl, alert_fatal,
  27827. illegal_parameter);
  27828. }
  27829. #endif
  27830. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27831. }
  27832. if (wc_curve448_import_public_ex(
  27833. input + args->idx, args->length,
  27834. ssl->peerX448Key,
  27835. EC448_LITTLE_ENDIAN)) {
  27836. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27837. }
  27838. ssl->peerX448KeyPresent = 1;
  27839. break;
  27840. }
  27841. #endif
  27842. #ifdef HAVE_PK_CALLBACKS
  27843. /* if callback then use it for shared secret */
  27844. if (ssl->ctx->EccSharedSecretCb != NULL) {
  27845. break;
  27846. }
  27847. #endif
  27848. if (ssl->eccTempKeyPresent == 0) {
  27849. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  27850. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  27851. }
  27852. if (ssl->peerEccKey == NULL) {
  27853. /* alloc/init on demand */
  27854. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  27855. (void**)&ssl->peerEccKey);
  27856. if (ret != 0) {
  27857. goto exit_dcke;
  27858. }
  27859. }
  27860. else if (ssl->peerEccKeyPresent) {
  27861. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  27862. ssl->peerEccKey);
  27863. ssl->peerEccKeyPresent = 0;
  27864. if (ret != 0) {
  27865. goto exit_dcke;
  27866. }
  27867. }
  27868. if (wc_ecc_import_x963_ex(input + args->idx,
  27869. args->length, ssl->peerEccKey,
  27870. ssl->eccTempKey->dp->id)) {
  27871. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  27872. }
  27873. ssl->peerEccKeyPresent = 1;
  27874. break;
  27875. }
  27876. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27877. default:
  27878. ret = BAD_KEA_TYPE_E;
  27879. } /* switch (ssl->specs.kea) */
  27880. /* Check for error */
  27881. if (ret != 0) {
  27882. goto exit_dcke;
  27883. }
  27884. /* Advance state and proceed */
  27885. ssl->options.asyncState = TLS_ASYNC_DO;
  27886. } /* TLS_ASYNC_BUILD */
  27887. FALL_THROUGH;
  27888. case TLS_ASYNC_DO:
  27889. {
  27890. switch (ssl->specs.kea) {
  27891. #ifndef NO_RSA
  27892. case rsa_kea:
  27893. {
  27894. RsaKey* key = (RsaKey*)ssl->hsKey;
  27895. ret = RsaDec(ssl,
  27896. input + args->idx,
  27897. args->length,
  27898. &args->output,
  27899. &args->sigSz,
  27900. key,
  27901. #ifdef HAVE_PK_CALLBACKS
  27902. ssl->buffers.key
  27903. #else
  27904. NULL
  27905. #endif
  27906. );
  27907. /* Errors that can occur here that should be
  27908. * indistinguishable:
  27909. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  27910. */
  27911. #ifdef WOLFSSL_ASYNC_CRYPT
  27912. if (ret == WC_PENDING_E)
  27913. goto exit_dcke;
  27914. #endif
  27915. if (ret == BAD_FUNC_ARG)
  27916. goto exit_dcke;
  27917. args->lastErr = ret - (SECRET_LEN - args->sigSz);
  27918. ret = 0;
  27919. break;
  27920. } /* rsa_kea */
  27921. #endif /* !NO_RSA */
  27922. #ifndef NO_PSK
  27923. case psk_kea:
  27924. {
  27925. break;
  27926. }
  27927. #endif /* !NO_PSK */
  27928. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27929. defined(HAVE_CURVE448)
  27930. case ecc_diffie_hellman_kea:
  27931. {
  27932. void* private_key = ssl->eccTempKey;
  27933. (void)private_key;
  27934. #ifdef HAVE_CURVE25519
  27935. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27936. ret = X25519SharedSecret(ssl,
  27937. (curve25519_key*)private_key,
  27938. ssl->peerX25519Key,
  27939. input + args->idx, &args->length,
  27940. ssl->arrays->preMasterSecret,
  27941. &ssl->arrays->preMasterSz,
  27942. WOLFSSL_SERVER_END
  27943. );
  27944. break;
  27945. }
  27946. #endif
  27947. #ifdef HAVE_CURVE448
  27948. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27949. ret = X448SharedSecret(ssl,
  27950. (curve448_key*)private_key,
  27951. ssl->peerX448Key,
  27952. input + args->idx, &args->length,
  27953. ssl->arrays->preMasterSecret,
  27954. &ssl->arrays->preMasterSz,
  27955. WOLFSSL_SERVER_END
  27956. );
  27957. break;
  27958. }
  27959. #endif
  27960. #ifdef HAVE_ECC
  27961. if (ssl->specs.static_ecdh) {
  27962. private_key = ssl->hsKey;
  27963. }
  27964. /* Generate shared secret */
  27965. ret = EccSharedSecret(ssl,
  27966. (ecc_key*)private_key, ssl->peerEccKey,
  27967. input + args->idx, &args->length,
  27968. ssl->arrays->preMasterSecret,
  27969. &ssl->arrays->preMasterSz,
  27970. WOLFSSL_SERVER_END
  27971. );
  27972. #ifdef WOLFSSL_ASYNC_CRYPT
  27973. if (ret != WC_PENDING_E)
  27974. #endif
  27975. {
  27976. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  27977. (void**)&ssl->peerEccKey);
  27978. ssl->peerEccKeyPresent = 0;
  27979. }
  27980. #endif
  27981. break;
  27982. }
  27983. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27984. #ifndef NO_DH
  27985. case diffie_hellman_kea:
  27986. {
  27987. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  27988. ssl->buffers.serverDH_Priv.buffer,
  27989. ssl->buffers.serverDH_Priv.length,
  27990. input + args->idx,
  27991. (word16)args->sigSz,
  27992. ssl->arrays->preMasterSecret,
  27993. &ssl->arrays->preMasterSz,
  27994. ssl->buffers.serverDH_P.buffer,
  27995. ssl->buffers.serverDH_P.length);
  27996. break;
  27997. }
  27998. #endif /* !NO_DH */
  27999. #if !defined(NO_DH) && !defined(NO_PSK)
  28000. case dhe_psk_kea:
  28001. {
  28002. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  28003. ssl->buffers.serverDH_Priv.buffer,
  28004. ssl->buffers.serverDH_Priv.length,
  28005. input + args->idx,
  28006. (word16)args->sigSz,
  28007. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  28008. &ssl->arrays->preMasterSz,
  28009. ssl->buffers.serverDH_P.buffer,
  28010. ssl->buffers.serverDH_P.length);
  28011. break;
  28012. }
  28013. #endif /* !NO_DH && !NO_PSK */
  28014. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28015. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28016. case ecdhe_psk_kea:
  28017. {
  28018. #ifdef HAVE_CURVE25519
  28019. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  28020. ret = X25519SharedSecret(ssl,
  28021. (curve25519_key*)ssl->eccTempKey,
  28022. ssl->peerX25519Key,
  28023. input + args->idx, &args->length,
  28024. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  28025. &args->sigSz,
  28026. WOLFSSL_SERVER_END
  28027. );
  28028. #ifdef WOLFSSL_ASYNC_CRYPT
  28029. if (ret != WC_PENDING_E)
  28030. #endif
  28031. {
  28032. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  28033. (void**)&ssl->peerX25519Key);
  28034. ssl->peerX25519KeyPresent = 0;
  28035. }
  28036. break;
  28037. }
  28038. #endif
  28039. #ifdef HAVE_CURVE448
  28040. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  28041. ret = X448SharedSecret(ssl,
  28042. (curve448_key*)ssl->eccTempKey,
  28043. ssl->peerX448Key,
  28044. input + args->idx, &args->length,
  28045. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  28046. &args->sigSz,
  28047. WOLFSSL_SERVER_END
  28048. );
  28049. #ifdef WOLFSSL_ASYNC_CRYPT
  28050. if (ret != WC_PENDING_E)
  28051. #endif
  28052. {
  28053. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  28054. (void**)&ssl->peerX448Key);
  28055. ssl->peerX448KeyPresent = 0;
  28056. }
  28057. break;
  28058. }
  28059. #endif
  28060. /* Generate shared secret */
  28061. ret = EccSharedSecret(ssl,
  28062. ssl->eccTempKey, ssl->peerEccKey,
  28063. input + args->idx, &args->length,
  28064. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  28065. &args->sigSz,
  28066. WOLFSSL_SERVER_END
  28067. );
  28068. if (!ssl->specs.static_ecdh
  28069. #ifdef WOLFSSL_ASYNC_CRYPT
  28070. && ret != WC_PENDING_E
  28071. #endif
  28072. ) {
  28073. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  28074. (void**)&ssl->peerEccKey);
  28075. ssl->peerEccKeyPresent = 0;
  28076. }
  28077. break;
  28078. }
  28079. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  28080. default:
  28081. ret = BAD_KEA_TYPE_E;
  28082. } /* switch (ssl->specs.kea) */
  28083. /* Check for error */
  28084. if (ret != 0) {
  28085. goto exit_dcke;
  28086. }
  28087. /* Advance state and proceed */
  28088. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  28089. } /* TLS_ASYNC_DO */
  28090. FALL_THROUGH;
  28091. case TLS_ASYNC_VERIFY:
  28092. {
  28093. switch (ssl->specs.kea) {
  28094. #ifndef NO_RSA
  28095. case rsa_kea:
  28096. {
  28097. byte mask;
  28098. int i;
  28099. /* Add the signature length to idx */
  28100. args->idx += args->length;
  28101. #ifdef DEBUG_WOLFSSL
  28102. /* check version (debug warning message only) */
  28103. if (args->output != NULL) {
  28104. if (args->output[0] != ssl->chVersion.major ||
  28105. args->output[1] != ssl->chVersion.minor) {
  28106. WOLFSSL_MSG("preMasterSecret version mismatch");
  28107. }
  28108. }
  28109. #endif
  28110. /* RFC5246 7.4.7.1:
  28111. * Treat incorrectly formatted message blocks and/or
  28112. * mismatched version numbers in a manner
  28113. * indistinguishable from correctly formatted RSA blocks
  28114. */
  28115. ret = args->lastErr;
  28116. args->lastErr = 0; /* reset */
  28117. /* On error 'ret' will be negative - top bit set */
  28118. mask = ((unsigned int)ret >>
  28119. ((sizeof(ret) * 8) - 1)) - 1;
  28120. /* build PreMasterSecret */
  28121. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  28122. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  28123. if (args->output != NULL) {
  28124. /* Use random secret on error */
  28125. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  28126. ssl->arrays->preMasterSecret[i] =
  28127. ctMaskSel(mask, args->output[i],
  28128. ssl->arrays->preMasterSecret[i]);
  28129. }
  28130. }
  28131. /* preMasterSecret has RNG and version set
  28132. * return proper length and ignore error
  28133. * error will be caught as decryption error
  28134. */
  28135. args->sigSz = SECRET_LEN;
  28136. ret = 0;
  28137. break;
  28138. } /* rsa_kea */
  28139. #endif /* !NO_RSA */
  28140. #ifndef NO_PSK
  28141. case psk_kea:
  28142. {
  28143. break;
  28144. }
  28145. #endif /* !NO_PSK */
  28146. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28147. defined(HAVE_CURVE448)
  28148. case ecc_diffie_hellman_kea:
  28149. {
  28150. /* skip past the imported peer key */
  28151. args->idx += args->length;
  28152. break;
  28153. }
  28154. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28155. #ifndef NO_DH
  28156. case diffie_hellman_kea:
  28157. {
  28158. args->idx += (word16)args->sigSz;
  28159. break;
  28160. }
  28161. #endif /* !NO_DH */
  28162. #if !defined(NO_DH) && !defined(NO_PSK)
  28163. case dhe_psk_kea:
  28164. {
  28165. byte* pms = ssl->arrays->preMasterSecret;
  28166. word16 clientSz = (word16)args->sigSz;
  28167. args->idx += clientSz;
  28168. c16toa((word16)ssl->arrays->preMasterSz, pms);
  28169. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  28170. pms += ssl->arrays->preMasterSz;
  28171. /* Use the PSK hint to look up the PSK and add it to the
  28172. * preMasterSecret here. */
  28173. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  28174. ssl->arrays->client_identity, ssl->arrays->psk_key,
  28175. MAX_PSK_KEY_LEN);
  28176. if (ssl->arrays->psk_keySz == 0 ||
  28177. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  28178. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  28179. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  28180. SendAlert(ssl, alert_fatal,
  28181. unknown_psk_identity);
  28182. #endif
  28183. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  28184. }
  28185. c16toa((word16) ssl->arrays->psk_keySz, pms);
  28186. pms += OPAQUE16_LEN;
  28187. XMEMCPY(pms, ssl->arrays->psk_key,
  28188. ssl->arrays->psk_keySz);
  28189. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
  28190. OPAQUE16_LEN;
  28191. break;
  28192. }
  28193. #endif /* !NO_DH && !NO_PSK */
  28194. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28195. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28196. case ecdhe_psk_kea:
  28197. {
  28198. byte* pms = ssl->arrays->preMasterSecret;
  28199. word16 clientSz = (word16)args->sigSz;
  28200. /* skip past the imported peer key */
  28201. args->idx += args->length;
  28202. /* Add preMasterSecret */
  28203. c16toa(clientSz, pms);
  28204. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  28205. pms += ssl->arrays->preMasterSz;
  28206. /* Use the PSK hint to look up the PSK and add it to the
  28207. * preMasterSecret here. */
  28208. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  28209. ssl->arrays->client_identity, ssl->arrays->psk_key,
  28210. MAX_PSK_KEY_LEN);
  28211. if (ssl->arrays->psk_keySz == 0 ||
  28212. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  28213. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  28214. }
  28215. c16toa((word16) ssl->arrays->psk_keySz, pms);
  28216. pms += OPAQUE16_LEN;
  28217. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  28218. ssl->arrays->preMasterSz +=
  28219. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  28220. break;
  28221. }
  28222. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  28223. default:
  28224. ret = BAD_KEA_TYPE_E;
  28225. } /* switch (ssl->specs.kea) */
  28226. /* Check for error */
  28227. if (ret != 0) {
  28228. goto exit_dcke;
  28229. }
  28230. /* Advance state and proceed */
  28231. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  28232. } /* TLS_ASYNC_VERIFY */
  28233. FALL_THROUGH;
  28234. case TLS_ASYNC_FINALIZE:
  28235. {
  28236. if (IsEncryptionOn(ssl, 0)) {
  28237. args->idx += ssl->keys.padSz;
  28238. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  28239. if (ssl->options.startedETMRead)
  28240. args->idx += MacSize(ssl);
  28241. #endif
  28242. }
  28243. ret = MakeMasterSecret(ssl);
  28244. /* Check for error */
  28245. if (ret != 0) {
  28246. goto exit_dcke;
  28247. }
  28248. /* Advance state and proceed */
  28249. ssl->options.asyncState = TLS_ASYNC_END;
  28250. } /* TLS_ASYNC_FINALIZE */
  28251. FALL_THROUGH;
  28252. case TLS_ASYNC_END:
  28253. {
  28254. /* Set final index */
  28255. *inOutIdx = args->idx;
  28256. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  28257. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  28258. if (ssl->options.verifyPeer) {
  28259. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  28260. }
  28261. #endif
  28262. break;
  28263. } /* TLS_ASYNC_END */
  28264. default:
  28265. ret = INPUT_CASE_ERROR;
  28266. } /* switch(ssl->options.asyncState) */
  28267. exit_dcke:
  28268. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  28269. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  28270. #ifdef WOLFSSL_ASYNC_CRYPT
  28271. /* Handle async operation */
  28272. if (ret == WC_PENDING_E) {
  28273. /* Mark message as not received so it can process again */
  28274. ssl->msgsReceived.got_client_key_exchange = 0;
  28275. return ret;
  28276. }
  28277. #endif /* WOLFSSL_ASYNC_CRYPT */
  28278. #ifdef OPENSSL_ALL
  28279. /* add error ret value to error queue */
  28280. if (ret != 0) {
  28281. WOLFSSL_ERROR(ret);
  28282. }
  28283. #endif
  28284. /* Cleanup PMS */
  28285. if (ssl->arrays->preMasterSecret != NULL) {
  28286. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  28287. }
  28288. ssl->arrays->preMasterSz = 0;
  28289. /* Final cleanup */
  28290. FreeDckeArgs(ssl, args);
  28291. FreeKeyExchange(ssl);
  28292. return ret;
  28293. }
  28294. #endif /* !WOLFSSL_NO_TLS12 */
  28295. #ifdef HAVE_SNI
  28296. int SNI_Callback(WOLFSSL* ssl)
  28297. {
  28298. int ad = 0;
  28299. int sniRet = 0;
  28300. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  28301. * when SNI is received. Call it now if exists */
  28302. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  28303. WOLFSSL_MSG("Calling custom sni callback");
  28304. sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg);
  28305. switch (sniRet) {
  28306. case warning_return:
  28307. WOLFSSL_MSG("Error in custom sni callback. Warning alert");
  28308. SendAlert(ssl, alert_warning, ad);
  28309. break;
  28310. case fatal_return:
  28311. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  28312. SendAlert(ssl, alert_fatal, ad);
  28313. return FATAL_ERROR;
  28314. case noack_return:
  28315. WOLFSSL_MSG("Server quietly not acking servername.");
  28316. break;
  28317. default:
  28318. break;
  28319. }
  28320. }
  28321. return 0;
  28322. }
  28323. #endif /* HAVE_SNI */
  28324. #endif /* NO_WOLFSSL_SERVER */
  28325. #ifdef WOLFSSL_ASYNC_CRYPT
  28326. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  28327. {
  28328. int ret = 0;
  28329. WC_ASYNC_DEV* asyncDev;
  28330. WOLF_EVENT* event;
  28331. if (ssl == NULL) {
  28332. return BAD_FUNC_ARG;
  28333. }
  28334. /* check for pending async */
  28335. asyncDev = ssl->async.dev;
  28336. if (asyncDev) {
  28337. /* grab event pointer */
  28338. event = &asyncDev->event;
  28339. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  28340. if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) {
  28341. /* advance key share state if doesn't need called again */
  28342. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  28343. (*state)++;
  28344. }
  28345. /* clear event */
  28346. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  28347. /* clear async dev */
  28348. ssl->async.dev = NULL;
  28349. }
  28350. }
  28351. else {
  28352. ret = WC_NOT_PENDING_E;
  28353. }
  28354. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  28355. return ret;
  28356. }
  28357. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  28358. {
  28359. int ret;
  28360. WOLF_EVENT* event;
  28361. if (ssl == NULL || asyncDev == NULL) {
  28362. return BAD_FUNC_ARG;
  28363. }
  28364. /* grab event pointer */
  28365. event = &asyncDev->event;
  28366. /* init event */
  28367. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  28368. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  28369. return ret;
  28370. }
  28371. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  28372. {
  28373. int ret;
  28374. WOLF_EVENT* event;
  28375. if (ssl == NULL || asyncDev == NULL) {
  28376. return BAD_FUNC_ARG;
  28377. }
  28378. /* grab event pointer */
  28379. event = &asyncDev->event;
  28380. /* store reference to active async operation */
  28381. ssl->async.dev = asyncDev;
  28382. /* place event into queue */
  28383. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  28384. /* success means return WC_PENDING_E */
  28385. if (ret == 0) {
  28386. ret = WC_PENDING_E;
  28387. }
  28388. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  28389. return ret;
  28390. }
  28391. #endif /* WOLFSSL_ASYNC_CRYPT */
  28392. /**
  28393. * Return the max fragment size. This is essentially the maximum
  28394. * fragment_length available.
  28395. * @param ssl WOLFSSL object containing ciphersuite information.
  28396. * @param maxFragment The amount of space we want to check is available. This
  28397. * is only the fragment length WITHOUT the (D)TLS headers.
  28398. * @return Max fragment size
  28399. */
  28400. int wolfSSL_GetMaxFragSize(WOLFSSL* ssl, int maxFragment)
  28401. {
  28402. (void) ssl; /* Avoid compiler warnings */
  28403. if (maxFragment > MAX_RECORD_SIZE) {
  28404. maxFragment = MAX_RECORD_SIZE;
  28405. }
  28406. #ifdef HAVE_MAX_FRAGMENT
  28407. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  28408. maxFragment = ssl->max_fragment;
  28409. }
  28410. #endif /* HAVE_MAX_FRAGMENT */
  28411. #ifdef WOLFSSL_DTLS
  28412. if (IsDtlsNotSctpMode(ssl)) {
  28413. int outputSz, mtuSz;
  28414. /* Given a input buffer size of maxFragment, how big will the
  28415. * encrypted output be? */
  28416. if (IsEncryptionOn(ssl, 1)) {
  28417. outputSz = BuildMessage(ssl, NULL, 0, NULL,
  28418. maxFragment + DTLS_HANDSHAKE_HEADER_SZ,
  28419. application_data, 0, 1, 0, CUR_ORDER);
  28420. }
  28421. else {
  28422. outputSz = maxFragment + DTLS_RECORD_HEADER_SZ +
  28423. DTLS_HANDSHAKE_HEADER_SZ;
  28424. }
  28425. /* Readjust maxFragment for MTU size. */
  28426. #if defined(WOLFSSL_DTLS_MTU)
  28427. mtuSz = ssl->dtlsMtuSz;
  28428. #else
  28429. mtuSz = MAX_MTU;
  28430. #endif
  28431. maxFragment = ModifyForMTU(ssl, maxFragment, outputSz, mtuSz);
  28432. }
  28433. #endif
  28434. return maxFragment;
  28435. }
  28436. #if defined(WOLFSSL_IOTSAFE) && defined(HAVE_PK_CALLBACKS)
  28437. IOTSAFE *wolfSSL_get_iotsafe_ctx(WOLFSSL *ssl)
  28438. {
  28439. if (ssl == NULL)
  28440. return NULL;
  28441. return &ssl->iotsafe;
  28442. }
  28443. int wolfSSL_set_iotsafe_ctx(WOLFSSL *ssl, IOTSAFE *iotsafe)
  28444. {
  28445. if ((ssl == NULL) || (iotsafe == NULL))
  28446. return BAD_FUNC_ARG;
  28447. XMEMCPY(&ssl->iotsafe, iotsafe, sizeof(IOTSAFE));
  28448. return 0;
  28449. }
  28450. #endif
  28451. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  28452. /* create an instance of WOLFSSL_BY_DIR_HASH structure */
  28453. WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void)
  28454. {
  28455. WOLFSSL_BY_DIR_HASH* dir_hash;
  28456. WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new");
  28457. dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL,
  28458. DYNAMIC_TYPE_OPENSSL);
  28459. if (dir_hash) {
  28460. XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH));
  28461. }
  28462. return dir_hash;
  28463. }
  28464. /* release a WOLFSSL_BY_DIR_HASH resource */
  28465. void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash)
  28466. {
  28467. if (dir_hash == NULL)
  28468. return;
  28469. XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL);
  28470. }
  28471. /* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */
  28472. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void)
  28473. {
  28474. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  28475. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null");
  28476. if (sk) {
  28477. sk->type = STACK_TYPE_BY_DIR_hash;
  28478. }
  28479. return sk;
  28480. }
  28481. /* returns value less than 0 on fail to match
  28482. * On a successful match the priority level found is returned
  28483. */
  28484. int wolfSSL_sk_BY_DIR_HASH_find(
  28485. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind)
  28486. {
  28487. WOLFSSL_STACK* next;
  28488. int i, sz;
  28489. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find");
  28490. if (sk == NULL || toFind == NULL) {
  28491. return WOLFSSL_FAILURE;
  28492. }
  28493. sz = wolfSSL_sk_BY_DIR_HASH_num(sk);
  28494. next = sk;
  28495. for (i = 0; i < sz && next != NULL; i++) {
  28496. if (next->data.dir_hash->hash_value == toFind->hash_value) {
  28497. return sz - i; /* reverse because stack pushed highest on first */
  28498. }
  28499. next = next->next;
  28500. }
  28501. return -1;
  28502. }
  28503. /* return a number of WOLFSSL_BY_DIR_HASH in stack */
  28504. int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  28505. {
  28506. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num");
  28507. if (sk == NULL)
  28508. return -1;
  28509. return (int)sk->num;
  28510. }
  28511. /* return WOLFSSL_BY_DIR_HASH instance at i */
  28512. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value(
  28513. const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i)
  28514. {
  28515. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value");
  28516. for (; sk != NULL && i > 0; i--)
  28517. sk = sk->next;
  28518. if (i != 0 || sk == NULL)
  28519. return NULL;
  28520. return sk->data.dir_hash;
  28521. }
  28522. /* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */
  28523. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop(
  28524. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk)
  28525. {
  28526. WOLFSSL_STACK* node;
  28527. WOLFSSL_BY_DIR_HASH* hash;
  28528. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop");
  28529. if (sk == NULL) {
  28530. return NULL;
  28531. }
  28532. node = sk->next;
  28533. hash = sk->data.dir_hash;
  28534. if (node != NULL) { /* update sk and remove node from stack */
  28535. sk->data.dir_hash = node->data.dir_hash;
  28536. sk->next = node->next;
  28537. wolfSSL_sk_free_node(node);
  28538. }
  28539. else { /* last x509 in stack */
  28540. sk->data.dir_hash = NULL;
  28541. }
  28542. if (sk->num > 0) {
  28543. sk->num -= 1;
  28544. }
  28545. return hash;
  28546. }
  28547. /* release all contents in stack, and then release stack itself. */
  28548. /* Second argument is a function pointer to release resouces. */
  28549. /* It calls the function to release resouces when t is passed */
  28550. /* instead of wolfSSL_BY_DIR_HASH_free(). */
  28551. void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk,
  28552. void (*f) (WOLFSSL_BY_DIR_HASH*))
  28553. {
  28554. WOLFSSL_STACK* node;
  28555. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free");
  28556. if (sk == NULL) {
  28557. return;
  28558. }
  28559. /* parse through stack freeing each node */
  28560. node = sk->next;
  28561. while (node && sk->num > 1) {
  28562. WOLFSSL_STACK* tmp = node;
  28563. node = node->next;
  28564. if (f)
  28565. f(tmp->data.dir_hash);
  28566. else
  28567. wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash);
  28568. tmp->data.dir_hash = NULL;
  28569. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  28570. sk->num -= 1;
  28571. }
  28572. /* free head of stack */
  28573. if (sk->num == 1) {
  28574. if (f)
  28575. f(sk->data.dir_hash);
  28576. else
  28577. wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash);
  28578. sk->data.dir_hash = NULL;
  28579. }
  28580. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  28581. }
  28582. /* release all contents in stack, and then release stack itself */
  28583. void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  28584. {
  28585. wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL);
  28586. }
  28587. /* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and
  28588. * tries to free it when the stack is free'd.
  28589. *
  28590. * return 1 on success 0 on fail
  28591. */
  28592. int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk,
  28593. WOLFSSL_BY_DIR_HASH* in)
  28594. {
  28595. WOLFSSL_STACK* node;
  28596. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push");
  28597. if (sk == NULL || in == NULL) {
  28598. return WOLFSSL_FAILURE;
  28599. }
  28600. /* no previous values in stack */
  28601. if (sk->data.dir_hash == NULL) {
  28602. sk->data.dir_hash = in;
  28603. sk->num += 1;
  28604. return WOLFSSL_SUCCESS;
  28605. }
  28606. /* stack already has value(s) create a new node and add more */
  28607. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  28608. DYNAMIC_TYPE_OPENSSL);
  28609. if (node == NULL) {
  28610. WOLFSSL_MSG("Memory error");
  28611. return WOLFSSL_FAILURE;
  28612. }
  28613. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  28614. /* push new obj onto head of stack */
  28615. node->data.dir_hash = sk->data.dir_hash;
  28616. node->next = sk->next;
  28617. node->type = sk->type;
  28618. sk->next = node;
  28619. sk->data.dir_hash = in;
  28620. sk->num += 1;
  28621. return WOLFSSL_SUCCESS;
  28622. }
  28623. /* create an instance of WOLFSSL_BY_DIR_entry structure */
  28624. WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void)
  28625. {
  28626. WOLFSSL_BY_DIR_entry* entry;
  28627. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new");
  28628. entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL,
  28629. DYNAMIC_TYPE_OPENSSL);
  28630. if (entry) {
  28631. XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry));
  28632. }
  28633. return entry;
  28634. }
  28635. /* release a WOLFSSL_BY_DIR_entry resource */
  28636. void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry)
  28637. {
  28638. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free");
  28639. if (entry == NULL)
  28640. return;
  28641. if (entry->hashes) {
  28642. wolfSSL_sk_BY_DIR_HASH_free(entry->hashes);
  28643. }
  28644. if (entry->dir_name != NULL) {
  28645. XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL);
  28646. }
  28647. XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL);
  28648. }
  28649. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void)
  28650. {
  28651. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  28652. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null");
  28653. if (sk) {
  28654. sk->type = STACK_TYPE_BY_DIR_entry;
  28655. }
  28656. return sk;
  28657. }
  28658. /* return a number of WOLFSSL_BY_DIR_entry in stack */
  28659. int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk)
  28660. {
  28661. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num");
  28662. if (sk == NULL)
  28663. return -1;
  28664. return (int)sk->num;
  28665. }
  28666. /* return WOLFSSL_BY_DIR_entry instance at i */
  28667. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value(
  28668. const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i)
  28669. {
  28670. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value");
  28671. for (; sk != NULL && i > 0; i--)
  28672. sk = sk->next;
  28673. if (i != 0 || sk == NULL)
  28674. return NULL;
  28675. return sk->data.dir_entry;
  28676. }
  28677. /* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */
  28678. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop(
  28679. WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk)
  28680. {
  28681. WOLFSSL_STACK* node;
  28682. WOLFSSL_BY_DIR_entry* entry;
  28683. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop");
  28684. if (sk == NULL) {
  28685. return NULL;
  28686. }
  28687. node = sk->next;
  28688. entry = sk->data.dir_entry;
  28689. if (node != NULL) { /* update sk and remove node from stack */
  28690. sk->data.dir_entry = node->data.dir_entry;
  28691. sk->next = node->next;
  28692. wolfSSL_sk_free_node(node);
  28693. }
  28694. else { /* last x509 in stack */
  28695. sk->data.dir_entry = NULL;
  28696. }
  28697. if (sk->num > 0) {
  28698. sk->num -= 1;
  28699. }
  28700. return entry;
  28701. }
  28702. /* release all contents in stack, and then release stack itself. */
  28703. /* Second argument is a function pointer to release resouces. */
  28704. /* It calls the function to release resouces when t is passed */
  28705. /* instead of wolfSSL_BY_DIR_entry_free(). */
  28706. void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  28707. void (*f) (WOLFSSL_BY_DIR_entry*))
  28708. {
  28709. WOLFSSL_STACK* node;
  28710. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free");
  28711. if (sk == NULL) {
  28712. return;
  28713. }
  28714. /* parse through stack freeing each node */
  28715. node = sk->next;
  28716. while (node && sk->num > 1) {
  28717. WOLFSSL_STACK* tmp = node;
  28718. node = node->next;
  28719. if (f)
  28720. f(tmp->data.dir_entry);
  28721. else
  28722. wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry);
  28723. tmp->data.dir_entry = NULL;
  28724. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  28725. sk->num -= 1;
  28726. }
  28727. /* free head of stack */
  28728. if (sk->num == 1) {
  28729. if (f)
  28730. f(sk->data.dir_entry);
  28731. else
  28732. wolfSSL_BY_DIR_entry_free(sk->data.dir_entry);
  28733. sk->data.dir_entry = NULL;
  28734. }
  28735. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  28736. }
  28737. /* release all contents in stack, and then release stack itself */
  28738. void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk)
  28739. {
  28740. wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL);
  28741. }
  28742. /* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and
  28743. * tries to free it when the stack is free'd.
  28744. *
  28745. * return 1 on success 0 on fail
  28746. */
  28747. int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  28748. WOLFSSL_BY_DIR_entry* in)
  28749. {
  28750. WOLFSSL_STACK* node;
  28751. if (sk == NULL || in == NULL) {
  28752. return WOLFSSL_FAILURE;
  28753. }
  28754. /* no previous values in stack */
  28755. if (sk->data.dir_entry == NULL) {
  28756. sk->data.dir_entry = in;
  28757. sk->num += 1;
  28758. return WOLFSSL_SUCCESS;
  28759. }
  28760. /* stack already has value(s) create a new node and add more */
  28761. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  28762. DYNAMIC_TYPE_OPENSSL);
  28763. if (node == NULL) {
  28764. WOLFSSL_MSG("Memory error");
  28765. return WOLFSSL_FAILURE;
  28766. }
  28767. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  28768. /* push new obj onto head of stack */
  28769. node->data.dir_entry = sk->data.dir_entry;
  28770. node->next = sk->next;
  28771. node->type = sk->type;
  28772. sk->next = node;
  28773. sk->data.dir_entry = in;
  28774. sk->num += 1;
  28775. return WOLFSSL_SUCCESS;
  28776. }
  28777. #endif /* OPENSSL_ALL */
  28778. #undef ERROR_OUT
  28779. #endif /* WOLFCRYPT_ONLY */