internal.c 1.0 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287
  1. /* internal.c
  2. *
  3. * Copyright (C) 2006-2020 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. /*
  26. * WOLFSSL_SMALL_CERT_VERIFY:
  27. * Verify the certificate signature without using DecodedCert. Doubles up
  28. * on some code but allows smaller peak heap memory usage.
  29. * Cannot be used with WOLFSSL_NONBLOCK_OCSP.
  30. * WOLFSSL_ALT_CERT_CHAINS:
  31. * Allows CA's to be presented by peer, but not part of a valid chain.
  32. * Default wolfSSL behavior is to require validation of all presented peer
  33. * certificates. This also allows loading intermediate CA's as trusted
  34. * and ignoring no signer failures for CA's up the chain to root.
  35. * WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT:
  36. * Enable resending the previous DTLS handshake flight only on a network
  37. * read timeout. By default we resend in two more cases, when we receive:
  38. * - an out of order last msg of the peer's flight
  39. * - a duplicate of the first msg from the peer's flight
  40. * WOLFSSL_NO_DEF_TICKET_ENC_CB:
  41. * No default ticket encryption callback.
  42. * Server only.
  43. * Application must set its own callback to use session tickets.
  44. * WOLFSSL_TICKET_ENC_CHACHA20_POLY1305
  45. * Use ChaCha20-Poly1305 to encrypt/decrypt session tickets in default
  46. * callback. Default algorithm if none defined and algorithms compiled in.
  47. * Server only.
  48. * WOLFSSL_TICKET_ENC_AES128_GCM
  49. * Use AES128-GCM to encrypt/decrypt session tickets in default callback.
  50. * Server only. Default algorithm if ChaCha20/Poly1305 not compiled in.
  51. * WOLFSSL_TICKET_ENC_AES256_GCM
  52. * Use AES256-GCM to encrypt/decrypt session tickets in default callback.
  53. * Server only.
  54. * WOLFSSL_TICKET_DECRYPT_NO_CREATE
  55. * Default callback will not request creation of new ticket on successful
  56. * decryption.
  57. * Server only.
  58. */
  59. #ifdef EXTERNAL_OPTS_OPENVPN
  60. #error EXTERNAL_OPTS_OPENVPN should not be defined\
  61. when building wolfSSL
  62. #endif
  63. #ifndef WOLFCRYPT_ONLY
  64. #include <wolfssl/internal.h>
  65. #include <wolfssl/error-ssl.h>
  66. #include <wolfssl/wolfcrypt/asn.h>
  67. #include <wolfssl/wolfcrypt/dh.h>
  68. #ifdef NO_INLINE
  69. #include <wolfssl/wolfcrypt/misc.h>
  70. #else
  71. #define WOLFSSL_MISC_INCLUDED
  72. #include <wolfcrypt/src/misc.c>
  73. #endif
  74. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
  75. #include <wolfssl/wolfcrypt/srp.h>
  76. #endif
  77. #ifdef HAVE_LIBZ
  78. #include "zlib.h"
  79. #endif
  80. #ifdef HAVE_NTRU
  81. #include "libntruencrypt/ntru_crypto.h"
  82. #endif
  83. #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
  84. defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
  85. #ifndef NO_STDIO_FILESYSTEM
  86. #ifdef FUSION_RTOS
  87. #include <fclstdio.h>
  88. #else
  89. #include <stdio.h>
  90. #endif
  91. #endif
  92. #endif
  93. #ifdef __sun
  94. #include <sys/filio.h>
  95. #endif
  96. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  97. #ifdef _MSC_VER
  98. /* disable for while(0) cases at the .c level for now */
  99. #pragma warning(disable:4127)
  100. #endif
  101. #if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
  102. #error \
  103. WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
  104. #endif
  105. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
  106. #error Cannot use both secure-renegotiation and renegotiation-indication
  107. #endif
  108. #ifndef WOLFSSL_NO_TLS12
  109. #ifndef NO_WOLFSSL_CLIENT
  110. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32*,
  111. word32);
  112. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input, word32*,
  113. word32);
  114. #ifndef NO_CERTS
  115. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*,
  116. word32);
  117. #endif
  118. #ifdef HAVE_SESSION_TICKET
  119. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32*,
  120. word32);
  121. #endif
  122. #endif
  123. #ifndef NO_WOLFSSL_SERVER
  124. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32*, word32);
  125. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  126. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  127. static int DoCertificateVerify(WOLFSSL* ssl, byte*, word32*, word32);
  128. #endif
  129. #ifdef WOLFSSL_DTLS
  130. static int SendHelloVerifyRequest(WOLFSSL*, const byte*, byte);
  131. #endif /* WOLFSSL_DTLS */
  132. #endif /* !NO_WOLFSSL_SERVER */
  133. #endif /* !WOLFSSL_NO_TLS12 */
  134. #ifndef NO_WOLFSSL_SERVER
  135. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  136. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx,
  137. TicketEncCbCtx* keyCtx);
  138. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx);
  139. static int DefTicketEncCb(WOLFSSL* ssl,
  140. byte key_name[WOLFSSL_TICKET_NAME_SZ],
  141. byte iv[WOLFSSL_TICKET_IV_SZ],
  142. byte mac[WOLFSSL_TICKET_MAC_SZ],
  143. int enc, byte* ticket, int inLen, int* outLen,
  144. void* userCtx);
  145. #endif
  146. #endif
  147. #ifdef WOLFSSL_DTLS
  148. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl);
  149. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl);
  150. #endif
  151. enum processReply {
  152. doProcessInit = 0,
  153. #ifndef NO_WOLFSSL_SERVER
  154. runProcessOldClientHello,
  155. #endif
  156. getRecordLayerHeader,
  157. getData,
  158. verifyEncryptedMessage,
  159. decryptMessage,
  160. verifyMessage,
  161. runProcessingOneMessage
  162. };
  163. #ifndef WOLFSSL_NO_TLS12
  164. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  165. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  166. static const byte tls13Downgrade[7] = {
  167. 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
  168. };
  169. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  170. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  171. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  172. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  173. int padSz, int content, int verify, int epochOrder);
  174. #endif
  175. #endif /* !WOLFSSL_NO_TLS12 */
  176. #ifdef HAVE_QSH
  177. int QSH_Init(WOLFSSL* ssl);
  178. #endif
  179. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  180. int tsip_useable(const WOLFSSL *ssl);
  181. int tsip_generatePremasterSecret();
  182. int tsip_generateEncryptPreMasterSecret(WOLFSSL *ssl, byte *out, word32 *outSz);
  183. #endif
  184. int IsTLS(const WOLFSSL* ssl)
  185. {
  186. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  187. return 1;
  188. return 0;
  189. }
  190. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  191. {
  192. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  193. return 1;
  194. #ifdef WOLFSSL_DTLS
  195. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  196. return 1;
  197. #endif
  198. return 0;
  199. }
  200. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  201. {
  202. return (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  203. }
  204. static WC_INLINE int IsEncryptionOn(WOLFSSL* ssl, int isSend)
  205. {
  206. #ifdef WOLFSSL_DTLS
  207. /* For DTLS, epoch 0 is always not encrypted. */
  208. if (ssl->options.dtls && !isSend && ssl->keys.curEpoch == 0)
  209. return 0;
  210. #endif /* WOLFSSL_DTLS */
  211. return ssl->keys.encryptionOn &&
  212. (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
  213. }
  214. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  215. /* If SCTP is not enabled returns the state of the dtls option.
  216. * If SCTP is enabled returns dtls && !sctp. */
  217. static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl)
  218. {
  219. #ifdef WOLFSSL_SCTP
  220. return ssl->options.dtls && !ssl->options.dtlsSctp;
  221. #else
  222. return ssl->options.dtls;
  223. #endif
  224. }
  225. #endif /* DTLS || !WOLFSSL_NO_TLS12 */
  226. #ifdef HAVE_QSH
  227. /* free all structs that where used with QSH */
  228. static int QSH_FreeAll(WOLFSSL* ssl)
  229. {
  230. QSHKey* key = ssl->QSH_Key;
  231. QSHKey* preKey = NULL;
  232. QSHSecret* secret = ssl->QSH_secret;
  233. QSHScheme* list = NULL;
  234. QSHScheme* preList = NULL;
  235. /* free elements in struct */
  236. while (key) {
  237. preKey = key;
  238. if (key->pri.buffer) {
  239. ForceZero(key->pri.buffer, key->pri.length);
  240. XFREE(key->pri.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  241. }
  242. if (key->pub.buffer)
  243. XFREE(key->pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  244. key = (QSHKey*)key->next;
  245. /* free struct */
  246. XFREE(preKey, ssl->heap, DYNAMIC_TYPE_QSH);
  247. }
  248. /* free all of peers QSH keys */
  249. key = ssl->peerQSHKey;
  250. while (key) {
  251. preKey = key;
  252. if (key->pri.buffer) {
  253. ForceZero(key->pri.buffer, key->pri.length);
  254. XFREE(key->pri.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  255. }
  256. if (key->pub.buffer)
  257. XFREE(key->pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  258. key = (QSHKey*)key->next;
  259. /* free struct */
  260. XFREE(preKey, ssl->heap, DYNAMIC_TYPE_QSH);
  261. }
  262. key = NULL;
  263. /* free secret information */
  264. if (secret) {
  265. /* free up the QSHScheme list in QSHSecret */
  266. if (secret->list)
  267. list = secret->list;
  268. while (list) {
  269. preList = list;
  270. if (list->PK)
  271. XFREE(list->PK, ssl->heap, DYNAMIC_TYPE_SECRET);
  272. list = (QSHScheme*)list->next;
  273. XFREE(preList, ssl->heap, DYNAMIC_TYPE_QSH);
  274. }
  275. /* free secret buffers */
  276. if (secret->SerSi) {
  277. if (secret->SerSi->buffer) {
  278. /* clear extra secret material that supplemented Master Secret*/
  279. ForceZero(secret->SerSi->buffer, secret->SerSi->length);
  280. XFREE(secret->SerSi->buffer, ssl->heap, DYNAMIC_TYPE_SECRET);
  281. }
  282. XFREE(secret->SerSi, ssl->heap, DYNAMIC_TYPE_SECRET);
  283. }
  284. if (secret->CliSi) {
  285. if (secret->CliSi->buffer) {
  286. /* clear extra secret material that supplemented Master Secret*/
  287. ForceZero(secret->CliSi->buffer, secret->CliSi->length);
  288. XFREE(secret->CliSi->buffer, ssl->heap, DYNAMIC_TYPE_SECRET);
  289. }
  290. XFREE(secret->CliSi, ssl->heap, DYNAMIC_TYPE_SECRET);
  291. }
  292. }
  293. XFREE(secret, ssl->heap, DYNAMIC_TYPE_QSH);
  294. secret = NULL;
  295. return 0;
  296. }
  297. #endif
  298. #ifdef HAVE_NTRU
  299. static WOLFSSL_GLOBAL WC_RNG* rng;
  300. static WOLFSSL_GLOBAL wolfSSL_Mutex* rngMutex;
  301. static word32 GetEntropy(unsigned char* out, word32 num_bytes)
  302. {
  303. int ret = 0;
  304. if (rng == NULL) {
  305. if ((rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), 0,
  306. DYNAMIC_TYPE_RNG)) == NULL)
  307. return DRBG_OUT_OF_MEMORY;
  308. wc_InitRng(rng);
  309. }
  310. if (rngMutex == NULL) {
  311. if ((rngMutex = (wolfSSL_Mutex*)XMALLOC(sizeof(wolfSSL_Mutex), 0,
  312. DYNAMIC_TYPE_MUTEX)) == NULL)
  313. return DRBG_OUT_OF_MEMORY;
  314. wc_InitMutex(rngMutex);
  315. }
  316. ret |= wc_LockMutex(rngMutex);
  317. ret |= wc_RNG_GenerateBlock(rng, out, num_bytes);
  318. ret |= wc_UnLockMutex(rngMutex);
  319. if (ret != 0)
  320. return DRBG_ENTROPY_FAIL;
  321. return DRBG_OK;
  322. }
  323. #endif /* HAVE_NTRU */
  324. #ifdef HAVE_LIBZ
  325. /* alloc user allocs to work with zlib */
  326. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  327. {
  328. (void)opaque;
  329. return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  330. }
  331. static void myFree(void* opaque, void* memory)
  332. {
  333. (void)opaque;
  334. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  335. }
  336. /* init zlib comp/decomp streams, 0 on success */
  337. static int InitStreams(WOLFSSL* ssl)
  338. {
  339. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  340. ssl->c_stream.zfree = (free_func)myFree;
  341. ssl->c_stream.opaque = (voidpf)ssl->heap;
  342. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  343. return ZLIB_INIT_ERROR;
  344. ssl->didStreamInit = 1;
  345. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  346. ssl->d_stream.zfree = (free_func)myFree;
  347. ssl->d_stream.opaque = (voidpf)ssl->heap;
  348. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  349. return 0;
  350. }
  351. static void FreeStreams(WOLFSSL* ssl)
  352. {
  353. if (ssl->didStreamInit) {
  354. deflateEnd(&ssl->c_stream);
  355. inflateEnd(&ssl->d_stream);
  356. }
  357. }
  358. /* compress in to out, return out size or error */
  359. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  360. {
  361. int err;
  362. int currTotal = (int)ssl->c_stream.total_out;
  363. ssl->c_stream.next_in = in;
  364. ssl->c_stream.avail_in = inSz;
  365. ssl->c_stream.next_out = out;
  366. ssl->c_stream.avail_out = outSz;
  367. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  368. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  369. return (int)ssl->c_stream.total_out - currTotal;
  370. }
  371. /* decompress in to out, return out size or error */
  372. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  373. {
  374. int err;
  375. int currTotal = (int)ssl->d_stream.total_out;
  376. ssl->d_stream.next_in = in;
  377. ssl->d_stream.avail_in = inSz;
  378. ssl->d_stream.next_out = out;
  379. ssl->d_stream.avail_out = outSz;
  380. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  381. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  382. return (int)ssl->d_stream.total_out - currTotal;
  383. }
  384. #endif /* HAVE_LIBZ */
  385. #ifdef WOLFSSL_SESSION_EXPORT
  386. #ifdef WOLFSSL_DTLS
  387. /* serializes the cipher specs struct for exporting */
  388. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  389. {
  390. word32 idx = 0;
  391. CipherSpecs* specs;
  392. WOLFSSL_ENTER("ExportCipherSpecState");
  393. if (exp == NULL || ssl == NULL) {
  394. return BAD_FUNC_ARG;
  395. }
  396. specs= &(ssl->specs);
  397. if (DTLS_EXPORT_SPC_SZ > len) {
  398. return BUFFER_E;
  399. }
  400. XMEMSET(exp, 0, DTLS_EXPORT_SPC_SZ);
  401. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  402. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  403. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  404. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  405. exp[idx++] = specs->bulk_cipher_algorithm;
  406. exp[idx++] = specs->cipher_type;
  407. exp[idx++] = specs->mac_algorithm;
  408. exp[idx++] = specs->kea;
  409. exp[idx++] = specs->sig_algo;
  410. exp[idx++] = specs->hash_size;
  411. exp[idx++] = specs->pad_size;
  412. exp[idx++] = specs->static_ecdh;
  413. if (idx != DTLS_EXPORT_SPC_SZ) {
  414. WOLFSSL_MSG("DTLS_EXPORT_SPC_SZ needs updated and export version");
  415. return DTLS_EXPORT_VER_E;
  416. }
  417. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  418. (void)ver;
  419. return idx;
  420. }
  421. /* serializes the key struct for exporting */
  422. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  423. byte small)
  424. {
  425. word32 idx = 0;
  426. byte sz;
  427. Keys* keys;
  428. WOLFSSL_ENTER("ExportKeyState");
  429. if (exp == NULL || ssl == NULL) {
  430. return BAD_FUNC_ARG;
  431. }
  432. keys = &(ssl->keys);
  433. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  434. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  435. return BUFFER_E;
  436. }
  437. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  438. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  439. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  440. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  441. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  442. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  443. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  444. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  445. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  446. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  447. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  448. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  449. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  450. c16toa(keys->dtls_peer_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  451. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  452. idx += OPAQUE16_LEN;
  453. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  454. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  455. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  456. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  457. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  458. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  459. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  460. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  461. exp[idx++] = keys->encryptionOn;
  462. exp[idx++] = keys->decryptedCur;
  463. /* from here on the buffer needs checked because is variable length that
  464. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  465. {
  466. word32 i;
  467. if ((OPAQUE16_LEN * 2) + idx +
  468. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  469. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  470. return BUFFER_E;
  471. }
  472. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  473. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  474. c32toa(keys->peerSeq[0].window[i], exp + idx);
  475. idx += OPAQUE32_LEN;
  476. }
  477. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  478. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  479. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  480. idx += OPAQUE32_LEN;
  481. }
  482. }
  483. if (idx >= len) {
  484. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  485. return BUFFER_E;
  486. }
  487. #ifdef HAVE_TRUNCATED_HMAC
  488. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  489. exp[idx++] = ssl->truncated_hmac;
  490. #else
  491. sz = ssl->specs.hash_size;
  492. exp[idx++] = 0; /* no truncated hmac */
  493. #endif
  494. sz = (small)? 0: sz;
  495. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  496. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  497. return BUFFER_E;
  498. }
  499. exp[idx++] = sz;
  500. if (sz > 0) {
  501. #ifndef WOLFSSL_AEAD_ONLY
  502. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  503. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  504. #else
  505. XMEMSET(exp + idx, 0, sz); idx += sz;
  506. XMEMSET(exp + idx, 0, sz); idx += sz;
  507. #endif
  508. }
  509. sz = (small)? 0: ssl->specs.key_size;
  510. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  511. WOLFSSL_MSG("Buffer not large enough for write key");
  512. return BUFFER_E;
  513. }
  514. exp[idx++] = sz;
  515. if (sz > 0) {
  516. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  517. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  518. }
  519. sz = (small)? 0: ssl->specs.iv_size;
  520. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  521. WOLFSSL_MSG("Buffer not large enough for IVs");
  522. return BUFFER_E;
  523. }
  524. exp[idx++] = sz;
  525. if (sz > 0) {
  526. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  527. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  528. }
  529. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  530. idx += AEAD_MAX_EXP_SZ;
  531. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  532. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  533. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  534. return BUFFER_E;
  535. }
  536. exp[idx++] = sz;
  537. if (sz > 0) {
  538. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  539. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  540. }
  541. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  542. if (idx > DTLS_EXPORT_KEY_SZ) {
  543. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  544. return DTLS_EXPORT_VER_E;
  545. }
  546. WOLFSSL_LEAVE("ExportKeyState", idx);
  547. (void)ver;
  548. return idx;
  549. }
  550. static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver)
  551. {
  552. word32 idx = 0;
  553. CipherSpecs* specs;
  554. WOLFSSL_ENTER("ImportCipherSpecState");
  555. if (exp == NULL || ssl == NULL) {
  556. return BAD_FUNC_ARG;
  557. }
  558. specs= &(ssl->specs);
  559. if (DTLS_EXPORT_SPC_SZ > len) {
  560. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  561. return BUFFER_E;
  562. }
  563. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  564. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  565. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  566. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  567. specs->bulk_cipher_algorithm = exp[idx++];
  568. specs->cipher_type = exp[idx++];
  569. specs->mac_algorithm = exp[idx++];
  570. specs->kea = exp[idx++];
  571. specs->sig_algo = exp[idx++];
  572. specs->hash_size = exp[idx++];
  573. specs->pad_size = exp[idx++];
  574. specs->static_ecdh = exp[idx++];
  575. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  576. (void)ver;
  577. return idx;
  578. }
  579. static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver)
  580. {
  581. word32 idx = 0;
  582. byte sz;
  583. Keys* keys;
  584. WOLFSSL_ENTER("ImportKeyState");
  585. if (exp == NULL || ssl == NULL) {
  586. return BAD_FUNC_ARG;
  587. }
  588. keys = &(ssl->keys);
  589. /* check minimum length -- includes byte used for size indicators */
  590. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  591. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  592. return BUFFER_E;
  593. }
  594. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  595. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  596. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  597. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  598. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  599. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  600. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  601. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  602. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  603. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  604. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  605. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  606. ato16(exp + idx, &keys->dtls_peer_handshake_number); idx += OPAQUE16_LEN;
  607. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  608. idx += OPAQUE16_LEN;
  609. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  610. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  611. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi); idx += OPAQUE16_LEN;
  612. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo); idx += OPAQUE32_LEN;
  613. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  614. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  615. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  616. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  617. keys->encryptionOn = exp[idx++];
  618. keys->decryptedCur = exp[idx++];
  619. {
  620. word16 i, wordCount, wordAdj = 0;
  621. /* do window */
  622. ato16(exp + idx, &wordCount);
  623. idx += OPAQUE16_LEN;
  624. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  625. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  626. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  627. }
  628. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  629. for (i = 0; i < wordCount; i++) {
  630. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  631. idx += OPAQUE32_LEN;
  632. }
  633. idx += wordAdj;
  634. /* do prevWindow */
  635. ato16(exp + idx, &wordCount);
  636. idx += OPAQUE16_LEN;
  637. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  638. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  639. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  640. }
  641. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  642. for (i = 0; i < wordCount; i++) {
  643. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  644. idx += OPAQUE32_LEN;
  645. }
  646. idx += wordAdj;
  647. }
  648. #ifdef HAVE_TRUNCATED_HMAC
  649. ssl->truncated_hmac = exp[idx++];
  650. #else
  651. idx++; /* no truncated hmac */
  652. #endif
  653. sz = exp[idx++];
  654. #ifndef WOLFSSL_AEAD_ONLY
  655. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  656. WOLFSSL_MSG("Buffer not large enough for MAC import");
  657. return BUFFER_E;
  658. }
  659. if (sz > 0) {
  660. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  661. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  662. }
  663. #else
  664. if (sz + idx > len) {
  665. return BUFFER_E;
  666. }
  667. idx += sz; idx += sz;
  668. #endif
  669. sz = exp[idx++];
  670. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  671. WOLFSSL_MSG("Buffer not large enough for key import");
  672. return BUFFER_E;
  673. }
  674. if (sz > 0) {
  675. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  676. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  677. }
  678. sz = exp[idx++];
  679. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  680. WOLFSSL_MSG("Buffer not large enough for write IV import");
  681. return BUFFER_E;
  682. }
  683. if (sz > 0) {
  684. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  685. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  686. }
  687. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  688. idx += AEAD_MAX_EXP_SZ;
  689. sz = exp[idx++];
  690. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  691. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  692. return BUFFER_E;
  693. }
  694. if (sz > 0) {
  695. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  696. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  697. }
  698. WOLFSSL_LEAVE("ImportKeyState", idx);
  699. (void)ver;
  700. return idx;
  701. }
  702. /* copy over necessary information from Options struct to buffer
  703. * On success returns size of buffer used on failure returns a negative value */
  704. static int dtls_export_new(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  705. {
  706. int idx = 0;
  707. word16 zero = 0;
  708. Options* options = &ssl->options;
  709. WOLFSSL_ENTER("dtls_export_new");
  710. if (exp == NULL || options == NULL || len < DTLS_EXPORT_OPT_SZ) {
  711. return BAD_FUNC_ARG;
  712. }
  713. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  714. /* these options are kept and sent to indicate verify status and strength
  715. * of handshake */
  716. exp[idx++] = options->sendVerify;
  717. exp[idx++] = options->verifyPeer;
  718. exp[idx++] = options->verifyNone;
  719. exp[idx++] = options->downgrade;
  720. #ifndef NO_DH
  721. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  722. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  723. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  724. #else
  725. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  726. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  727. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  728. #endif
  729. #ifndef NO_RSA
  730. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  731. #else
  732. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  733. #endif
  734. #ifdef HAVE_ECC
  735. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  736. #else
  737. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  738. #endif
  739. /* these options are kept to indicate state and behavior */
  740. #ifndef NO_PSK
  741. exp[idx++] = options->havePSK;
  742. #else
  743. exp[idx++] = 0;
  744. #endif
  745. exp[idx++] = options->sessionCacheOff;
  746. exp[idx++] = options->sessionCacheFlushOff;
  747. exp[idx++] = options->side;
  748. exp[idx++] = options->resuming;
  749. exp[idx++] = options->haveSessionId;
  750. exp[idx++] = options->tls;
  751. exp[idx++] = options->tls1_1;
  752. exp[idx++] = options->dtls;
  753. exp[idx++] = options->connReset;
  754. exp[idx++] = options->isClosed;
  755. exp[idx++] = options->closeNotify;
  756. exp[idx++] = options->sentNotify;
  757. exp[idx++] = options->usingCompression;
  758. exp[idx++] = options->haveRSA;
  759. exp[idx++] = options->haveECC;
  760. exp[idx++] = options->haveDH;
  761. exp[idx++] = options->haveNTRU;
  762. exp[idx++] = options->haveQSH;
  763. exp[idx++] = options->haveECDSAsig;
  764. exp[idx++] = options->haveStaticECC;
  765. exp[idx++] = options->havePeerVerify;
  766. exp[idx++] = options->usingPSK_cipher;
  767. exp[idx++] = options->usingAnon_cipher;
  768. exp[idx++] = options->sendAlertState;
  769. exp[idx++] = options->partialWrite;
  770. exp[idx++] = options->quietShutdown;
  771. exp[idx++] = options->groupMessages;
  772. #ifdef HAVE_POLY1305
  773. exp[idx++] = options->oldPoly;
  774. #else
  775. exp[idx++] = 0;
  776. #endif
  777. #ifdef HAVE_ANON
  778. exp[idx++] = options->haveAnon;
  779. #else
  780. exp[idx++] = 0;
  781. #endif
  782. #ifdef HAVE_SESSION_TICKET
  783. exp[idx++] = options->createTicket;
  784. exp[idx++] = options->useTicket;
  785. exp[idx++] = options->noTicketTls12;
  786. #ifdef WOLFSSL_TLS13
  787. if (ver > DTLS_EXPORT_VERSION_3) {
  788. exp[idx++] = options->noTicketTls13;
  789. }
  790. #else
  791. if (ver > DTLS_EXPORT_VERSION_3) {
  792. exp[idx++] = 0;
  793. }
  794. #endif
  795. #else
  796. exp[idx++] = 0;
  797. exp[idx++] = 0;
  798. if (ver > DTLS_EXPORT_VERSION_3) {
  799. exp[idx++] = 0;
  800. }
  801. #endif
  802. exp[idx++] = options->processReply;
  803. exp[idx++] = options->cipherSuite0;
  804. exp[idx++] = options->cipherSuite;
  805. exp[idx++] = options->serverState;
  806. exp[idx++] = options->clientState;
  807. exp[idx++] = options->handShakeState;
  808. exp[idx++] = options->handShakeDone;
  809. exp[idx++] = options->minDowngrade;
  810. exp[idx++] = options->connectState;
  811. exp[idx++] = options->acceptState;
  812. exp[idx++] = options->asyncState;
  813. /* version of connection */
  814. exp[idx++] = ssl->version.major;
  815. exp[idx++] = ssl->version.minor;
  816. (void)zero;
  817. /* check if changes were made and notify of need to update export version */
  818. switch (ver) {
  819. case DTLS_EXPORT_VERSION_3:
  820. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  821. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  822. return DTLS_EXPORT_VER_E;
  823. }
  824. break;
  825. case DTLS_EXPORT_VERSION:
  826. if (idx != DTLS_EXPORT_OPT_SZ) {
  827. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  828. return DTLS_EXPORT_VER_E;
  829. }
  830. break;
  831. default:
  832. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  833. return DTLS_EXPORT_VER_E;
  834. }
  835. WOLFSSL_LEAVE("dtls_export_new", idx);
  836. return idx;
  837. }
  838. /* copy items from Export struct to Options struct
  839. * On success returns size of buffer used on failure returns a negative value */
  840. static int dtls_export_load(WOLFSSL* ssl, const byte* exp, word32 len, byte ver)
  841. {
  842. int idx = 0;
  843. Options* options = &ssl->options;
  844. switch (ver) {
  845. case DTLS_EXPORT_VERSION:
  846. if (len < DTLS_EXPORT_OPT_SZ) {
  847. WOLFSSL_MSG("Sanity check on buffer size failed");
  848. return BAD_FUNC_ARG;
  849. }
  850. break;
  851. case DTLS_EXPORT_VERSION_3:
  852. if (len < DTLS_EXPORT_OPT_SZ_3) {
  853. WOLFSSL_MSG("Sanity check on buffer size failed");
  854. return BAD_FUNC_ARG;
  855. }
  856. break;
  857. default:
  858. WOLFSSL_MSG("Export version not supported");
  859. return BAD_FUNC_ARG;
  860. }
  861. if (exp == NULL || options == NULL) {
  862. return BAD_FUNC_ARG;
  863. }
  864. /* these options are kept and sent to indicate verify status and strength
  865. * of handshake */
  866. options->sendVerify = exp[idx++];
  867. options->verifyPeer = exp[idx++];
  868. options->verifyNone = exp[idx++];
  869. options->downgrade = exp[idx++];
  870. #ifndef NO_DH
  871. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  872. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  873. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  874. #else
  875. idx += OPAQUE16_LEN;
  876. idx += OPAQUE16_LEN;
  877. idx += OPAQUE16_LEN;
  878. #endif
  879. #ifndef NO_RSA
  880. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  881. #else
  882. idx += OPAQUE16_LEN;
  883. #endif
  884. #ifdef HAVE_ECC
  885. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  886. #else
  887. idx += OPAQUE16_LEN;
  888. #endif
  889. /* these options are kept to indicate state and behavior */
  890. #ifndef NO_PSK
  891. options->havePSK = exp[idx++];
  892. #else
  893. idx++;
  894. #endif
  895. options->sessionCacheOff = exp[idx++];
  896. options->sessionCacheFlushOff = exp[idx++];
  897. options->side = exp[idx++];
  898. options->resuming = exp[idx++];
  899. options->haveSessionId = exp[idx++];
  900. options->tls = exp[idx++];
  901. options->tls1_1 = exp[idx++];
  902. options->dtls = exp[idx++];
  903. options->connReset = exp[idx++];
  904. options->isClosed = exp[idx++];
  905. options->closeNotify = exp[idx++];
  906. options->sentNotify = exp[idx++];
  907. options->usingCompression = exp[idx++];
  908. options->haveRSA = exp[idx++];
  909. options->haveECC = exp[idx++];
  910. options->haveDH = exp[idx++];
  911. options->haveNTRU = exp[idx++];
  912. options->haveQSH = exp[idx++];
  913. options->haveECDSAsig = exp[idx++];
  914. options->haveStaticECC = exp[idx++];
  915. options->havePeerVerify = exp[idx++];
  916. options->usingPSK_cipher = exp[idx++];
  917. options->usingAnon_cipher = exp[idx++];
  918. options->sendAlertState = exp[idx++];
  919. options->partialWrite = exp[idx++];
  920. options->quietShutdown = exp[idx++];
  921. options->groupMessages = exp[idx++];
  922. #ifdef HAVE_POLY1305
  923. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  924. #else
  925. idx++;
  926. #endif
  927. #ifdef HAVE_ANON
  928. options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */
  929. #else
  930. idx++;
  931. #endif
  932. #ifdef HAVE_SESSION_TICKET
  933. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  934. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  935. options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
  936. #ifdef WOLFSSL_TLS13
  937. if (ver > DTLS_EXPORT_VERSION_3) {
  938. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  939. }
  940. #else
  941. if (ver > DTLS_EXPORT_VERSION_3) {
  942. exp[idx++] = 0;
  943. }
  944. #endif
  945. #else
  946. idx++;
  947. idx++;
  948. if (ver > DTLS_EXPORT_VERSION_3) {
  949. idx++;
  950. }
  951. #endif
  952. options->processReply = exp[idx++];
  953. options->cipherSuite0 = exp[idx++];
  954. options->cipherSuite = exp[idx++];
  955. options->serverState = exp[idx++];
  956. options->clientState = exp[idx++];
  957. options->handShakeState = exp[idx++];
  958. options->handShakeDone = exp[idx++];
  959. options->minDowngrade = exp[idx++];
  960. options->connectState = exp[idx++];
  961. options->acceptState = exp[idx++];
  962. options->asyncState = exp[idx++];
  963. /* version of connection */
  964. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  965. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  966. return VERSION_ERROR;
  967. }
  968. return idx;
  969. }
  970. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  971. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  972. {
  973. int idx = 0;
  974. int ipSz = DTLS_EXPORT_IP; /* start as max size */
  975. int fam = 0;
  976. word16 port = 0;
  977. char ip[DTLS_EXPORT_IP];
  978. if (ver != DTLS_EXPORT_VERSION) {
  979. WOLFSSL_MSG("Export version not supported");
  980. return BAD_FUNC_ARG;
  981. }
  982. if (ssl == NULL || exp == NULL || len < sizeof(ip) + 3 * DTLS_EXPORT_LEN) {
  983. return BAD_FUNC_ARG;
  984. }
  985. if (ssl->ctx->CBGetPeer == NULL) {
  986. WOLFSSL_MSG("No get peer call back set");
  987. return BAD_FUNC_ARG;
  988. }
  989. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  990. WOLFSSL_MSG("Get peer callback error");
  991. return SOCKET_ERROR_E;
  992. }
  993. /* check that ipSz/fam is not negative or too large since user can set cb */
  994. if (ipSz < 0 || ipSz > DTLS_EXPORT_IP || fam < 0) {
  995. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  996. return SOCKET_ERROR_E;
  997. }
  998. c16toa((word16)fam, exp + idx); idx += DTLS_EXPORT_LEN;
  999. c16toa((word16)ipSz, exp + idx); idx += DTLS_EXPORT_LEN;
  1000. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  1001. c16toa(port, exp + idx); idx += DTLS_EXPORT_LEN;
  1002. return idx;
  1003. }
  1004. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  1005. static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
  1006. {
  1007. word16 idx = 0;
  1008. word16 ipSz;
  1009. word16 fam;
  1010. word16 port;
  1011. char ip[DTLS_EXPORT_IP];
  1012. if (ver != DTLS_EXPORT_VERSION && ver != DTLS_EXPORT_VERSION_3) {
  1013. WOLFSSL_MSG("Export version not supported");
  1014. return BAD_FUNC_ARG;
  1015. }
  1016. if (len == 0) {
  1017. WOLFSSL_MSG("No peer info sent");
  1018. return 0;
  1019. }
  1020. if (ssl == NULL || buf == NULL || len < 3 * DTLS_EXPORT_LEN) {
  1021. return BAD_FUNC_ARG;
  1022. }
  1023. /* import sin family */
  1024. ato16(buf + idx, &fam); idx += DTLS_EXPORT_LEN;
  1025. /* import ip address idx, and ipSz are unsigned but cast for enum */
  1026. ato16(buf + idx, &ipSz); idx += DTLS_EXPORT_LEN;
  1027. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + DTLS_EXPORT_LEN) > len) {
  1028. return BUFFER_E;
  1029. }
  1030. XMEMSET(ip, 0, sizeof(ip));
  1031. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  1032. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  1033. ato16(buf + idx, &port); idx += DTLS_EXPORT_LEN;
  1034. /* sanity check for a function to call, then use it to import peer info */
  1035. if (ssl->ctx->CBSetPeer == NULL) {
  1036. WOLFSSL_MSG("No set peer function");
  1037. return BAD_FUNC_ARG;
  1038. }
  1039. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  1040. WOLFSSL_MSG("Error setting peer info");
  1041. return SOCKET_ERROR_E;
  1042. }
  1043. return idx;
  1044. }
  1045. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1046. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1047. * passed in.
  1048. * On success returns the size of serialized session state.*/
  1049. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1050. {
  1051. int ret;
  1052. word32 idx = 0;
  1053. word32 totalLen = 0;
  1054. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1055. if (buf == NULL || ssl == NULL) {
  1056. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1057. return BAD_FUNC_ARG;
  1058. }
  1059. totalLen += DTLS_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1060. /* each of the following have a 2 byte length before data */
  1061. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1062. if (totalLen > sz) {
  1063. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1064. return BUFFER_E;
  1065. }
  1066. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1067. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1068. ((byte)DTLS_EXPORT_VERSION & 0X0F);
  1069. idx += DTLS_EXPORT_LEN; /* leave room for total length */
  1070. /* export keys struct and dtls state -- variable length stored in ret */
  1071. idx += DTLS_EXPORT_LEN; /* leave room for length */
  1072. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1073. DTLS_EXPORT_VERSION, 1)) < 0) {
  1074. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1075. return ret;
  1076. }
  1077. c16toa((word16)ret, buf + idx - DTLS_EXPORT_LEN); idx += ret;
  1078. /* place total length of exported buffer minus 2 bytes protocol/version */
  1079. c16toa((word16)(idx - DTLS_EXPORT_LEN), buf + DTLS_EXPORT_LEN);
  1080. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1081. /* if compiled with debug options then print the version, protocol, size */
  1082. {
  1083. char debug[256];
  1084. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1085. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1086. , (int)DTLS_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1087. WOLFSSL_MSG(debug);
  1088. }
  1089. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1090. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1091. return idx;
  1092. }
  1093. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session
  1094. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1095. * passed in.
  1096. * On success returns the size of serialized session.*/
  1097. int wolfSSL_dtls_export_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1098. {
  1099. int ret;
  1100. word32 idx = 0;
  1101. word32 totalLen = 0;
  1102. WOLFSSL_ENTER("wolfSSL_dtls_export_internal");
  1103. if (buf == NULL || ssl == NULL) {
  1104. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", BAD_FUNC_ARG);
  1105. return BAD_FUNC_ARG;
  1106. }
  1107. totalLen += DTLS_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1108. /* each of the following have a 2 byte length before data */
  1109. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1110. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1111. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_SPC_SZ;
  1112. totalLen += DTLS_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1113. if (totalLen > sz) {
  1114. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", BUFFER_E);
  1115. return BUFFER_E;
  1116. }
  1117. buf[idx++] = (byte)DTLS_EXPORT_PRO;
  1118. buf[idx++] = ((byte)DTLS_EXPORT_PRO & 0xF0) |
  1119. ((byte)DTLS_EXPORT_VERSION & 0X0F);
  1120. idx += DTLS_EXPORT_LEN; /* leave spot for length */
  1121. c16toa((word16)DTLS_EXPORT_OPT_SZ, buf + idx); idx += DTLS_EXPORT_LEN;
  1122. if ((ret = dtls_export_new(ssl, buf + idx, sz - idx,
  1123. DTLS_EXPORT_VERSION)) < 0) {
  1124. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1125. return ret;
  1126. }
  1127. idx += ret;
  1128. /* export keys struct and dtls state -- variable length stored in ret */
  1129. idx += DTLS_EXPORT_LEN; /* leave room for length */
  1130. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1131. DTLS_EXPORT_VERSION, 0)) < 0) {
  1132. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1133. return ret;
  1134. }
  1135. c16toa((word16)ret, buf + idx - DTLS_EXPORT_LEN); idx += ret;
  1136. /* export of cipher specs struct */
  1137. c16toa((word16)DTLS_EXPORT_SPC_SZ, buf + idx); idx += DTLS_EXPORT_LEN;
  1138. if ((ret = ExportCipherSpecState(ssl, buf + idx, sz - idx,
  1139. DTLS_EXPORT_VERSION)) < 0) {
  1140. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1141. return ret;
  1142. }
  1143. idx += ret;
  1144. /* export of dtls peer information */
  1145. idx += DTLS_EXPORT_LEN;
  1146. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1147. ret = 0; /* not saving peer port/ip information */
  1148. #else
  1149. if ((ret = ExportPeerInfo(ssl, buf + idx, sz - idx,
  1150. DTLS_EXPORT_VERSION)) < 0) {
  1151. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1152. return ret;
  1153. }
  1154. #endif
  1155. c16toa(ret, buf + idx - DTLS_EXPORT_LEN);
  1156. idx += ret;
  1157. /* place total length of exported buffer minus 2 bytes protocol/version */
  1158. c16toa((word16)(idx - DTLS_EXPORT_LEN), buf + DTLS_EXPORT_LEN);
  1159. /* if compiled with debug options then print the version, protocol, size */
  1160. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1161. {
  1162. char debug[256];
  1163. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session\n"
  1164. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1165. , (int)DTLS_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1166. WOLFSSL_MSG(debug);
  1167. }
  1168. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1169. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", idx);
  1170. return idx;
  1171. }
  1172. /* On success return amount of buffer consumed */
  1173. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1174. {
  1175. word32 idx = 0;
  1176. word16 length = 0;
  1177. int version;
  1178. int ret;
  1179. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1180. /* check at least enough room for protocol and length */
  1181. if (sz < DTLS_EXPORT_LEN * 2 || ssl == NULL) {
  1182. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1183. return BAD_FUNC_ARG;
  1184. }
  1185. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1186. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1187. WOLFSSL_MSG("Incorrect protocol");
  1188. return BAD_FUNC_ARG;
  1189. }
  1190. version = buf[idx++] & 0x0F;
  1191. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1192. if (length > sz - DTLS_EXPORT_LEN) { /* subtract 2 for protocol */
  1193. WOLFSSL_MSG("Buffer size sanity check failed");
  1194. return BUFFER_E;
  1195. }
  1196. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1197. /* if compiled with debug options then print the version, protocol, size */
  1198. {
  1199. char debug[256];
  1200. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1201. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1202. , (int)version, buf[0], (buf[1] >> 4), length);
  1203. WOLFSSL_MSG(debug);
  1204. }
  1205. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1206. /* perform sanity checks and extract Options information used */
  1207. switch (version) {
  1208. case DTLS_EXPORT_VERSION:
  1209. break;
  1210. default:
  1211. WOLFSSL_MSG("Bad export state version");
  1212. return BAD_FUNC_ARG;
  1213. }
  1214. /* perform sanity checks and extract Keys struct */
  1215. if (DTLS_EXPORT_LEN + idx > sz) {
  1216. WOLFSSL_MSG("Import Key struct error");
  1217. return BUFFER_E;
  1218. }
  1219. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1220. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1221. WOLFSSL_MSG("Import Key struct error");
  1222. return BUFFER_E;
  1223. }
  1224. if ((ret = ImportKeyState(ssl, buf + idx, length, version)) < 0) {
  1225. WOLFSSL_MSG("Import Key struct error");
  1226. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1227. return ret;
  1228. }
  1229. idx += ret;
  1230. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1231. return idx;
  1232. }
  1233. /* On success return amount of buffer consumed */
  1234. int wolfSSL_dtls_import_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1235. {
  1236. word32 idx = 0;
  1237. word16 length = 0;
  1238. int version;
  1239. int ret;
  1240. int optSz;
  1241. WOLFSSL_ENTER("wolfSSL_dtls_import_internal");
  1242. /* check at least enough room for protocol and length */
  1243. if (sz < DTLS_EXPORT_LEN * 2 || ssl == NULL) {
  1244. return BAD_FUNC_ARG;
  1245. }
  1246. /* sanity check on protocol ID and size of buffer */
  1247. if (buf[idx++] != (byte)DTLS_EXPORT_PRO ||
  1248. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1249. /* don't increment on second idx to next get version */
  1250. /* check if importing state only */
  1251. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1252. }
  1253. version = buf[idx++] & 0x0F;
  1254. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1255. if (length > sz - DTLS_EXPORT_LEN) { /* subtract 2 for protocol */
  1256. return BUFFER_E;
  1257. }
  1258. /* if compiled with debug options then print the version, protocol, size */
  1259. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1260. {
  1261. char debug[256];
  1262. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1263. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1264. , (int)version, buf[0], (buf[1] >> 4), length);
  1265. WOLFSSL_MSG(debug);
  1266. }
  1267. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1268. /* perform sanity checks and extract Options information used */
  1269. switch (version) {
  1270. case DTLS_EXPORT_VERSION:
  1271. optSz = DTLS_EXPORT_OPT_SZ;
  1272. break;
  1273. case DTLS_EXPORT_VERSION_3:
  1274. WOLFSSL_MSG("Importing older version 3");
  1275. optSz = DTLS_EXPORT_OPT_SZ_3;
  1276. break;
  1277. default:
  1278. WOLFSSL_MSG("Bad export version");
  1279. return BAD_FUNC_ARG;
  1280. }
  1281. if (DTLS_EXPORT_LEN + optSz + idx > sz) {
  1282. WOLFSSL_MSG("Import Options struct error");
  1283. return BUFFER_E;
  1284. }
  1285. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1286. if (length != optSz) {
  1287. WOLFSSL_MSG("Import Options struct error");
  1288. return BUFFER_E;
  1289. }
  1290. if ((ret = dtls_export_load(ssl, buf + idx, length, version)) < 0) {
  1291. WOLFSSL_MSG("Import Options struct error");
  1292. return ret;
  1293. }
  1294. idx += length;
  1295. /* perform sanity checks and extract Keys struct */
  1296. if (DTLS_EXPORT_LEN + idx > sz) {
  1297. WOLFSSL_MSG("Import Key struct error");
  1298. return BUFFER_E;
  1299. }
  1300. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1301. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1302. WOLFSSL_MSG("Import Key struct error");
  1303. return BUFFER_E;
  1304. }
  1305. if ((ret = ImportKeyState(ssl, buf + idx, length, version)) < 0) {
  1306. WOLFSSL_MSG("Import Key struct error");
  1307. return ret;
  1308. }
  1309. idx += ret;
  1310. /* perform sanity checks and extract CipherSpecs struct */
  1311. if (DTLS_EXPORT_LEN + DTLS_EXPORT_SPC_SZ + idx > sz) {
  1312. WOLFSSL_MSG("Import CipherSpecs struct error");
  1313. return BUFFER_E;
  1314. }
  1315. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1316. if ( length != DTLS_EXPORT_SPC_SZ) {
  1317. WOLFSSL_MSG("Import CipherSpecs struct error");
  1318. return BUFFER_E;
  1319. }
  1320. if ((ret = ImportCipherSpecState(ssl, buf + idx, length, version)) < 0) {
  1321. WOLFSSL_MSG("Import CipherSpecs struct error");
  1322. return ret;
  1323. }
  1324. idx += ret;
  1325. /* perform sanity checks and extract DTLS peer info */
  1326. if (DTLS_EXPORT_LEN + idx > sz) {
  1327. WOLFSSL_MSG("Import DTLS peer info error");
  1328. return BUFFER_E;
  1329. }
  1330. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1331. if (idx + length > sz) {
  1332. WOLFSSL_MSG("Import DTLS peer info error");
  1333. return BUFFER_E;
  1334. }
  1335. if ((ret = ImportPeerInfo(ssl, buf + idx, length, version)) < 0) {
  1336. WOLFSSL_MSG("Import Peer Addr error");
  1337. return ret;
  1338. }
  1339. idx += ret;
  1340. SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  1341. /* make sure is a valid suite used */
  1342. if (wolfSSL_get_cipher(ssl) == NULL) {
  1343. WOLFSSL_MSG("Can not match cipher suite imported");
  1344. return MATCH_SUITE_ERROR;
  1345. }
  1346. #ifndef WOLFSSL_AEAD_ONLY
  1347. /* set hmac function to use when verifying */
  1348. if (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1349. ssl->options.dtls == 1) {
  1350. ssl->hmac = TLS_hmac;
  1351. }
  1352. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1353. if (ssl->specs.cipher_type == stream &&
  1354. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1355. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1356. return SANITY_CIPHER_E;
  1357. }
  1358. #endif /* !WOLFSSL_AEAD_ONLY */
  1359. return idx;
  1360. }
  1361. #endif /* WOLFSSL_DTLS */
  1362. #endif /* WOLFSSL_SESSION_EXPORT */
  1363. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1364. {
  1365. method->version = pv;
  1366. method->side = WOLFSSL_CLIENT_END;
  1367. method->downgrade = 0;
  1368. }
  1369. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  1370. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1371. {
  1372. if (ssl == NULL)
  1373. return BAD_FUNC_ARG;
  1374. /* set side */
  1375. ssl->options.side = side;
  1376. /* reset options that are side specific */
  1377. #ifdef HAVE_NTRU
  1378. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1379. ssl->options.haveNTRU = 1; /* always on client side */
  1380. /* server can turn on by loading key */
  1381. }
  1382. #endif
  1383. #ifdef HAVE_ECC
  1384. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1385. ssl->options.haveECDSAsig = 1; /* always on client side */
  1386. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1387. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1388. }
  1389. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1390. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1391. ssl->options.haveECDSAsig = 1; /* always on client side */
  1392. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1393. }
  1394. #endif
  1395. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1396. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1397. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1398. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1399. ssl->options.haveEMS = 1;
  1400. }
  1401. #ifdef WOLFSSL_DTLS
  1402. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1403. ssl->options.haveEMS = 1;
  1404. #endif /* WOLFSSL_DTLS */
  1405. }
  1406. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1407. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  1408. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  1409. int ret;
  1410. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  1411. if (ret != 0) {
  1412. WOLFSSL_MSG("DTLS Cookie Secret error");
  1413. return ret;
  1414. }
  1415. }
  1416. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  1417. return InitSSL_Suites(ssl);
  1418. }
  1419. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1420. /* Initialize SSL context, return 0 on success */
  1421. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1422. {
  1423. int ret = 0;
  1424. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1425. ctx->method = method;
  1426. ctx->refCount = 1; /* so either CTX_free or SSL_free can release */
  1427. ctx->heap = ctx; /* defaults to self */
  1428. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1429. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE; /* current default: TLSv1_MINOR */
  1430. if (wc_InitMutex(&ctx->countMutex) < 0) {
  1431. WOLFSSL_MSG("Mutex error on CTX init");
  1432. ctx->err = CTX_INIT_MUTEX_E;
  1433. return BAD_MUTEX_E;
  1434. }
  1435. #ifndef NO_CERTS
  1436. ctx->privateKeyDevId = INVALID_DEVID;
  1437. #endif
  1438. #ifndef NO_DH
  1439. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1440. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1441. #endif
  1442. #ifndef NO_RSA
  1443. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1444. #endif
  1445. #ifdef HAVE_ECC
  1446. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1447. ctx->eccTempKeySz = ECDHE_SIZE;
  1448. #endif
  1449. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  1450. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1451. #endif
  1452. #ifdef OPENSSL_EXTRA
  1453. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1454. #endif
  1455. #ifndef WOLFSSL_USER_IO
  1456. #ifdef MICRIUM
  1457. ctx->CBIORecv = MicriumReceive;
  1458. ctx->CBIOSend = MicriumSend;
  1459. #ifdef WOLFSSL_DTLS
  1460. if (method->version.major == DTLS_MAJOR) {
  1461. ctx->CBIORecv = MicriumReceiveFrom;
  1462. ctx->CBIOSend = MicriumSendTo;
  1463. }
  1464. #ifdef WOLFSSL_SESSION_EXPORT
  1465. #error Micrium port does not support DTLS session export yet
  1466. #endif
  1467. #endif
  1468. #elif defined WOLFSSL_UIP
  1469. ctx->CBIORecv = uIPReceive;
  1470. ctx->CBIOSend = uIPSend;
  1471. #ifdef WOLFSSL_DTLS
  1472. if (method->version.major == DTLS_MAJOR) {
  1473. ctx->CBIOSendTo = uIPSendTo;
  1474. ctx->CBIORecvFrom = uIPRecvFrom;
  1475. }
  1476. #endif
  1477. #else
  1478. ctx->CBIORecv = EmbedReceive;
  1479. ctx->CBIOSend = EmbedSend;
  1480. #ifdef WOLFSSL_DTLS
  1481. if (method->version.major == DTLS_MAJOR) {
  1482. ctx->CBIORecv = EmbedReceiveFrom;
  1483. ctx->CBIOSend = EmbedSendTo;
  1484. }
  1485. #ifdef WOLFSSL_SESSION_EXPORT
  1486. ctx->CBGetPeer = EmbedGetPeer;
  1487. ctx->CBSetPeer = EmbedSetPeer;
  1488. #endif
  1489. #endif
  1490. #endif /* MICRIUM */
  1491. #endif /* WOLFSSL_USER_IO */
  1492. #ifdef HAVE_NETX
  1493. ctx->CBIORecv = NetX_Receive;
  1494. ctx->CBIOSend = NetX_Send;
  1495. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1496. ctx->CBIORecv = Mynewt_Receive;
  1497. ctx->CBIOSend = Mynewt_Send;
  1498. #elif defined(WOLFSSL_GNRC)
  1499. ctx->CBIORecv = GNRC_ReceiveFrom;
  1500. ctx->CBIOSend = GNRC_SendTo;
  1501. #endif
  1502. #ifdef HAVE_NTRU
  1503. if (method->side == WOLFSSL_CLIENT_END)
  1504. ctx->haveNTRU = 1; /* always on client side */
  1505. /* server can turn on by loading key */
  1506. #endif
  1507. #ifdef HAVE_ECC
  1508. if (method->side == WOLFSSL_CLIENT_END) {
  1509. ctx->haveECDSAsig = 1; /* always on client side */
  1510. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1511. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  1512. }
  1513. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1514. if (method->side == WOLFSSL_CLIENT_END) {
  1515. ctx->haveECDSAsig = 1; /* always on client side */
  1516. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1517. }
  1518. #endif
  1519. ctx->devId = INVALID_DEVID;
  1520. #if defined(WOLFSSL_DTLS)
  1521. #ifdef WOLFSSL_SCTP
  1522. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  1523. #elif defined(WOLFSSL_DTLS_MTU)
  1524. ctx->dtlsMtuSz = MAX_MTU;
  1525. #endif
  1526. #endif
  1527. #ifndef NO_CERTS
  1528. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  1529. if (ctx->cm == NULL) {
  1530. WOLFSSL_MSG("Bad Cert Manager New");
  1531. return BAD_CERT_MANAGER_ERROR;
  1532. }
  1533. #ifdef OPENSSL_EXTRA
  1534. /* setup WOLFSSL_X509_STORE */
  1535. ctx->x509_store.cm = ctx->cm;
  1536. /* WOLFSSL_X509_VERIFY_PARAM */
  1537. if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  1538. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  1539. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  1540. WOLFSSL_MSG("ctx->param memory error");
  1541. return MEMORY_E;
  1542. }
  1543. XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  1544. #endif
  1545. #endif
  1546. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1547. if (method->side == WOLFSSL_CLIENT_END) {
  1548. if ((method->version.major == SSLv3_MAJOR) &&
  1549. (method->version.minor >= TLSv1_MINOR)) {
  1550. ctx->haveEMS = 1;
  1551. }
  1552. #ifdef WOLFSSL_DTLS
  1553. if (method->version.major == DTLS_MAJOR)
  1554. ctx->haveEMS = 1;
  1555. #endif /* WOLFSSL_DTLS */
  1556. }
  1557. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1558. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  1559. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  1560. ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
  1561. if (ret != 0) return ret;
  1562. ctx->ticketEncCb = DefTicketEncCb;
  1563. ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
  1564. #endif
  1565. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  1566. #endif
  1567. #ifdef HAVE_WOLF_EVENT
  1568. if (ret == 0)
  1569. ret = wolfEventQueue_Init(&ctx->event_queue);
  1570. #endif /* HAVE_WOLF_EVENT */
  1571. #ifdef WOLFSSL_EARLY_DATA
  1572. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  1573. #endif
  1574. #if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
  1575. ctx->noPskDheKe = 1;
  1576. #endif
  1577. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  1578. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1579. return ret;
  1580. }
  1581. /* In case contexts are held in array and don't want to free actual ctx */
  1582. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  1583. {
  1584. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
  1585. defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
  1586. int i;
  1587. #endif
  1588. #ifdef HAVE_WOLF_EVENT
  1589. wolfEventQueue_Free(&ctx->event_queue);
  1590. #endif /* HAVE_WOLF_EVENT */
  1591. #ifdef WOLFSSL_STATIC_MEMORY
  1592. if (ctx->onHeap == 1) {
  1593. XFREE(ctx->method, ctx->heap, DYNAMIC_TYPE_METHOD);
  1594. }
  1595. else {
  1596. XFREE(ctx->method, NULL, DYNAMIC_TYPE_METHOD);
  1597. }
  1598. #else
  1599. XFREE(ctx->method, ctx->heap, DYNAMIC_TYPE_METHOD);
  1600. #endif
  1601. ctx->method = NULL;
  1602. if (ctx->suites) {
  1603. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  1604. ctx->suites = NULL;
  1605. }
  1606. #ifndef NO_DH
  1607. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1608. ctx->serverDH_G.buffer = NULL;
  1609. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1610. ctx->serverDH_P.buffer = NULL;
  1611. #endif /* !NO_DH */
  1612. #ifdef SINGLE_THREADED
  1613. if (ctx->rng) {
  1614. wc_FreeRng(ctx->rng);
  1615. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  1616. ctx->rng = NULL;
  1617. }
  1618. #endif /* SINGLE_THREADED */
  1619. #ifndef NO_CERTS
  1620. FreeDer(&ctx->privateKey);
  1621. FreeDer(&ctx->certificate);
  1622. #ifdef KEEP_OUR_CERT
  1623. if (ctx->ourCert && ctx->ownOurCert) {
  1624. wolfSSL_X509_free(ctx->ourCert);
  1625. ctx->ourCert = NULL;
  1626. }
  1627. #endif /* KEEP_OUR_CERT */
  1628. FreeDer(&ctx->certChain);
  1629. wolfSSL_CertManagerFree(ctx->cm);
  1630. ctx->cm = NULL;
  1631. #ifdef OPENSSL_EXTRA
  1632. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  1633. while (ctx->ca_names != NULL) {
  1634. WOLFSSL_STACK *next = ctx->ca_names->next;
  1635. wolfSSL_X509_NAME_free(ctx->ca_names->data.name);
  1636. XFREE(ctx->ca_names, NULL, DYNAMIC_TYPE_OPENSSL);
  1637. ctx->ca_names = next;
  1638. }
  1639. #endif
  1640. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  1641. if (ctx->x509Chain) {
  1642. wolfSSL_sk_X509_free(ctx->x509Chain);
  1643. ctx->x509Chain = NULL;
  1644. }
  1645. #endif
  1646. #endif /* !NO_CERTS */
  1647. #ifdef HAVE_TLS_EXTENSIONS
  1648. TLSX_FreeAll(ctx->extensions, ctx->heap);
  1649. #ifndef NO_WOLFSSL_SERVER
  1650. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  1651. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  1652. if (ctx->certOcspRequest) {
  1653. FreeOcspRequest(ctx->certOcspRequest);
  1654. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  1655. }
  1656. #endif
  1657. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1658. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  1659. if (ctx->chainOcspRequest[i]) {
  1660. FreeOcspRequest(ctx->chainOcspRequest[i]);
  1661. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  1662. ctx->chainOcspRequest[i] = NULL;
  1663. }
  1664. }
  1665. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  1666. #endif /* !NO_WOLFSSL_SERVER */
  1667. #endif /* HAVE_TLS_EXTENSIONS */
  1668. #ifdef OPENSSL_EXTRA
  1669. if(ctx->alpn_cli_protos) {
  1670. XFREE((void *)ctx->alpn_cli_protos, NULL, DYNAMIC_TYPE_OPENSSL);
  1671. ctx->alpn_cli_protos = NULL;
  1672. }
  1673. if (ctx->param) {
  1674. XFREE(ctx->param, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  1675. }
  1676. #endif
  1677. #ifdef WOLFSSL_STATIC_EPHEMERAL
  1678. #ifndef NO_DH
  1679. if (ctx->staticKE.dhKey)
  1680. FreeDer(&ctx->staticKE.dhKey);
  1681. #endif
  1682. #ifdef HAVE_ECC
  1683. if (ctx->staticKE.ecKey)
  1684. FreeDer(&ctx->staticKE.ecKey);
  1685. #endif
  1686. #endif
  1687. #ifdef WOLFSSL_STATIC_MEMORY
  1688. if (ctx->heap != NULL) {
  1689. #ifdef WOLFSSL_HEAP_TEST
  1690. /* avoid dereferencing a test value */
  1691. if (ctx->heap != (void*)WOLFSSL_HEAP_TEST)
  1692. #endif
  1693. {
  1694. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)(ctx->heap);
  1695. wc_FreeMutex(&((WOLFSSL_HEAP*)(hint->memory))->memory_mutex);
  1696. }
  1697. }
  1698. #endif /* WOLFSSL_STATIC_MEMORY */
  1699. }
  1700. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  1701. {
  1702. int refCount;
  1703. /* decrement CTX reference count */
  1704. if ((refCount = SSL_CTX_RefCount(ctx, -1)) < 0) {
  1705. /* check error state, if mutex error code then mutex init failed but
  1706. * CTX was still malloc'd */
  1707. if (ctx->err == CTX_INIT_MUTEX_E) {
  1708. SSL_CtxResourceFree(ctx);
  1709. XFREE(ctx, ctx->heap, DYNAMIC_TYPE_CTX);
  1710. }
  1711. return;
  1712. }
  1713. if (refCount == 0) {
  1714. void* heap = ctx->heap;
  1715. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  1716. SSL_CtxResourceFree(ctx);
  1717. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  1718. !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  1719. TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
  1720. #endif
  1721. wc_FreeMutex(&ctx->countMutex);
  1722. #ifdef WOLFSSL_STATIC_MEMORY
  1723. if (ctx->onHeap == 0) {
  1724. heap = NULL;
  1725. }
  1726. #endif
  1727. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  1728. (void)heap; /* not used in some builds */
  1729. }
  1730. else {
  1731. (void)ctx;
  1732. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  1733. }
  1734. }
  1735. /* Set cipher pointers to null */
  1736. void InitCiphers(WOLFSSL* ssl)
  1737. {
  1738. #ifdef BUILD_ARC4
  1739. ssl->encrypt.arc4 = NULL;
  1740. ssl->decrypt.arc4 = NULL;
  1741. #endif
  1742. #ifdef BUILD_DES3
  1743. ssl->encrypt.des3 = NULL;
  1744. ssl->decrypt.des3 = NULL;
  1745. #endif
  1746. #ifdef BUILD_AES
  1747. ssl->encrypt.aes = NULL;
  1748. ssl->decrypt.aes = NULL;
  1749. #endif
  1750. #ifdef HAVE_CAMELLIA
  1751. ssl->encrypt.cam = NULL;
  1752. ssl->decrypt.cam = NULL;
  1753. #endif
  1754. #ifdef HAVE_HC128
  1755. ssl->encrypt.hc128 = NULL;
  1756. ssl->decrypt.hc128 = NULL;
  1757. #endif
  1758. #ifdef BUILD_RABBIT
  1759. ssl->encrypt.rabbit = NULL;
  1760. ssl->decrypt.rabbit = NULL;
  1761. #endif
  1762. #ifdef HAVE_CHACHA
  1763. ssl->encrypt.chacha = NULL;
  1764. ssl->decrypt.chacha = NULL;
  1765. #endif
  1766. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  1767. ssl->auth.poly1305 = NULL;
  1768. #endif
  1769. ssl->encrypt.setup = 0;
  1770. ssl->decrypt.setup = 0;
  1771. #ifdef HAVE_ONE_TIME_AUTH
  1772. ssl->auth.setup = 0;
  1773. #endif
  1774. #ifdef HAVE_IDEA
  1775. ssl->encrypt.idea = NULL;
  1776. ssl->decrypt.idea = NULL;
  1777. #endif
  1778. }
  1779. /* Free ciphers */
  1780. void FreeCiphers(WOLFSSL* ssl)
  1781. {
  1782. (void)ssl;
  1783. #ifdef BUILD_ARC4
  1784. wc_Arc4Free(ssl->encrypt.arc4);
  1785. wc_Arc4Free(ssl->decrypt.arc4);
  1786. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1787. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1788. #endif
  1789. #ifdef BUILD_DES3
  1790. wc_Des3Free(ssl->encrypt.des3);
  1791. wc_Des3Free(ssl->decrypt.des3);
  1792. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1793. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1794. #endif
  1795. #if defined(BUILD_AES) || defined(BUILD_AESGCM) /* See: InitKeys() in keys.c
  1796. * on addition of BUILD_AESGCM
  1797. * check (enc->aes, dec->aes) */
  1798. wc_AesFree(ssl->encrypt.aes);
  1799. wc_AesFree(ssl->decrypt.aes);
  1800. #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \
  1801. !defined(WOLFSSL_NO_TLS12)
  1802. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1803. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1804. #endif
  1805. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1806. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1807. #endif
  1808. #ifdef CIPHER_NONCE
  1809. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1810. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1811. #endif
  1812. #ifdef HAVE_CAMELLIA
  1813. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1814. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1815. #endif
  1816. #ifdef HAVE_HC128
  1817. XFREE(ssl->encrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1818. XFREE(ssl->decrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1819. #endif
  1820. #ifdef BUILD_RABBIT
  1821. XFREE(ssl->encrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1822. XFREE(ssl->decrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1823. #endif
  1824. #ifdef HAVE_CHACHA
  1825. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1826. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1827. #endif
  1828. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  1829. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1830. #endif
  1831. #ifdef HAVE_IDEA
  1832. XFREE(ssl->encrypt.idea, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1833. XFREE(ssl->decrypt.idea, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1834. #endif
  1835. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  1836. wc_HmacFree(ssl->encrypt.hmac);
  1837. wc_HmacFree(ssl->decrypt.hmac);
  1838. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1839. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1840. #endif
  1841. }
  1842. void InitCipherSpecs(CipherSpecs* cs)
  1843. {
  1844. XMEMSET(cs, 0, sizeof(CipherSpecs));
  1845. cs->bulk_cipher_algorithm = INVALID_BYTE;
  1846. cs->cipher_type = INVALID_BYTE;
  1847. cs->mac_algorithm = INVALID_BYTE;
  1848. cs->kea = INVALID_BYTE;
  1849. cs->sig_algo = INVALID_BYTE;
  1850. }
  1851. #if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
  1852. defined(HAVE_ECC))
  1853. static int GetMacDigestSize(byte macAlgo)
  1854. {
  1855. switch (macAlgo) {
  1856. #ifndef NO_SHA
  1857. case sha_mac:
  1858. return WC_SHA_DIGEST_SIZE;
  1859. #endif
  1860. #ifndef NO_SHA256
  1861. case sha256_mac:
  1862. return WC_SHA256_DIGEST_SIZE;
  1863. #endif
  1864. #ifdef WOLFSSL_SHA384
  1865. case sha384_mac:
  1866. return WC_SHA384_DIGEST_SIZE;
  1867. #endif
  1868. #ifdef WOLFSSL_SHA512
  1869. case sha512_mac:
  1870. return WC_SHA512_DIGEST_SIZE;
  1871. #endif
  1872. default:
  1873. break;
  1874. }
  1875. return NOT_COMPILED_IN;
  1876. }
  1877. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  1878. static WC_INLINE void AddSuiteHashSigAlgo(Suites* suites, byte macAlgo, byte sigAlgo,
  1879. int keySz, word16* inOutIdx)
  1880. {
  1881. int addSigAlgo = 1;
  1882. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  1883. if (sigAlgo == ecc_dsa_sa_algo) {
  1884. int digestSz = GetMacDigestSize(macAlgo);
  1885. /* do not add sig/algos with digest size larger than key size */
  1886. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  1887. addSigAlgo = 0;
  1888. }
  1889. }
  1890. #else
  1891. (void)keySz;
  1892. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  1893. if (addSigAlgo) {
  1894. #ifdef WC_RSA_PSS
  1895. if (sigAlgo == rsa_pss_sa_algo) {
  1896. /* RSA PSS is sig then mac */
  1897. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1898. *inOutIdx += 1;
  1899. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  1900. *inOutIdx += 1;
  1901. #ifdef WOLFSSL_TLS13
  1902. /* Add the certificate algorithm as well */
  1903. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1904. *inOutIdx += 1;
  1905. suites->hashSigAlgo[*inOutIdx] = PSS_RSAE_TO_PSS_PSS(macAlgo);
  1906. *inOutIdx += 1;
  1907. #endif
  1908. }
  1909. else
  1910. #endif
  1911. {
  1912. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  1913. *inOutIdx += 1;
  1914. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1915. *inOutIdx += 1;
  1916. }
  1917. }
  1918. }
  1919. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  1920. int haveAnon, int tls1_2, int keySz)
  1921. {
  1922. word16 idx = 0;
  1923. (void)tls1_2;
  1924. (void)keySz;
  1925. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  1926. if (haveECDSAsig) {
  1927. #ifdef HAVE_ECC
  1928. #ifdef WOLFSSL_SHA512
  1929. AddSuiteHashSigAlgo(suites, sha512_mac, ecc_dsa_sa_algo, keySz, &idx);
  1930. #endif
  1931. #ifdef WOLFSSL_SHA384
  1932. AddSuiteHashSigAlgo(suites, sha384_mac, ecc_dsa_sa_algo, keySz, &idx);
  1933. #endif
  1934. #ifndef NO_SHA256
  1935. AddSuiteHashSigAlgo(suites, sha256_mac, ecc_dsa_sa_algo, keySz, &idx);
  1936. #endif
  1937. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  1938. defined(WOLFSSL_ALLOW_TLS_SHA1))
  1939. AddSuiteHashSigAlgo(suites, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  1940. #endif
  1941. #endif
  1942. #ifdef HAVE_ED25519
  1943. AddSuiteHashSigAlgo(suites, ED25519_SA_MAJOR, ED25519_SA_MINOR, keySz,
  1944. &idx);
  1945. #endif
  1946. #ifdef HAVE_ED448
  1947. AddSuiteHashSigAlgo(suites, ED448_SA_MAJOR, ED448_SA_MINOR, keySz,
  1948. &idx);
  1949. #endif
  1950. }
  1951. #endif /* HAVE_ECC || HAVE_ED25519 || defined(HAVE_ED448 */
  1952. if (haveRSAsig) {
  1953. #ifdef WC_RSA_PSS
  1954. if (tls1_2) {
  1955. #ifdef WOLFSSL_SHA512
  1956. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_pss_sa_algo, keySz,
  1957. &idx);
  1958. #endif
  1959. #ifdef WOLFSSL_SHA384
  1960. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_pss_sa_algo, keySz,
  1961. &idx);
  1962. #endif
  1963. #ifndef NO_SHA256
  1964. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_pss_sa_algo, keySz,
  1965. &idx);
  1966. #endif
  1967. }
  1968. #endif
  1969. #ifdef WOLFSSL_SHA512
  1970. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_sa_algo, keySz, &idx);
  1971. #endif
  1972. #ifdef WOLFSSL_SHA384
  1973. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_sa_algo, keySz, &idx);
  1974. #endif
  1975. #ifndef NO_SHA256
  1976. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_sa_algo, keySz, &idx);
  1977. #endif
  1978. #ifdef WOLFSSL_SHA224
  1979. AddSuiteHashSigAlgo(suites, sha224_mac, rsa_sa_algo, keySz, &idx);
  1980. #endif
  1981. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  1982. defined(WOLFSSL_ALLOW_TLS_SHA1))
  1983. AddSuiteHashSigAlgo(suites, sha_mac, rsa_sa_algo, keySz, &idx);
  1984. #endif
  1985. }
  1986. #ifdef HAVE_ANON
  1987. if (haveAnon) {
  1988. AddSuiteHashSigAlgo(suites, sha_mac, anonymous_sa_algo, keySz, &idx);
  1989. }
  1990. #endif
  1991. (void)haveAnon;
  1992. (void)haveECDSAsig;
  1993. suites->hashSigAlgoSz = idx;
  1994. }
  1995. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  1996. word16 havePSK, word16 haveDH, word16 haveNTRU,
  1997. word16 haveECDSAsig, word16 haveECC,
  1998. word16 haveStaticECC, word16 haveAnon, int side)
  1999. {
  2000. word16 idx = 0;
  2001. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  2002. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  2003. #ifdef WOLFSSL_TLS13
  2004. int tls1_3 = IsAtLeastTLSv1_3(pv);
  2005. #endif
  2006. int dtls = 0;
  2007. int haveRSAsig = 1;
  2008. (void)tls; /* shut up compiler */
  2009. (void)tls1_2;
  2010. (void)dtls;
  2011. (void)haveDH;
  2012. (void)havePSK;
  2013. (void)haveNTRU;
  2014. (void)haveStaticECC;
  2015. (void)haveECC;
  2016. (void)side;
  2017. (void)haveRSA; /* some builds won't read */
  2018. (void)haveRSAsig; /* non ecc builds won't read */
  2019. (void)haveAnon; /* anon ciphers optional */
  2020. if (suites == NULL) {
  2021. WOLFSSL_MSG("InitSuites pointer error");
  2022. return;
  2023. }
  2024. if (suites->setSuites)
  2025. return; /* trust user settings, don't override */
  2026. #ifdef WOLFSSL_TLS13
  2027. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  2028. if (tls1_3) {
  2029. suites->suites[idx++] = TLS13_BYTE;
  2030. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  2031. }
  2032. #endif
  2033. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  2034. if (tls1_3) {
  2035. suites->suites[idx++] = TLS13_BYTE;
  2036. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  2037. }
  2038. #endif
  2039. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  2040. if (tls1_3) {
  2041. suites->suites[idx++] = TLS13_BYTE;
  2042. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  2043. }
  2044. #endif
  2045. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  2046. if (tls1_3) {
  2047. suites->suites[idx++] = TLS13_BYTE;
  2048. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  2049. }
  2050. #endif
  2051. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  2052. if (tls1_3) {
  2053. suites->suites[idx++] = TLS13_BYTE;
  2054. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  2055. }
  2056. #endif
  2057. #ifdef HAVE_NULL_CIPHER
  2058. #ifdef BUILD_TLS_SHA256_SHA256
  2059. if (tls1_3) {
  2060. suites->suites[idx++] = ECC_BYTE;
  2061. suites->suites[idx++] = TLS_SHA256_SHA256;
  2062. }
  2063. #endif
  2064. #ifdef BUILD_TLS_SHA384_SHA384
  2065. if (tls1_3) {
  2066. suites->suites[idx++] = ECC_BYTE;
  2067. suites->suites[idx++] = TLS_SHA384_SHA384;
  2068. }
  2069. #endif
  2070. #endif
  2071. #endif /* WOLFSSL_TLS13 */
  2072. #ifndef WOLFSSL_NO_TLS12
  2073. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  2074. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  2075. haveRSA = 0; /* can't do RSA with ECDSA key */
  2076. }
  2077. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  2078. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  2079. }
  2080. #endif /* !NO_WOLFSSL_SERVER */
  2081. #ifdef WOLFSSL_DTLS
  2082. if (pv.major == DTLS_MAJOR) {
  2083. dtls = 1;
  2084. tls = 1;
  2085. /* May be dead assignments dependent upon configuration */
  2086. (void) dtls;
  2087. (void) tls;
  2088. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  2089. }
  2090. #endif
  2091. #ifdef HAVE_RENEGOTIATION_INDICATION
  2092. if (side == WOLFSSL_CLIENT_END) {
  2093. suites->suites[idx++] = CIPHER_BYTE;
  2094. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  2095. }
  2096. #endif
  2097. #ifdef BUILD_TLS_QSH
  2098. if (tls) {
  2099. suites->suites[idx++] = QSH_BYTE;
  2100. suites->suites[idx++] = TLS_QSH;
  2101. }
  2102. #endif
  2103. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  2104. if (tls && haveNTRU && haveRSA) {
  2105. suites->suites[idx++] = CIPHER_BYTE;
  2106. suites->suites[idx++] = TLS_NTRU_RSA_WITH_AES_256_CBC_SHA;
  2107. }
  2108. #endif
  2109. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  2110. if (tls && haveNTRU && haveRSA) {
  2111. suites->suites[idx++] = CIPHER_BYTE;
  2112. suites->suites[idx++] = TLS_NTRU_RSA_WITH_AES_128_CBC_SHA;
  2113. }
  2114. #endif
  2115. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  2116. if (!dtls && tls && haveNTRU && haveRSA) {
  2117. suites->suites[idx++] = CIPHER_BYTE;
  2118. suites->suites[idx++] = TLS_NTRU_RSA_WITH_RC4_128_SHA;
  2119. }
  2120. #endif
  2121. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  2122. if (tls && haveNTRU && haveRSA) {
  2123. suites->suites[idx++] = CIPHER_BYTE;
  2124. suites->suites[idx++] = TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA;
  2125. }
  2126. #endif
  2127. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2128. if (tls1_2 && haveECC) {
  2129. suites->suites[idx++] = ECC_BYTE;
  2130. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2131. }
  2132. #endif
  2133. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2134. if (tls1_2 && haveECC) {
  2135. suites->suites[idx++] = ECC_BYTE;
  2136. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2137. }
  2138. #endif
  2139. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2140. if (tls1_2 && haveRSA) {
  2141. suites->suites[idx++] = ECC_BYTE;
  2142. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2143. }
  2144. #endif
  2145. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2146. if (tls1_2 && haveRSA) {
  2147. suites->suites[idx++] = ECC_BYTE;
  2148. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2149. }
  2150. #endif
  2151. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2152. if (tls1_2 && haveDH && haveRSA) {
  2153. suites->suites[idx++] = CIPHER_BYTE;
  2154. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2155. }
  2156. #endif
  2157. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2158. if (tls1_2 && haveDH && haveRSA) {
  2159. suites->suites[idx++] = CIPHER_BYTE;
  2160. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2161. }
  2162. #endif
  2163. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  2164. if (tls1_2 && haveRSA) {
  2165. suites->suites[idx++] = CIPHER_BYTE;
  2166. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  2167. }
  2168. #endif
  2169. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  2170. if (tls1_2 && haveRSA) {
  2171. suites->suites[idx++] = CIPHER_BYTE;
  2172. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  2173. }
  2174. #endif
  2175. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  2176. if (tls1_2 && haveECC && haveStaticECC) {
  2177. suites->suites[idx++] = ECC_BYTE;
  2178. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  2179. }
  2180. #endif
  2181. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  2182. if (tls1_2 && haveECC && haveStaticECC) {
  2183. suites->suites[idx++] = ECC_BYTE;
  2184. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  2185. }
  2186. #endif
  2187. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  2188. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2189. suites->suites[idx++] = ECC_BYTE;
  2190. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  2191. }
  2192. #endif
  2193. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  2194. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2195. suites->suites[idx++] = ECC_BYTE;
  2196. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  2197. }
  2198. #endif
  2199. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  2200. if (tls1_2 && haveDH && havePSK) {
  2201. suites->suites[idx++] = CIPHER_BYTE;
  2202. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  2203. }
  2204. #endif
  2205. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  2206. if (tls1_2 && haveDH && haveAnon) {
  2207. suites->suites[idx++] = CIPHER_BYTE;
  2208. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  2209. }
  2210. #endif
  2211. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  2212. if (tls1_2 && haveDH && haveAnon) {
  2213. suites->suites[idx++] = CIPHER_BYTE;
  2214. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  2215. }
  2216. #endif
  2217. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  2218. if (tls1_2 && haveDH && havePSK) {
  2219. suites->suites[idx++] = CIPHER_BYTE;
  2220. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  2221. }
  2222. #endif
  2223. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  2224. if (tls1_2 && havePSK) {
  2225. suites->suites[idx++] = CIPHER_BYTE;
  2226. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  2227. }
  2228. #endif
  2229. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  2230. if (tls1_2 && havePSK) {
  2231. suites->suites[idx++] = CIPHER_BYTE;
  2232. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  2233. }
  2234. #endif
  2235. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  2236. if (tls1_2 && haveECC) {
  2237. suites->suites[idx++] = CHACHA_BYTE;
  2238. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  2239. }
  2240. #endif
  2241. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2242. if (tls1_2 && haveRSA) {
  2243. suites->suites[idx++] = CHACHA_BYTE;
  2244. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2245. }
  2246. #endif
  2247. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2248. if (tls1_2 && haveRSA) {
  2249. suites->suites[idx++] = CHACHA_BYTE;
  2250. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2251. }
  2252. #endif
  2253. /* Place as higher priority for MYSQL */
  2254. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  2255. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2256. if (tls && haveDH && haveRSA) {
  2257. suites->suites[idx++] = CIPHER_BYTE;
  2258. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2259. }
  2260. #endif
  2261. #endif
  2262. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  2263. if (tls1_2 && haveRSA) {
  2264. suites->suites[idx++] = ECC_BYTE;
  2265. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  2266. }
  2267. #endif
  2268. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  2269. if (tls1_2 && haveECC) {
  2270. suites->suites[idx++] = ECC_BYTE;
  2271. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  2272. }
  2273. #endif
  2274. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  2275. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2276. suites->suites[idx++] = ECC_BYTE;
  2277. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  2278. }
  2279. #endif
  2280. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  2281. if (tls1_2 && haveECC && haveStaticECC) {
  2282. suites->suites[idx++] = ECC_BYTE;
  2283. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  2284. }
  2285. #endif
  2286. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  2287. if (tls1_2 && haveRSA) {
  2288. suites->suites[idx++] = ECC_BYTE;
  2289. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  2290. }
  2291. #endif
  2292. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2293. if (tls1_2 && haveECC) {
  2294. suites->suites[idx++] = ECC_BYTE;
  2295. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  2296. }
  2297. #endif
  2298. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  2299. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2300. suites->suites[idx++] = ECC_BYTE;
  2301. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  2302. }
  2303. #endif
  2304. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  2305. if (tls1_2 && haveECC && haveStaticECC) {
  2306. suites->suites[idx++] = ECC_BYTE;
  2307. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  2308. }
  2309. #endif
  2310. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  2311. if (tls && haveECC) {
  2312. suites->suites[idx++] = ECC_BYTE;
  2313. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  2314. }
  2315. #endif
  2316. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  2317. if (tls && haveECC && haveStaticECC) {
  2318. suites->suites[idx++] = ECC_BYTE;
  2319. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  2320. }
  2321. #endif
  2322. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  2323. if (tls && haveECC) {
  2324. suites->suites[idx++] = ECC_BYTE;
  2325. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  2326. }
  2327. #endif
  2328. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  2329. if (tls && haveECC && haveStaticECC) {
  2330. suites->suites[idx++] = ECC_BYTE;
  2331. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  2332. }
  2333. #endif
  2334. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  2335. if (!dtls && tls && haveECC) {
  2336. suites->suites[idx++] = ECC_BYTE;
  2337. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  2338. }
  2339. #endif
  2340. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  2341. if (!dtls && tls && haveECC && haveStaticECC) {
  2342. suites->suites[idx++] = ECC_BYTE;
  2343. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  2344. }
  2345. #endif
  2346. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  2347. if (tls && haveECC) {
  2348. suites->suites[idx++] = ECC_BYTE;
  2349. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2350. }
  2351. #endif
  2352. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  2353. if (tls && haveECC && haveStaticECC) {
  2354. suites->suites[idx++] = ECC_BYTE;
  2355. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2356. }
  2357. #endif
  2358. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  2359. if (tls && haveRSA) {
  2360. suites->suites[idx++] = ECC_BYTE;
  2361. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  2362. }
  2363. #endif
  2364. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  2365. if (tls && haveRSAsig && haveStaticECC) {
  2366. suites->suites[idx++] = ECC_BYTE;
  2367. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  2368. }
  2369. #endif
  2370. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  2371. if (tls && haveRSA) {
  2372. suites->suites[idx++] = ECC_BYTE;
  2373. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  2374. }
  2375. #endif
  2376. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  2377. if (tls && haveRSAsig && haveStaticECC) {
  2378. suites->suites[idx++] = ECC_BYTE;
  2379. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  2380. }
  2381. #endif
  2382. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  2383. if (!dtls && tls && haveRSA) {
  2384. suites->suites[idx++] = ECC_BYTE;
  2385. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  2386. }
  2387. #endif
  2388. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  2389. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  2390. suites->suites[idx++] = ECC_BYTE;
  2391. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  2392. }
  2393. #endif
  2394. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  2395. if (tls && haveRSA) {
  2396. suites->suites[idx++] = ECC_BYTE;
  2397. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2398. }
  2399. #endif
  2400. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  2401. if (tls && haveRSAsig && haveStaticECC) {
  2402. suites->suites[idx++] = ECC_BYTE;
  2403. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  2404. }
  2405. #endif
  2406. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  2407. if (tls1_2 && haveECC) {
  2408. suites->suites[idx++] = ECC_BYTE;
  2409. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  2410. }
  2411. #endif
  2412. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  2413. if (tls1_2 && haveECC) {
  2414. suites->suites[idx++] = ECC_BYTE;
  2415. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  2416. }
  2417. #endif
  2418. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  2419. if (tls1_2 && haveECC) {
  2420. suites->suites[idx++] = ECC_BYTE;
  2421. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  2422. }
  2423. #endif
  2424. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  2425. if (tls1_2 && haveRSA) {
  2426. suites->suites[idx++] = ECC_BYTE;
  2427. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  2428. }
  2429. #endif
  2430. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  2431. if (tls1_2 && haveRSA) {
  2432. suites->suites[idx++] = ECC_BYTE;
  2433. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  2434. }
  2435. #endif
  2436. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  2437. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2438. if (tls1_2 && haveDH && haveRSA)
  2439. #else
  2440. if (tls && haveDH && haveRSA)
  2441. #endif
  2442. {
  2443. suites->suites[idx++] = CIPHER_BYTE;
  2444. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  2445. }
  2446. #endif
  2447. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  2448. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2449. if (tls1_2 && haveDH && haveRSA)
  2450. #else
  2451. if (tls && haveDH && haveRSA)
  2452. #endif
  2453. {
  2454. suites->suites[idx++] = CIPHER_BYTE;
  2455. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  2456. }
  2457. #endif
  2458. /* Place as higher priority for MYSQL testing */
  2459. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  2460. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2461. if (tls && haveDH && haveRSA) {
  2462. suites->suites[idx++] = CIPHER_BYTE;
  2463. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2464. }
  2465. #endif
  2466. #endif
  2467. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  2468. if (tls && haveDH && haveRSA) {
  2469. suites->suites[idx++] = CIPHER_BYTE;
  2470. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  2471. }
  2472. #endif
  2473. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  2474. if (tls && haveDH && haveRSA) {
  2475. suites->suites[idx++] = CIPHER_BYTE;
  2476. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2477. }
  2478. #endif
  2479. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  2480. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2481. if (tls1_2 && haveRSA)
  2482. #else
  2483. if (tls && haveRSA)
  2484. #endif
  2485. {
  2486. suites->suites[idx++] = CIPHER_BYTE;
  2487. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  2488. }
  2489. #endif
  2490. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  2491. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2492. if (tls1_2 && haveRSA)
  2493. #else
  2494. if (tls && haveRSA)
  2495. #endif
  2496. {
  2497. suites->suites[idx++] = CIPHER_BYTE;
  2498. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  2499. }
  2500. #endif
  2501. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  2502. if (tls && haveRSA) {
  2503. suites->suites[idx++] = CIPHER_BYTE;
  2504. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  2505. }
  2506. #endif
  2507. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  2508. if (tls && haveRSA) {
  2509. suites->suites[idx++] = CIPHER_BYTE;
  2510. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  2511. }
  2512. #endif
  2513. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2514. if (tls1_2 && haveECC) {
  2515. suites->suites[idx++] = CHACHA_BYTE;
  2516. suites->suites[idx++] =
  2517. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2518. }
  2519. #endif
  2520. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2521. if (tls1_2 && haveRSA) {
  2522. suites->suites[idx++] = CHACHA_BYTE;
  2523. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2524. }
  2525. #endif
  2526. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2527. if (tls1_2 && haveRSA) {
  2528. suites->suites[idx++] = CHACHA_BYTE;
  2529. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2530. }
  2531. #endif
  2532. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  2533. if (tls && haveECC) {
  2534. suites->suites[idx++] = ECC_BYTE;
  2535. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  2536. }
  2537. #endif
  2538. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  2539. if (tls && haveRSA) {
  2540. suites->suites[idx++] = CIPHER_BYTE;
  2541. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  2542. }
  2543. #endif
  2544. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  2545. if (tls && haveRSA) {
  2546. suites->suites[idx++] = CIPHER_BYTE;
  2547. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  2548. }
  2549. #endif
  2550. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  2551. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2552. if (tls1_2 && haveRSA)
  2553. #else
  2554. if (tls && haveRSA)
  2555. #endif
  2556. {
  2557. suites->suites[idx++] = CIPHER_BYTE;
  2558. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  2559. }
  2560. #endif
  2561. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  2562. if (tls && havePSK) {
  2563. suites->suites[idx++] = CIPHER_BYTE;
  2564. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  2565. }
  2566. #endif
  2567. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  2568. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2569. if (tls1_2 && haveDH && havePSK)
  2570. #else
  2571. if (tls && haveDH && havePSK)
  2572. #endif
  2573. {
  2574. suites->suites[idx++] = CIPHER_BYTE;
  2575. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  2576. }
  2577. #endif
  2578. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  2579. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2580. if (tls1_2 && havePSK)
  2581. #else
  2582. if (tls && havePSK)
  2583. #endif
  2584. {
  2585. suites->suites[idx++] = CIPHER_BYTE;
  2586. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  2587. }
  2588. #endif
  2589. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  2590. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2591. if (tls1_2 && haveDH && havePSK)
  2592. #else
  2593. if (tls && haveDH && havePSK)
  2594. #endif
  2595. {
  2596. suites->suites[idx++] = CIPHER_BYTE;
  2597. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  2598. }
  2599. #endif
  2600. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  2601. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2602. if (tls1_2 && havePSK)
  2603. #else
  2604. if (tls1 && havePSK)
  2605. #endif
  2606. {
  2607. suites->suites[idx++] = CIPHER_BYTE;
  2608. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  2609. }
  2610. #endif
  2611. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  2612. if (tls && havePSK) {
  2613. suites->suites[idx++] = CIPHER_BYTE;
  2614. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  2615. }
  2616. #endif
  2617. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  2618. if (tls && haveDH && havePSK) {
  2619. suites->suites[idx++] = ECC_BYTE;
  2620. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  2621. }
  2622. #endif
  2623. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  2624. if (tls && haveDH && havePSK) {
  2625. suites->suites[idx++] = ECC_BYTE;
  2626. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  2627. }
  2628. #endif
  2629. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  2630. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2631. if (tls1_2 && havePSK)
  2632. #else
  2633. if (tls && havePSK)
  2634. #endif
  2635. {
  2636. suites->suites[idx++] = CHACHA_BYTE;
  2637. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2638. }
  2639. #endif
  2640. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  2641. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2642. if (tls1_2 && havePSK)
  2643. #else
  2644. if (tls && havePSK)
  2645. #endif
  2646. {
  2647. suites->suites[idx++] = CHACHA_BYTE;
  2648. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2649. }
  2650. #endif
  2651. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  2652. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2653. if (tls1_2 && havePSK)
  2654. #else
  2655. if (tls && havePSK)
  2656. #endif
  2657. {
  2658. suites->suites[idx++] = CHACHA_BYTE;
  2659. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2660. }
  2661. #endif
  2662. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  2663. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2664. if (tls1_2 && havePSK)
  2665. #else
  2666. if (tls && havePSK)
  2667. #endif
  2668. {
  2669. suites->suites[idx++] = ECC_BYTE;
  2670. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  2671. }
  2672. #endif
  2673. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  2674. if (tls && havePSK) {
  2675. suites->suites[idx++] = ECC_BYTE;
  2676. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  2677. }
  2678. #endif
  2679. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  2680. if (tls && havePSK) {
  2681. suites->suites[idx++] = ECC_BYTE;
  2682. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  2683. }
  2684. #endif
  2685. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  2686. if (tls && havePSK) {
  2687. suites->suites[idx++] = ECC_BYTE;
  2688. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  2689. }
  2690. #endif
  2691. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  2692. if (tls && havePSK) {
  2693. suites->suites[idx++] = ECC_BYTE;
  2694. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  2695. }
  2696. #endif
  2697. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  2698. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2699. if (tls1_2 && haveDH && havePSK)
  2700. #else
  2701. if (tls && haveDH && havePSK)
  2702. #endif
  2703. {
  2704. suites->suites[idx++] = CIPHER_BYTE;
  2705. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  2706. }
  2707. #endif
  2708. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  2709. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2710. if (tls1_2 && havePSK)
  2711. #else
  2712. if (tls && havePSK)
  2713. #endif
  2714. {
  2715. suites->suites[idx++] = CIPHER_BYTE;
  2716. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  2717. }
  2718. #endif
  2719. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  2720. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2721. if (tls1_2 && havePSK)
  2722. #else
  2723. if (tls && havePSK)
  2724. #endif
  2725. {
  2726. suites->suites[idx++] = ECC_BYTE;
  2727. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  2728. }
  2729. #endif
  2730. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  2731. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2732. if (tls1_2 && haveDH && havePSK)
  2733. #else
  2734. if (tls && haveDH && havePSK)
  2735. #endif
  2736. {
  2737. suites->suites[idx++] = CIPHER_BYTE;
  2738. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  2739. }
  2740. #endif
  2741. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  2742. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2743. if (tls1_2 && havePSK)
  2744. #else
  2745. if (tls && havePSK)
  2746. #endif
  2747. {
  2748. suites->suites[idx++] = CIPHER_BYTE;
  2749. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  2750. }
  2751. #endif
  2752. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  2753. if (tls && havePSK) {
  2754. suites->suites[idx++] = CIPHER_BYTE;
  2755. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  2756. }
  2757. #endif
  2758. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  2759. if (!dtls && haveRSA) {
  2760. suites->suites[idx++] = CIPHER_BYTE;
  2761. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  2762. }
  2763. #endif
  2764. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  2765. if (!dtls && haveRSA) {
  2766. suites->suites[idx++] = CIPHER_BYTE;
  2767. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  2768. }
  2769. #endif
  2770. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  2771. if (haveRSA ) {
  2772. suites->suites[idx++] = CIPHER_BYTE;
  2773. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  2774. }
  2775. #endif
  2776. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  2777. if (!dtls && tls && haveRSA) {
  2778. suites->suites[idx++] = CIPHER_BYTE;
  2779. suites->suites[idx++] = TLS_RSA_WITH_HC_128_MD5;
  2780. }
  2781. #endif
  2782. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  2783. if (!dtls && tls && haveRSA) {
  2784. suites->suites[idx++] = CIPHER_BYTE;
  2785. suites->suites[idx++] = TLS_RSA_WITH_HC_128_SHA;
  2786. }
  2787. #endif
  2788. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  2789. if (!dtls && tls && haveRSA) {
  2790. suites->suites[idx++] = CIPHER_BYTE;
  2791. suites->suites[idx++] = TLS_RSA_WITH_RABBIT_SHA;
  2792. }
  2793. #endif
  2794. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  2795. if (tls && haveRSA) {
  2796. suites->suites[idx++] = CIPHER_BYTE;
  2797. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  2798. }
  2799. #endif
  2800. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  2801. if (tls && haveDH && haveRSA) {
  2802. suites->suites[idx++] = CIPHER_BYTE;
  2803. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  2804. }
  2805. #endif
  2806. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  2807. if (tls && haveRSA) {
  2808. suites->suites[idx++] = CIPHER_BYTE;
  2809. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  2810. }
  2811. #endif
  2812. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  2813. if (tls && haveDH && haveRSA) {
  2814. suites->suites[idx++] = CIPHER_BYTE;
  2815. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  2816. }
  2817. #endif
  2818. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  2819. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2820. if (tls1_2 && haveRSA)
  2821. #else
  2822. if (tls && haveRSA)
  2823. #endif
  2824. {
  2825. suites->suites[idx++] = CIPHER_BYTE;
  2826. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  2827. }
  2828. #endif
  2829. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  2830. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2831. if (tls1_2 && haveDH && haveRSA)
  2832. #else
  2833. if (tls && haveDH && haveRSA)
  2834. #endif
  2835. {
  2836. suites->suites[idx++] = CIPHER_BYTE;
  2837. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  2838. }
  2839. #endif
  2840. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  2841. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2842. if (tls1_2 && haveRSA)
  2843. #else
  2844. if (tls && haveRSA)
  2845. #endif
  2846. {
  2847. suites->suites[idx++] = CIPHER_BYTE;
  2848. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  2849. }
  2850. #endif
  2851. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  2852. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2853. if (tls1_2 && haveDH && haveRSA)
  2854. #else
  2855. if (tls && haveDH && haveRSA)
  2856. #endif
  2857. {
  2858. suites->suites[idx++] = CIPHER_BYTE;
  2859. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  2860. }
  2861. #endif
  2862. #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA
  2863. if (haveRSA) {
  2864. suites->suites[idx++] = CIPHER_BYTE;
  2865. suites->suites[idx++] = SSL_RSA_WITH_IDEA_CBC_SHA;
  2866. }
  2867. #endif
  2868. #endif /* !WOLFSSL_NO_TLS12 */
  2869. suites->suiteSz = idx;
  2870. InitSuitesHashSigAlgo(suites, haveECDSAsig | haveECC, haveRSAsig | haveRSA,
  2871. 0, tls1_2, keySz);
  2872. }
  2873. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  2874. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  2875. /* Decode the signature algorithm.
  2876. *
  2877. * input The encoded signature algorithm.
  2878. * hashalgo The hash algorithm.
  2879. * hsType The signature type.
  2880. */
  2881. static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  2882. {
  2883. switch (input[0]) {
  2884. case NEW_SA_MAJOR:
  2885. #ifdef HAVE_ED25519
  2886. /* ED25519: 0x0807 */
  2887. if (input[1] == ED25519_SA_MINOR) {
  2888. *hsType = ed25519_sa_algo;
  2889. /* Hash performed as part of sign/verify operation. */
  2890. *hashAlgo = sha512_mac;
  2891. }
  2892. else
  2893. #endif
  2894. #ifdef HAVE_ED448
  2895. /* ED448: 0x0808 */
  2896. if (input[1] == ED448_SA_MINOR) {
  2897. *hsType = ed448_sa_algo;
  2898. /* Hash performed as part of sign/verify operation. */
  2899. *hashAlgo = sha512_mac;
  2900. }
  2901. else
  2902. #endif
  2903. #ifdef WC_RSA_PSS
  2904. /* PSS PSS signatures: 0x080[9-b] */
  2905. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  2906. *hsType = rsa_pss_pss_algo;
  2907. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  2908. }
  2909. else
  2910. #endif
  2911. {
  2912. *hsType = input[0];
  2913. *hashAlgo = input[1];
  2914. }
  2915. break;
  2916. default:
  2917. *hashAlgo = input[0];
  2918. *hsType = input[1];
  2919. break;
  2920. }
  2921. }
  2922. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  2923. #ifndef WOLFSSL_NO_TLS12
  2924. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  2925. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  2926. defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
  2927. static enum wc_HashType HashAlgoToType(int hashAlgo)
  2928. {
  2929. switch (hashAlgo) {
  2930. #ifdef WOLFSSL_SHA512
  2931. case sha512_mac:
  2932. return WC_HASH_TYPE_SHA512;
  2933. #endif
  2934. #ifdef WOLFSSL_SHA384
  2935. case sha384_mac:
  2936. return WC_HASH_TYPE_SHA384;
  2937. #endif
  2938. #ifndef NO_SHA256
  2939. case sha256_mac:
  2940. return WC_HASH_TYPE_SHA256;
  2941. #endif
  2942. #ifdef WOLFSSL_SHA224
  2943. case sha224_mac:
  2944. return WC_HASH_TYPE_SHA224;
  2945. #endif
  2946. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2947. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2948. case sha_mac:
  2949. return WC_HASH_TYPE_SHA;
  2950. #endif
  2951. default:
  2952. WOLFSSL_MSG("Bad hash sig algo");
  2953. break;
  2954. }
  2955. return WC_HASH_TYPE_NONE;
  2956. }
  2957. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  2958. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  2959. #endif /* !WOLFSSL_NO_TLS12 */
  2960. #ifndef NO_CERTS
  2961. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
  2962. {
  2963. (void)dynamicFlag;
  2964. (void)heap;
  2965. if (name != NULL) {
  2966. XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME));
  2967. name->name = name->staticName;
  2968. name->heap = heap;
  2969. }
  2970. }
  2971. void FreeX509Name(WOLFSSL_X509_NAME* name)
  2972. {
  2973. if (name != NULL) {
  2974. if (name->dynamicName) {
  2975. XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
  2976. name->name = NULL;
  2977. }
  2978. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  2979. {
  2980. int i;
  2981. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  2982. if (name->entry[i].set) {
  2983. wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
  2984. wolfSSL_ASN1_STRING_free(name->entry[i].value);
  2985. }
  2986. }
  2987. }
  2988. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  2989. }
  2990. }
  2991. /* Initialize wolfSSL X509 type */
  2992. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  2993. {
  2994. if (x509 == NULL) {
  2995. WOLFSSL_MSG("Null parameter passed in!");
  2996. return;
  2997. }
  2998. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  2999. x509->heap = heap;
  3000. InitX509Name(&x509->issuer, 0, heap);
  3001. InitX509Name(&x509->subject, 0, heap);
  3002. x509->dynamicMemory = (byte)dynamicFlag;
  3003. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3004. x509->refCount = 1;
  3005. (void)wc_InitMutex(&x509->refMutex);
  3006. #endif
  3007. }
  3008. /* Free wolfSSL X509 type */
  3009. void FreeX509(WOLFSSL_X509* x509)
  3010. {
  3011. if (x509 == NULL)
  3012. return;
  3013. FreeX509Name(&x509->issuer);
  3014. FreeX509Name(&x509->subject);
  3015. if (x509->pubKey.buffer) {
  3016. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  3017. x509->pubKey.buffer = NULL;
  3018. }
  3019. FreeDer(&x509->derCert);
  3020. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  3021. x509->sig.buffer = NULL;
  3022. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3023. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3024. x509->authKeyId = NULL;
  3025. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3026. x509->subjKeyId = NULL;
  3027. if (x509->authInfo != NULL) {
  3028. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3029. x509->authInfo = NULL;
  3030. }
  3031. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  3032. if (x509->authInfoCaIssuer != NULL) {
  3033. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3034. }
  3035. if (x509->ext_sk != NULL) {
  3036. wolfSSL_sk_X509_EXTENSION_free(x509->ext_sk);
  3037. }
  3038. if (x509->ext_sk_full != NULL) {
  3039. wolfSSL_sk_X509_EXTENSION_free(x509->ext_sk_full);
  3040. }
  3041. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  3042. #ifdef OPENSSL_EXTRA
  3043. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  3044. if (x509->serialNumber != NULL) {
  3045. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  3046. }
  3047. #endif
  3048. if (x509->extKeyUsageSrc != NULL) {
  3049. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3050. x509->extKeyUsageSrc= NULL;
  3051. }
  3052. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3053. #if defined(OPENSSL_ALL)
  3054. if (x509->algor.algorithm) {
  3055. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  3056. x509->algor.algorithm = NULL;
  3057. }
  3058. if (x509->key.algor) {
  3059. wolfSSL_X509_ALGOR_free(x509->key.algor);
  3060. x509->key.algor = NULL;
  3061. }
  3062. if (x509->key.pkey) {
  3063. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  3064. x509->key.pkey = NULL;
  3065. }
  3066. #endif /* OPENSSL_ALL */
  3067. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
  3068. if (x509->challengePwAttr) {
  3069. wolfSSL_X509_ATTRIBUTE_free(x509->challengePwAttr);
  3070. }
  3071. #endif /* WOLFSSL_CERT_REQ */
  3072. if (x509->altNames) {
  3073. FreeAltNames(x509->altNames, x509->heap);
  3074. x509->altNames = NULL;
  3075. }
  3076. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3077. wc_FreeMutex(&x509->refMutex);
  3078. #endif
  3079. }
  3080. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3081. #if !defined(WOLFSSL_NO_TLS12)
  3082. /* Encode the signature algorithm into buffer.
  3083. *
  3084. * hashalgo The hash algorithm.
  3085. * hsType The signature type.
  3086. * output The buffer to encode into.
  3087. */
  3088. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  3089. {
  3090. switch (hsType) {
  3091. #ifdef HAVE_ECC
  3092. case ecc_dsa_sa_algo:
  3093. output[0] = hashAlgo;
  3094. output[1] = ecc_dsa_sa_algo;
  3095. break;
  3096. #endif
  3097. #ifdef HAVE_ED25519
  3098. case ed25519_sa_algo:
  3099. output[0] = ED25519_SA_MAJOR;
  3100. output[1] = ED25519_SA_MINOR;
  3101. (void)hashAlgo;
  3102. break;
  3103. #endif
  3104. #ifdef HAVE_ED448
  3105. case ed448_sa_algo:
  3106. output[0] = ED448_SA_MAJOR;
  3107. output[1] = ED448_SA_MINOR;
  3108. (void)hashAlgo;
  3109. break;
  3110. #endif
  3111. #ifndef NO_RSA
  3112. case rsa_sa_algo:
  3113. output[0] = hashAlgo;
  3114. output[1] = rsa_sa_algo;
  3115. break;
  3116. #ifdef WC_RSA_PSS
  3117. /* PSS signatures: 0x080[4-6] */
  3118. case rsa_pss_sa_algo:
  3119. output[0] = rsa_pss_sa_algo;
  3120. output[1] = hashAlgo;
  3121. break;
  3122. #endif
  3123. #endif
  3124. }
  3125. (void)hashAlgo;
  3126. (void)output;
  3127. }
  3128. #endif
  3129. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  3130. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  3131. {
  3132. switch (hashAlgo) {
  3133. #ifndef NO_SHA
  3134. case sha_mac:
  3135. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  3136. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  3137. break;
  3138. #endif /* !NO_SHA */
  3139. #ifndef NO_SHA256
  3140. case sha256_mac:
  3141. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  3142. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  3143. break;
  3144. #endif /* !NO_SHA256 */
  3145. #ifdef WOLFSSL_SHA384
  3146. case sha384_mac:
  3147. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  3148. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  3149. break;
  3150. #endif /* WOLFSSL_SHA384 */
  3151. #ifdef WOLFSSL_SHA512
  3152. case sha512_mac:
  3153. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  3154. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  3155. break;
  3156. #endif /* WOLFSSL_SHA512 */
  3157. } /* switch */
  3158. }
  3159. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  3160. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3161. #endif /* !NO_CERTS */
  3162. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3163. static word32 MacSize(WOLFSSL* ssl)
  3164. {
  3165. #ifdef HAVE_TRUNCATED_HMAC
  3166. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  3167. : ssl->specs.hash_size;
  3168. #else
  3169. word32 digestSz = ssl->specs.hash_size;
  3170. #endif
  3171. return digestSz;
  3172. }
  3173. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  3174. #ifndef NO_RSA
  3175. #ifndef WOLFSSL_NO_TLS12
  3176. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3177. static int TypeHash(int hashAlgo)
  3178. {
  3179. switch (hashAlgo) {
  3180. #ifdef WOLFSSL_SHA512
  3181. case sha512_mac:
  3182. return SHA512h;
  3183. #endif
  3184. #ifdef WOLFSSL_SHA384
  3185. case sha384_mac:
  3186. return SHA384h;
  3187. #endif
  3188. #ifndef NO_SHA256
  3189. case sha256_mac:
  3190. return SHA256h;
  3191. #endif
  3192. #ifdef WOLFSSL_SHA224
  3193. case sha224_mac:
  3194. return SHA224h;
  3195. #endif
  3196. #ifndef NO_SHA
  3197. case sha_mac:
  3198. return SHAh;
  3199. #endif
  3200. }
  3201. return 0;
  3202. }
  3203. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  3204. #endif /* !WOLFSSL_NO_TLS12 */
  3205. #if defined(WC_RSA_PSS)
  3206. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  3207. {
  3208. switch (hashAlgo) {
  3209. #ifdef WOLFSSL_SHA512
  3210. case sha512_mac:
  3211. *hashType = WC_HASH_TYPE_SHA512;
  3212. if (mgf != NULL)
  3213. *mgf = WC_MGF1SHA512;
  3214. break;
  3215. #endif
  3216. #ifdef WOLFSSL_SHA384
  3217. case sha384_mac:
  3218. *hashType = WC_HASH_TYPE_SHA384;
  3219. if (mgf != NULL)
  3220. *mgf = WC_MGF1SHA384;
  3221. break;
  3222. #endif
  3223. #ifndef NO_SHA256
  3224. case sha256_mac:
  3225. *hashType = WC_HASH_TYPE_SHA256;
  3226. if (mgf != NULL)
  3227. *mgf = WC_MGF1SHA256;
  3228. break;
  3229. #endif
  3230. default:
  3231. return BAD_FUNC_ARG;
  3232. }
  3233. return 0;
  3234. }
  3235. #endif
  3236. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3237. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3238. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3239. DerBuffer* keyBufInfo)
  3240. {
  3241. int ret;
  3242. #ifdef HAVE_PK_CALLBACKS
  3243. const byte* keyBuf = NULL;
  3244. word32 keySz = 0;
  3245. if (keyBufInfo) {
  3246. keyBuf = keyBufInfo->buffer;
  3247. keySz = keyBufInfo->length;
  3248. }
  3249. #endif
  3250. (void)ssl;
  3251. (void)keyBufInfo;
  3252. (void)sigAlgo;
  3253. (void)hashAlgo;
  3254. WOLFSSL_ENTER("RsaSign");
  3255. #ifdef WOLFSSL_ASYNC_CRYPT
  3256. /* initialize event */
  3257. if (key) {
  3258. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3259. if (ret != 0)
  3260. return ret;
  3261. }
  3262. #endif
  3263. #if defined(WC_RSA_PSS)
  3264. if (sigAlgo == rsa_pss_sa_algo) {
  3265. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3266. int mgf = 0;
  3267. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3268. if (ret != 0)
  3269. return ret;
  3270. #if defined(HAVE_PK_CALLBACKS)
  3271. if (ssl->ctx->RsaPssSignCb) {
  3272. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3273. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  3274. TypeHash(hashAlgo), mgf,
  3275. keyBuf, keySz, ctx);
  3276. }
  3277. else
  3278. #endif
  3279. {
  3280. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  3281. ssl->rng);
  3282. }
  3283. }
  3284. else
  3285. #endif
  3286. #if defined(HAVE_PK_CALLBACKS)
  3287. if (ssl->ctx->RsaSignCb) {
  3288. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3289. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3290. ctx);
  3291. }
  3292. else
  3293. #endif /*HAVE_PK_CALLBACKS */
  3294. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  3295. /* Handle async pending response */
  3296. #ifdef WOLFSSL_ASYNC_CRYPT
  3297. if (key && ret == WC_PENDING_E) {
  3298. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3299. }
  3300. #endif /* WOLFSSL_ASYNC_CRYPT */
  3301. /* For positive response return in outSz */
  3302. if (ret > 0) {
  3303. *outSz = ret;
  3304. ret = 0;
  3305. }
  3306. WOLFSSL_LEAVE("RsaSign", ret);
  3307. return ret;
  3308. }
  3309. #endif
  3310. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  3311. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  3312. {
  3313. int ret;
  3314. #ifdef HAVE_PK_CALLBACKS
  3315. const byte* keyBuf = NULL;
  3316. word32 keySz = 0;
  3317. if (keyBufInfo) {
  3318. keyBuf = keyBufInfo->buffer;
  3319. keySz = keyBufInfo->length;
  3320. }
  3321. #endif
  3322. (void)ssl;
  3323. (void)keyBufInfo;
  3324. (void)sigAlgo;
  3325. (void)hashAlgo;
  3326. WOLFSSL_ENTER("RsaVerify");
  3327. #ifdef WOLFSSL_ASYNC_CRYPT
  3328. /* initialize event */
  3329. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3330. if (ret != 0)
  3331. return ret;
  3332. #endif
  3333. #if defined(WC_RSA_PSS)
  3334. if (sigAlgo == rsa_pss_sa_algo) {
  3335. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3336. int mgf = 0;
  3337. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3338. if (ret != 0)
  3339. return ret;
  3340. #ifdef HAVE_PK_CALLBACKS
  3341. if (ssl->ctx->RsaPssVerifyCb) {
  3342. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  3343. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  3344. TypeHash(hashAlgo), mgf,
  3345. keyBuf, keySz, ctx);
  3346. }
  3347. else
  3348. #endif /*HAVE_PK_CALLBACKS */
  3349. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  3350. }
  3351. else
  3352. #endif
  3353. #ifdef HAVE_PK_CALLBACKS
  3354. if (ssl->ctx->RsaVerifyCb) {
  3355. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  3356. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3357. }
  3358. else
  3359. #endif /*HAVE_PK_CALLBACKS */
  3360. {
  3361. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  3362. }
  3363. /* Handle async pending response */
  3364. #ifdef WOLFSSL_ASYNC_CRYPT
  3365. if (ret == WC_PENDING_E) {
  3366. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3367. }
  3368. #endif /* WOLFSSL_ASYNC_CRYPT */
  3369. WOLFSSL_LEAVE("RsaVerify", ret);
  3370. return ret;
  3371. }
  3372. /* Verify RSA signature, 0 on success */
  3373. /* This function is used to check the sign result */
  3374. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  3375. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3376. DerBuffer* keyBufInfo)
  3377. {
  3378. byte* out = NULL; /* inline result */
  3379. int ret;
  3380. #ifdef HAVE_PK_CALLBACKS
  3381. const byte* keyBuf = NULL;
  3382. word32 keySz = 0;
  3383. if (keyBufInfo) {
  3384. keyBuf = keyBufInfo->buffer;
  3385. keySz = keyBufInfo->length;
  3386. }
  3387. #endif
  3388. (void)ssl;
  3389. (void)keyBufInfo;
  3390. (void)sigAlgo;
  3391. (void)hashAlgo;
  3392. WOLFSSL_ENTER("VerifyRsaSign");
  3393. if (verifySig == NULL || plain == NULL) {
  3394. return BAD_FUNC_ARG;
  3395. }
  3396. if (sigSz > ENCRYPT_LEN) {
  3397. WOLFSSL_MSG("Signature buffer too big");
  3398. return BUFFER_E;
  3399. }
  3400. #ifdef WOLFSSL_ASYNC_CRYPT
  3401. /* initialize event */
  3402. if (key) {
  3403. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3404. if (ret != 0)
  3405. return ret;
  3406. }
  3407. #endif
  3408. #if defined(WC_RSA_PSS)
  3409. if (sigAlgo == rsa_pss_sa_algo) {
  3410. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3411. int mgf = 0;
  3412. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3413. if (ret != 0)
  3414. return ret;
  3415. #ifdef HAVE_PK_CALLBACKS
  3416. if (ssl->ctx->RsaPssSignCheckCb) {
  3417. /* The key buffer includes private/public portion,
  3418. but only public is used */
  3419. /* If HSM hardware is checking the signature result you can
  3420. optionally skip the sign check and return 0 */
  3421. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3422. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3423. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  3424. TypeHash(hashAlgo), mgf,
  3425. keyBuf, keySz, ctx);
  3426. if (ret > 0) {
  3427. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  3428. hashType);
  3429. if (ret != 0)
  3430. ret = VERIFY_CERT_ERROR;
  3431. }
  3432. }
  3433. else
  3434. #endif /* HAVE_PK_CALLBACKS */
  3435. {
  3436. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  3437. key);
  3438. if (ret > 0) {
  3439. #ifdef HAVE_SELFTEST
  3440. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  3441. hashType);
  3442. #else
  3443. ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret,
  3444. hashType, -1,
  3445. mp_count_bits(&key->n));
  3446. #endif
  3447. if (ret != 0)
  3448. ret = VERIFY_CERT_ERROR;
  3449. }
  3450. }
  3451. }
  3452. else
  3453. #endif /* WC_RSA_PSS */
  3454. {
  3455. #ifdef HAVE_PK_CALLBACKS
  3456. if (ssl->ctx->RsaSignCheckCb) {
  3457. /* The key buffer includes private/public portion,
  3458. but only public is used */
  3459. /* If HSM hardware is checking the signature result you can
  3460. optionally skip the sign check and return 0 */
  3461. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3462. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3463. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  3464. keyBuf, keySz, ctx);
  3465. }
  3466. else
  3467. #endif /* HAVE_PK_CALLBACKS */
  3468. {
  3469. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  3470. }
  3471. if (ret > 0) {
  3472. if (ret != (int)plainSz || !out ||
  3473. XMEMCMP(plain, out, plainSz) != 0) {
  3474. WOLFSSL_MSG("RSA Signature verification failed");
  3475. ret = RSA_SIGN_FAULT;
  3476. } else {
  3477. ret = 0; /* RSA reset */
  3478. }
  3479. }
  3480. }
  3481. /* Handle async pending response */
  3482. #ifdef WOLFSSL_ASYNC_CRYPT
  3483. if (key && ret == WC_PENDING_E) {
  3484. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3485. }
  3486. #endif /* WOLFSSL_ASYNC_CRYPT */
  3487. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  3488. return ret;
  3489. }
  3490. #ifndef WOLFSSL_NO_TLS12
  3491. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3492. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  3493. RsaKey* key, DerBuffer* keyBufInfo)
  3494. {
  3495. int ret;
  3496. #ifdef HAVE_PK_CALLBACKS
  3497. const byte* keyBuf = NULL;
  3498. word32 keySz = 0;
  3499. if (keyBufInfo) {
  3500. keyBuf = keyBufInfo->buffer;
  3501. keySz = keyBufInfo->length;
  3502. }
  3503. #endif
  3504. (void)ssl;
  3505. (void)keyBufInfo;
  3506. WOLFSSL_ENTER("RsaDec");
  3507. #ifdef WOLFSSL_ASYNC_CRYPT
  3508. /* initialize event */
  3509. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3510. if (ret != 0)
  3511. return ret;
  3512. #endif
  3513. #ifdef HAVE_PK_CALLBACKS
  3514. if (ssl->ctx->RsaDecCb) {
  3515. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  3516. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3517. }
  3518. else
  3519. #endif /* HAVE_PK_CALLBACKS */
  3520. {
  3521. #ifdef WC_RSA_BLINDING
  3522. ret = wc_RsaSetRNG(key, ssl->rng);
  3523. if (ret != 0)
  3524. return ret;
  3525. #endif
  3526. ret = wc_RsaPrivateDecryptInline(in, inSz, out, key);
  3527. }
  3528. /* Handle async pending response */
  3529. #ifdef WOLFSSL_ASYNC_CRYPT
  3530. if (ret == WC_PENDING_E) {
  3531. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3532. }
  3533. #endif /* WOLFSSL_ASYNC_CRYPT */
  3534. /* For positive response return in outSz */
  3535. if (ret > 0) {
  3536. *outSz = ret;
  3537. ret = 0;
  3538. }
  3539. WOLFSSL_LEAVE("RsaDec", ret);
  3540. return ret;
  3541. }
  3542. #endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
  3543. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  3544. RsaKey* key, buffer* keyBufInfo)
  3545. {
  3546. int ret;
  3547. #ifdef HAVE_PK_CALLBACKS
  3548. const byte* keyBuf = NULL;
  3549. word32 keySz = 0;
  3550. if (keyBufInfo) {
  3551. keyBuf = keyBufInfo->buffer;
  3552. keySz = keyBufInfo->length;
  3553. }
  3554. #endif
  3555. (void)ssl;
  3556. (void)keyBufInfo;
  3557. WOLFSSL_ENTER("RsaEnc");
  3558. #ifdef WOLFSSL_ASYNC_CRYPT
  3559. /* initialize event */
  3560. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3561. if (ret != 0)
  3562. return ret;
  3563. #endif
  3564. #ifdef HAVE_PK_CALLBACKS
  3565. if (ssl->ctx->RsaEncCb) {
  3566. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  3567. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  3568. }
  3569. else
  3570. #endif /* HAVE_PK_CALLBACKS */
  3571. {
  3572. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  3573. }
  3574. /* Handle async pending response */
  3575. #ifdef WOLFSSL_ASYNC_CRYPT
  3576. if (ret == WC_PENDING_E) {
  3577. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3578. }
  3579. #endif /* WOLFSSL_ASYNC_CRYPT */
  3580. /* For positive response return in outSz */
  3581. if (ret > 0) {
  3582. *outSz = ret;
  3583. ret = 0;
  3584. }
  3585. WOLFSSL_LEAVE("RsaEnc", ret);
  3586. return ret;
  3587. }
  3588. #endif /* !WOLFSSL_NO_TLS12 */
  3589. #endif /* NO_RSA */
  3590. #ifdef HAVE_ECC
  3591. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3592. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  3593. {
  3594. int ret;
  3595. #ifdef HAVE_PK_CALLBACKS
  3596. const byte* keyBuf = NULL;
  3597. word32 keySz = 0;
  3598. if (keyBufInfo) {
  3599. keyBuf = keyBufInfo->buffer;
  3600. keySz = keyBufInfo->length;
  3601. }
  3602. #endif
  3603. (void)ssl;
  3604. (void)keyBufInfo;
  3605. WOLFSSL_ENTER("EccSign");
  3606. #ifdef WOLFSSL_ASYNC_CRYPT
  3607. /* initialize event */
  3608. if (key) {
  3609. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3610. if (ret != 0)
  3611. return ret;
  3612. }
  3613. #endif
  3614. #if defined(HAVE_PK_CALLBACKS)
  3615. if (ssl->ctx->EccSignCb) {
  3616. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  3617. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  3618. keySz, ctx);
  3619. }
  3620. else
  3621. #endif /* HAVE_PK_CALLBACKS */
  3622. {
  3623. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  3624. }
  3625. /* Handle async pending response */
  3626. #ifdef WOLFSSL_ASYNC_CRYPT
  3627. if (key && ret == WC_PENDING_E) {
  3628. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3629. }
  3630. #endif /* WOLFSSL_ASYNC_CRYPT */
  3631. WOLFSSL_LEAVE("EccSign", ret);
  3632. return ret;
  3633. }
  3634. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  3635. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  3636. {
  3637. int ret;
  3638. #ifdef HAVE_PK_CALLBACKS
  3639. const byte* keyBuf = NULL;
  3640. word32 keySz = 0;
  3641. if (keyBufInfo) {
  3642. keyBuf = keyBufInfo->buffer;
  3643. keySz = keyBufInfo->length;
  3644. }
  3645. #endif
  3646. (void)ssl;
  3647. (void)keyBufInfo;
  3648. WOLFSSL_ENTER("EccVerify");
  3649. #ifdef WOLFSSL_ASYNC_CRYPT
  3650. /* initialize event */
  3651. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3652. if (ret != 0)
  3653. return ret;
  3654. #endif
  3655. #ifdef HAVE_PK_CALLBACKS
  3656. if (ssl->ctx->EccVerifyCb) {
  3657. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  3658. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3659. &ssl->eccVerifyRes, ctx);
  3660. }
  3661. else
  3662. #endif /* HAVE_PK_CALLBACKS */
  3663. {
  3664. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  3665. }
  3666. /* Handle async pending response */
  3667. #ifdef WOLFSSL_ASYNC_CRYPT
  3668. if (ret == WC_PENDING_E) {
  3669. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3670. }
  3671. else
  3672. #endif /* WOLFSSL_ASYNC_CRYPT */
  3673. {
  3674. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  3675. }
  3676. WOLFSSL_LEAVE("EccVerify", ret);
  3677. return ret;
  3678. }
  3679. #ifdef HAVE_PK_CALLBACKS
  3680. /* Gets ECC key for shared secret callback testing
  3681. * Client side: returns peer key
  3682. * Server side: returns private key
  3683. */
  3684. static int EccGetKey(WOLFSSL* ssl, ecc_key** otherKey)
  3685. {
  3686. int ret = NO_PEER_KEY;
  3687. ecc_key* tmpKey = NULL;
  3688. if (ssl == NULL || otherKey == NULL) {
  3689. return BAD_FUNC_ARG;
  3690. }
  3691. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  3692. if (ssl->specs.static_ecdh) {
  3693. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent ||
  3694. !ssl->peerEccDsaKey->dp) {
  3695. return NO_PEER_KEY;
  3696. }
  3697. tmpKey = (struct ecc_key*)ssl->peerEccDsaKey;
  3698. }
  3699. else {
  3700. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  3701. !ssl->peerEccKey->dp) {
  3702. return NO_PEER_KEY;
  3703. }
  3704. tmpKey = (struct ecc_key*)ssl->peerEccKey;
  3705. }
  3706. }
  3707. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  3708. if (ssl->specs.static_ecdh) {
  3709. if (ssl->hsKey == NULL) {
  3710. return NO_PRIVATE_KEY;
  3711. }
  3712. tmpKey = (struct ecc_key*)ssl->hsKey;
  3713. }
  3714. else {
  3715. if (!ssl->eccTempKeyPresent) {
  3716. return NO_PRIVATE_KEY;
  3717. }
  3718. tmpKey = (struct ecc_key*)ssl->eccTempKey;
  3719. }
  3720. }
  3721. if (tmpKey) {
  3722. *otherKey = tmpKey;
  3723. ret = 0;
  3724. }
  3725. return ret;
  3726. }
  3727. #endif /* HAVE_PK_CALLBACKS */
  3728. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  3729. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  3730. int side)
  3731. {
  3732. int ret;
  3733. #ifdef HAVE_PK_CALLBACKS
  3734. ecc_key* otherKey = NULL;
  3735. #endif
  3736. #ifdef WOLFSSL_ASYNC_CRYPT
  3737. WC_ASYNC_DEV* asyncDev = &priv_key->asyncDev;
  3738. #endif
  3739. (void)ssl;
  3740. (void)pubKeyDer;
  3741. (void)pubKeySz;
  3742. (void)side;
  3743. WOLFSSL_ENTER("EccSharedSecret");
  3744. #ifdef HAVE_PK_CALLBACKS
  3745. if (ssl->ctx->EccSharedSecretCb) {
  3746. ret = EccGetKey(ssl, &otherKey);
  3747. if (ret != 0)
  3748. return ret;
  3749. #ifdef WOLFSSL_ASYNC_CRYPT
  3750. asyncDev = &otherKey->asyncDev;
  3751. #endif
  3752. }
  3753. #endif
  3754. #ifdef WOLFSSL_ASYNC_CRYPT
  3755. /* initialize event */
  3756. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3757. if (ret != 0)
  3758. return ret;
  3759. #endif
  3760. #ifdef HAVE_PK_CALLBACKS
  3761. if (ssl->ctx->EccSharedSecretCb) {
  3762. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  3763. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  3764. pubKeySz, out, outlen, side, ctx);
  3765. }
  3766. else
  3767. #endif
  3768. {
  3769. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  3770. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \
  3771. !defined(HAVE_SELFTEST)
  3772. ret = wc_ecc_set_rng(priv_key, ssl->rng);
  3773. if (ret == 0)
  3774. #endif
  3775. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  3776. }
  3777. /* Handle async pending response */
  3778. #ifdef WOLFSSL_ASYNC_CRYPT
  3779. if (ret == WC_PENDING_E) {
  3780. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  3781. }
  3782. #endif /* WOLFSSL_ASYNC_CRYPT */
  3783. WOLFSSL_LEAVE("EccSharedSecret", ret);
  3784. return ret;
  3785. }
  3786. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  3787. {
  3788. int ret = 0;
  3789. int keySz = 0;
  3790. int ecc_curve = ECC_CURVE_DEF;
  3791. WOLFSSL_ENTER("EccMakeKey");
  3792. #ifdef WOLFSSL_ASYNC_CRYPT
  3793. /* initialize event */
  3794. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  3795. if (ret != 0)
  3796. return ret;
  3797. #endif
  3798. /* get key size */
  3799. if (peer == NULL || peer->dp == NULL) {
  3800. keySz = ssl->eccTempKeySz;
  3801. }
  3802. else {
  3803. keySz = peer->dp->size;
  3804. ecc_curve = peer->dp->id;
  3805. }
  3806. /* get curve type */
  3807. if (ssl->ecdhCurveOID > 0) {
  3808. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  3809. }
  3810. #ifdef HAVE_PK_CALLBACKS
  3811. if (ssl->ctx->EccKeyGenCb) {
  3812. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  3813. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  3814. }
  3815. else
  3816. #endif
  3817. {
  3818. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  3819. }
  3820. /* make sure the curve is set for TLS */
  3821. if (ret == 0 && key->dp) {
  3822. ssl->ecdhCurveOID = key->dp->oidSum;
  3823. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  3824. ssl->namedGroup = 0;
  3825. #endif
  3826. }
  3827. /* Handle async pending response */
  3828. #ifdef WOLFSSL_ASYNC_CRYPT
  3829. if (ret == WC_PENDING_E) {
  3830. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3831. }
  3832. #endif /* WOLFSSL_ASYNC_CRYPT */
  3833. WOLFSSL_LEAVE("EccMakeKey", ret);
  3834. return ret;
  3835. }
  3836. #endif /* HAVE_ECC */
  3837. #ifdef HAVE_ED25519
  3838. /* Check whether the key contains a public key.
  3839. * If not then pull it out of the leaf certificate.
  3840. *
  3841. * ssl SSL/TLS object.
  3842. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  3843. * 0 on success.
  3844. */
  3845. int Ed25519CheckPubKey(WOLFSSL* ssl)
  3846. {
  3847. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  3848. int ret = 0;
  3849. /* Public key required for signing. */
  3850. if (!key->pubKeySet) {
  3851. DerBuffer* leaf = ssl->buffers.certificate;
  3852. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert),
  3853. ssl->heap, DYNAMIC_TYPE_DCERT);
  3854. if (cert == NULL)
  3855. ret = MEMORY_E;
  3856. if (ret == 0) {
  3857. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  3858. ret = DecodeToKey(cert, 0);
  3859. }
  3860. if (ret == 0) {
  3861. ret = wc_ed25519_import_public(cert->publicKey, cert->pubKeySize,
  3862. key);
  3863. }
  3864. if (cert != NULL) {
  3865. FreeDecodedCert(cert);
  3866. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  3867. }
  3868. }
  3869. return ret;
  3870. }
  3871. /* Sign the data using EdDSA and key using Ed25519.
  3872. *
  3873. * ssl SSL object.
  3874. * in Data or message to sign.
  3875. * inSz Length of the data.
  3876. * out Buffer to hold signature.
  3877. * outSz On entry, size of the buffer. On exit, the size of the signature.
  3878. * key The private Ed25519 key data.
  3879. * keySz The length of the private key data in bytes.
  3880. * ctx The callback context.
  3881. * returns 0 on success, otherwise the value is an error.
  3882. */
  3883. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3884. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  3885. {
  3886. int ret;
  3887. #ifdef HAVE_PK_CALLBACKS
  3888. const byte* keyBuf = NULL;
  3889. word32 keySz = 0;
  3890. if (keyBufInfo) {
  3891. keyBuf = keyBufInfo->buffer;
  3892. keySz = keyBufInfo->length;
  3893. }
  3894. #endif
  3895. (void)ssl;
  3896. (void)keyBufInfo;
  3897. WOLFSSL_ENTER("Ed25519Sign");
  3898. #ifdef WOLFSSL_ASYNC_CRYPT
  3899. /* initialize event */
  3900. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3901. if (ret != 0)
  3902. return ret;
  3903. #endif
  3904. #if defined(HAVE_PK_CALLBACKS)
  3905. if (ssl->ctx->Ed25519SignCb) {
  3906. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  3907. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  3908. keySz, ctx);
  3909. }
  3910. else
  3911. #endif /* HAVE_PK_CALLBACKS */
  3912. {
  3913. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  3914. }
  3915. /* Handle async pending response */
  3916. #ifdef WOLFSSL_ASYNC_CRYPT
  3917. if (ret == WC_PENDING_E) {
  3918. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3919. }
  3920. #endif /* WOLFSSL_ASYNC_CRYPT */
  3921. WOLFSSL_LEAVE("Ed25519Sign", ret);
  3922. return ret;
  3923. }
  3924. /* Verify the data using EdDSA and key using Ed25519.
  3925. *
  3926. * ssl SSL object.
  3927. * in Signature data.
  3928. * inSz Length of the signature data in bytes.
  3929. * msg Message to verify.
  3930. * outSz Length of message in bytes.
  3931. * key The public Ed25519 key data.
  3932. * keySz The length of the private key data in bytes.
  3933. * ctx The callback context.
  3934. * returns 0 on success, otherwise the value is an error.
  3935. */
  3936. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  3937. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  3938. {
  3939. int ret;
  3940. #ifdef HAVE_PK_CALLBACKS
  3941. const byte* keyBuf = NULL;
  3942. word32 keySz = 0;
  3943. if (keyBufInfo) {
  3944. keyBuf = keyBufInfo->buffer;
  3945. keySz = keyBufInfo->length;
  3946. }
  3947. #endif
  3948. (void)ssl;
  3949. (void)keyBufInfo;
  3950. WOLFSSL_ENTER("Ed25519Verify");
  3951. #ifdef WOLFSSL_ASYNC_CRYPT
  3952. /* initialize event */
  3953. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3954. if (ret != 0)
  3955. return ret;
  3956. #endif
  3957. #ifdef HAVE_PK_CALLBACKS
  3958. if (ssl->ctx->Ed25519VerifyCb) {
  3959. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  3960. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  3961. keySz, &ssl->eccVerifyRes, ctx);
  3962. }
  3963. else
  3964. #endif /* HAVE_PK_CALLBACKS */
  3965. {
  3966. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  3967. &ssl->eccVerifyRes, key);
  3968. }
  3969. /* Handle async pending response */
  3970. #ifdef WOLFSSL_ASYNC_CRYPT
  3971. if (ret == WC_PENDING_E) {
  3972. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3973. }
  3974. else
  3975. #endif /* WOLFSSL_ASYNC_CRYPT */
  3976. {
  3977. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  3978. }
  3979. WOLFSSL_LEAVE("Ed25519Verify", ret);
  3980. return ret;
  3981. }
  3982. #endif /* HAVE_ED25519 */
  3983. #ifndef WOLFSSL_NO_TLS12
  3984. #ifdef HAVE_CURVE25519
  3985. #ifdef HAVE_PK_CALLBACKS
  3986. /* Gets X25519 key for shared secret callback testing
  3987. * Client side: returns peer key
  3988. * Server side: returns private key
  3989. */
  3990. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  3991. {
  3992. int ret = NO_PEER_KEY;
  3993. struct curve25519_key* tmpKey = NULL;
  3994. if (ssl == NULL || otherKey == NULL) {
  3995. return BAD_FUNC_ARG;
  3996. }
  3997. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  3998. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  3999. !ssl->peerX25519Key->dp) {
  4000. return NO_PEER_KEY;
  4001. }
  4002. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  4003. }
  4004. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4005. if (!ssl->eccTempKeyPresent) {
  4006. return NO_PRIVATE_KEY;
  4007. }
  4008. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  4009. }
  4010. if (tmpKey) {
  4011. *otherKey = (curve25519_key *)tmpKey;
  4012. ret = 0;
  4013. }
  4014. return ret;
  4015. }
  4016. #endif /* HAVE_PK_CALLBACKS */
  4017. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  4018. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  4019. byte* out, word32* outlen, int side)
  4020. {
  4021. int ret;
  4022. (void)ssl;
  4023. (void)pubKeyDer;
  4024. (void)pubKeySz;
  4025. (void)side;
  4026. WOLFSSL_ENTER("X25519SharedSecret");
  4027. #ifdef WOLFSSL_ASYNC_CRYPT
  4028. /* initialize event */
  4029. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4030. if (ret != 0)
  4031. return ret;
  4032. #endif
  4033. #ifdef HAVE_PK_CALLBACKS
  4034. if (ssl->ctx->X25519SharedSecretCb) {
  4035. curve25519_key* otherKey = NULL;
  4036. ret = X25519GetKey(ssl, &otherKey);
  4037. if (ret == 0) {
  4038. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  4039. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  4040. pubKeySz, out, outlen, side, ctx);
  4041. }
  4042. }
  4043. else
  4044. #endif
  4045. {
  4046. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  4047. EC25519_LITTLE_ENDIAN);
  4048. }
  4049. /* Handle async pending response */
  4050. #ifdef WOLFSSL_ASYNC_CRYPT
  4051. if (ret == WC_PENDING_E) {
  4052. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4053. }
  4054. #endif /* WOLFSSL_ASYNC_CRYPT */
  4055. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  4056. return ret;
  4057. }
  4058. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  4059. curve25519_key* peer)
  4060. {
  4061. int ret = 0;
  4062. (void)peer;
  4063. WOLFSSL_ENTER("X25519MakeKey");
  4064. #ifdef WOLFSSL_ASYNC_CRYPT
  4065. /* initialize event */
  4066. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4067. if (ret != 0)
  4068. return ret;
  4069. #endif
  4070. #ifdef HAVE_PK_CALLBACKS
  4071. if (ssl->ctx->X25519KeyGenCb) {
  4072. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  4073. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  4074. }
  4075. else
  4076. #endif
  4077. {
  4078. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  4079. }
  4080. if (ret == 0) {
  4081. ssl->ecdhCurveOID = ECC_X25519_OID;
  4082. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4083. ssl->namedGroup = 0;
  4084. #endif
  4085. }
  4086. /* Handle async pending response */
  4087. #ifdef WOLFSSL_ASYNC_CRYPT
  4088. if (ret == WC_PENDING_E) {
  4089. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4090. }
  4091. #endif /* WOLFSSL_ASYNC_CRYPT */
  4092. WOLFSSL_LEAVE("X25519MakeKey", ret);
  4093. return ret;
  4094. }
  4095. #endif /* HAVE_CURVE25519 */
  4096. #ifdef HAVE_ED448
  4097. /* Check whether the key contains a public key.
  4098. * If not then pull it out of the leaf certificate.
  4099. *
  4100. * ssl SSL/TLS object.
  4101. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4102. * 0 on success.
  4103. */
  4104. int Ed448CheckPubKey(WOLFSSL* ssl)
  4105. {
  4106. ed448_key* key = (ed448_key*)ssl->hsKey;
  4107. int ret = 0;
  4108. /* Public key required for signing. */
  4109. if (!key->pubKeySet) {
  4110. DerBuffer* leaf = ssl->buffers.certificate;
  4111. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert), ssl->heap,
  4112. DYNAMIC_TYPE_DCERT);
  4113. if (cert == NULL)
  4114. ret = MEMORY_E;
  4115. if (ret == 0) {
  4116. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4117. ret = DecodeToKey(cert, 0);
  4118. }
  4119. if (ret == 0) {
  4120. ret = wc_ed448_import_public(cert->publicKey, cert->pubKeySize,
  4121. key);
  4122. }
  4123. if (cert != NULL) {
  4124. FreeDecodedCert(cert);
  4125. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4126. }
  4127. }
  4128. return ret;
  4129. }
  4130. /* Sign the data using EdDSA and key using Ed448.
  4131. *
  4132. * ssl SSL object.
  4133. * in Data or message to sign.
  4134. * inSz Length of the data.
  4135. * out Buffer to hold signature.
  4136. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4137. * key The private Ed448 key data.
  4138. * keySz The length of the private key data in bytes.
  4139. * ctx The callback context.
  4140. * returns 0 on success, otherwise the value is an error.
  4141. */
  4142. int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4143. word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
  4144. {
  4145. int ret;
  4146. #ifdef HAVE_PK_CALLBACKS
  4147. const byte* keyBuf = NULL;
  4148. word32 keySz = 0;
  4149. if (keyBufInfo) {
  4150. keyBuf = keyBufInfo->buffer;
  4151. keySz = keyBufInfo->length;
  4152. }
  4153. #endif
  4154. (void)ssl;
  4155. (void)keyBufInfo;
  4156. WOLFSSL_ENTER("Ed448Sign");
  4157. #ifdef WOLFSSL_ASYNC_CRYPT
  4158. /* initialize event */
  4159. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4160. if (ret != 0)
  4161. return ret;
  4162. #endif
  4163. #if defined(HAVE_PK_CALLBACKS)
  4164. if (ssl->ctx->Ed448SignCb) {
  4165. void* ctx = wolfSSL_GetEd448SignCtx(ssl);
  4166. ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4167. ctx);
  4168. }
  4169. else
  4170. #endif /* HAVE_PK_CALLBACKS */
  4171. {
  4172. ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
  4173. }
  4174. /* Handle async pending response */
  4175. #ifdef WOLFSSL_ASYNC_CRYPT
  4176. if (ret == WC_PENDING_E) {
  4177. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4178. }
  4179. #endif /* WOLFSSL_ASYNC_CRYPT */
  4180. WOLFSSL_LEAVE("Ed448Sign", ret);
  4181. return ret;
  4182. }
  4183. /* Verify the data using EdDSA and key using Ed448.
  4184. *
  4185. * ssl SSL object.
  4186. * in Signature data.
  4187. * inSz Length of the signature data in bytes.
  4188. * msg Message to verify.
  4189. * outSz Length of message in bytes.
  4190. * key The public Ed448 key data.
  4191. * keySz The length of the private key data in bytes.
  4192. * ctx The callback context.
  4193. * returns 0 on success, otherwise the value is an error.
  4194. */
  4195. int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4196. word32 msgSz, ed448_key* key, buffer* keyBufInfo)
  4197. {
  4198. int ret;
  4199. #ifdef HAVE_PK_CALLBACKS
  4200. const byte* keyBuf = NULL;
  4201. word32 keySz = 0;
  4202. if (keyBufInfo) {
  4203. keyBuf = keyBufInfo->buffer;
  4204. keySz = keyBufInfo->length;
  4205. }
  4206. #endif
  4207. (void)ssl;
  4208. (void)keyBufInfo;
  4209. WOLFSSL_ENTER("Ed448Verify");
  4210. #ifdef WOLFSSL_ASYNC_CRYPT
  4211. /* initialize event */
  4212. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4213. if (ret != 0)
  4214. return ret;
  4215. #endif
  4216. #ifdef HAVE_PK_CALLBACKS
  4217. if (ssl->ctx->Ed448VerifyCb) {
  4218. void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
  4219. ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
  4220. &ssl->eccVerifyRes, ctx);
  4221. }
  4222. else
  4223. #endif /* HAVE_PK_CALLBACKS */
  4224. {
  4225. ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
  4226. NULL, 0);
  4227. }
  4228. /* Handle async pending response */
  4229. #ifdef WOLFSSL_ASYNC_CRYPT
  4230. if (ret == WC_PENDING_E) {
  4231. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4232. }
  4233. else
  4234. #endif /* WOLFSSL_ASYNC_CRYPT */
  4235. {
  4236. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4237. }
  4238. WOLFSSL_LEAVE("Ed448Verify", ret);
  4239. return ret;
  4240. }
  4241. #endif /* HAVE_ED448 */
  4242. #ifdef HAVE_CURVE448
  4243. #ifdef HAVE_PK_CALLBACKS
  4244. /* Gets X448 key for shared secret callback testing
  4245. * Client side: returns peer key
  4246. * Server side: returns private key
  4247. */
  4248. static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
  4249. {
  4250. int ret = NO_PEER_KEY;
  4251. struct curve448_key* tmpKey = NULL;
  4252. if (ssl == NULL || otherKey == NULL) {
  4253. return BAD_FUNC_ARG;
  4254. }
  4255. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4256. if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
  4257. return NO_PEER_KEY;
  4258. }
  4259. tmpKey = (struct curve448_key*)ssl->peerX448Key;
  4260. }
  4261. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4262. if (!ssl->eccTempKeyPresent) {
  4263. return NO_PRIVATE_KEY;
  4264. }
  4265. tmpKey = (struct curve448_key*)ssl->eccTempKey;
  4266. }
  4267. if (tmpKey) {
  4268. *otherKey = (curve448_key *)tmpKey;
  4269. ret = 0;
  4270. }
  4271. return ret;
  4272. }
  4273. #endif /* HAVE_PK_CALLBACKS */
  4274. static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
  4275. curve448_key* pub_key, byte* pubKeyDer,
  4276. word32* pubKeySz, byte* out, word32* outlen,
  4277. int side)
  4278. {
  4279. int ret;
  4280. (void)ssl;
  4281. (void)pubKeyDer;
  4282. (void)pubKeySz;
  4283. (void)side;
  4284. WOLFSSL_ENTER("X448SharedSecret");
  4285. #ifdef WOLFSSL_ASYNC_CRYPT
  4286. /* initialize event */
  4287. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4288. if (ret != 0)
  4289. return ret;
  4290. #endif
  4291. #ifdef HAVE_PK_CALLBACKS
  4292. if (ssl->ctx->X448SharedSecretCb) {
  4293. curve448_key* otherKey = NULL;
  4294. ret = X448GetKey(ssl, &otherKey);
  4295. if (ret == 0) {
  4296. void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
  4297. ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
  4298. pubKeySz, out, outlen, side, ctx);
  4299. }
  4300. }
  4301. else
  4302. #endif
  4303. {
  4304. ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
  4305. EC448_LITTLE_ENDIAN);
  4306. }
  4307. /* Handle async pending response */
  4308. #ifdef WOLFSSL_ASYNC_CRYPT
  4309. if (ret == WC_PENDING_E) {
  4310. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4311. }
  4312. #endif /* WOLFSSL_ASYNC_CRYPT */
  4313. WOLFSSL_LEAVE("X448SharedSecret", ret);
  4314. return ret;
  4315. }
  4316. static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
  4317. {
  4318. int ret = 0;
  4319. (void)peer;
  4320. WOLFSSL_ENTER("X448MakeKey");
  4321. #ifdef WOLFSSL_ASYNC_CRYPT
  4322. /* initialize event */
  4323. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4324. if (ret != 0)
  4325. return ret;
  4326. #endif
  4327. #ifdef HAVE_PK_CALLBACKS
  4328. if (ssl->ctx->X448KeyGenCb) {
  4329. void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
  4330. ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
  4331. }
  4332. else
  4333. #endif
  4334. {
  4335. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  4336. }
  4337. if (ret == 0) {
  4338. ssl->ecdhCurveOID = ECC_X448_OID;
  4339. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4340. ssl->namedGroup = 0;
  4341. #endif
  4342. }
  4343. /* Handle async pending response */
  4344. #ifdef WOLFSSL_ASYNC_CRYPT
  4345. if (ret == WC_PENDING_E) {
  4346. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4347. }
  4348. #endif /* WOLFSSL_ASYNC_CRYPT */
  4349. WOLFSSL_LEAVE("X448MakeKey", ret);
  4350. return ret;
  4351. }
  4352. #endif /* HAVE_CURVE448 */
  4353. #if !defined(NO_CERTS) || !defined(NO_PSK)
  4354. #if !defined(NO_DH)
  4355. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  4356. byte* priv, word32* privSz,
  4357. byte* pub, word32* pubSz)
  4358. {
  4359. int ret;
  4360. WOLFSSL_ENTER("DhGenKeyPair");
  4361. #ifdef WOLFSSL_ASYNC_CRYPT
  4362. /* initialize event */
  4363. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4364. if (ret != 0)
  4365. return ret;
  4366. #endif
  4367. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  4368. /* Handle async pending response */
  4369. #ifdef WOLFSSL_ASYNC_CRYPT
  4370. if (ret == WC_PENDING_E) {
  4371. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  4372. }
  4373. #endif /* WOLFSSL_ASYNC_CRYPT */
  4374. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  4375. return ret;
  4376. }
  4377. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  4378. const byte* priv, word32 privSz,
  4379. const byte* otherPub, word32 otherPubSz,
  4380. byte* agree, word32* agreeSz)
  4381. {
  4382. int ret;
  4383. (void)ssl;
  4384. WOLFSSL_ENTER("DhAgree");
  4385. #ifdef WOLFSSL_ASYNC_CRYPT
  4386. /* initialize event */
  4387. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4388. if (ret != 0)
  4389. return ret;
  4390. #endif
  4391. #ifdef HAVE_PK_CALLBACKS
  4392. if (ssl->ctx->DhAgreeCb) {
  4393. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  4394. WOLFSSL_MSG("Calling DhAgree Callback Function");
  4395. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  4396. otherPub, otherPubSz, agree, agreeSz, ctx);
  4397. }
  4398. else
  4399. #endif
  4400. {
  4401. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  4402. ret = wc_DhCheckPubValue(ssl->buffers.serverDH_P.buffer,
  4403. ssl->buffers.serverDH_P.length, otherPub, otherPubSz);
  4404. if (ret != 0) {
  4405. #ifdef OPENSSL_EXTRA
  4406. SendAlert(ssl, alert_fatal, illegal_parameter);
  4407. #endif
  4408. }
  4409. else
  4410. #endif
  4411. {
  4412. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  4413. otherPubSz);
  4414. }
  4415. }
  4416. /* Handle async pending response */
  4417. #ifdef WOLFSSL_ASYNC_CRYPT
  4418. if (ret == WC_PENDING_E) {
  4419. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  4420. }
  4421. #endif /* WOLFSSL_ASYNC_CRYPT */
  4422. WOLFSSL_LEAVE("DhAgree", ret);
  4423. return ret;
  4424. }
  4425. #endif /* !NO_DH */
  4426. #endif /* !NO_CERTS || !NO_PSK */
  4427. #endif /* !WOLFSSL_NO_TLS12 */
  4428. #ifdef HAVE_PK_CALLBACKS
  4429. int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
  4430. {
  4431. int pkcbset = 0;
  4432. (void)ssl;
  4433. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  4434. !defined(NO_RSA)
  4435. if (0
  4436. #ifdef HAVE_ECC
  4437. || (ssl->ctx->EccSignCb != NULL &&
  4438. ssl->buffers.keyType == ecc_dsa_sa_algo)
  4439. #endif
  4440. #ifdef HAVE_ED25519
  4441. || (ssl->ctx->Ed25519SignCb != NULL &&
  4442. ssl->buffers.keyType == ed25519_sa_algo)
  4443. #endif
  4444. #ifdef HAVE_ED448
  4445. || (ssl->ctx->Ed448SignCb != NULL &&
  4446. ssl->buffers.keyType == ed448_sa_algo)
  4447. #endif
  4448. #ifndef NO_RSA
  4449. || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
  4450. || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
  4451. #ifdef WC_RSA_PSS
  4452. || (ssl->ctx->RsaPssSignCb != NULL &&
  4453. ssl->buffers.keyType == rsa_pss_sa_algo)
  4454. #endif
  4455. #endif
  4456. ) {
  4457. pkcbset = 1;
  4458. }
  4459. #endif
  4460. return pkcbset;
  4461. }
  4462. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  4463. {
  4464. int pkcbset = 0;
  4465. (void)ctx;
  4466. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  4467. !defined(NO_RSA)
  4468. if (0
  4469. #ifdef HAVE_ECC
  4470. || ctx->EccSignCb != NULL
  4471. #endif
  4472. #ifdef HAVE_ED25519
  4473. || ctx->Ed25519SignCb != NULL
  4474. #endif
  4475. #ifdef HAVE_ED448
  4476. || ctx->Ed448SignCb != NULL
  4477. #endif
  4478. #ifndef NO_RSA
  4479. || ctx->RsaSignCb != NULL
  4480. || ctx->RsaDecCb != NULL
  4481. #ifdef WC_RSA_PSS
  4482. || ctx->RsaPssSignCb != NULL
  4483. #endif
  4484. #endif
  4485. ) {
  4486. pkcbset = 1;
  4487. }
  4488. #endif
  4489. return pkcbset;
  4490. }
  4491. #endif /* HAVE_PK_CALLBACKS */
  4492. int InitSSL_Suites(WOLFSSL* ssl)
  4493. {
  4494. int keySz = 0;
  4495. byte havePSK = 0;
  4496. byte haveAnon = 0;
  4497. byte haveRSA = 0;
  4498. byte haveMcast = 0;
  4499. (void)haveAnon; /* Squash unused var warnings */
  4500. (void)haveMcast;
  4501. if (!ssl)
  4502. return BAD_FUNC_ARG;
  4503. #ifndef NO_RSA
  4504. haveRSA = 1;
  4505. #endif
  4506. #ifndef NO_PSK
  4507. havePSK = (byte)ssl->options.havePSK;
  4508. #endif /* NO_PSK */
  4509. #ifdef HAVE_ANON
  4510. haveAnon = (byte)ssl->options.haveAnon;
  4511. #endif /* HAVE_ANON*/
  4512. #ifdef WOLFSSL_MULTICAST
  4513. haveMcast = (byte)ssl->options.haveMcast;
  4514. #endif /* WOLFSSL_MULTICAST */
  4515. #ifdef WOLFSSL_EARLY_DATA
  4516. if (ssl->options.side == WOLFSSL_SERVER_END)
  4517. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  4518. #endif
  4519. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  4520. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  4521. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  4522. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  4523. ssl->buffers.keyType == ed25519_sa_algo ||
  4524. ssl->buffers.keyType == ed448_sa_algo;
  4525. #endif
  4526. #ifndef NO_CERTS
  4527. keySz = ssl->buffers.keySz;
  4528. #endif
  4529. /* make sure server has DH parms, and add PSK if there, add NTRU too */
  4530. if (ssl->options.side == WOLFSSL_SERVER_END) {
  4531. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  4532. ssl->options.haveDH, ssl->options.haveNTRU,
  4533. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4534. ssl->options.haveStaticECC, ssl->options.haveAnon,
  4535. ssl->options.side);
  4536. }
  4537. else {
  4538. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  4539. TRUE, ssl->options.haveNTRU,
  4540. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4541. ssl->options.haveStaticECC, ssl->options.haveAnon,
  4542. ssl->options.side);
  4543. }
  4544. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  4545. /* make sure server has cert and key unless using PSK, Anon, or
  4546. * Multicast. This should be true even if just switching ssl ctx */
  4547. if (ssl->options.side == WOLFSSL_SERVER_END &&
  4548. !havePSK && !haveAnon && !haveMcast) {
  4549. /* server certificate must be loaded */
  4550. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  4551. WOLFSSL_MSG("Server missing certificate");
  4552. return NO_PRIVATE_KEY;
  4553. }
  4554. /* allow no private key if using PK callbacks and CB is set */
  4555. #ifdef HAVE_PK_CALLBACKS
  4556. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  4557. WOLFSSL_MSG("Using PK for server private key");
  4558. }
  4559. else
  4560. #endif
  4561. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  4562. WOLFSSL_MSG("Server missing private key");
  4563. return NO_PRIVATE_KEY;
  4564. }
  4565. }
  4566. #endif
  4567. return WOLFSSL_SUCCESS;
  4568. }
  4569. /* returns new reference count. Arg incr positive=up or negative=down */
  4570. int SSL_CTX_RefCount(WOLFSSL_CTX* ctx, int incr)
  4571. {
  4572. int refCount;
  4573. if (ctx == NULL) {
  4574. return BAD_FUNC_ARG;
  4575. }
  4576. if (wc_LockMutex(&ctx->countMutex) != 0) {
  4577. WOLFSSL_MSG("Couldn't lock CTX count mutex");
  4578. return BAD_MUTEX_E;
  4579. }
  4580. ctx->refCount += incr;
  4581. /* make sure refCount is never negative */
  4582. if (ctx->refCount < 0) {
  4583. ctx->refCount = 0;
  4584. }
  4585. refCount = ctx->refCount;
  4586. wc_UnLockMutex(&ctx->countMutex);
  4587. return refCount;
  4588. }
  4589. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  4590. It is used during initialization and to switch an ssl's CTX with
  4591. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  4592. unless writeDup is on.
  4593. ssl object to initialize
  4594. ctx parent factory
  4595. writeDup flag indicating this is a write dup only
  4596. WOLFSSL_SUCCESS return value on success */
  4597. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  4598. {
  4599. int ret;
  4600. byte newSSL;
  4601. if (!ssl || !ctx)
  4602. return BAD_FUNC_ARG;
  4603. #ifndef SINGLE_THREADED
  4604. if (ssl->suites == NULL && !writeDup)
  4605. return BAD_FUNC_ARG;
  4606. #endif
  4607. newSSL = ssl->ctx == NULL; /* Assign after null check */
  4608. #ifndef NO_PSK
  4609. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  4610. return BAD_FUNC_ARG; /* needed for copy below */
  4611. }
  4612. #endif
  4613. /* decrement previous CTX reference count if exists.
  4614. * This should only happen if switching ctxs!*/
  4615. if (!newSSL) {
  4616. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  4617. wolfSSL_CTX_free(ssl->ctx);
  4618. }
  4619. /* increment CTX reference count */
  4620. if ((ret = SSL_CTX_RefCount(ctx, 1)) < 0) {
  4621. return ret;
  4622. }
  4623. ret = WOLFSSL_SUCCESS; /* set default ret */
  4624. ssl->ctx = ctx; /* only for passing to calls, options could change */
  4625. ssl->version = ctx->method->version;
  4626. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  4627. ssl->options.mask = ctx->mask;
  4628. #endif
  4629. #ifdef OPENSSL_EXTRA
  4630. #ifdef WOLFSSL_TLS13
  4631. if (ssl->version.minor == TLSv1_3_MINOR &&
  4632. (ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  4633. if (!ctx->method->downgrade) {
  4634. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
  4635. "allowed and downgrading disabled.");
  4636. return VERSION_ERROR;
  4637. }
  4638. WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
  4639. ssl->version.minor = TLSv1_2_MINOR;
  4640. }
  4641. #endif
  4642. if (ssl->version.minor == TLSv1_2_MINOR &&
  4643. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  4644. if (!ctx->method->downgrade) {
  4645. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
  4646. "allowed and downgrading disabled.");
  4647. return VERSION_ERROR;
  4648. }
  4649. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  4650. ssl->version.minor = TLSv1_1_MINOR;
  4651. }
  4652. if (ssl->version.minor == TLSv1_1_MINOR &&
  4653. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  4654. if (!ctx->method->downgrade) {
  4655. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
  4656. "allowed and downgrading disabled.");
  4657. return VERSION_ERROR;
  4658. }
  4659. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  4660. ssl->options.tls1_1 = 0;
  4661. ssl->version.minor = TLSv1_MINOR;
  4662. }
  4663. if (ssl->version.minor == TLSv1_MINOR &&
  4664. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  4665. if (!ctx->method->downgrade) {
  4666. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
  4667. "allowed and downgrading disabled.");
  4668. return VERSION_ERROR;
  4669. }
  4670. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  4671. ssl->options.tls = 0;
  4672. ssl->options.tls1_1 = 0;
  4673. ssl->version.minor = SSLv3_MINOR;
  4674. }
  4675. if (ssl->version.minor == SSLv3_MINOR &&
  4676. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  4677. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  4678. return VERSION_ERROR;
  4679. }
  4680. if (ssl->version.minor < ssl->options.minDowngrade) {
  4681. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  4682. return VERSION_ERROR;
  4683. }
  4684. #endif
  4685. #ifdef HAVE_ECC
  4686. ssl->eccTempKeySz = ctx->eccTempKeySz;
  4687. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  4688. #endif
  4689. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  4690. ssl->pkCurveOID = ctx->pkCurveOID;
  4691. #endif
  4692. #ifdef OPENSSL_EXTRA
  4693. ssl->CBIS = ctx->CBIS;
  4694. #endif
  4695. ssl->timeout = ctx->timeout;
  4696. ssl->verifyCallback = ctx->verifyCallback;
  4697. ssl->options.side = ctx->method->side;
  4698. ssl->options.downgrade = ctx->method->downgrade;
  4699. ssl->options.minDowngrade = ctx->minDowngrade;
  4700. ssl->options.haveDH = ctx->haveDH;
  4701. ssl->options.haveNTRU = ctx->haveNTRU;
  4702. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  4703. ssl->options.haveECC = ctx->haveECC;
  4704. ssl->options.haveStaticECC = ctx->haveStaticECC;
  4705. #ifndef NO_PSK
  4706. ssl->options.havePSK = ctx->havePSK;
  4707. ssl->options.client_psk_cb = ctx->client_psk_cb;
  4708. ssl->options.server_psk_cb = ctx->server_psk_cb;
  4709. ssl->options.psk_ctx = ctx->psk_ctx;
  4710. #ifdef WOLFSSL_TLS13
  4711. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  4712. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  4713. #endif
  4714. #endif /* NO_PSK */
  4715. #ifdef WOLFSSL_EARLY_DATA
  4716. if (ssl->options.side == WOLFSSL_SERVER_END)
  4717. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  4718. #endif
  4719. #ifdef HAVE_ANON
  4720. ssl->options.haveAnon = ctx->haveAnon;
  4721. #endif
  4722. #ifndef NO_DH
  4723. ssl->options.minDhKeySz = ctx->minDhKeySz;
  4724. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  4725. #endif
  4726. #ifndef NO_RSA
  4727. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  4728. #endif
  4729. #ifdef HAVE_ECC
  4730. ssl->options.minEccKeySz = ctx->minEccKeySz;
  4731. #endif
  4732. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  4733. ssl->options.verifyDepth = ctx->verifyDepth;
  4734. #endif
  4735. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  4736. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  4737. #ifdef HAVE_EXT_CACHE
  4738. ssl->options.internalCacheOff = ctx->internalCacheOff;
  4739. #endif
  4740. ssl->options.verifyPeer = ctx->verifyPeer;
  4741. ssl->options.verifyNone = ctx->verifyNone;
  4742. ssl->options.failNoCert = ctx->failNoCert;
  4743. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  4744. ssl->options.sendVerify = ctx->sendVerify;
  4745. ssl->options.partialWrite = ctx->partialWrite;
  4746. ssl->options.quietShutdown = ctx->quietShutdown;
  4747. ssl->options.groupMessages = ctx->groupMessages;
  4748. #ifndef NO_DH
  4749. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  4750. !defined(HAVE_SELFTEST)
  4751. ssl->options.dhKeyTested = ctx->dhKeyTested;
  4752. #endif
  4753. ssl->buffers.serverDH_P = ctx->serverDH_P;
  4754. ssl->buffers.serverDH_G = ctx->serverDH_G;
  4755. #endif
  4756. #ifndef NO_CERTS
  4757. /* ctx still owns certificate, certChain, key, dh, and cm */
  4758. ssl->buffers.certificate = ctx->certificate;
  4759. ssl->buffers.certChain = ctx->certChain;
  4760. #ifdef WOLFSSL_TLS13
  4761. ssl->buffers.certChainCnt = ctx->certChainCnt;
  4762. #endif
  4763. ssl->buffers.key = ctx->privateKey;
  4764. ssl->buffers.keyType = ctx->privateKeyType;
  4765. ssl->buffers.keyId = ctx->privateKeyId;
  4766. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  4767. ssl->buffers.keySz = ctx->privateKeySz;
  4768. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  4769. #endif
  4770. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  4771. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  4772. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  4773. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  4774. ssl->buffers.keyType == ed25519_sa_algo ||
  4775. ssl->buffers.keyType == ed448_sa_algo;
  4776. #endif
  4777. #ifdef WOLFSSL_ASYNC_CRYPT
  4778. ssl->devId = ctx->devId;
  4779. #endif
  4780. if (writeDup == 0) {
  4781. #ifndef NO_PSK
  4782. if (ctx->server_hint[0]) { /* set in CTX */
  4783. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  4784. sizeof(ssl->arrays->server_hint));
  4785. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  4786. }
  4787. #endif /* NO_PSK */
  4788. if (ctx->suites) {
  4789. #ifndef SINGLE_THREADED
  4790. *ssl->suites = *ctx->suites;
  4791. #else
  4792. ssl->suites = ctx->suites;
  4793. #endif
  4794. }
  4795. else {
  4796. XMEMSET(ssl->suites, 0, sizeof(Suites));
  4797. }
  4798. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  4799. /* Defer initializing suites until accept or connect */
  4800. ret = InitSSL_Suites(ssl);
  4801. }
  4802. } /* writeDup check */
  4803. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  4804. if (ctx->mask != 0 && wolfSSL_set_options(ssl, ctx->mask) == 0) {
  4805. WOLFSSL_MSG("wolfSSL_set_options error");
  4806. return BAD_FUNC_ARG;
  4807. }
  4808. #endif
  4809. #ifdef WOLFSSL_SESSION_EXPORT
  4810. #ifdef WOLFSSL_DTLS
  4811. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  4812. #endif
  4813. #endif
  4814. ssl->CBIORecv = ctx->CBIORecv;
  4815. ssl->CBIOSend = ctx->CBIOSend;
  4816. #ifdef OPENSSL_EXTRA
  4817. ssl->readAhead = ctx->readAhead;
  4818. #endif
  4819. ssl->verifyDepth = ctx->verifyDepth;
  4820. return ret;
  4821. }
  4822. int InitHandshakeHashes(WOLFSSL* ssl)
  4823. {
  4824. int ret;
  4825. /* make sure existing handshake hashes are free'd */
  4826. if (ssl->hsHashes != NULL) {
  4827. FreeHandshakeHashes(ssl);
  4828. }
  4829. /* allocate handshake hashes */
  4830. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  4831. DYNAMIC_TYPE_HASHES);
  4832. if (ssl->hsHashes == NULL) {
  4833. WOLFSSL_MSG("HS_Hashes Memory error");
  4834. return MEMORY_E;
  4835. }
  4836. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  4837. #ifndef NO_OLD_TLS
  4838. #ifndef NO_MD5
  4839. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  4840. if (ret != 0)
  4841. return ret;
  4842. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4843. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  4844. #endif
  4845. #endif
  4846. #ifndef NO_SHA
  4847. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  4848. if (ret != 0)
  4849. return ret;
  4850. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4851. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  4852. #endif
  4853. #endif
  4854. #endif /* !NO_OLD_TLS */
  4855. #ifndef NO_SHA256
  4856. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  4857. if (ret != 0)
  4858. return ret;
  4859. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4860. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  4861. #endif
  4862. #endif
  4863. #ifdef WOLFSSL_SHA384
  4864. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  4865. if (ret != 0)
  4866. return ret;
  4867. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4868. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  4869. #endif
  4870. #endif
  4871. #ifdef WOLFSSL_SHA512
  4872. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  4873. if (ret != 0)
  4874. return ret;
  4875. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4876. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  4877. #endif
  4878. #endif
  4879. return ret;
  4880. }
  4881. void FreeHandshakeHashes(WOLFSSL* ssl)
  4882. {
  4883. if (ssl->hsHashes) {
  4884. #ifndef NO_OLD_TLS
  4885. #ifndef NO_MD5
  4886. wc_Md5Free(&ssl->hsHashes->hashMd5);
  4887. #endif
  4888. #ifndef NO_SHA
  4889. wc_ShaFree(&ssl->hsHashes->hashSha);
  4890. #endif
  4891. #endif /* !NO_OLD_TLS */
  4892. #ifndef NO_SHA256
  4893. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  4894. #endif
  4895. #ifdef WOLFSSL_SHA384
  4896. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  4897. #endif
  4898. #ifdef WOLFSSL_SHA512
  4899. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  4900. #endif
  4901. #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \
  4902. !defined(WOLFSSL_NO_CLIENT_AUTH)
  4903. if (ssl->hsHashes->messages != NULL) {
  4904. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  4905. ssl->hsHashes->messages = NULL;
  4906. }
  4907. #endif
  4908. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  4909. ssl->hsHashes = NULL;
  4910. }
  4911. }
  4912. /* init everything to 0, NULL, default values before calling anything that may
  4913. fail so that destructor has a "good" state to cleanup
  4914. ssl object to initialize
  4915. ctx parent factory
  4916. writeDup flag indicating this is a write dup only
  4917. 0 on success */
  4918. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  4919. {
  4920. int ret;
  4921. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  4922. #if defined(WOLFSSL_STATIC_MEMORY)
  4923. if (ctx->heap != NULL) {
  4924. WOLFSSL_HEAP_HINT* ssl_hint;
  4925. WOLFSSL_HEAP_HINT* ctx_hint;
  4926. /* avoid dereferencing a test value */
  4927. #ifdef WOLFSSL_HEAP_TEST
  4928. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  4929. ssl->heap = ctx->heap;
  4930. }
  4931. else {
  4932. #endif
  4933. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  4934. ctx->heap, DYNAMIC_TYPE_SSL);
  4935. if (ssl->heap == NULL) {
  4936. return MEMORY_E;
  4937. }
  4938. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  4939. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  4940. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  4941. /* lock and check IO count / handshake count */
  4942. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  4943. WOLFSSL_MSG("Bad memory_mutex lock");
  4944. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  4945. ssl->heap = NULL; /* free and set to NULL for IO counter */
  4946. return BAD_MUTEX_E;
  4947. }
  4948. if (ctx_hint->memory->maxHa > 0 &&
  4949. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  4950. WOLFSSL_MSG("At max number of handshakes for static memory");
  4951. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4952. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  4953. ssl->heap = NULL; /* free and set to NULL for IO counter */
  4954. return MEMORY_E;
  4955. }
  4956. if (ctx_hint->memory->maxIO > 0 &&
  4957. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  4958. WOLFSSL_MSG("At max number of IO allowed for static memory");
  4959. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4960. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  4961. ssl->heap = NULL; /* free and set to NULL for IO counter */
  4962. return MEMORY_E;
  4963. }
  4964. ctx_hint->memory->curIO++;
  4965. ctx_hint->memory->curHa++;
  4966. ssl_hint->memory = ctx_hint->memory;
  4967. ssl_hint->haFlag = 1;
  4968. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4969. /* check if tracking stats */
  4970. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  4971. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  4972. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  4973. if (ssl_hint->stats == NULL) {
  4974. return MEMORY_E;
  4975. }
  4976. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  4977. }
  4978. /* check if using fixed IO buffers */
  4979. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  4980. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  4981. WOLFSSL_MSG("Bad memory_mutex lock");
  4982. return BAD_MUTEX_E;
  4983. }
  4984. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  4985. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4986. return MEMORY_E;
  4987. }
  4988. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  4989. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4990. return MEMORY_E;
  4991. }
  4992. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  4993. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  4994. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4995. return MEMORY_E;
  4996. }
  4997. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4998. }
  4999. #ifdef WOLFSSL_HEAP_TEST
  5000. }
  5001. #endif
  5002. }
  5003. else {
  5004. ssl->heap = ctx->heap;
  5005. }
  5006. #else
  5007. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  5008. #endif /* WOLFSSL_STATIC_MEMORY */
  5009. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  5010. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5011. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  5012. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5013. #ifdef KEEP_PEER_CERT
  5014. InitX509(&ssl->peerCert, 0, ssl->heap);
  5015. #endif
  5016. ssl->rfd = -1; /* set to invalid descriptor */
  5017. ssl->wfd = -1;
  5018. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  5019. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  5020. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  5021. #ifdef HAVE_NETX
  5022. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  5023. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  5024. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  5025. ssl->mnCtx = mynewt_ctx_new();
  5026. if(!ssl->mnCtx) {
  5027. return MEMORY_E;
  5028. }
  5029. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  5030. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  5031. #elif defined (WOLFSSL_GNRC)
  5032. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  5033. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  5034. #endif
  5035. /* initialize states */
  5036. ssl->options.serverState = NULL_STATE;
  5037. ssl->options.clientState = NULL_STATE;
  5038. ssl->options.connectState = CONNECT_BEGIN;
  5039. ssl->options.acceptState = ACCEPT_BEGIN;
  5040. ssl->options.handShakeState = NULL_STATE;
  5041. ssl->options.processReply = doProcessInit;
  5042. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  5043. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  5044. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  5045. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  5046. #ifndef NO_DH
  5047. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5048. !defined(HAVE_SELFTEST)
  5049. ssl->options.dhDoKeyTest = 1;
  5050. #endif
  5051. #endif
  5052. #ifdef WOLFSSL_DTLS
  5053. #ifdef WOLFSSL_SCTP
  5054. ssl->options.dtlsSctp = ctx->dtlsSctp;
  5055. #endif
  5056. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  5057. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  5058. ssl->dtls_expected_rx = ssl->dtlsMtuSz;
  5059. #else
  5060. ssl->dtls_expected_rx = MAX_MTU;
  5061. #endif
  5062. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  5063. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  5064. ssl->dtls_timeout = ssl->dtls_timeout_init;
  5065. ssl->buffers.dtlsCtx.rfd = -1;
  5066. ssl->buffers.dtlsCtx.wfd = -1;
  5067. #endif
  5068. #ifndef WOLFSSL_AEAD_ONLY
  5069. #ifndef NO_OLD_TLS
  5070. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  5071. #elif !defined(WOLFSSL_NO_TLS12)
  5072. ssl->hmac = TLS_hmac;
  5073. #endif
  5074. #endif
  5075. #if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
  5076. /* Save arrays by default for OpenVPN */
  5077. ssl->options.saveArrays = 1;
  5078. #endif
  5079. ssl->cipher.ssl = ssl;
  5080. #ifdef HAVE_EXTENDED_MASTER
  5081. ssl->options.haveEMS = ctx->haveEMS;
  5082. #endif
  5083. ssl->options.useClientOrder = ctx->useClientOrder;
  5084. ssl->options.mutualAuth = ctx->mutualAuth;
  5085. #ifdef WOLFSSL_STATIC_EPHEMERAL
  5086. ssl->staticKE = ctx->staticKE;
  5087. #endif
  5088. #ifdef WOLFSSL_TLS13
  5089. #ifdef HAVE_SESSION_TICKET
  5090. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  5091. #endif
  5092. ssl->options.noPskDheKe = ctx->noPskDheKe;
  5093. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5094. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  5095. #endif
  5096. if (ctx->numGroups > 0) {
  5097. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  5098. ssl->numGroups = ctx->numGroups;
  5099. }
  5100. #endif
  5101. #ifdef HAVE_TLS_EXTENSIONS
  5102. #ifdef HAVE_MAX_FRAGMENT
  5103. ssl->max_fragment = MAX_RECORD_SIZE;
  5104. #endif
  5105. #ifdef HAVE_ALPN
  5106. ssl->alpn_client_list = NULL;
  5107. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  5108. ssl->alpnSelect = ctx->alpnSelect;
  5109. ssl->alpnSelectArg = ctx->alpnSelectArg;
  5110. #endif
  5111. #endif
  5112. #ifdef HAVE_SUPPORTED_CURVES
  5113. ssl->options.userCurves = ctx->userCurves;
  5114. #endif
  5115. #endif /* HAVE_TLS_EXTENSIONS */
  5116. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  5117. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  5118. #endif
  5119. /* default alert state (none) */
  5120. ssl->alert_history.last_rx.code = -1;
  5121. ssl->alert_history.last_rx.level = -1;
  5122. ssl->alert_history.last_tx.code = -1;
  5123. ssl->alert_history.last_tx.level = -1;
  5124. #ifdef OPENSSL_EXTRA
  5125. /* copy over application session context ID */
  5126. ssl->sessionCtxSz = ctx->sessionCtxSz;
  5127. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  5128. ssl->cbioFlag = ctx->cbioFlag;
  5129. #endif
  5130. InitCiphers(ssl);
  5131. InitCipherSpecs(&ssl->specs);
  5132. /* all done with init, now can return errors, call other stuff */
  5133. if (!writeDup) {
  5134. /* arrays */
  5135. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  5136. DYNAMIC_TYPE_ARRAYS);
  5137. if (ssl->arrays == NULL) {
  5138. WOLFSSL_MSG("Arrays Memory error");
  5139. return MEMORY_E;
  5140. }
  5141. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  5142. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  5143. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  5144. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  5145. DYNAMIC_TYPE_SECRET);
  5146. if (ssl->arrays->preMasterSecret == NULL) {
  5147. return MEMORY_E;
  5148. }
  5149. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  5150. #endif
  5151. #ifdef OPENSSL_EXTRA
  5152. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  5153. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  5154. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  5155. WOLFSSL_MSG("ssl->param memory error");
  5156. return MEMORY_E;
  5157. }
  5158. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  5159. #endif
  5160. #ifdef SINGLE_THREADED
  5161. if (ctx->suites == NULL)
  5162. #endif
  5163. {
  5164. /* suites */
  5165. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  5166. DYNAMIC_TYPE_SUITES);
  5167. if (ssl->suites == NULL) {
  5168. WOLFSSL_MSG("Suites Memory error");
  5169. return MEMORY_E;
  5170. }
  5171. #ifdef OPENSSL_ALL
  5172. ssl->suites->stack = NULL;
  5173. #endif
  5174. #ifdef SINGLE_THREADED
  5175. ssl->options.ownSuites = 1;
  5176. #endif
  5177. }
  5178. #ifdef SINGLE_THREADED
  5179. else {
  5180. ssl->options.ownSuites = 0;
  5181. }
  5182. #endif
  5183. }
  5184. /* Initialize SSL with the appropriate fields from it's ctx */
  5185. /* requires valid arrays and suites unless writeDup ing */
  5186. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS)
  5187. return ret;
  5188. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  5189. #ifdef SINGLE_THREADED
  5190. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  5191. #endif
  5192. if (ssl->rng == NULL) {
  5193. /* RNG */
  5194. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  5195. if (ssl->rng == NULL) {
  5196. WOLFSSL_MSG("RNG Memory error");
  5197. return MEMORY_E;
  5198. }
  5199. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  5200. ssl->options.weOwnRng = 1;
  5201. /* FIPS RNG API does not accept a heap hint */
  5202. #ifndef HAVE_FIPS
  5203. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  5204. WOLFSSL_MSG("RNG Init error");
  5205. return ret;
  5206. }
  5207. #else
  5208. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  5209. WOLFSSL_MSG("RNG Init error");
  5210. return ret;
  5211. }
  5212. #endif
  5213. }
  5214. #ifdef HAVE_WRITE_DUP
  5215. if (writeDup) {
  5216. /* all done */
  5217. return 0;
  5218. }
  5219. #endif
  5220. /* hsHashes */
  5221. ret = InitHandshakeHashes(ssl);
  5222. if (ret != 0)
  5223. return ret;
  5224. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  5225. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  5226. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  5227. if (ret != 0) {
  5228. WOLFSSL_MSG("DTLS Cookie Secret error");
  5229. return ret;
  5230. }
  5231. }
  5232. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  5233. #ifdef HAVE_SECRET_CALLBACK
  5234. ssl->sessionSecretCb = NULL;
  5235. ssl->sessionSecretCtx = NULL;
  5236. #ifdef WOLFSSL_TLS13
  5237. ssl->tls13SecretCb = NULL;
  5238. ssl->tls13SecretCtx = NULL;
  5239. #endif
  5240. #endif
  5241. #ifdef HAVE_SESSION_TICKET
  5242. ssl->options.noTicketTls12 = ctx->noTicketTls12;
  5243. ssl->session.ticket = ssl->session.staticTicket;
  5244. #endif
  5245. #ifdef WOLFSSL_MULTICAST
  5246. if (ctx->haveMcast) {
  5247. int i;
  5248. ssl->options.haveMcast = 1;
  5249. ssl->options.mcastID = ctx->mcastID;
  5250. /* Force the state to look like handshake has completed. */
  5251. /* Keying material is supplied externally. */
  5252. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  5253. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  5254. ssl->options.connectState = SECOND_REPLY_DONE;
  5255. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  5256. ssl->options.handShakeState = HANDSHAKE_DONE;
  5257. ssl->options.handShakeDone = 1;
  5258. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  5259. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  5260. }
  5261. #endif
  5262. #ifdef HAVE_SECURE_RENEGOTIATION
  5263. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5264. int useSecureReneg = ssl->ctx->useSecureReneg;
  5265. /* use secure renegotiation by default (not recommend) */
  5266. #ifdef WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT
  5267. useSecureReneg = 1;
  5268. #endif
  5269. if (useSecureReneg) {
  5270. ret = wolfSSL_UseSecureRenegotiation(ssl);
  5271. if (ret != WOLFSSL_SUCCESS)
  5272. return ret;
  5273. }
  5274. }
  5275. #endif /* HAVE_SECURE_RENEGOTIATION */
  5276. return 0;
  5277. }
  5278. /* free use of temporary arrays */
  5279. void FreeArrays(WOLFSSL* ssl, int keep)
  5280. {
  5281. if (ssl->arrays) {
  5282. if (keep) {
  5283. /* keeps session id for user retrieval */
  5284. XMEMCPY(ssl->session.sessionID, ssl->arrays->sessionID, ID_LEN);
  5285. ssl->session.sessionIDSz = ssl->arrays->sessionIDSz;
  5286. }
  5287. if (ssl->arrays->preMasterSecret) {
  5288. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  5289. ssl->arrays->preMasterSecret = NULL;
  5290. }
  5291. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  5292. ssl->arrays->pendingMsg = NULL;
  5293. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  5294. }
  5295. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  5296. ssl->arrays = NULL;
  5297. }
  5298. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  5299. {
  5300. if (ssl && pKey && *pKey) {
  5301. switch (type) {
  5302. #ifndef NO_RSA
  5303. case DYNAMIC_TYPE_RSA:
  5304. wc_FreeRsaKey((RsaKey*)*pKey);
  5305. break;
  5306. #endif /* ! NO_RSA */
  5307. #ifdef HAVE_ECC
  5308. case DYNAMIC_TYPE_ECC:
  5309. wc_ecc_free((ecc_key*)*pKey);
  5310. break;
  5311. #endif /* HAVE_ECC */
  5312. #ifdef HAVE_ED25519
  5313. case DYNAMIC_TYPE_ED25519:
  5314. wc_ed25519_free((ed25519_key*)*pKey);
  5315. break;
  5316. #endif /* HAVE_ED25519 */
  5317. #ifdef HAVE_CURVE25519
  5318. case DYNAMIC_TYPE_CURVE25519:
  5319. wc_curve25519_free((curve25519_key*)*pKey);
  5320. break;
  5321. #endif /* HAVE_CURVE25519 */
  5322. #ifdef HAVE_ED448
  5323. case DYNAMIC_TYPE_ED448:
  5324. wc_ed448_free((ed448_key*)*pKey);
  5325. break;
  5326. #endif /* HAVE_ED448 */
  5327. #ifdef HAVE_CURVE448
  5328. case DYNAMIC_TYPE_CURVE448:
  5329. wc_curve448_free((curve448_key*)*pKey);
  5330. break;
  5331. #endif /* HAVE_CURVE448 */
  5332. #ifndef NO_DH
  5333. case DYNAMIC_TYPE_DH:
  5334. wc_FreeDhKey((DhKey*)*pKey);
  5335. break;
  5336. #endif /* !NO_DH */
  5337. default:
  5338. break;
  5339. }
  5340. XFREE(*pKey, ssl->heap, type);
  5341. /* Reset pointer */
  5342. *pKey = NULL;
  5343. }
  5344. }
  5345. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  5346. {
  5347. int ret = BAD_FUNC_ARG;
  5348. int sz = 0;
  5349. if (ssl == NULL || pKey == NULL) {
  5350. return BAD_FUNC_ARG;
  5351. }
  5352. /* Sanity check key destination */
  5353. if (*pKey != NULL) {
  5354. WOLFSSL_MSG("Key already present!");
  5355. return BAD_STATE_E;
  5356. }
  5357. /* Determine size */
  5358. switch (type) {
  5359. #ifndef NO_RSA
  5360. case DYNAMIC_TYPE_RSA:
  5361. sz = sizeof(RsaKey);
  5362. break;
  5363. #endif /* ! NO_RSA */
  5364. #ifdef HAVE_ECC
  5365. case DYNAMIC_TYPE_ECC:
  5366. sz = sizeof(ecc_key);
  5367. break;
  5368. #endif /* HAVE_ECC */
  5369. #ifdef HAVE_ED25519
  5370. case DYNAMIC_TYPE_ED25519:
  5371. sz = sizeof(ed25519_key);
  5372. break;
  5373. #endif /* HAVE_ED25519 */
  5374. #ifdef HAVE_CURVE25519
  5375. case DYNAMIC_TYPE_CURVE25519:
  5376. sz = sizeof(curve25519_key);
  5377. break;
  5378. #endif /* HAVE_CURVE25519 */
  5379. #ifdef HAVE_ED448
  5380. case DYNAMIC_TYPE_ED448:
  5381. sz = sizeof(ed448_key);
  5382. break;
  5383. #endif /* HAVE_ED448 */
  5384. #ifdef HAVE_CURVE448
  5385. case DYNAMIC_TYPE_CURVE448:
  5386. sz = sizeof(curve448_key);
  5387. break;
  5388. #endif /* HAVE_CURVE448 */
  5389. #ifndef NO_DH
  5390. case DYNAMIC_TYPE_DH:
  5391. sz = sizeof(DhKey);
  5392. break;
  5393. #endif /* !NO_DH */
  5394. default:
  5395. return BAD_FUNC_ARG;
  5396. }
  5397. if (sz == 0) {
  5398. return NOT_COMPILED_IN;
  5399. }
  5400. /* Allocate memory for key */
  5401. *pKey = (void *)XMALLOC(sz, ssl->heap, type);
  5402. if (*pKey == NULL) {
  5403. return MEMORY_E;
  5404. }
  5405. /* Initialize key */
  5406. switch (type) {
  5407. #ifndef NO_RSA
  5408. case DYNAMIC_TYPE_RSA:
  5409. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  5410. break;
  5411. #endif /* ! NO_RSA */
  5412. #ifdef HAVE_ECC
  5413. case DYNAMIC_TYPE_ECC:
  5414. ret = wc_ecc_init_ex((ecc_key*)*pKey, ssl->heap, ssl->devId);
  5415. break;
  5416. #endif /* HAVE_ECC */
  5417. #ifdef HAVE_ED25519
  5418. case DYNAMIC_TYPE_ED25519:
  5419. wc_ed25519_init((ed25519_key*)*pKey);
  5420. ret = 0;
  5421. break;
  5422. #endif /* HAVE_CURVE25519 */
  5423. #ifdef HAVE_CURVE25519
  5424. case DYNAMIC_TYPE_CURVE25519:
  5425. wc_curve25519_init((curve25519_key*)*pKey);
  5426. ret = 0;
  5427. break;
  5428. #endif /* HAVE_CURVE25519 */
  5429. #ifdef HAVE_ED448
  5430. case DYNAMIC_TYPE_ED448:
  5431. wc_ed448_init((ed448_key*)*pKey);
  5432. ret = 0;
  5433. break;
  5434. #endif /* HAVE_CURVE448 */
  5435. #ifdef HAVE_CURVE448
  5436. case DYNAMIC_TYPE_CURVE448:
  5437. wc_curve448_init((curve448_key*)*pKey);
  5438. ret = 0;
  5439. break;
  5440. #endif /* HAVE_CURVE448 */
  5441. #ifndef NO_DH
  5442. case DYNAMIC_TYPE_DH:
  5443. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  5444. break;
  5445. #endif /* !NO_DH */
  5446. default:
  5447. return BAD_FUNC_ARG;
  5448. }
  5449. /* On error free handshake key */
  5450. if (ret != 0) {
  5451. FreeKey(ssl, type, pKey);
  5452. }
  5453. return ret;
  5454. }
  5455. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  5456. defined(HAVE_CURVE25519) || defined(HHAVE_ED448) || defined(HAVE_CURVE448)
  5457. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  5458. {
  5459. int ret = 0;
  5460. (void)ssl;
  5461. switch (type) {
  5462. #ifndef NO_RSA
  5463. case DYNAMIC_TYPE_RSA:
  5464. wc_FreeRsaKey((RsaKey*)pKey);
  5465. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  5466. break;
  5467. #endif /* ! NO_RSA */
  5468. #ifdef HAVE_ECC
  5469. case DYNAMIC_TYPE_ECC:
  5470. wc_ecc_free((ecc_key*)pKey);
  5471. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  5472. break;
  5473. #endif /* HAVE_ECC */
  5474. #ifdef HAVE_ED25519
  5475. case DYNAMIC_TYPE_ED25519:
  5476. wc_ed25519_free((ed25519_key*)pKey);
  5477. ret = wc_ed25519_init((ed25519_key*)pKey);
  5478. break;
  5479. #endif /* HAVE_CURVE25519 */
  5480. #ifdef HAVE_CURVE25519
  5481. case DYNAMIC_TYPE_CURVE25519:
  5482. wc_curve25519_free((curve25519_key*)pKey);
  5483. ret = wc_curve25519_init((curve25519_key*)pKey);
  5484. break;
  5485. #endif /* HAVE_CURVE25519 */
  5486. #ifdef HAVE_ED448
  5487. case DYNAMIC_TYPE_ED448:
  5488. wc_ed448_free((ed448_key*)pKey);
  5489. ret = wc_ed448_init((ed448_key*)pKey);
  5490. break;
  5491. #endif /* HAVE_CURVE448 */
  5492. #ifdef HAVE_CURVE448
  5493. case DYNAMIC_TYPE_CURVE448:
  5494. wc_curve448_free((curve448_key*)pKey);
  5495. ret = wc_curve448_init((curve448_key*)pKey);
  5496. break;
  5497. #endif /* HAVE_CURVE448 */
  5498. #ifndef NO_DH
  5499. case DYNAMIC_TYPE_DH:
  5500. wc_FreeDhKey((DhKey*)pKey);
  5501. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  5502. break;
  5503. #endif /* !NO_DH */
  5504. default:
  5505. return BAD_FUNC_ARG;
  5506. }
  5507. return ret;
  5508. }
  5509. #endif
  5510. void FreeKeyExchange(WOLFSSL* ssl)
  5511. {
  5512. /* Cleanup signature buffer */
  5513. if (ssl->buffers.sig.buffer) {
  5514. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  5515. ssl->buffers.sig.buffer = NULL;
  5516. ssl->buffers.sig.length = 0;
  5517. }
  5518. /* Cleanup digest buffer */
  5519. if (ssl->buffers.digest.buffer) {
  5520. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  5521. ssl->buffers.digest.buffer = NULL;
  5522. ssl->buffers.digest.length = 0;
  5523. }
  5524. /* Free handshake key */
  5525. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  5526. #ifndef NO_DH
  5527. /* Free temp DH key */
  5528. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  5529. #endif
  5530. /* Cleanup async */
  5531. #ifdef WOLFSSL_ASYNC_CRYPT
  5532. if (ssl->async.freeArgs) {
  5533. ssl->async.freeArgs(ssl, ssl->async.args);
  5534. ssl->async.freeArgs = NULL;
  5535. }
  5536. FreeBuildMsgArgs(ssl, &ssl->async.buildArgs);
  5537. #endif
  5538. }
  5539. /* Free up all memory used by Suites structure from WOLFSSL */
  5540. void FreeSuites(WOLFSSL* ssl)
  5541. {
  5542. #ifdef SINGLE_THREADED
  5543. if (ssl->options.ownSuites)
  5544. #endif
  5545. {
  5546. #ifdef OPENSSL_ALL
  5547. wolfSSL_sk_SSL_CIPHER_free(ssl->suites->stack);
  5548. #endif
  5549. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  5550. }
  5551. ssl->suites = NULL;
  5552. }
  5553. /* In case holding SSL object in array and don't want to free actual ssl */
  5554. void SSL_ResourceFree(WOLFSSL* ssl)
  5555. {
  5556. /* Note: any resources used during the handshake should be released in the
  5557. * function FreeHandshakeResources(). Be careful with the special cases
  5558. * like the RNG which may optionally be kept for the whole session. (For
  5559. * example with the RNG, it isn't used beyond the handshake except when
  5560. * using stream ciphers where it is retained. */
  5561. FreeCiphers(ssl);
  5562. FreeArrays(ssl, 0);
  5563. FreeKeyExchange(ssl);
  5564. if (ssl->options.weOwnRng) {
  5565. wc_FreeRng(ssl->rng);
  5566. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  5567. }
  5568. FreeSuites(ssl);
  5569. FreeHandshakeHashes(ssl);
  5570. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  5571. /* clear keys struct after session */
  5572. ForceZero(&ssl->keys, sizeof(Keys));
  5573. #ifdef WOLFSSL_TLS13
  5574. if (ssl->options.tls1_3) {
  5575. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  5576. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  5577. }
  5578. #endif
  5579. #ifndef NO_DH
  5580. if (ssl->buffers.serverDH_Priv.buffer) {
  5581. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  5582. ssl->buffers.serverDH_Priv.length);
  5583. }
  5584. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5585. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5586. /* parameters (p,g) may be owned by ctx */
  5587. if (ssl->buffers.weOwnDH) {
  5588. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5589. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5590. }
  5591. #endif /* !NO_DH */
  5592. #ifndef NO_CERTS
  5593. ssl->keepCert = 0; /* make sure certificate is free'd */
  5594. wolfSSL_UnloadCertsKeys(ssl);
  5595. #endif
  5596. #ifndef NO_RSA
  5597. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  5598. ssl->peerRsaKeyPresent = 0;
  5599. #endif
  5600. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  5601. XFREE(ssl->peerTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
  5602. #endif
  5603. if (ssl->buffers.inputBuffer.dynamicFlag)
  5604. ShrinkInputBuffer(ssl, FORCED_FREE);
  5605. if (ssl->buffers.outputBuffer.dynamicFlag)
  5606. ShrinkOutputBuffer(ssl);
  5607. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  5608. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  5609. DYNAMIC_TYPE_COOKIE_PWD);
  5610. #endif
  5611. #ifdef WOLFSSL_DTLS
  5612. DtlsMsgPoolReset(ssl);
  5613. if (ssl->dtls_rx_msg_list != NULL) {
  5614. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  5615. ssl->dtls_rx_msg_list = NULL;
  5616. ssl->dtls_rx_msg_list_sz = 0;
  5617. }
  5618. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  5619. ssl->buffers.dtlsCtx.peer.sa = NULL;
  5620. #ifndef NO_WOLFSSL_SERVER
  5621. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  5622. DYNAMIC_TYPE_COOKIE_PWD);
  5623. #endif
  5624. #endif /* WOLFSSL_DTLS */
  5625. #ifdef OPENSSL_EXTRA
  5626. #ifndef NO_BIO
  5627. if (ssl->biord != ssl->biowr) /* only free write if different */
  5628. wolfSSL_BIO_free(ssl->biowr);
  5629. wolfSSL_BIO_free(ssl->biord); /* always free read bio */
  5630. ssl->biowr = NULL;
  5631. ssl->biord = NULL;
  5632. #endif
  5633. #endif
  5634. #ifdef HAVE_LIBZ
  5635. FreeStreams(ssl);
  5636. #endif
  5637. #ifdef HAVE_ECC
  5638. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  5639. ssl->peerEccKeyPresent = 0;
  5640. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  5641. ssl->peerEccDsaKeyPresent = 0;
  5642. #endif
  5643. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
  5644. {
  5645. int dtype = 0;
  5646. #ifdef HAVE_ECC
  5647. dtype = DYNAMIC_TYPE_ECC;
  5648. #endif
  5649. #ifdef HAVE_CURVE25519
  5650. if (ssl->peerX25519KeyPresent
  5651. #ifdef HAVE_ECC
  5652. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
  5653. #endif /* HAVE_ECC */
  5654. )
  5655. {
  5656. dtype = DYNAMIC_TYPE_CURVE25519;
  5657. }
  5658. #endif /* HAVE_CURVE25519 */
  5659. #ifdef HAVE_CURVE448
  5660. if (ssl->peerX448KeyPresent
  5661. #ifdef HAVE_ECC
  5662. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
  5663. #endif /* HAVE_ECC */
  5664. )
  5665. {
  5666. dtype = DYNAMIC_TYPE_CURVE448;
  5667. }
  5668. #endif /* HAVE_CURVE448 */
  5669. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  5670. ssl->eccTempKeyPresent = 0;
  5671. }
  5672. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  5673. #ifdef HAVE_CURVE25519
  5674. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  5675. ssl->peerX25519KeyPresent = 0;
  5676. #endif
  5677. #ifdef HAVE_ED25519
  5678. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  5679. ssl->peerEd25519KeyPresent = 0;
  5680. #ifdef HAVE_PK_CALLBACKS
  5681. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  5682. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  5683. DYNAMIC_TYPE_ED25519);
  5684. ssl->buffers.peerEd25519Key.buffer = NULL;
  5685. }
  5686. #endif
  5687. #endif
  5688. #ifdef HAVE_CURVE448
  5689. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  5690. ssl->peerX448KeyPresent = 0;
  5691. #endif
  5692. #ifdef HAVE_ED448
  5693. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  5694. ssl->peerEd448KeyPresent = 0;
  5695. #ifdef HAVE_PK_CALLBACKS
  5696. if (ssl->buffers.peerEd448Key.buffer != NULL) {
  5697. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
  5698. DYNAMIC_TYPE_ED448);
  5699. ssl->buffers.peerEd448Key.buffer = NULL;
  5700. }
  5701. #endif
  5702. #endif
  5703. #ifdef HAVE_PK_CALLBACKS
  5704. #ifdef HAVE_ECC
  5705. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  5706. #endif /* HAVE_ECC */
  5707. #ifndef NO_RSA
  5708. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  5709. #endif /* NO_RSA */
  5710. #endif /* HAVE_PK_CALLBACKS */
  5711. #ifdef HAVE_TLS_EXTENSIONS
  5712. TLSX_FreeAll(ssl->extensions, ssl->heap);
  5713. #ifdef HAVE_ALPN
  5714. if (ssl->alpn_client_list != NULL) {
  5715. XFREE(ssl->alpn_client_list, ssl->heap, DYNAMIC_TYPE_ALPN);
  5716. ssl->alpn_client_list = NULL;
  5717. }
  5718. #endif
  5719. #endif /* HAVE_TLS_EXTENSIONS */
  5720. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  5721. if (ssl->mnCtx) {
  5722. mynewt_ctx_clear(ssl->mnCtx);
  5723. ssl->mnCtx = NULL;
  5724. }
  5725. #endif
  5726. #ifdef HAVE_NETX
  5727. if (ssl->nxCtx.nxPacket)
  5728. nx_packet_release(ssl->nxCtx.nxPacket);
  5729. #endif
  5730. #ifdef KEEP_PEER_CERT
  5731. FreeX509(&ssl->peerCert);
  5732. #endif
  5733. #ifdef HAVE_SESSION_TICKET
  5734. if (ssl->session.isDynamic) {
  5735. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  5736. ssl->session.ticket = ssl->session.staticTicket;
  5737. ssl->session.isDynamic = 0;
  5738. ssl->session.ticketLen = 0;
  5739. }
  5740. #endif
  5741. #ifdef HAVE_EXT_CACHE
  5742. wolfSSL_SESSION_free(ssl->extSession);
  5743. #endif
  5744. #ifdef HAVE_WRITE_DUP
  5745. if (ssl->dupWrite) {
  5746. FreeWriteDup(ssl);
  5747. }
  5748. #endif
  5749. #ifdef OPENSSL_EXTRA
  5750. if (ssl->param) {
  5751. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  5752. }
  5753. #endif
  5754. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5755. while (ssl->certReqCtx != NULL) {
  5756. CertReqCtx* curr = ssl->certReqCtx;
  5757. ssl->certReqCtx = curr->next;
  5758. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5759. }
  5760. #endif
  5761. #ifdef WOLFSSL_STATIC_EPHEMERAL
  5762. #ifndef NO_DH
  5763. if (ssl->staticKE.dhKey && ssl->staticKE.dhKey != ssl->ctx->staticKE.dhKey)
  5764. FreeDer(&ssl->staticKE.dhKey);
  5765. #endif
  5766. #ifdef HAVE_ECC
  5767. if (ssl->staticKE.ecKey && ssl->staticKE.ecKey != ssl->ctx->staticKE.ecKey)
  5768. FreeDer(&ssl->staticKE.ecKey);
  5769. #endif
  5770. #endif
  5771. #ifdef WOLFSSL_STATIC_MEMORY
  5772. /* check if using fixed io buffers and free them */
  5773. if (ssl->heap != NULL) {
  5774. #ifdef WOLFSSL_HEAP_TEST
  5775. /* avoid dereferencing a test value */
  5776. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  5777. #endif
  5778. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  5779. WOLFSSL_HEAP* ctx_heap;
  5780. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  5781. ctx_heap = ssl_hint->memory;
  5782. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  5783. WOLFSSL_MSG("Bad memory_mutex lock");
  5784. }
  5785. ctx_heap->curIO--;
  5786. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  5787. WOLFSSL_MSG("Error freeing fixed output buffer");
  5788. }
  5789. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  5790. WOLFSSL_MSG("Error freeing fixed output buffer");
  5791. }
  5792. if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/
  5793. ctx_heap->curHa--;
  5794. }
  5795. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  5796. /* check if tracking stats */
  5797. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  5798. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  5799. }
  5800. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  5801. #ifdef WOLFSSL_HEAP_TEST
  5802. }
  5803. #endif
  5804. }
  5805. #endif /* WOLFSSL_STATIC_MEMORY */
  5806. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  5807. wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
  5808. wolfSSL_sk_X509_free(ssl->peerCertChain);
  5809. #endif
  5810. }
  5811. /* Free any handshake resources no longer needed */
  5812. void FreeHandshakeResources(WOLFSSL* ssl)
  5813. {
  5814. WOLFSSL_ENTER("FreeHandshakeResources");
  5815. #ifdef WOLFSSL_DTLS
  5816. /* DTLS_POOL */
  5817. if (ssl->options.dtls) {
  5818. DtlsMsgPoolReset(ssl);
  5819. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  5820. ssl->dtls_rx_msg_list = NULL;
  5821. ssl->dtls_rx_msg_list_sz = 0;
  5822. }
  5823. #endif
  5824. #ifdef HAVE_SECURE_RENEGOTIATION
  5825. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  5826. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  5827. return;
  5828. }
  5829. #endif
  5830. /* input buffer */
  5831. if (ssl->buffers.inputBuffer.dynamicFlag)
  5832. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  5833. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5834. if (!ssl->options.tls1_3)
  5835. #endif
  5836. {
  5837. #ifndef OPENSSL_ALL
  5838. /* free suites unless using compatibility layer */
  5839. FreeSuites(ssl);
  5840. #endif
  5841. /* hsHashes */
  5842. FreeHandshakeHashes(ssl);
  5843. }
  5844. /* RNG */
  5845. if (ssl->options.tls1_1 == 0
  5846. #ifndef WOLFSSL_AEAD_ONLY
  5847. || ssl->specs.cipher_type == stream
  5848. #endif
  5849. #if defined(WOLFSSL_TLS13)
  5850. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5851. || ssl->options.tls1_3
  5852. #elif !defined(HAVE_SESSION_TICKET)
  5853. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  5854. #endif
  5855. #endif
  5856. ) {
  5857. if (ssl->options.weOwnRng) {
  5858. wc_FreeRng(ssl->rng);
  5859. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  5860. ssl->rng = NULL;
  5861. ssl->options.weOwnRng = 0;
  5862. }
  5863. }
  5864. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  5865. defined(HAVE_SESSION_TICKET)
  5866. if (!ssl->options.tls1_3)
  5867. #endif
  5868. /* arrays */
  5869. if (ssl->options.saveArrays == 0)
  5870. FreeArrays(ssl, 1);
  5871. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5872. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  5873. #endif
  5874. {
  5875. #ifndef NO_RSA
  5876. /* peerRsaKey */
  5877. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  5878. ssl->peerRsaKeyPresent = 0;
  5879. #endif
  5880. #ifdef HAVE_ECC
  5881. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  5882. ssl->peerEccDsaKeyPresent = 0;
  5883. #endif /* HAVE_ECC */
  5884. #ifdef HAVE_ED25519
  5885. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  5886. ssl->peerEd25519KeyPresent = 0;
  5887. #endif /* HAVE_ED25519 */
  5888. #ifdef HAVE_ED448
  5889. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  5890. ssl->peerEd448KeyPresent = 0;
  5891. #endif /* HAVE_ED448 */
  5892. }
  5893. #ifdef HAVE_ECC
  5894. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  5895. ssl->peerEccKeyPresent = 0;
  5896. #endif
  5897. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  5898. {
  5899. int dtype;
  5900. #ifdef HAVE_ECC
  5901. dtype = DYNAMIC_TYPE_ECC;
  5902. #elif defined(HAVE_CURVE25519)
  5903. dtype = DYNAMIC_TYPE_CURVE25519;
  5904. #else
  5905. dtype = DYNAMIC_TYPE_CURVE448;
  5906. #endif
  5907. #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
  5908. if (ssl->peerX25519KeyPresent ||
  5909. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  5910. {
  5911. dtype = DYNAMIC_TYPE_CURVE25519;
  5912. }
  5913. #endif
  5914. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  5915. defined(HAVE_CURVE448)
  5916. if (ssl->peerX448KeyPresent ||
  5917. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
  5918. {
  5919. dtype = DYNAMIC_TYPE_CURVE448;
  5920. }
  5921. #endif
  5922. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  5923. ssl->eccTempKeyPresent = 0;
  5924. }
  5925. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  5926. #ifdef HAVE_CURVE25519
  5927. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  5928. ssl->peerX25519KeyPresent = 0;
  5929. #endif
  5930. #ifdef HAVE_CURVE448
  5931. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  5932. ssl->peerX448KeyPresent = 0;
  5933. #endif
  5934. #ifndef NO_DH
  5935. if (ssl->buffers.serverDH_Priv.buffer) {
  5936. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  5937. ssl->buffers.serverDH_Priv.length);
  5938. }
  5939. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5940. ssl->buffers.serverDH_Priv.buffer = NULL;
  5941. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5942. ssl->buffers.serverDH_Pub.buffer = NULL;
  5943. /* parameters (p,g) may be owned by ctx */
  5944. if (ssl->buffers.weOwnDH) {
  5945. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5946. ssl->buffers.serverDH_G.buffer = NULL;
  5947. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5948. ssl->buffers.serverDH_P.buffer = NULL;
  5949. }
  5950. #endif /* !NO_DH */
  5951. #ifndef NO_CERTS
  5952. wolfSSL_UnloadCertsKeys(ssl);
  5953. #endif
  5954. #ifdef HAVE_PK_CALLBACKS
  5955. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5956. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  5957. #endif
  5958. {
  5959. #ifdef HAVE_ECC
  5960. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  5961. ssl->buffers.peerEccDsaKey.buffer = NULL;
  5962. #endif /* HAVE_ECC */
  5963. #ifndef NO_RSA
  5964. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  5965. ssl->buffers.peerRsaKey.buffer = NULL;
  5966. #endif /* NO_RSA */
  5967. #ifdef HAVE_ED25519
  5968. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  5969. DYNAMIC_TYPE_ED25519);
  5970. ssl->buffers.peerEd25519Key.buffer = NULL;
  5971. #endif
  5972. #ifdef HAVE_ED448
  5973. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
  5974. ssl->buffers.peerEd448Key.buffer = NULL;
  5975. #endif
  5976. }
  5977. #endif /* HAVE_PK_CALLBACKS */
  5978. #ifdef HAVE_QSH
  5979. QSH_FreeAll(ssl);
  5980. #endif
  5981. #ifdef HAVE_SESSION_TICKET
  5982. if (ssl->session.isDynamic) {
  5983. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  5984. ssl->session.ticket = ssl->session.staticTicket;
  5985. ssl->session.isDynamic = 0;
  5986. ssl->session.ticketLen = 0;
  5987. }
  5988. #endif
  5989. #if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \
  5990. !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5991. /* Some extensions need to be kept for post-handshake querying. */
  5992. TLSX_FreeAll(ssl->extensions, ssl->heap);
  5993. ssl->extensions = NULL;
  5994. #endif
  5995. #ifdef WOLFSSL_STATIC_MEMORY
  5996. /* when done with handshake decrement current handshake count */
  5997. if (ssl->heap != NULL) {
  5998. #ifdef WOLFSSL_HEAP_TEST
  5999. /* avoid dereferencing a test value */
  6000. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  6001. #endif
  6002. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  6003. WOLFSSL_HEAP* ctx_heap;
  6004. ctx_heap = ssl_hint->memory;
  6005. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  6006. WOLFSSL_MSG("Bad memory_mutex lock");
  6007. }
  6008. ctx_heap->curHa--;
  6009. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  6010. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  6011. #ifdef WOLFSSL_HEAP_TEST
  6012. }
  6013. #endif
  6014. }
  6015. #endif /* WOLFSSL_STATIC_MEMORY */
  6016. }
  6017. /* heap argument is the heap hint used when creating SSL */
  6018. void FreeSSL(WOLFSSL* ssl, void* heap)
  6019. {
  6020. if (ssl->ctx) {
  6021. FreeSSL_Ctx(ssl->ctx); /* will decrement and free underlying CTX if 0 */
  6022. }
  6023. SSL_ResourceFree(ssl);
  6024. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  6025. (void)heap;
  6026. }
  6027. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  6028. !defined(WOLFSSL_NO_TLS12) || \
  6029. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \
  6030. && defined(HAVE_AEAD))
  6031. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  6032. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  6033. {
  6034. if (verify) {
  6035. seq[0] = ssl->keys.peer_sequence_number_hi;
  6036. seq[1] = ssl->keys.peer_sequence_number_lo++;
  6037. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  6038. /* handle rollover */
  6039. ssl->keys.peer_sequence_number_hi++;
  6040. }
  6041. }
  6042. else {
  6043. seq[0] = ssl->keys.sequence_number_hi;
  6044. seq[1] = ssl->keys.sequence_number_lo++;
  6045. if (seq[1] > ssl->keys.sequence_number_lo) {
  6046. /* handle rollover */
  6047. ssl->keys.sequence_number_hi++;
  6048. }
  6049. }
  6050. }
  6051. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  6052. #ifdef WOLFSSL_DTLS
  6053. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  6054. {
  6055. #ifdef HAVE_SECURE_RENEGOTIATION
  6056. order = DtlsCheckOrder(ssl, order);
  6057. #endif
  6058. if (order == PREV_ORDER) {
  6059. /* Previous epoch case */
  6060. if (ssl->options.haveMcast) {
  6061. #ifdef WOLFSSL_MULTICAST
  6062. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  6063. (ssl->options.mcastID << 8) |
  6064. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  6065. #endif
  6066. }
  6067. else
  6068. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  6069. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  6070. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  6071. }
  6072. else if (order == PEER_ORDER) {
  6073. if (ssl->options.haveMcast) {
  6074. #ifdef WOLFSSL_MULTICAST
  6075. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  6076. (ssl->keys.curPeerId << 8) |
  6077. (ssl->keys.curSeq_hi & 0xFF);
  6078. #endif
  6079. }
  6080. else
  6081. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  6082. (ssl->keys.curSeq_hi & 0xFFFF);
  6083. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  6084. }
  6085. else {
  6086. if (ssl->options.haveMcast) {
  6087. #ifdef WOLFSSL_MULTICAST
  6088. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  6089. (ssl->options.mcastID << 8) |
  6090. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  6091. #endif
  6092. }
  6093. else
  6094. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  6095. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  6096. seq[1] = ssl->keys.dtls_sequence_number_lo;
  6097. }
  6098. }
  6099. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  6100. {
  6101. word32 seq;
  6102. #ifdef HAVE_SECURE_RENEGOTIATION
  6103. order = DtlsCheckOrder(ssl, order);
  6104. #endif
  6105. if (order == PREV_ORDER) {
  6106. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  6107. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  6108. /* handle rollover */
  6109. ssl->keys.dtls_prev_sequence_number_hi++;
  6110. }
  6111. }
  6112. else if (order == PEER_ORDER) {
  6113. seq = ssl->keys.peer_sequence_number_lo++;
  6114. if (seq > ssl->keys.peer_sequence_number_lo) {
  6115. /* handle rollover */
  6116. ssl->keys.peer_sequence_number_hi++;
  6117. }
  6118. }
  6119. else {
  6120. seq = ssl->keys.dtls_sequence_number_lo++;
  6121. if (seq > ssl->keys.dtls_sequence_number_lo) {
  6122. /* handle rollover */
  6123. ssl->keys.dtls_sequence_number_hi++;
  6124. }
  6125. }
  6126. }
  6127. #endif /* WOLFSSL_DTLS */
  6128. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  6129. void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  6130. {
  6131. word32 seq[2] = {0, 0};
  6132. if (!ssl->options.dtls) {
  6133. GetSEQIncrement(ssl, verifyOrder, seq);
  6134. }
  6135. else {
  6136. #ifdef WOLFSSL_DTLS
  6137. DtlsGetSEQ(ssl, verifyOrder, seq);
  6138. #endif
  6139. }
  6140. c32toa(seq[0], out);
  6141. c32toa(seq[1], out + OPAQUE32_LEN);
  6142. }
  6143. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  6144. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
  6145. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */
  6146. #ifdef WOLFSSL_DTLS
  6147. /* functions for managing DTLS datagram reordering */
  6148. /* Need to allocate space for the handshake message header. The hashing
  6149. * routines assume the message pointer is still within the buffer that
  6150. * has the headers, and will include those headers in the hash. The store
  6151. * routines need to take that into account as well. New will allocate
  6152. * extra space for the headers. */
  6153. DtlsMsg* DtlsMsgNew(word32 sz, void* heap)
  6154. {
  6155. DtlsMsg* msg;
  6156. WOLFSSL_ENTER("DtlsMsgNew()");
  6157. (void)heap;
  6158. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  6159. if (msg != NULL) {
  6160. XMEMSET(msg, 0, sizeof(DtlsMsg));
  6161. msg->buf = (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ,
  6162. heap, DYNAMIC_TYPE_DTLS_BUFFER);
  6163. if (msg->buf != NULL) {
  6164. msg->sz = sz;
  6165. msg->type = no_shake;
  6166. msg->msg = msg->buf + DTLS_HANDSHAKE_HEADER_SZ;
  6167. }
  6168. else {
  6169. XFREE(msg, heap, DYNAMIC_TYPE_DTLS_MSG);
  6170. msg = NULL;
  6171. }
  6172. }
  6173. return msg;
  6174. }
  6175. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  6176. {
  6177. (void)heap;
  6178. WOLFSSL_ENTER("DtlsMsgDelete()");
  6179. if (item != NULL) {
  6180. DtlsFrag* cur = item->fragList;
  6181. while (cur != NULL) {
  6182. DtlsFrag* next = cur->next;
  6183. XFREE(cur, heap, DYNAMIC_TYPE_DTLS_FRAG);
  6184. cur = next;
  6185. }
  6186. if (item->buf != NULL)
  6187. XFREE(item->buf, heap, DYNAMIC_TYPE_DTLS_BUFFER);
  6188. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  6189. }
  6190. }
  6191. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  6192. {
  6193. DtlsMsg* next;
  6194. WOLFSSL_ENTER("DtlsMsgListDelete()");
  6195. while (head) {
  6196. next = head->next;
  6197. DtlsMsgDelete(head, heap);
  6198. head = next;
  6199. }
  6200. }
  6201. /**
  6202. * Drop messages when they are no longer going to be retransmitted
  6203. */
  6204. void DtlsTxMsgListClean(WOLFSSL* ssl)
  6205. {
  6206. DtlsMsg* head = ssl->dtls_tx_msg_list;
  6207. DtlsMsg* next;
  6208. WOLFSSL_ENTER("DtlsTxMsgListClean()");
  6209. while (head) {
  6210. next = head->next;
  6211. if (VerifyForTxDtlsMsgDelete(ssl, head))
  6212. DtlsMsgDelete(head, ssl->heap);
  6213. else
  6214. /* Stored packets should be in order so break on first failed
  6215. * verify */
  6216. break;
  6217. ssl->dtls_tx_msg_list_sz--;
  6218. /* Reset timer as deleting a node means that state has progressed */
  6219. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6220. head = next;
  6221. }
  6222. ssl->dtls_tx_msg_list = head;
  6223. }
  6224. /* Create a DTLS Fragment from *begin - end, adjust new *begin and bytesLeft */
  6225. static DtlsFrag* CreateFragment(word32* begin, word32 end, const byte* data,
  6226. byte* buf, word32* bytesLeft, void* heap)
  6227. {
  6228. DtlsFrag* newFrag;
  6229. word32 added = end - *begin + 1;
  6230. WOLFSSL_ENTER("CreateFragment()");
  6231. (void)heap;
  6232. newFrag = (DtlsFrag*)XMALLOC(sizeof(DtlsFrag), heap,
  6233. DYNAMIC_TYPE_DTLS_FRAG);
  6234. if (newFrag != NULL) {
  6235. newFrag->next = NULL;
  6236. newFrag->begin = *begin;
  6237. newFrag->end = end;
  6238. XMEMCPY(buf + *begin, data, added);
  6239. *bytesLeft -= added;
  6240. *begin = newFrag->end + 1;
  6241. }
  6242. return newFrag;
  6243. }
  6244. int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
  6245. word32 fragOffset, word32 fragSz, void* heap)
  6246. {
  6247. WOLFSSL_ENTER("DtlsMsgSet()");
  6248. if (msg != NULL && data != NULL && msg->fragSz <= msg->sz &&
  6249. (fragOffset + fragSz) <= msg->sz) {
  6250. DtlsFrag* cur = msg->fragList;
  6251. DtlsFrag* prev = cur;
  6252. DtlsFrag* newFrag;
  6253. word32 bytesLeft = fragSz; /* could be overlapping fragment */
  6254. word32 startOffset = fragOffset;
  6255. word32 added;
  6256. msg->seq = seq;
  6257. msg->epoch = epoch;
  6258. msg->type = type;
  6259. if (fragOffset == 0) {
  6260. XMEMCPY(msg->buf, data - DTLS_HANDSHAKE_HEADER_SZ,
  6261. DTLS_HANDSHAKE_HEADER_SZ);
  6262. c32to24(msg->sz, msg->msg - DTLS_HANDSHAKE_FRAG_SZ);
  6263. }
  6264. /* if no message data, just return */
  6265. if (fragSz == 0)
  6266. return 0;
  6267. /* if list is empty add full fragment to front */
  6268. if (cur == NULL) {
  6269. newFrag = CreateFragment(&fragOffset, fragOffset + fragSz - 1, data,
  6270. msg->msg, &bytesLeft, heap);
  6271. if (newFrag == NULL)
  6272. return MEMORY_E;
  6273. msg->fragSz = fragSz;
  6274. msg->fragList = newFrag;
  6275. return 0;
  6276. }
  6277. /* add to front if before current front, up to next->begin */
  6278. if (fragOffset < cur->begin) {
  6279. word32 end = fragOffset + fragSz - 1;
  6280. if (end >= cur->begin)
  6281. end = cur->begin - 1;
  6282. added = end - fragOffset + 1;
  6283. newFrag = CreateFragment(&fragOffset, end, data, msg->msg,
  6284. &bytesLeft, heap);
  6285. if (newFrag == NULL)
  6286. return MEMORY_E;
  6287. msg->fragSz += added;
  6288. newFrag->next = cur;
  6289. msg->fragList = newFrag;
  6290. }
  6291. /* while we have bytes left, try to find a gap to fill */
  6292. while (bytesLeft > 0) {
  6293. /* get previous packet in list */
  6294. while (cur && (fragOffset >= cur->begin)) {
  6295. prev = cur;
  6296. cur = cur->next;
  6297. }
  6298. /* don't add duplicate data */
  6299. if (prev->end >= fragOffset) {
  6300. if ( (fragOffset + bytesLeft - 1) <= prev->end)
  6301. return 0;
  6302. fragOffset = prev->end + 1;
  6303. bytesLeft = startOffset + fragSz - fragOffset;
  6304. }
  6305. if (cur == NULL)
  6306. /* we're at the end */
  6307. added = bytesLeft;
  6308. else
  6309. /* we're in between two frames */
  6310. added = min(bytesLeft, cur->begin - fragOffset);
  6311. /* data already there */
  6312. if (added == 0)
  6313. continue;
  6314. newFrag = CreateFragment(&fragOffset, fragOffset + added - 1,
  6315. data + fragOffset - startOffset,
  6316. msg->msg, &bytesLeft, heap);
  6317. if (newFrag == NULL)
  6318. return MEMORY_E;
  6319. msg->fragSz += added;
  6320. newFrag->next = prev->next;
  6321. prev->next = newFrag;
  6322. }
  6323. }
  6324. return 0;
  6325. }
  6326. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word32 epoch, word32 seq)
  6327. {
  6328. WOLFSSL_ENTER("DtlsMsgFind()");
  6329. while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
  6330. head = head->next;
  6331. }
  6332. return head;
  6333. }
  6334. void DtlsMsgStore(WOLFSSL* ssl, word32 epoch, word32 seq, const byte* data,
  6335. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  6336. {
  6337. /* See if seq exists in the list. If it isn't in the list, make
  6338. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  6339. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  6340. * the seq is in the list and it isn't full, copy fragSz bytes from
  6341. * data to msg->msg starting at offset fragOffset, and add fragSz to
  6342. * msg->fragSz. Insertions take into account data already in the list
  6343. * in case there are overlaps in the handshake message due to retransmit
  6344. * messages. The new item should be inserted into the list in its
  6345. * proper position.
  6346. *
  6347. * 1. Find seq in list, or where seq should go in list. If seq not in
  6348. * list, create new item and insert into list. Either case, keep
  6349. * pointer to item.
  6350. * 2. Copy the data from the message to the stored message where it
  6351. * belongs without overlaps.
  6352. */
  6353. DtlsMsg* head = ssl->dtls_rx_msg_list;
  6354. WOLFSSL_ENTER("DtlsMsgStore()");
  6355. if (head != NULL) {
  6356. DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
  6357. if (cur == NULL) {
  6358. cur = DtlsMsgNew(dataSz, heap);
  6359. if (cur != NULL) {
  6360. if (DtlsMsgSet(cur, seq, epoch, data, type,
  6361. fragOffset, fragSz, heap) < 0) {
  6362. DtlsMsgDelete(cur, heap);
  6363. }
  6364. else {
  6365. ssl->dtls_rx_msg_list_sz++;
  6366. head = DtlsMsgInsert(head, cur);
  6367. }
  6368. }
  6369. }
  6370. else {
  6371. /* If this fails, the data is just dropped. */
  6372. DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
  6373. fragSz, heap);
  6374. }
  6375. }
  6376. else {
  6377. head = DtlsMsgNew(dataSz, heap);
  6378. if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
  6379. fragSz, heap) < 0) {
  6380. DtlsMsgDelete(head, heap);
  6381. head = NULL;
  6382. }
  6383. else {
  6384. ssl->dtls_rx_msg_list_sz++;
  6385. }
  6386. }
  6387. ssl->dtls_rx_msg_list = head;
  6388. }
  6389. /* DtlsMsgInsert() is an in-order insert. */
  6390. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  6391. {
  6392. WOLFSSL_ENTER("DtlsMsgInsert()");
  6393. if (head == NULL || (item->epoch <= head->epoch &&
  6394. item->seq < head->seq)) {
  6395. item->next = head;
  6396. head = item;
  6397. }
  6398. else if (head->next == NULL) {
  6399. head->next = item;
  6400. }
  6401. else {
  6402. DtlsMsg* cur = head->next;
  6403. DtlsMsg* prev = head;
  6404. while (cur) {
  6405. if (item->epoch <= cur->epoch &&
  6406. item->seq < cur->seq) {
  6407. item->next = cur;
  6408. prev->next = item;
  6409. break;
  6410. }
  6411. prev = cur;
  6412. cur = cur->next;
  6413. }
  6414. if (cur == NULL) {
  6415. prev->next = item;
  6416. }
  6417. }
  6418. return head;
  6419. }
  6420. /**
  6421. * DtlsMsgPoolSave() adds the message to the end of the stored transmit
  6422. * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
  6423. * anything else that increments ssl->keys.dtls_handshake_number.
  6424. */
  6425. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
  6426. enum HandShakeType type)
  6427. {
  6428. DtlsMsg* item;
  6429. int ret = 0;
  6430. WOLFSSL_ENTER("DtlsMsgPoolSave()");
  6431. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  6432. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  6433. return DTLS_POOL_SZ_E;
  6434. }
  6435. item = DtlsMsgNew(dataSz, ssl->heap);
  6436. if (item != NULL) {
  6437. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  6438. XMEMCPY(item->buf, data, dataSz);
  6439. item->sz = dataSz;
  6440. item->epoch = ssl->keys.dtls_epoch;
  6441. item->seq = ssl->keys.dtls_handshake_number;
  6442. item->type = type;
  6443. if (cur == NULL)
  6444. ssl->dtls_tx_msg_list = item;
  6445. else {
  6446. while (cur->next)
  6447. cur = cur->next;
  6448. cur->next = item;
  6449. }
  6450. ssl->dtls_tx_msg_list_sz++;
  6451. }
  6452. else
  6453. ret = MEMORY_E;
  6454. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  6455. return ret;
  6456. }
  6457. /* DtlsMsgPoolTimeout() updates the timeout time. */
  6458. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  6459. {
  6460. int result = -1;
  6461. WOLFSSL_ENTER("DtlsMsgPoolTimeout()");
  6462. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  6463. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  6464. result = 0;
  6465. }
  6466. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  6467. return result;
  6468. }
  6469. /* DtlsMsgPoolReset() deletes the stored transmit list and resets the timeout
  6470. * value. */
  6471. void DtlsMsgPoolReset(WOLFSSL* ssl)
  6472. {
  6473. WOLFSSL_ENTER("DtlsMsgPoolReset()");
  6474. if (ssl->dtls_tx_msg_list) {
  6475. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  6476. ssl->dtls_tx_msg_list = NULL;
  6477. ssl->dtls_tx_msg = NULL;
  6478. ssl->dtls_tx_msg_list_sz = 0;
  6479. }
  6480. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6481. }
  6482. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  6483. {
  6484. /**
  6485. * only the first message from previous flight should be valid
  6486. * to be used for triggering retransmission of whole DtlsMsgPool.
  6487. * change cipher suite type is not verified here
  6488. */
  6489. return ((fragOffset == 0) &&
  6490. (((ssl->options.side == WOLFSSL_SERVER_END) &&
  6491. ((type == client_hello) ||
  6492. ((ssl->options.verifyPeer) && (type == certificate)) ||
  6493. ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
  6494. ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  6495. (type == hello_request || type == server_hello))));
  6496. }
  6497. /**
  6498. * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
  6499. * depending on the current state of the handshake negotiation.
  6500. */
  6501. int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
  6502. {
  6503. WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete()");
  6504. if (item->epoch < ssl->keys.dtls_epoch - 1)
  6505. /* Messages not from current or previous epoch can be deleted */
  6506. return 1;
  6507. switch (ssl->options.side) {
  6508. case WOLFSSL_CLIENT_END:
  6509. if (item->type == client_hello &&
  6510. ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
  6511. return 1; /* client can forget first client_hello if received full
  6512. * flight of packets from server */
  6513. else
  6514. return 0;
  6515. case WOLFSSL_SERVER_END:
  6516. if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
  6517. item->type == hello_request)
  6518. return 1; /* Server can forget HelloRequest if client sent a valid
  6519. * ClientHello */
  6520. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
  6521. item->type <= server_hello_done)
  6522. return 1; /* server can forget everything up to ServerHelloDone if
  6523. * a client finished message has been received and
  6524. * successfully processed */
  6525. else
  6526. return 0;
  6527. default:
  6528. return 0;
  6529. }
  6530. }
  6531. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  6532. * updated with new sequence numbers, and will be re-encrypted if needed. */
  6533. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  6534. {
  6535. int ret = 0;
  6536. DtlsMsg* pool;
  6537. int epochOrder;
  6538. WOLFSSL_ENTER("DtlsMsgPoolSend()");
  6539. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  6540. if (pool != NULL) {
  6541. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  6542. !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
  6543. ssl->options.acceptState == SERVER_HELLO_DONE ||
  6544. ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
  6545. ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
  6546. (ssl->options.side == WOLFSSL_CLIENT_END &&
  6547. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  6548. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  6549. ssl->options.connectState == FINISHED_DONE ||
  6550. ssl->options.connectState == SECOND_REPLY_DONE))) {
  6551. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  6552. ssl->error = DTLS_RETX_OVER_TX;
  6553. return WOLFSSL_FATAL_ERROR;
  6554. }
  6555. while (pool != NULL) {
  6556. if (pool->epoch == 0) {
  6557. DtlsRecordLayerHeader* dtls;
  6558. dtls = (DtlsRecordLayerHeader*)pool->buf;
  6559. /* If the stored record's epoch is 0, and the currently set
  6560. * epoch is 0, use the "current order" sequence number.
  6561. * If the stored record's epoch is 0 and the currently set
  6562. * epoch is not 0, the stored record is considered a "previous
  6563. * order" sequence number. */
  6564. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  6565. CUR_ORDER : PREV_ORDER;
  6566. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  6567. DtlsSEQIncrement(ssl, epochOrder);
  6568. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  6569. WOLFSSL_ERROR(ret);
  6570. return ret;
  6571. }
  6572. XMEMCPY(ssl->buffers.outputBuffer.buffer +
  6573. ssl->buffers.outputBuffer.idx +
  6574. ssl->buffers.outputBuffer.length,
  6575. pool->buf, pool->sz);
  6576. ssl->buffers.outputBuffer.length += pool->sz;
  6577. }
  6578. else {
  6579. /* Handle sending packets from previous epoch */
  6580. byte* input;
  6581. byte* output;
  6582. int inputSz, sendSz;
  6583. input = pool->buf;
  6584. inputSz = pool->sz;
  6585. sendSz = inputSz + MAX_MSG_EXTRA;
  6586. #ifdef HAVE_SECURE_RENEGOTIATION
  6587. /*
  6588. * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
  6589. * ssl->keys otherwise
  6590. * PREV_ORDER will always use ssl->keys
  6591. */
  6592. if (DtlsSCRKeysSet(ssl)) {
  6593. if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  6594. epochOrder = CUR_ORDER;
  6595. else
  6596. epochOrder = PREV_ORDER;
  6597. }
  6598. else {
  6599. epochOrder = CUR_ORDER;
  6600. }
  6601. #else
  6602. epochOrder = CUR_ORDER;
  6603. #endif
  6604. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  6605. WOLFSSL_ERROR(ret);
  6606. return ret;
  6607. }
  6608. output = ssl->buffers.outputBuffer.buffer +
  6609. ssl->buffers.outputBuffer.length;
  6610. if (inputSz != ENUM_LEN)
  6611. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  6612. handshake, 0, 0, 0, epochOrder);
  6613. else
  6614. /* inputSz == ENUM_LEN must mean that this is a change cipher
  6615. * spec message */
  6616. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  6617. change_cipher_spec, 0, 0, 0, epochOrder);
  6618. if (sendSz < 0) {
  6619. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  6620. return BUILD_MSG_ERROR;
  6621. }
  6622. ssl->buffers.outputBuffer.length += sendSz;
  6623. }
  6624. if (!ssl->options.groupMessages)
  6625. ret = SendBuffered(ssl);
  6626. /**
  6627. * on server side, retransmission is being triggered only by sending
  6628. * first message of given flight, in order to trigger client
  6629. * to retransmit its whole flight. Sending the whole previous flight
  6630. * could lead to retransmission of previous client flight for each
  6631. * server message from previous flight. Therefore one message should
  6632. * be enough to do the trick.
  6633. */
  6634. if (sendOnlyFirstPacket &&
  6635. ssl->options.side == WOLFSSL_SERVER_END)
  6636. pool = NULL;
  6637. else
  6638. pool = pool->next;
  6639. ssl->dtls_tx_msg = pool;
  6640. }
  6641. if (ret == 0 && ssl->options.groupMessages)
  6642. ret = SendBuffered(ssl);
  6643. }
  6644. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  6645. return ret;
  6646. }
  6647. #endif /* WOLFSSL_DTLS */
  6648. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  6649. ProtocolVersion MakeSSLv3(void)
  6650. {
  6651. ProtocolVersion pv;
  6652. pv.major = SSLv3_MAJOR;
  6653. pv.minor = SSLv3_MINOR;
  6654. return pv;
  6655. }
  6656. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  6657. #ifdef WOLFSSL_DTLS
  6658. ProtocolVersion MakeDTLSv1(void)
  6659. {
  6660. ProtocolVersion pv;
  6661. pv.major = DTLS_MAJOR;
  6662. pv.minor = DTLS_MINOR;
  6663. return pv;
  6664. }
  6665. #ifndef WOLFSSL_NO_TLS12
  6666. ProtocolVersion MakeDTLSv1_2(void)
  6667. {
  6668. ProtocolVersion pv;
  6669. pv.major = DTLS_MAJOR;
  6670. pv.minor = DTLSv1_2_MINOR;
  6671. return pv;
  6672. }
  6673. #endif /* !WOLFSSL_NO_TLS12 */
  6674. #endif /* WOLFSSL_DTLS */
  6675. #ifndef NO_ASN_TIME
  6676. #if defined(USER_TICKS)
  6677. #if 0
  6678. word32 LowResTimer(void)
  6679. {
  6680. /*
  6681. write your own clock tick function if don't want time(0)
  6682. needs second accuracy but doesn't have to correlated to EPOCH
  6683. */
  6684. }
  6685. #endif
  6686. #elif defined(TIME_OVERRIDES)
  6687. /* use same asn time overrides unless user wants tick override above */
  6688. #ifndef HAVE_TIME_T_TYPE
  6689. typedef long time_t;
  6690. #endif
  6691. extern time_t XTIME(time_t * timer);
  6692. word32 LowResTimer(void)
  6693. {
  6694. return (word32) XTIME(0);
  6695. }
  6696. #elif defined(USE_WINDOWS_API)
  6697. word32 LowResTimer(void)
  6698. {
  6699. static int init = 0;
  6700. static LARGE_INTEGER freq;
  6701. LARGE_INTEGER count;
  6702. if (!init) {
  6703. QueryPerformanceFrequency(&freq);
  6704. init = 1;
  6705. }
  6706. QueryPerformanceCounter(&count);
  6707. return (word32)(count.QuadPart / freq.QuadPart);
  6708. }
  6709. #elif defined(HAVE_RTP_SYS)
  6710. #include "rtptime.h"
  6711. word32 LowResTimer(void)
  6712. {
  6713. return (word32)rtp_get_system_sec();
  6714. }
  6715. #elif defined(WOLFSSL_DEOS)
  6716. word32 LowResTimer(void)
  6717. {
  6718. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  6719. word32 *systemTickPtr = systemTickPointer();
  6720. return (word32) *systemTickPtr/systemTickTimeInHz;
  6721. }
  6722. #elif defined(MICRIUM)
  6723. word32 LowResTimer(void)
  6724. {
  6725. OS_TICK ticks = 0;
  6726. OS_ERR err;
  6727. ticks = OSTimeGet(&err);
  6728. return (word32) (ticks / OSCfg_TickRate_Hz);
  6729. }
  6730. #elif defined(MICROCHIP_TCPIP_V5)
  6731. word32 LowResTimer(void)
  6732. {
  6733. return (word32) (TickGet() / TICKS_PER_SECOND);
  6734. }
  6735. #elif defined(MICROCHIP_TCPIP)
  6736. #if defined(MICROCHIP_MPLAB_HARMONY)
  6737. #include <system/tmr/sys_tmr.h>
  6738. word32 LowResTimer(void)
  6739. {
  6740. return (word32) (SYS_TMR_TickCountGet() /
  6741. SYS_TMR_TickCounterFrequencyGet());
  6742. }
  6743. #else
  6744. word32 LowResTimer(void)
  6745. {
  6746. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  6747. }
  6748. #endif
  6749. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  6750. word32 LowResTimer(void)
  6751. {
  6752. TIME_STRUCT mqxTime;
  6753. _time_get_elapsed(&mqxTime);
  6754. return (word32) mqxTime.SECONDS;
  6755. }
  6756. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  6757. #include "include/task.h"
  6758. unsigned int LowResTimer(void)
  6759. {
  6760. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  6761. }
  6762. #elif defined(FREERTOS)
  6763. #include "task.h"
  6764. unsigned int LowResTimer(void)
  6765. {
  6766. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  6767. }
  6768. #elif defined(FREESCALE_KSDK_BM)
  6769. #include "lwip/sys.h" /* lwIP */
  6770. word32 LowResTimer(void)
  6771. {
  6772. return sys_now()/1000;
  6773. }
  6774. #elif defined(WOLFSSL_TIRTOS)
  6775. word32 LowResTimer(void)
  6776. {
  6777. return (word32) Seconds_get();
  6778. }
  6779. #elif defined(WOLFSSL_XILINX)
  6780. #include "xrtcpsu.h"
  6781. word32 LowResTimer(void)
  6782. {
  6783. XRtcPsu_Config* con;
  6784. XRtcPsu rtc;
  6785. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  6786. if (con != NULL) {
  6787. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  6788. == XST_SUCCESS) {
  6789. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  6790. }
  6791. else {
  6792. WOLFSSL_MSG("Unable to initialize RTC");
  6793. }
  6794. }
  6795. return 0;
  6796. }
  6797. #elif defined(WOLFSSL_UTASKER)
  6798. word32 LowResTimer(void)
  6799. {
  6800. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  6801. }
  6802. #elif defined(WOLFSSL_NUCLEUS_1_2)
  6803. #define NU_TICKS_PER_SECOND 100
  6804. word32 LowResTimer(void)
  6805. {
  6806. /* returns number of 10ms ticks, so 100 ticks/sec */
  6807. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  6808. }
  6809. #elif defined(WOLFSSL_APACHE_MYNEWT)
  6810. #include "os/os_time.h"
  6811. word32 LowResTimer(void)
  6812. {
  6813. word32 now;
  6814. struct os_timeval tv;
  6815. os_gettimeofday(&tv, NULL);
  6816. now = (word32)tv.tv_sec;
  6817. return now;
  6818. }
  6819. #elif defined(WOLFSSL_ZEPHYR)
  6820. word32 LowResTimer(void)
  6821. {
  6822. return k_uptime_get() / 1000;
  6823. }
  6824. #elif defined(WOLFSSL_LINUXKM)
  6825. #include <linux/time.h>
  6826. #include <linux/ktime.h>
  6827. word32 LowResTimer(void)
  6828. {
  6829. return (word32)ktime_get_real_ns();
  6830. }
  6831. #else
  6832. /* Posix style time */
  6833. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  6834. #include <time.h>
  6835. #endif
  6836. word32 LowResTimer(void)
  6837. {
  6838. return (word32)XTIME(0);
  6839. }
  6840. #endif
  6841. #endif /* !NO_ASN_TIME */
  6842. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  6843. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  6844. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  6845. /* Store the message for use with CertificateVerify using EdDSA.
  6846. *
  6847. * ssl SSL/TLS object.
  6848. * data Message to store.
  6849. * sz Size of message to store.
  6850. * returns MEMORY_E if not able to reallocate, otherwise 0.
  6851. */
  6852. static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
  6853. {
  6854. int ret = 0;
  6855. byte* msgs;
  6856. if (ssl->options.cacheMessages) {
  6857. msgs = (byte*)XREALLOC(ssl->hsHashes->messages,
  6858. ssl->hsHashes->length + sz,
  6859. ssl->heap, DYNAMIC_TYPE_HASHES);
  6860. if (msgs == NULL)
  6861. ret = MEMORY_E;
  6862. if (ret == 0) {
  6863. ssl->hsHashes->messages = msgs;
  6864. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  6865. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  6866. ssl->hsHashes->length += sz;
  6867. }
  6868. }
  6869. return ret;
  6870. }
  6871. #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  6872. int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
  6873. {
  6874. int ret = 0;
  6875. (void)data;
  6876. (void)sz;
  6877. if (ssl->hsHashes == NULL) {
  6878. return BAD_FUNC_ARG;
  6879. }
  6880. #ifndef NO_OLD_TLS
  6881. #ifndef NO_SHA
  6882. wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
  6883. #endif
  6884. #ifndef NO_MD5
  6885. wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
  6886. #endif
  6887. #endif /* NO_OLD_TLS */
  6888. if (IsAtLeastTLSv1_2(ssl)) {
  6889. #ifndef NO_SHA256
  6890. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
  6891. if (ret != 0)
  6892. return ret;
  6893. #endif
  6894. #ifdef WOLFSSL_SHA384
  6895. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
  6896. if (ret != 0)
  6897. return ret;
  6898. #endif
  6899. #ifdef WOLFSSL_SHA512
  6900. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
  6901. if (ret != 0)
  6902. return ret;
  6903. #endif
  6904. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  6905. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  6906. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  6907. ret = EdDSA_Update(ssl, data, sz);
  6908. if (ret != 0)
  6909. return ret;
  6910. #endif
  6911. }
  6912. return ret;
  6913. }
  6914. /* add output to md5 and sha handshake hashes, exclude record header */
  6915. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  6916. {
  6917. const byte* adj;
  6918. if (ssl->hsHashes == NULL)
  6919. return BAD_FUNC_ARG;
  6920. adj = output + RECORD_HEADER_SZ + ivSz;
  6921. sz -= RECORD_HEADER_SZ;
  6922. #ifdef HAVE_FUZZER
  6923. if (ssl->fuzzerCb)
  6924. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  6925. #endif
  6926. #ifdef WOLFSSL_DTLS
  6927. if (ssl->options.dtls) {
  6928. adj += DTLS_RECORD_EXTRA;
  6929. sz -= DTLS_RECORD_EXTRA;
  6930. }
  6931. #endif
  6932. return HashRaw(ssl, adj, sz);
  6933. }
  6934. /* add input to md5 and sha handshake hashes, include handshake header */
  6935. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  6936. {
  6937. const byte* adj;
  6938. if (ssl->hsHashes == NULL) {
  6939. return BAD_FUNC_ARG;
  6940. }
  6941. adj = input - HANDSHAKE_HEADER_SZ;
  6942. sz += HANDSHAKE_HEADER_SZ;
  6943. #ifdef WOLFSSL_DTLS
  6944. if (ssl->options.dtls) {
  6945. adj -= DTLS_HANDSHAKE_EXTRA;
  6946. sz += DTLS_HANDSHAKE_EXTRA;
  6947. }
  6948. #endif
  6949. return HashRaw(ssl, adj, sz);
  6950. }
  6951. /* add record layer header for message */
  6952. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
  6953. {
  6954. RecordLayerHeader* rl;
  6955. (void)epochOrder;
  6956. /* record layer header */
  6957. rl = (RecordLayerHeader*)output;
  6958. if (rl == NULL) {
  6959. return;
  6960. }
  6961. rl->type = type;
  6962. rl->pvMajor = ssl->version.major; /* type and version same in each */
  6963. #ifdef WOLFSSL_TLS13
  6964. if (IsAtLeastTLSv1_3(ssl->version)) {
  6965. rl->pvMinor = TLSv1_2_MINOR;
  6966. }
  6967. else
  6968. #endif
  6969. rl->pvMinor = ssl->version.minor;
  6970. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  6971. if (ssl->options.side == WOLFSSL_CLIENT_END
  6972. && ssl->options.connectState == CONNECT_BEGIN
  6973. && !ssl->options.resuming) {
  6974. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  6975. : ssl->version.minor;
  6976. }
  6977. #endif
  6978. if (!ssl->options.dtls) {
  6979. c16toa((word16)length, rl->length);
  6980. }
  6981. else {
  6982. #ifdef WOLFSSL_DTLS
  6983. DtlsRecordLayerHeader* dtls;
  6984. /* dtls record layer header extensions */
  6985. dtls = (DtlsRecordLayerHeader*)output;
  6986. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  6987. c16toa((word16)length, dtls->length);
  6988. #endif
  6989. }
  6990. }
  6991. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  6992. !defined(NO_WOLFSSL_SERVER))
  6993. /* add handshake header for message */
  6994. static void AddHandShakeHeader(byte* output, word32 length,
  6995. word32 fragOffset, word32 fragLength,
  6996. byte type, WOLFSSL* ssl)
  6997. {
  6998. HandShakeHeader* hs;
  6999. (void)fragOffset;
  7000. (void)fragLength;
  7001. (void)ssl;
  7002. /* handshake header */
  7003. hs = (HandShakeHeader*)output;
  7004. if (hs == NULL)
  7005. return;
  7006. hs->type = type;
  7007. c32to24(length, hs->length); /* type and length same for each */
  7008. #ifdef WOLFSSL_DTLS
  7009. if (ssl->options.dtls) {
  7010. DtlsHandShakeHeader* dtls;
  7011. /* dtls handshake header extensions */
  7012. dtls = (DtlsHandShakeHeader*)output;
  7013. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  7014. c32to24(fragOffset, dtls->fragment_offset);
  7015. c32to24(fragLength, dtls->fragment_length);
  7016. }
  7017. #endif
  7018. }
  7019. /* add both headers for handshake message */
  7020. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  7021. {
  7022. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  7023. word32 outputAdj = RECORD_HEADER_SZ;
  7024. #ifdef WOLFSSL_DTLS
  7025. if (ssl->options.dtls) {
  7026. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  7027. outputAdj += DTLS_RECORD_EXTRA;
  7028. }
  7029. #endif
  7030. AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
  7031. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  7032. }
  7033. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  7034. #ifndef WOLFSSL_NO_TLS12
  7035. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
  7036. !defined(WOLFSSL_NO_CLIENT_AUTH))
  7037. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  7038. word32 length, byte type, WOLFSSL* ssl)
  7039. {
  7040. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  7041. word32 outputAdj = RECORD_HEADER_SZ;
  7042. (void)fragSz;
  7043. #ifdef WOLFSSL_DTLS
  7044. if (ssl->options.dtls) {
  7045. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  7046. outputAdj += DTLS_RECORD_EXTRA;
  7047. }
  7048. #endif
  7049. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
  7050. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  7051. }
  7052. #endif /* NO_CERTS */
  7053. #endif /* !WOLFSSL_NO_TLS12 */
  7054. /* return bytes received, -1 on error */
  7055. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  7056. {
  7057. int recvd;
  7058. if (ssl->CBIORecv == NULL) {
  7059. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  7060. return -1;
  7061. }
  7062. retry:
  7063. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  7064. if (recvd < 0) {
  7065. switch (recvd) {
  7066. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  7067. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)
  7068. #ifndef NO_BIO
  7069. if (ssl->biord) {
  7070. /* If retry and read flags are set, return WANT_READ */
  7071. if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
  7072. (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
  7073. return WANT_READ;
  7074. }
  7075. }
  7076. #endif
  7077. #endif
  7078. return -1;
  7079. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  7080. return WANT_READ;
  7081. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  7082. #ifdef USE_WINDOWS_API
  7083. if (ssl->options.dtls) {
  7084. goto retry;
  7085. }
  7086. #endif
  7087. ssl->options.connReset = 1;
  7088. return -1;
  7089. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  7090. /* see if we got our timeout */
  7091. #ifdef WOLFSSL_CALLBACKS
  7092. if (ssl->toInfoOn) {
  7093. struct itimerval timeout;
  7094. getitimer(ITIMER_REAL, &timeout);
  7095. if (timeout.it_value.tv_sec == 0 &&
  7096. timeout.it_value.tv_usec == 0) {
  7097. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  7098. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  7099. ssl->timeoutInfo.timeoutName[
  7100. MAX_TIMEOUT_NAME_SZ] = '\0';
  7101. WOLFSSL_MSG("Got our timeout");
  7102. return WANT_READ;
  7103. }
  7104. }
  7105. #endif
  7106. goto retry;
  7107. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  7108. ssl->options.isClosed = 1;
  7109. return -1;
  7110. case WOLFSSL_CBIO_ERR_TIMEOUT:
  7111. #ifdef WOLFSSL_DTLS
  7112. if (IsDtlsNotSctpMode(ssl) &&
  7113. ssl->options.handShakeState != HANDSHAKE_DONE &&
  7114. DtlsMsgPoolTimeout(ssl) == 0 &&
  7115. DtlsMsgPoolSend(ssl, 0) == 0) {
  7116. /* retry read for DTLS during handshake only */
  7117. goto retry;
  7118. }
  7119. #endif
  7120. return -1;
  7121. default:
  7122. WOLFSSL_MSG("Unexpected recv return code");
  7123. return recvd;
  7124. }
  7125. }
  7126. return recvd;
  7127. }
  7128. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  7129. void ShrinkOutputBuffer(WOLFSSL* ssl)
  7130. {
  7131. WOLFSSL_MSG("Shrinking output buffer\n");
  7132. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  7133. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  7134. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  7135. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  7136. ssl->buffers.outputBuffer.dynamicFlag = 0;
  7137. ssl->buffers.outputBuffer.offset = 0;
  7138. }
  7139. /* Switch dynamic input buffer back to static, keep any remaining input */
  7140. /* forced free means cleaning up */
  7141. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  7142. {
  7143. int usedLength = ssl->buffers.inputBuffer.length -
  7144. ssl->buffers.inputBuffer.idx;
  7145. if (!forcedFree && usedLength > STATIC_BUFFER_LEN)
  7146. return;
  7147. WOLFSSL_MSG("Shrinking input buffer\n");
  7148. if (!forcedFree && usedLength > 0)
  7149. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  7150. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  7151. usedLength);
  7152. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  7153. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  7154. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  7155. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  7156. ssl->buffers.inputBuffer.dynamicFlag = 0;
  7157. ssl->buffers.inputBuffer.offset = 0;
  7158. ssl->buffers.inputBuffer.idx = 0;
  7159. ssl->buffers.inputBuffer.length = usedLength;
  7160. }
  7161. int SendBuffered(WOLFSSL* ssl)
  7162. {
  7163. if (ssl->CBIOSend == NULL) {
  7164. WOLFSSL_MSG("Your IO Send callback is null, please set");
  7165. return SOCKET_ERROR_E;
  7166. }
  7167. #ifdef WOLFSSL_DEBUG_TLS
  7168. if (ssl->buffers.outputBuffer.idx == 0) {
  7169. WOLFSSL_MSG("Data to send");
  7170. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  7171. ssl->buffers.outputBuffer.length);
  7172. }
  7173. #endif
  7174. while (ssl->buffers.outputBuffer.length > 0) {
  7175. int sent = ssl->CBIOSend(ssl,
  7176. (char*)ssl->buffers.outputBuffer.buffer +
  7177. ssl->buffers.outputBuffer.idx,
  7178. (int)ssl->buffers.outputBuffer.length,
  7179. ssl->IOCB_WriteCtx);
  7180. if (sent < 0) {
  7181. switch (sent) {
  7182. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  7183. return WANT_WRITE;
  7184. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  7185. ssl->options.connReset = 1;
  7186. break;
  7187. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  7188. /* see if we got our timeout */
  7189. #ifdef WOLFSSL_CALLBACKS
  7190. if (ssl->toInfoOn) {
  7191. struct itimerval timeout;
  7192. getitimer(ITIMER_REAL, &timeout);
  7193. if (timeout.it_value.tv_sec == 0 &&
  7194. timeout.it_value.tv_usec == 0) {
  7195. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  7196. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  7197. ssl->timeoutInfo.timeoutName[
  7198. MAX_TIMEOUT_NAME_SZ] = '\0';
  7199. WOLFSSL_MSG("Got our timeout");
  7200. return WANT_WRITE;
  7201. }
  7202. }
  7203. #endif
  7204. continue;
  7205. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  7206. ssl->options.connReset = 1; /* treat same as reset */
  7207. break;
  7208. default:
  7209. return SOCKET_ERROR_E;
  7210. }
  7211. return SOCKET_ERROR_E;
  7212. }
  7213. if (sent > (int)ssl->buffers.outputBuffer.length) {
  7214. WOLFSSL_MSG("SendBuffered() out of bounds read");
  7215. return SEND_OOB_READ_E;
  7216. }
  7217. ssl->buffers.outputBuffer.idx += sent;
  7218. ssl->buffers.outputBuffer.length -= sent;
  7219. }
  7220. ssl->buffers.outputBuffer.idx = 0;
  7221. if (ssl->buffers.outputBuffer.dynamicFlag)
  7222. ShrinkOutputBuffer(ssl);
  7223. return 0;
  7224. }
  7225. /* Grow the output buffer */
  7226. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  7227. {
  7228. byte* tmp;
  7229. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7230. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  7231. RECORD_HEADER_SZ;
  7232. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7233. #else
  7234. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7235. #endif
  7236. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7237. /* the encrypted data will be offset from the front of the buffer by
  7238. the header, if the user wants encrypted alignment they need
  7239. to define their alignment requirement */
  7240. if (align) {
  7241. while (align < hdrSz)
  7242. align *= 2;
  7243. }
  7244. #endif
  7245. tmp = (byte*)XMALLOC(size + ssl->buffers.outputBuffer.length + align,
  7246. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  7247. WOLFSSL_MSG("growing output buffer\n");
  7248. if (tmp == NULL)
  7249. return MEMORY_E;
  7250. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7251. if (align)
  7252. tmp += align - hdrSz;
  7253. #endif
  7254. #ifdef WOLFSSL_STATIC_MEMORY
  7255. /* can be from IO memory pool which does not need copy if same buffer */
  7256. if (ssl->buffers.outputBuffer.length &&
  7257. tmp == ssl->buffers.outputBuffer.buffer) {
  7258. ssl->buffers.outputBuffer.bufferSize =
  7259. size + ssl->buffers.outputBuffer.length;
  7260. return 0;
  7261. }
  7262. #endif
  7263. if (ssl->buffers.outputBuffer.length)
  7264. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  7265. ssl->buffers.outputBuffer.length);
  7266. if (ssl->buffers.outputBuffer.dynamicFlag)
  7267. XFREE(ssl->buffers.outputBuffer.buffer -
  7268. ssl->buffers.outputBuffer.offset, ssl->heap,
  7269. DYNAMIC_TYPE_OUT_BUFFER);
  7270. ssl->buffers.outputBuffer.dynamicFlag = 1;
  7271. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7272. if (align)
  7273. ssl->buffers.outputBuffer.offset = align - hdrSz;
  7274. else
  7275. #endif
  7276. ssl->buffers.outputBuffer.offset = 0;
  7277. ssl->buffers.outputBuffer.buffer = tmp;
  7278. ssl->buffers.outputBuffer.bufferSize = size +
  7279. ssl->buffers.outputBuffer.length;
  7280. return 0;
  7281. }
  7282. /* Grow the input buffer, should only be to read cert or big app data */
  7283. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  7284. {
  7285. byte* tmp;
  7286. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7287. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  7288. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  7289. #else
  7290. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7291. #endif
  7292. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7293. /* the encrypted data will be offset from the front of the buffer by
  7294. the dtls record header, if the user wants encrypted alignment they need
  7295. to define their alignment requirement. in tls we read record header
  7296. to get size of record and put actual data back at front, so don't need */
  7297. if (align) {
  7298. while (align < hdrSz)
  7299. align *= 2;
  7300. }
  7301. #endif
  7302. if (usedLength < 0 || size < 0) {
  7303. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  7304. return BAD_FUNC_ARG;
  7305. }
  7306. tmp = (byte*)XMALLOC(size + usedLength + align,
  7307. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  7308. WOLFSSL_MSG("growing input buffer\n");
  7309. if (tmp == NULL)
  7310. return MEMORY_E;
  7311. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7312. if (align)
  7313. tmp += align - hdrSz;
  7314. #endif
  7315. #ifdef WOLFSSL_STATIC_MEMORY
  7316. /* can be from IO memory pool which does not need copy if same buffer */
  7317. if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
  7318. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  7319. ssl->buffers.inputBuffer.idx = 0;
  7320. ssl->buffers.inputBuffer.length = usedLength;
  7321. return 0;
  7322. }
  7323. #endif
  7324. if (usedLength)
  7325. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  7326. ssl->buffers.inputBuffer.idx, usedLength);
  7327. if (ssl->buffers.inputBuffer.dynamicFlag)
  7328. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  7329. ssl->heap,DYNAMIC_TYPE_IN_BUFFER);
  7330. ssl->buffers.inputBuffer.dynamicFlag = 1;
  7331. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7332. if (align)
  7333. ssl->buffers.inputBuffer.offset = align - hdrSz;
  7334. else
  7335. #endif
  7336. ssl->buffers.inputBuffer.offset = 0;
  7337. ssl->buffers.inputBuffer.buffer = tmp;
  7338. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  7339. ssl->buffers.inputBuffer.idx = 0;
  7340. ssl->buffers.inputBuffer.length = usedLength;
  7341. return 0;
  7342. }
  7343. /* Check available size into output buffer, make room if needed.
  7344. * This function needs to be called before anything gets put
  7345. * into the output buffers since it flushes pending data if it
  7346. * predicts that the msg will exceed MTU. */
  7347. int CheckAvailableSize(WOLFSSL *ssl, int size)
  7348. {
  7349. if (size < 0) {
  7350. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  7351. return BAD_FUNC_ARG;
  7352. }
  7353. #ifdef WOLFSSL_DTLS
  7354. if (ssl->options.dtls &&
  7355. size + ssl->buffers.outputBuffer.length -
  7356. ssl->buffers.outputBuffer.idx > ssl->dtls_expected_rx) {
  7357. int ret;
  7358. WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
  7359. "to make room for new message");
  7360. if ((ret = SendBuffered(ssl)) != 0) {
  7361. return ret;
  7362. }
  7363. }
  7364. #endif
  7365. if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
  7366. < (word32)size) {
  7367. if (GrowOutputBuffer(ssl, size) < 0)
  7368. return MEMORY_E;
  7369. }
  7370. return 0;
  7371. }
  7372. /* do all verify and sanity checks on record header */
  7373. static int GetRecordHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  7374. RecordLayerHeader* rh, word16 *size)
  7375. {
  7376. if (!ssl->options.dtls) {
  7377. #ifdef HAVE_FUZZER
  7378. if (ssl->fuzzerCb)
  7379. ssl->fuzzerCb(ssl, input + *inOutIdx, RECORD_HEADER_SZ, FUZZ_HEAD,
  7380. ssl->fuzzerCtx);
  7381. #endif
  7382. XMEMCPY(rh, input + *inOutIdx, RECORD_HEADER_SZ);
  7383. *inOutIdx += RECORD_HEADER_SZ;
  7384. ato16(rh->length, size);
  7385. }
  7386. else {
  7387. #ifdef WOLFSSL_DTLS
  7388. #ifdef HAVE_FUZZER
  7389. if (ssl->fuzzerCb)
  7390. ssl->fuzzerCb(ssl, input + *inOutIdx, DTLS_RECORD_HEADER_SZ,
  7391. FUZZ_HEAD, ssl->fuzzerCtx);
  7392. #endif
  7393. /* type and version in same sport */
  7394. XMEMCPY(rh, input + *inOutIdx, ENUM_LEN + VERSION_SZ);
  7395. *inOutIdx += ENUM_LEN + VERSION_SZ;
  7396. ato16(input + *inOutIdx, &ssl->keys.curEpoch);
  7397. *inOutIdx += OPAQUE16_LEN;
  7398. if (ssl->options.haveMcast) {
  7399. #ifdef WOLFSSL_MULTICAST
  7400. ssl->keys.curPeerId = input[*inOutIdx];
  7401. ssl->keys.curSeq_hi = input[*inOutIdx+1];
  7402. #endif
  7403. }
  7404. else
  7405. ato16(input + *inOutIdx, &ssl->keys.curSeq_hi);
  7406. *inOutIdx += OPAQUE16_LEN;
  7407. ato32(input + *inOutIdx, &ssl->keys.curSeq_lo);
  7408. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  7409. ato16(input + *inOutIdx, size);
  7410. *inOutIdx += LENGTH_SZ;
  7411. #endif
  7412. }
  7413. #ifdef WOLFSSL_DTLS
  7414. if (IsDtlsNotSctpMode(ssl)) {
  7415. if (!DtlsCheckWindow(ssl) ||
  7416. (rh->type == application_data && ssl->keys.curEpoch == 0) ||
  7417. (rh->type == alert && ssl->options.handShakeDone &&
  7418. ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
  7419. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  7420. return SEQUENCE_ERROR;
  7421. }
  7422. }
  7423. #endif
  7424. /* catch version mismatch */
  7425. #ifndef WOLFSSL_TLS13
  7426. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  7427. #else
  7428. if (rh->pvMajor != ssl->version.major ||
  7429. (rh->pvMinor != ssl->version.minor &&
  7430. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_2_MINOR)
  7431. ))
  7432. #endif
  7433. {
  7434. if (ssl->options.side == WOLFSSL_SERVER_END &&
  7435. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  7436. WOLFSSL_MSG("Client attempting to connect with different version");
  7437. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  7438. ssl->options.downgrade &&
  7439. ssl->options.connectState < FIRST_REPLY_DONE)
  7440. WOLFSSL_MSG("Server attempting to accept with different version");
  7441. else if (ssl->options.dtls && rh->type == handshake)
  7442. /* Check the DTLS handshake message RH version later. */
  7443. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  7444. else {
  7445. WOLFSSL_MSG("SSL version error");
  7446. /* send alert per RFC5246 Appendix E. Backward Compatibility */
  7447. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  7448. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  7449. SendAlert(ssl, alert_fatal, wc_protocol_version);
  7450. #else
  7451. SendAlert(ssl, alert_fatal, protocol_version);
  7452. #endif
  7453. }
  7454. return VERSION_ERROR; /* only use requested version */
  7455. }
  7456. }
  7457. /* record layer length check */
  7458. #ifdef HAVE_MAX_FRAGMENT
  7459. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  7460. SendAlert(ssl, alert_fatal, record_overflow);
  7461. return LENGTH_ERROR;
  7462. }
  7463. #else
  7464. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA))
  7465. return LENGTH_ERROR;
  7466. #endif
  7467. /* verify record type here as well */
  7468. switch (rh->type) {
  7469. case handshake:
  7470. case change_cipher_spec:
  7471. case application_data:
  7472. case alert:
  7473. break;
  7474. case no_type:
  7475. default:
  7476. WOLFSSL_MSG("Unknown Record Type");
  7477. return UNKNOWN_RECORD_TYPE;
  7478. }
  7479. /* haven't decrypted this record yet */
  7480. ssl->keys.decryptedCur = 0;
  7481. return 0;
  7482. }
  7483. #ifndef WOLFSSL_NO_TLS12
  7484. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  7485. byte *type, word32 *size, word32 totalSz)
  7486. {
  7487. const byte *ptr = input + *inOutIdx;
  7488. (void)ssl;
  7489. *inOutIdx += HANDSHAKE_HEADER_SZ;
  7490. if (*inOutIdx > totalSz)
  7491. return BUFFER_E;
  7492. *type = ptr[0];
  7493. c24to32(&ptr[1], size);
  7494. return 0;
  7495. }
  7496. #endif
  7497. #ifdef WOLFSSL_DTLS
  7498. static int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  7499. word32* inOutIdx, byte *type, word32 *size,
  7500. word32 *fragOffset, word32 *fragSz,
  7501. word32 totalSz)
  7502. {
  7503. word32 idx = *inOutIdx;
  7504. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  7505. if (*inOutIdx > totalSz) {
  7506. WOLFSSL_ERROR(BUFFER_E);
  7507. return BUFFER_E;
  7508. }
  7509. *type = input[idx++];
  7510. c24to32(input + idx, size);
  7511. idx += OPAQUE24_LEN;
  7512. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  7513. idx += DTLS_HANDSHAKE_SEQ_SZ;
  7514. c24to32(input + idx, fragOffset);
  7515. idx += DTLS_HANDSHAKE_FRAG_SZ;
  7516. c24to32(input + idx, fragSz);
  7517. if (ssl->curRL.pvMajor != ssl->version.major ||
  7518. ssl->curRL.pvMinor != ssl->version.minor) {
  7519. if (*type != client_hello && *type != hello_verify_request) {
  7520. WOLFSSL_ERROR(VERSION_ERROR);
  7521. return VERSION_ERROR;
  7522. }
  7523. else {
  7524. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  7525. }
  7526. }
  7527. return 0;
  7528. }
  7529. #endif
  7530. #if !defined(NO_OLD_TLS) || \
  7531. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  7532. /* fill with MD5 pad size since biggest required */
  7533. static const byte PAD1[PAD_MD5] =
  7534. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7535. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7536. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7537. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7538. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7539. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  7540. };
  7541. static const byte PAD2[PAD_MD5] =
  7542. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7543. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7544. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7545. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7546. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7547. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  7548. };
  7549. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  7550. #ifndef NO_OLD_TLS
  7551. /* calculate MD5 hash for finished */
  7552. #ifdef WOLFSSL_TI_HASH
  7553. #include <wolfssl/wolfcrypt/hash.h>
  7554. #endif
  7555. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  7556. {
  7557. int ret;
  7558. byte md5_result[WC_MD5_DIGEST_SIZE];
  7559. #ifdef WOLFSSL_SMALL_STACK
  7560. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7561. if (md5 == NULL)
  7562. return MEMORY_E;
  7563. #else
  7564. wc_Md5 md5[1];
  7565. #endif
  7566. /* make md5 inner */
  7567. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  7568. if (ret == 0)
  7569. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  7570. if (ret == 0)
  7571. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  7572. if (ret == 0)
  7573. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  7574. if (ret == 0)
  7575. ret = wc_Md5Final(md5, md5_result);
  7576. /* make md5 outer */
  7577. if (ret == 0) {
  7578. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  7579. if (ret == 0) {
  7580. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  7581. if (ret == 0)
  7582. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  7583. if (ret == 0)
  7584. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  7585. if (ret == 0)
  7586. ret = wc_Md5Final(md5, hashes->md5);
  7587. wc_Md5Free(md5);
  7588. }
  7589. }
  7590. #ifdef WOLFSSL_SMALL_STACK
  7591. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7592. #endif
  7593. return ret;
  7594. }
  7595. /* calculate SHA hash for finished */
  7596. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  7597. {
  7598. int ret;
  7599. byte sha_result[WC_SHA_DIGEST_SIZE];
  7600. #ifdef WOLFSSL_SMALL_STACK
  7601. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7602. if (sha == NULL)
  7603. return MEMORY_E;
  7604. #else
  7605. wc_Sha sha[1];
  7606. #endif
  7607. /* make sha inner */
  7608. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  7609. if (ret == 0)
  7610. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  7611. if (ret == 0)
  7612. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  7613. if (ret == 0)
  7614. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  7615. if (ret == 0)
  7616. ret = wc_ShaFinal(sha, sha_result);
  7617. /* make sha outer */
  7618. if (ret == 0) {
  7619. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  7620. if (ret == 0) {
  7621. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  7622. if (ret == 0)
  7623. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  7624. if (ret == 0)
  7625. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  7626. if (ret == 0)
  7627. ret = wc_ShaFinal(sha, hashes->sha);
  7628. wc_ShaFree(sha);
  7629. }
  7630. }
  7631. #ifdef WOLFSSL_SMALL_STACK
  7632. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7633. #endif
  7634. return ret;
  7635. }
  7636. #endif
  7637. #ifndef WOLFSSL_NO_TLS12
  7638. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  7639. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  7640. {
  7641. int ret = 0;
  7642. if (ssl == NULL)
  7643. return BAD_FUNC_ARG;
  7644. #ifndef NO_TLS
  7645. if (ssl->options.tls) {
  7646. ret = BuildTlsFinished(ssl, hashes, sender);
  7647. }
  7648. #endif
  7649. #ifndef NO_OLD_TLS
  7650. if (!ssl->options.tls) {
  7651. ret = BuildMD5(ssl, hashes, sender);
  7652. if (ret == 0) {
  7653. ret = BuildSHA(ssl, hashes, sender);
  7654. }
  7655. }
  7656. #endif
  7657. return ret;
  7658. }
  7659. #endif /* WOLFSSL_NO_TLS12 */
  7660. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  7661. /* cipher requirements */
  7662. enum {
  7663. REQUIRES_RSA,
  7664. REQUIRES_DHE,
  7665. REQUIRES_ECC,
  7666. REQUIRES_ECC_STATIC,
  7667. REQUIRES_PSK,
  7668. REQUIRES_NTRU,
  7669. REQUIRES_RSA_SIG,
  7670. REQUIRES_AEAD
  7671. };
  7672. /* Does this cipher suite (first, second) have the requirement
  7673. an ephemeral key exchange will still require the key for signing
  7674. the key exchange so ECHDE_RSA requires an rsa key thus rsa_kea */
  7675. static int CipherRequires(byte first, byte second, int requirement)
  7676. {
  7677. (void)requirement;
  7678. #ifndef WOLFSSL_NO_TLS12
  7679. #ifdef HAVE_CHACHA
  7680. if (first == CHACHA_BYTE) {
  7681. switch (second) {
  7682. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  7683. if (requirement == REQUIRES_RSA)
  7684. return 1;
  7685. break;
  7686. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  7687. if (requirement == REQUIRES_ECC)
  7688. return 1;
  7689. break;
  7690. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  7691. if (requirement == REQUIRES_RSA)
  7692. return 1;
  7693. if (requirement == REQUIRES_DHE)
  7694. return 1;
  7695. break;
  7696. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  7697. if (requirement == REQUIRES_RSA)
  7698. return 1;
  7699. break;
  7700. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  7701. if (requirement == REQUIRES_ECC)
  7702. return 1;
  7703. break;
  7704. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  7705. if (requirement == REQUIRES_RSA)
  7706. return 1;
  7707. if (requirement == REQUIRES_DHE)
  7708. return 1;
  7709. break;
  7710. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  7711. if (requirement == REQUIRES_PSK)
  7712. return 1;
  7713. break;
  7714. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  7715. if (requirement == REQUIRES_PSK)
  7716. return 1;
  7717. break;
  7718. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  7719. if (requirement == REQUIRES_PSK)
  7720. return 1;
  7721. if (requirement == REQUIRES_DHE)
  7722. return 1;
  7723. break;
  7724. }
  7725. if (requirement == REQUIRES_AEAD)
  7726. return 1;
  7727. }
  7728. #endif /* HAVE_CHACHA */
  7729. /* ECC extensions */
  7730. if (first == ECC_BYTE) {
  7731. switch (second) {
  7732. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7733. #ifndef NO_RSA
  7734. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  7735. if (requirement == REQUIRES_RSA)
  7736. return 1;
  7737. break;
  7738. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  7739. if (requirement == REQUIRES_ECC_STATIC)
  7740. return 1;
  7741. if (requirement == REQUIRES_RSA_SIG)
  7742. return 1;
  7743. break;
  7744. #ifndef NO_DES3
  7745. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  7746. if (requirement == REQUIRES_RSA)
  7747. return 1;
  7748. break;
  7749. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  7750. if (requirement == REQUIRES_ECC_STATIC)
  7751. return 1;
  7752. if (requirement == REQUIRES_RSA_SIG)
  7753. return 1;
  7754. break;
  7755. #endif /* !NO_DES3 */
  7756. #ifndef NO_RC4
  7757. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  7758. if (requirement == REQUIRES_RSA)
  7759. return 1;
  7760. break;
  7761. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  7762. if (requirement == REQUIRES_ECC_STATIC)
  7763. return 1;
  7764. if (requirement == REQUIRES_RSA_SIG)
  7765. return 1;
  7766. break;
  7767. #endif /* !NO_RC4 */
  7768. #endif /* NO_RSA */
  7769. #ifndef NO_DES3
  7770. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  7771. if (requirement == REQUIRES_ECC)
  7772. return 1;
  7773. break;
  7774. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  7775. if (requirement == REQUIRES_ECC_STATIC)
  7776. return 1;
  7777. break;
  7778. #endif /* !NO_DES3 */
  7779. #ifndef NO_RC4
  7780. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  7781. if (requirement == REQUIRES_ECC)
  7782. return 1;
  7783. break;
  7784. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  7785. if (requirement == REQUIRES_ECC_STATIC)
  7786. return 1;
  7787. break;
  7788. #endif /* !NO_RC4 */
  7789. #ifndef NO_RSA
  7790. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  7791. if (requirement == REQUIRES_RSA)
  7792. return 1;
  7793. break;
  7794. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  7795. if (requirement == REQUIRES_ECC_STATIC)
  7796. return 1;
  7797. if (requirement == REQUIRES_RSA_SIG)
  7798. return 1;
  7799. break;
  7800. #endif /* !NO_RSA */
  7801. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  7802. if (requirement == REQUIRES_ECC)
  7803. return 1;
  7804. break;
  7805. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  7806. if (requirement == REQUIRES_ECC_STATIC)
  7807. return 1;
  7808. break;
  7809. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  7810. if (requirement == REQUIRES_ECC)
  7811. return 1;
  7812. break;
  7813. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  7814. if (requirement == REQUIRES_ECC_STATIC)
  7815. return 1;
  7816. break;
  7817. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  7818. if (requirement == REQUIRES_ECC)
  7819. return 1;
  7820. if (requirement == REQUIRES_AEAD)
  7821. return 1;
  7822. break;
  7823. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  7824. if (requirement == REQUIRES_ECC)
  7825. return 1;
  7826. if (requirement == REQUIRES_AEAD)
  7827. return 1;
  7828. break;
  7829. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  7830. if (requirement == REQUIRES_ECC_STATIC)
  7831. return 1;
  7832. if (requirement == REQUIRES_AEAD)
  7833. return 1;
  7834. break;
  7835. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  7836. if (requirement == REQUIRES_ECC_STATIC)
  7837. return 1;
  7838. if (requirement == REQUIRES_AEAD)
  7839. return 1;
  7840. break;
  7841. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7842. #ifndef NO_RSA
  7843. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7844. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  7845. if (requirement == REQUIRES_RSA)
  7846. return 1;
  7847. if (requirement == REQUIRES_AEAD)
  7848. return 1;
  7849. break;
  7850. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  7851. if (requirement == REQUIRES_RSA)
  7852. return 1;
  7853. if (requirement == REQUIRES_AEAD)
  7854. return 1;
  7855. break;
  7856. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  7857. if (requirement == REQUIRES_ECC_STATIC)
  7858. return 1;
  7859. if (requirement == REQUIRES_RSA_SIG)
  7860. return 1;
  7861. if (requirement == REQUIRES_AEAD)
  7862. return 1;
  7863. break;
  7864. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  7865. if (requirement == REQUIRES_ECC_STATIC)
  7866. return 1;
  7867. if (requirement == REQUIRES_RSA_SIG)
  7868. return 1;
  7869. if (requirement == REQUIRES_AEAD)
  7870. return 1;
  7871. break;
  7872. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7873. #ifdef HAVE_AESCCM
  7874. case TLS_RSA_WITH_AES_128_CCM_8 :
  7875. case TLS_RSA_WITH_AES_256_CCM_8 :
  7876. if (requirement == REQUIRES_RSA)
  7877. return 1;
  7878. if (requirement == REQUIRES_RSA_SIG)
  7879. return 1;
  7880. if (requirement == REQUIRES_AEAD)
  7881. return 1;
  7882. break;
  7883. #endif /* HAVE_AESCCM */
  7884. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7885. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  7886. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  7887. if (requirement == REQUIRES_RSA)
  7888. return 1;
  7889. break;
  7890. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  7891. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  7892. if (requirement == REQUIRES_RSA_SIG)
  7893. return 1;
  7894. if (requirement == REQUIRES_ECC_STATIC)
  7895. return 1;
  7896. break;
  7897. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7898. #endif /* !NO_RSA */
  7899. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7900. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  7901. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  7902. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  7903. if (requirement == REQUIRES_ECC)
  7904. return 1;
  7905. if (requirement == REQUIRES_AEAD)
  7906. return 1;
  7907. break;
  7908. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  7909. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  7910. if (requirement == REQUIRES_ECC)
  7911. return 1;
  7912. break;
  7913. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  7914. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  7915. if (requirement == REQUIRES_ECC)
  7916. return 1;
  7917. if (requirement == REQUIRES_ECC_STATIC)
  7918. return 1;
  7919. break;
  7920. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7921. #ifndef NO_PSK
  7922. case TLS_PSK_WITH_AES_128_CCM:
  7923. case TLS_PSK_WITH_AES_256_CCM:
  7924. case TLS_PSK_WITH_AES_128_CCM_8:
  7925. case TLS_PSK_WITH_AES_256_CCM_8:
  7926. if (requirement == REQUIRES_PSK)
  7927. return 1;
  7928. if (requirement == REQUIRES_AEAD)
  7929. return 1;
  7930. break;
  7931. case TLS_DHE_PSK_WITH_AES_128_CCM:
  7932. case TLS_DHE_PSK_WITH_AES_256_CCM:
  7933. if (requirement == REQUIRES_PSK)
  7934. return 1;
  7935. if (requirement == REQUIRES_DHE)
  7936. return 1;
  7937. if (requirement == REQUIRES_AEAD)
  7938. return 1;
  7939. break;
  7940. #endif /* !NO_PSK */
  7941. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7942. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  7943. if (requirement == REQUIRES_ECC)
  7944. return 1;
  7945. break;
  7946. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  7947. if (requirement == REQUIRES_PSK)
  7948. return 1;
  7949. break;
  7950. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  7951. if (requirement == REQUIRES_PSK)
  7952. return 1;
  7953. break;
  7954. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7955. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  7956. case TLS_SHA256_SHA256:
  7957. break;
  7958. case TLS_SHA384_SHA384:
  7959. break;
  7960. #endif
  7961. default:
  7962. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  7963. return 0;
  7964. } /* switch */
  7965. } /* if */
  7966. #endif /* !WOLFSSL_NO_TLS12 */
  7967. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  7968. if (first == TLS13_BYTE) {
  7969. switch (second) {
  7970. #ifdef WOLFSSL_TLS13
  7971. case TLS_AES_128_GCM_SHA256:
  7972. case TLS_AES_256_GCM_SHA384:
  7973. case TLS_CHACHA20_POLY1305_SHA256:
  7974. case TLS_AES_128_CCM_SHA256:
  7975. case TLS_AES_128_CCM_8_SHA256:
  7976. break;
  7977. #endif
  7978. default:
  7979. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  7980. "TLS v1.3");
  7981. return 0;
  7982. }
  7983. }
  7984. #ifndef WOLFSSL_NO_TLS12
  7985. if (first != ECC_BYTE && first != CHACHA_BYTE &&
  7986. first != TLS13_BYTE) { /* normal suites */
  7987. switch (second) {
  7988. #ifndef NO_RSA
  7989. #ifndef NO_RC4
  7990. case SSL_RSA_WITH_RC4_128_SHA :
  7991. if (requirement == REQUIRES_RSA)
  7992. return 1;
  7993. break;
  7994. case SSL_RSA_WITH_RC4_128_MD5 :
  7995. if (requirement == REQUIRES_RSA)
  7996. return 1;
  7997. break;
  7998. #endif /* NO_RC4 */
  7999. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  8000. if (requirement == REQUIRES_RSA)
  8001. return 1;
  8002. break;
  8003. #ifdef HAVE_NTRU
  8004. case TLS_NTRU_RSA_WITH_RC4_128_SHA :
  8005. if (requirement == REQUIRES_NTRU)
  8006. return 1;
  8007. break;
  8008. #endif /* HAVE_NTRU */
  8009. case TLS_RSA_WITH_AES_128_CBC_SHA :
  8010. if (requirement == REQUIRES_RSA)
  8011. return 1;
  8012. break;
  8013. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  8014. if (requirement == REQUIRES_RSA)
  8015. return 1;
  8016. break;
  8017. #ifdef HAVE_NTRU
  8018. case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA :
  8019. if (requirement == REQUIRES_NTRU)
  8020. return 1;
  8021. break;
  8022. #endif /* HAVE_NTRU */
  8023. case TLS_RSA_WITH_AES_256_CBC_SHA :
  8024. if (requirement == REQUIRES_RSA)
  8025. return 1;
  8026. break;
  8027. #ifdef HAVE_NTRU
  8028. case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA :
  8029. if (requirement == REQUIRES_NTRU)
  8030. return 1;
  8031. break;
  8032. #endif /* HAVE_NTRU */
  8033. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  8034. if (requirement == REQUIRES_RSA)
  8035. return 1;
  8036. break;
  8037. case TLS_RSA_WITH_NULL_MD5 :
  8038. case TLS_RSA_WITH_NULL_SHA :
  8039. case TLS_RSA_WITH_NULL_SHA256 :
  8040. if (requirement == REQUIRES_RSA)
  8041. return 1;
  8042. break;
  8043. #ifdef HAVE_NTRU
  8044. case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA :
  8045. if (requirement == REQUIRES_NTRU)
  8046. return 1;
  8047. break;
  8048. #endif /* HAVE_NTRU */
  8049. #ifdef HAVE_IDEA
  8050. case SSL_RSA_WITH_IDEA_CBC_SHA :
  8051. if (requirement == REQUIRES_RSA)
  8052. return 1;
  8053. break;
  8054. #endif /* HAVE_IDEA */
  8055. #endif /* !NO_RSA */
  8056. #ifndef NO_PSK
  8057. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  8058. if (requirement == REQUIRES_PSK)
  8059. return 1;
  8060. if (requirement == REQUIRES_AEAD)
  8061. return 1;
  8062. break;
  8063. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  8064. if (requirement == REQUIRES_PSK)
  8065. return 1;
  8066. if (requirement == REQUIRES_AEAD)
  8067. return 1;
  8068. break;
  8069. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  8070. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  8071. case TLS_PSK_WITH_AES_128_CBC_SHA :
  8072. case TLS_PSK_WITH_AES_256_CBC_SHA :
  8073. case TLS_PSK_WITH_NULL_SHA384 :
  8074. case TLS_PSK_WITH_NULL_SHA256 :
  8075. case TLS_PSK_WITH_NULL_SHA :
  8076. if (requirement == REQUIRES_PSK)
  8077. return 1;
  8078. break;
  8079. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  8080. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  8081. if (requirement == REQUIRES_DHE)
  8082. return 1;
  8083. if (requirement == REQUIRES_PSK)
  8084. return 1;
  8085. if (requirement == REQUIRES_AEAD)
  8086. return 1;
  8087. break;
  8088. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  8089. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  8090. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  8091. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  8092. if (requirement == REQUIRES_DHE)
  8093. return 1;
  8094. if (requirement == REQUIRES_PSK)
  8095. return 1;
  8096. break;
  8097. #endif /* NO_PSK */
  8098. #ifndef NO_RSA
  8099. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  8100. if (requirement == REQUIRES_RSA)
  8101. return 1;
  8102. if (requirement == REQUIRES_DHE)
  8103. return 1;
  8104. break;
  8105. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  8106. if (requirement == REQUIRES_RSA)
  8107. return 1;
  8108. if (requirement == REQUIRES_DHE)
  8109. return 1;
  8110. break;
  8111. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  8112. if (requirement == REQUIRES_RSA)
  8113. return 1;
  8114. if (requirement == REQUIRES_DHE)
  8115. return 1;
  8116. break;
  8117. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  8118. if (requirement == REQUIRES_RSA)
  8119. return 1;
  8120. if (requirement == REQUIRES_DHE)
  8121. return 1;
  8122. break;
  8123. #ifndef NO_HC128
  8124. case TLS_RSA_WITH_HC_128_MD5 :
  8125. if (requirement == REQUIRES_RSA)
  8126. return 1;
  8127. break;
  8128. case TLS_RSA_WITH_HC_128_SHA :
  8129. if (requirement == REQUIRES_RSA)
  8130. return 1;
  8131. break;
  8132. #endif /* NO_HC128 */
  8133. #ifndef NO_RABBIT
  8134. case TLS_RSA_WITH_RABBIT_SHA :
  8135. if (requirement == REQUIRES_RSA)
  8136. return 1;
  8137. break;
  8138. #endif /* !NO_RABBIT */
  8139. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  8140. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  8141. if (requirement == REQUIRES_RSA)
  8142. return 1;
  8143. if (requirement == REQUIRES_AEAD)
  8144. return 1;
  8145. break;
  8146. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  8147. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  8148. if (requirement == REQUIRES_RSA)
  8149. return 1;
  8150. if (requirement == REQUIRES_DHE)
  8151. return 1;
  8152. if (requirement == REQUIRES_AEAD)
  8153. return 1;
  8154. break;
  8155. #ifdef HAVE_CAMELLIA
  8156. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  8157. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  8158. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  8159. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  8160. if (requirement == REQUIRES_RSA)
  8161. return 1;
  8162. break;
  8163. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  8164. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  8165. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  8166. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  8167. if (requirement == REQUIRES_RSA)
  8168. return 1;
  8169. if (requirement == REQUIRES_RSA_SIG)
  8170. return 1;
  8171. if (requirement == REQUIRES_DHE)
  8172. return 1;
  8173. break;
  8174. #endif /* HAVE_CAMELLIA */
  8175. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  8176. if (requirement == REQUIRES_RSA)
  8177. return 1;
  8178. if (requirement == REQUIRES_RSA_SIG)
  8179. return 1;
  8180. if (requirement == REQUIRES_DHE)
  8181. return 1;
  8182. break;
  8183. #endif
  8184. #ifdef HAVE_ANON
  8185. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  8186. if (requirement == REQUIRES_DHE)
  8187. return 1;
  8188. break;
  8189. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  8190. if (requirement == REQUIRES_DHE)
  8191. return 1;
  8192. if (requirement == REQUIRES_AEAD)
  8193. return 1;
  8194. break;
  8195. #endif
  8196. #ifdef WOLFSSL_MULTICAST
  8197. case WDM_WITH_NULL_SHA256 :
  8198. break;
  8199. #endif
  8200. default:
  8201. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  8202. return 0;
  8203. } /* switch */
  8204. } /* if ECC / Normal suites else */
  8205. #endif /* !WOLFSSL_NO_TLS12 */
  8206. return 0;
  8207. }
  8208. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  8209. #ifndef NO_CERTS
  8210. /* Match names with wildcards, each wildcard can represent a single name
  8211. component or fragment but not multiple names, i.e.,
  8212. *.z.com matches y.z.com but not x.y.z.com
  8213. return 1 on success */
  8214. int MatchDomainName(const char* pattern, int len, const char* str)
  8215. {
  8216. int ret = 0;
  8217. char p, s;
  8218. if (pattern == NULL || str == NULL || len <= 0)
  8219. return 0;
  8220. while (len > 0) {
  8221. p = (char)XTOLOWER((unsigned char)*pattern++);
  8222. if (p == '\0')
  8223. break;
  8224. if (p == '*') {
  8225. while (--len > 0 &&
  8226. (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') {
  8227. }
  8228. if (len == 0)
  8229. p = '\0';
  8230. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  8231. if (s == p)
  8232. break;
  8233. if (s == '.')
  8234. return 0;
  8235. str++;
  8236. }
  8237. }
  8238. else {
  8239. if (p != (char)XTOLOWER((unsigned char) *str))
  8240. return 0;
  8241. }
  8242. if (len > 0) {
  8243. str++;
  8244. len--;
  8245. }
  8246. }
  8247. if (*str == '\0' && len == 0) {
  8248. ret = 1; /* success */
  8249. }
  8250. return ret;
  8251. }
  8252. /* Check that alternative names, if they exists, match the domain.
  8253. * Fail if there are wild patterns and they didn't match.
  8254. * Check the common name if no alternative names matched.
  8255. *
  8256. * dCert Decoded cert to get the alternative names from.
  8257. * domain Domain name to compare against.
  8258. * checkCN Whether to check the common name.
  8259. * returns 1 : match was found.
  8260. * 0 : no match found.
  8261. * -1 : No matches and wild pattern match failed.
  8262. */
  8263. int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
  8264. {
  8265. int match = 0;
  8266. DNS_entry* altName = NULL;
  8267. char *buf;
  8268. word32 len;
  8269. WOLFSSL_MSG("Checking AltNames");
  8270. if (dCert)
  8271. altName = dCert->altNames;
  8272. if (checkCN != NULL) {
  8273. *checkCN = (altName == NULL) ? 1 : 0;
  8274. }
  8275. while (altName) {
  8276. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  8277. char name[WOLFSSL_MAX_IPSTR] = {0};
  8278. #endif
  8279. WOLFSSL_MSG("\tindividual AltName check");
  8280. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  8281. /* check if alt name is stored as IP addr octet */
  8282. if (altName->type == ASN_IP_TYPE) {
  8283. char tmp[4];
  8284. int i;
  8285. word32 idx = 0;
  8286. for (i = 0; (idx < WOLFSSL_MAX_IPSTR) && (i < altName->len); i++) {
  8287. XMEMSET(tmp, 0, sizeof(tmp));
  8288. XSNPRINTF(tmp, sizeof(tmp), (altName->len <= 4) ? "%u" : "%02X",
  8289. altName->name[i]);
  8290. idx += (word32)XSTRLEN(tmp);
  8291. XSTRNCAT(name, tmp, (altName->len <= 4) ? 3 : 2);
  8292. if ((idx < WOLFSSL_MAX_IPSTR ) && ((i + 1) < altName->len)) {
  8293. name[idx++] = (altName->len <= 4) ? '.' : ':';
  8294. }
  8295. }
  8296. if (idx >= WOLFSSL_MAX_IPSTR) {
  8297. idx = WOLFSSL_MAX_IPSTR -1;
  8298. }
  8299. name[idx] = '\0';
  8300. buf = name;
  8301. len = (word32)XSTRLEN(name);
  8302. }
  8303. else
  8304. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  8305. {
  8306. buf = altName->name;
  8307. len = altName->len;
  8308. }
  8309. if (MatchDomainName(buf, len, domain)) {
  8310. match = 1;
  8311. if (checkCN != NULL) {
  8312. *checkCN = 0;
  8313. }
  8314. WOLFSSL_MSG("\tmatch found");
  8315. break;
  8316. }
  8317. /* No matches and wild pattern match failed. */
  8318. else if (buf && (len >=1) && (buf[0] == '*')) {
  8319. match = -1;
  8320. WOLFSSL_MSG("\twildcard match failed");
  8321. }
  8322. altName = altName->next;
  8323. }
  8324. return match;
  8325. }
  8326. /* Check the domain name matches the subject alternative name or the subject
  8327. * name.
  8328. *
  8329. * dcert Decoded certificate.
  8330. * domainName The domain name.
  8331. * domainNameLen The length of the domain name.
  8332. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  8333. */
  8334. int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
  8335. {
  8336. int checkCN;
  8337. int ret = DOMAIN_NAME_MISMATCH;
  8338. /* Assume name is NUL terminated. */
  8339. (void)domainNameLen;
  8340. if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
  8341. WOLFSSL_MSG("DomainName match on alt names failed");
  8342. }
  8343. else {
  8344. ret = 0;
  8345. }
  8346. if (checkCN == 1) {
  8347. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  8348. domainName) == 1) {
  8349. ret = 0;
  8350. }
  8351. else {
  8352. WOLFSSL_MSG("DomainName match on common name failed");
  8353. }
  8354. }
  8355. return ret;
  8356. }
  8357. int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
  8358. {
  8359. WOLFSSL_MSG("Checking IPAddr");
  8360. return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
  8361. }
  8362. #ifdef SESSION_CERTS
  8363. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  8364. byte* certBuf, word32 certSz)
  8365. {
  8366. if (chain->count < MAX_CHAIN_DEPTH &&
  8367. certSz < MAX_X509_SIZE) {
  8368. chain->certs[chain->count].length = certSz;
  8369. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  8370. chain->count++;
  8371. }
  8372. else {
  8373. WOLFSSL_MSG("Couldn't store chain cert for session");
  8374. }
  8375. }
  8376. #endif
  8377. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  8378. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8379. /* Copy parts X509 needs from Decoded cert, 0 on success */
  8380. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  8381. * altNames pointers could be free'd by second x509 still active by first */
  8382. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  8383. {
  8384. int ret = 0;
  8385. if (x509 == NULL || dCert == NULL ||
  8386. dCert->subjectCNLen < 0)
  8387. return BAD_FUNC_ARG;
  8388. if (x509->issuer.name == NULL || x509->subject.name == NULL) {
  8389. WOLFSSL_MSG("Either init was not called on X509 or programming error");
  8390. return BAD_FUNC_ARG;
  8391. }
  8392. x509->version = dCert->version + 1;
  8393. XSTRNCPY(x509->issuer.name, dCert->issuer, ASN_NAME_MAX);
  8394. x509->issuer.name[ASN_NAME_MAX - 1] = '\0';
  8395. x509->issuer.sz = (int)XSTRLEN(x509->issuer.name) + 1;
  8396. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8397. if (dCert->issuerName != NULL) {
  8398. wolfSSL_X509_set_issuer_name(x509,
  8399. (WOLFSSL_X509_NAME*)dCert->issuerName);
  8400. x509->issuer.x509 = x509;
  8401. }
  8402. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8403. XSTRNCPY(x509->subject.name, dCert->subject, ASN_NAME_MAX);
  8404. x509->subject.name[ASN_NAME_MAX - 1] = '\0';
  8405. x509->subject.sz = (int)XSTRLEN(x509->subject.name) + 1;
  8406. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8407. if (dCert->subjectName != NULL) {
  8408. wolfSSL_X509_set_subject_name(x509,
  8409. (WOLFSSL_X509_NAME*)dCert->subjectName);
  8410. x509->subject.x509 = x509;
  8411. }
  8412. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8413. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  8414. x509->subject.rawLen = min(dCert->subjectRawLen, sizeof(x509->subject.raw));
  8415. XMEMCPY(x509->subject.raw, dCert->subjectRaw, x509->subject.rawLen);
  8416. #ifdef WOLFSSL_CERT_EXT
  8417. x509->issuer.rawLen = min(dCert->issuerRawLen, sizeof(x509->issuer.raw));
  8418. XMEMCPY(x509->issuer.raw, dCert->issuerRaw, x509->issuer.rawLen);
  8419. #endif
  8420. #endif
  8421. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  8422. x509->serialSz = dCert->serialSz;
  8423. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  8424. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  8425. x509->subjectCN[dCert->subjectCNLen] = '\0';
  8426. }
  8427. else
  8428. x509->subjectCN[0] = '\0';
  8429. #ifdef WOLFSSL_CERT_REQ
  8430. x509->isCSR = dCert->isCSR;
  8431. /* CSR attributes */
  8432. if (dCert->cPwd) {
  8433. if (dCert->cPwdLen < CTC_NAME_SIZE) {
  8434. XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
  8435. x509->challengePw[dCert->cPwdLen] = '\0';
  8436. #ifdef OPENSSL_ALL
  8437. if (x509->challengePwAttr) {
  8438. wolfSSL_X509_ATTRIBUTE_free(x509->challengePwAttr);
  8439. }
  8440. x509->challengePwAttr = wolfSSL_X509_ATTRIBUTE_new();
  8441. if (x509->challengePwAttr) {
  8442. x509->challengePwAttr->value->value.asn1_string =
  8443. wolfSSL_ASN1_STRING_new();
  8444. if (wolfSSL_ASN1_STRING_set(
  8445. x509->challengePwAttr->value->value.asn1_string,
  8446. dCert->cPwd, dCert->cPwdLen) != WOLFSSL_SUCCESS) {
  8447. ret = MEMORY_E;
  8448. }
  8449. x509->challengePwAttr->value->type = V_ASN1_PRINTABLESTRING;
  8450. }
  8451. else {
  8452. ret = MEMORY_E;
  8453. }
  8454. #endif
  8455. }
  8456. else {
  8457. WOLFSSL_MSG("Challenge password too long");
  8458. ret = MEMORY_E;
  8459. }
  8460. }
  8461. #endif
  8462. #ifdef WOLFSSL_SEP
  8463. {
  8464. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  8465. if (minSz > 0) {
  8466. x509->deviceTypeSz = minSz;
  8467. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  8468. }
  8469. else
  8470. x509->deviceTypeSz = 0;
  8471. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  8472. if (minSz > 0) {
  8473. x509->hwTypeSz = minSz;
  8474. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  8475. }
  8476. else
  8477. x509->hwTypeSz = 0;
  8478. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  8479. if (minSz > 0) {
  8480. x509->hwSerialNumSz = minSz;
  8481. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  8482. }
  8483. else
  8484. x509->hwSerialNumSz = 0;
  8485. }
  8486. #endif /* WOLFSSL_SEP */
  8487. {
  8488. int minSz;
  8489. if (dCert->beforeDateLen > 0) {
  8490. minSz = min(dCert->beforeDate[1], MAX_DATE_SZ);
  8491. x509->notBefore.type = dCert->beforeDate[0];
  8492. x509->notBefore.length = minSz;
  8493. XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
  8494. }
  8495. else
  8496. x509->notBefore.length = 0;
  8497. if (dCert->afterDateLen > 0) {
  8498. minSz = min(dCert->afterDate[1], MAX_DATE_SZ);
  8499. x509->notAfter.type = dCert->afterDate[0];
  8500. x509->notAfter.length = minSz;
  8501. XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
  8502. }
  8503. else
  8504. x509->notAfter.length = 0;
  8505. }
  8506. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  8507. x509->pubKey.buffer = (byte*)XMALLOC(
  8508. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  8509. if (x509->pubKey.buffer != NULL) {
  8510. x509->pubKeyOID = dCert->keyOID;
  8511. x509->pubKey.length = dCert->pubKeySize;
  8512. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  8513. }
  8514. else
  8515. ret = MEMORY_E;
  8516. #if defined(OPENSSL_ALL)
  8517. if (ret == 0) {
  8518. x509->key.pubKeyOID = dCert->keyOID;
  8519. if (!x509->key.algor) {
  8520. x509->key.algor = wolfSSL_X509_ALGOR_new();
  8521. } else {
  8522. wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
  8523. }
  8524. if (!(x509->key.algor->algorithm =
  8525. wolfSSL_OBJ_nid2obj(dCert->keyOID))) {
  8526. ret = PUBLIC_KEY_E;
  8527. }
  8528. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  8529. if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
  8530. &dCert->publicKey,
  8531. dCert->pubKeySize))) {
  8532. ret = PUBLIC_KEY_E;
  8533. }
  8534. }
  8535. #endif
  8536. }
  8537. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  8538. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  8539. x509->sig.buffer = (byte*)XMALLOC(
  8540. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  8541. if (x509->sig.buffer == NULL) {
  8542. ret = MEMORY_E;
  8543. }
  8544. else {
  8545. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  8546. x509->sig.length = dCert->sigLength;
  8547. x509->sigOID = dCert->signatureOID;
  8548. }
  8549. #if defined(OPENSSL_ALL)
  8550. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  8551. if (!(x509->algor.algorithm =
  8552. wolfSSL_OBJ_nid2obj(dCert->signatureOID))) {
  8553. ret = PUBLIC_KEY_E;
  8554. }
  8555. #endif
  8556. }
  8557. /* store cert for potential retrieval */
  8558. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap) == 0) {
  8559. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  8560. }
  8561. else {
  8562. ret = MEMORY_E;
  8563. }
  8564. x509->altNames = dCert->altNames;
  8565. dCert->weOwnAltNames = 0;
  8566. x509->altNamesNext = x509->altNames; /* index hint */
  8567. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  8568. !defined(IGNORE_NAME_CONSTRAINTS)
  8569. /* add copies of alternate emails from dCert to X509 */
  8570. if (dCert->altEmailNames != NULL) {
  8571. DNS_entry* cur = dCert->altEmailNames;
  8572. while (cur != NULL) {
  8573. if (cur->type == ASN_RFC822_TYPE) {
  8574. DNS_entry* dnsEntry;
  8575. int strLen = cur->len;
  8576. dnsEntry = (DNS_entry*)XMALLOC(sizeof(DNS_entry), x509->heap,
  8577. DYNAMIC_TYPE_ALTNAME);
  8578. if (dnsEntry == NULL) {
  8579. WOLFSSL_MSG("\tOut of Memory");
  8580. return MEMORY_E;
  8581. }
  8582. dnsEntry->type = ASN_RFC822_TYPE;
  8583. dnsEntry->name = (char*)XMALLOC(strLen + 1, x509->heap,
  8584. DYNAMIC_TYPE_ALTNAME);
  8585. if (dnsEntry->name == NULL) {
  8586. WOLFSSL_MSG("\tOut of Memory");
  8587. XFREE(dnsEntry, x509->heap, DYNAMIC_TYPE_ALTNAME);
  8588. return MEMORY_E;
  8589. }
  8590. dnsEntry->len = strLen;
  8591. XMEMCPY(dnsEntry->name, cur->name, strLen);
  8592. dnsEntry->name[strLen] = '\0';
  8593. dnsEntry->next = x509->altNames;
  8594. x509->altNames = dnsEntry;
  8595. }
  8596. cur = cur->next;
  8597. }
  8598. }
  8599. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8600. x509->isCa = dCert->isCA;
  8601. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8602. x509->pathLength = dCert->pathLength;
  8603. x509->keyUsage = dCert->extKeyUsage;
  8604. x509->CRLdistSet = dCert->extCRLdistSet;
  8605. x509->CRLdistCrit = dCert->extCRLdistCrit;
  8606. x509->CRLInfo = dCert->extCrlInfo;
  8607. x509->CRLInfoSz = dCert->extCrlInfoSz;
  8608. x509->authInfoSet = dCert->extAuthInfoSet;
  8609. x509->authInfoCrit = dCert->extAuthInfoCrit;
  8610. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  8611. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  8612. DYNAMIC_TYPE_X509_EXT);
  8613. if (x509->authInfo != NULL) {
  8614. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  8615. x509->authInfoSz = dCert->extAuthInfoSz;
  8616. }
  8617. else {
  8618. ret = MEMORY_E;
  8619. }
  8620. }
  8621. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  8622. if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
  8623. x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
  8624. DYNAMIC_TYPE_X509_EXT);
  8625. if (x509->authInfoCaIssuer != NULL) {
  8626. XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
  8627. x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
  8628. }
  8629. else {
  8630. ret = MEMORY_E;
  8631. }
  8632. }
  8633. #endif
  8634. x509->basicConstSet = dCert->extBasicConstSet;
  8635. x509->basicConstCrit = dCert->extBasicConstCrit;
  8636. x509->basicConstPlSet = dCert->pathLengthSet;
  8637. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  8638. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  8639. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  8640. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  8641. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  8642. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  8643. DYNAMIC_TYPE_X509_EXT);
  8644. if (x509->authKeyId != NULL) {
  8645. XMEMCPY(x509->authKeyId,
  8646. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  8647. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  8648. }
  8649. else
  8650. ret = MEMORY_E;
  8651. }
  8652. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  8653. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  8654. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  8655. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  8656. DYNAMIC_TYPE_X509_EXT);
  8657. if (x509->subjKeyId != NULL) {
  8658. XMEMCPY(x509->subjKeyId,
  8659. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  8660. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  8661. }
  8662. else
  8663. ret = MEMORY_E;
  8664. }
  8665. x509->keyUsageSet = dCert->extKeyUsageSet;
  8666. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  8667. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  8668. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  8669. x509->heap, DYNAMIC_TYPE_X509_EXT);
  8670. if (x509->extKeyUsageSrc != NULL) {
  8671. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  8672. dCert->extExtKeyUsageSz);
  8673. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  8674. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  8675. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  8676. }
  8677. else {
  8678. ret = MEMORY_E;
  8679. }
  8680. }
  8681. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  8682. x509->certPolicySet = dCert->extCertPolicySet;
  8683. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  8684. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  8685. #ifdef WOLFSSL_CERT_EXT
  8686. {
  8687. int i;
  8688. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  8689. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  8690. MAX_CERTPOL_SZ);
  8691. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  8692. }
  8693. #endif /* WOLFSSL_CERT_EXT */
  8694. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8695. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  8696. x509->pkCurveOID = dCert->pkCurveOID;
  8697. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8698. return ret;
  8699. }
  8700. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  8701. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  8702. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  8703. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  8704. word32 status_length)
  8705. {
  8706. int ret = 0;
  8707. OcspRequest* request;
  8708. WOLFSSL_ENTER("ProcessCSR");
  8709. #ifdef WOLFSSL_SMALL_STACK
  8710. CertStatus* status;
  8711. OcspEntry* single;
  8712. OcspResponse* response;
  8713. #else
  8714. CertStatus status[1];
  8715. OcspEntry single[1];
  8716. OcspResponse response[1];
  8717. #endif
  8718. do {
  8719. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  8720. if (ssl->status_request) {
  8721. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  8722. ssl->status_request = 0;
  8723. break;
  8724. }
  8725. #endif
  8726. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  8727. if (ssl->status_request_v2) {
  8728. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  8729. WOLFSSL_CSR2_OCSP, 0);
  8730. ssl->status_request_v2 = 0;
  8731. break;
  8732. }
  8733. #endif
  8734. return BUFFER_ERROR;
  8735. } while(0);
  8736. if (request == NULL)
  8737. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  8738. #ifdef WOLFSSL_SMALL_STACK
  8739. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  8740. DYNAMIC_TYPE_OCSP_STATUS);
  8741. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  8742. DYNAMIC_TYPE_OCSP_ENTRY);
  8743. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  8744. DYNAMIC_TYPE_OCSP_REQUEST);
  8745. if (status == NULL || single == NULL || response == NULL) {
  8746. if (status)
  8747. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  8748. if (single)
  8749. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  8750. if (response)
  8751. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  8752. return MEMORY_ERROR;
  8753. }
  8754. #endif
  8755. InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
  8756. if (OcspResponseDecode(response, ssl->ctx->cm, ssl->heap, 0) != 0)
  8757. ret = BAD_CERTIFICATE_STATUS_ERROR;
  8758. else if (CompareOcspReqResp(request, response) != 0)
  8759. ret = BAD_CERTIFICATE_STATUS_ERROR;
  8760. else if (response->responseStatus != OCSP_SUCCESSFUL)
  8761. ret = BAD_CERTIFICATE_STATUS_ERROR;
  8762. else if (response->single->status->status == CERT_REVOKED)
  8763. ret = OCSP_CERT_REVOKED;
  8764. else if (response->single->status->status != CERT_GOOD)
  8765. ret = BAD_CERTIFICATE_STATUS_ERROR;
  8766. else {
  8767. XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
  8768. ssl->ocspProducedDateFormat = response->producedDateFormat;
  8769. }
  8770. *inOutIdx += status_length;
  8771. #ifdef WOLFSSL_SMALL_STACK
  8772. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  8773. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  8774. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  8775. #endif
  8776. WOLFSSL_LEAVE("ProcessCSR", ret);
  8777. return ret;
  8778. }
  8779. #endif
  8780. #ifdef HAVE_PK_CALLBACKS
  8781. #ifdef HAVE_ECC
  8782. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  8783. const unsigned char* hash, unsigned int hashSz,
  8784. const unsigned char* keyDer, unsigned int keySz,
  8785. int* result, void* ctx)
  8786. {
  8787. int ret = NOT_COMPILED_IN;
  8788. WOLFSSL* ssl = (WOLFSSL*)ctx;
  8789. if (ssl && ssl->ctx->EccVerifyCb) {
  8790. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  8791. keyDer, keySz, result, ssl->EccVerifyCtx);
  8792. }
  8793. return ret;
  8794. }
  8795. #endif
  8796. #ifndef NO_RSA
  8797. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  8798. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  8799. void* ctx)
  8800. {
  8801. int ret = NOT_COMPILED_IN;
  8802. WOLFSSL* ssl = (WOLFSSL*)ctx;
  8803. if (ssl && ssl->ctx->RsaVerifyCb) {
  8804. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  8805. ssl->RsaVerifyCtx);
  8806. }
  8807. return ret;
  8808. }
  8809. #endif
  8810. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  8811. {
  8812. if (ssl == NULL || sigCtx == NULL)
  8813. return BAD_FUNC_ARG;
  8814. /* only setup the verify callback if a PK is set */
  8815. #ifdef HAVE_ECC
  8816. if (ssl->ctx->EccVerifyCb) {
  8817. sigCtx->pkCbEcc = SigPkCbEccVerify;
  8818. sigCtx->pkCtxEcc = ssl;
  8819. }
  8820. #endif
  8821. #ifndef NO_RSA
  8822. /* only setup the verify callback if a PK is set */
  8823. if (ssl->ctx->RsaVerifyCb) {
  8824. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  8825. sigCtx->pkCtxRsa = ssl;
  8826. }
  8827. #endif
  8828. return 0;
  8829. }
  8830. #endif /* HAVE_PK_CALLBACKS */
  8831. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  8832. static void DoCertFatalAlert(WOLFSSL* ssl, int ret)
  8833. {
  8834. int alertWhy;
  8835. if (ssl == NULL || ret == 0) {
  8836. return;
  8837. }
  8838. /* Determine alert reason */
  8839. alertWhy = bad_certificate;
  8840. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
  8841. alertWhy = certificate_expired;
  8842. } else if (ret == ASN_NO_SIGNER_E) {
  8843. alertWhy = unknown_ca;
  8844. }
  8845. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD))
  8846. else if (ret == CRL_CERT_REVOKED) {
  8847. alertWhy = certificate_revoked;
  8848. }
  8849. #endif
  8850. else if (ret == NO_PEER_CERT) {
  8851. #ifdef WOLFSSL_TLS13
  8852. if (ssl->options.tls1_3) {
  8853. alertWhy = certificate_required;
  8854. }
  8855. else
  8856. #endif
  8857. {
  8858. alertWhy = handshake_failure;
  8859. }
  8860. }
  8861. /* send fatal alert and mark connection closed */
  8862. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  8863. ssl->options.isClosed = 1;
  8864. }
  8865. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  8866. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  8867. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  8868. * The intermediates are done first then peer leaf cert last. Use the
  8869. * store->error_depth member to determine index (0=peer, >1 intermediates)
  8870. */
  8871. int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret,
  8872. ProcPeerCertArgs* args)
  8873. {
  8874. int verify_ok = 0, use_cb = 0;
  8875. void *heap;
  8876. if (cm == NULL) {
  8877. return BAD_FUNC_ARG;
  8878. }
  8879. heap = (ssl != NULL) ? ssl->heap : cm->heap;
  8880. /* Determine if verify was okay */
  8881. if (ret == 0) {
  8882. verify_ok = 1;
  8883. }
  8884. /* Determine if verify callback should be used */
  8885. if (ret != 0) {
  8886. if ((ssl != NULL) && (!ssl->options.verifyNone)) {
  8887. use_cb = 1; /* always report errors */
  8888. }
  8889. }
  8890. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  8891. /* always use verify callback on peer leaf cert */
  8892. if (args->certIdx == 0) {
  8893. use_cb = 1;
  8894. }
  8895. #endif
  8896. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  8897. /* perform verify callback on other intermediate certs (not just peer) */
  8898. if (args->certIdx > 0) {
  8899. use_cb = 1;
  8900. }
  8901. #endif
  8902. #if defined(OPENSSL_EXTRA)
  8903. /* perform domain name check on the peer certificate */
  8904. if (args->dCertInit && args->dCert && (ssl != NULL) &&
  8905. ssl->param && ssl->param->hostName[0]) {
  8906. /* If altNames names is present, then subject common name is ignored */
  8907. if (args->dCert->altNames != NULL) {
  8908. if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
  8909. if (ret == 0) {
  8910. ret = DOMAIN_NAME_MISMATCH;
  8911. }
  8912. }
  8913. }
  8914. else {
  8915. if (args->dCert->subjectCN) {
  8916. if (MatchDomainName(args->dCert->subjectCN,
  8917. args->dCert->subjectCNLen,
  8918. ssl->param->hostName) == 0) {
  8919. if (ret == 0) {
  8920. ret = DOMAIN_NAME_MISMATCH;
  8921. }
  8922. }
  8923. }
  8924. }
  8925. }
  8926. /* perform IP address check on the peer certificate */
  8927. if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
  8928. (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
  8929. if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
  8930. if (ret == 0) {
  8931. ret = IPADDR_MISMATCH;
  8932. }
  8933. }
  8934. }
  8935. #endif
  8936. /* if verify callback has been set */
  8937. if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
  8938. #ifdef OPENSSL_ALL
  8939. || (ssl->ctx->verifyCertCb != NULL)
  8940. #endif
  8941. ))
  8942. #ifndef NO_WOLFSSL_CM_VERIFY
  8943. || (cm->verifyCallback != NULL)
  8944. #endif
  8945. ) {
  8946. int verifyFail = 0;
  8947. #ifdef WOLFSSL_SMALL_STACK
  8948. WOLFSSL_X509_STORE_CTX* store;
  8949. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8950. WOLFSSL_X509* x509;
  8951. #endif
  8952. char* domain = NULL;
  8953. #else
  8954. WOLFSSL_X509_STORE_CTX store[1];
  8955. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8956. WOLFSSL_X509 x509[1];
  8957. #endif
  8958. char domain[ASN_NAME_MAX];
  8959. #endif
  8960. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8961. int x509Free = 0;
  8962. #endif
  8963. #ifdef WOLFSSL_SMALL_STACK
  8964. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  8965. sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE);
  8966. if (store == NULL) {
  8967. return MEMORY_E;
  8968. }
  8969. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8970. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  8971. DYNAMIC_TYPE_X509);
  8972. if (x509 == NULL) {
  8973. XFREE(store, heap, DYNAMIC_TYPE_X509);
  8974. return MEMORY_E;
  8975. }
  8976. #endif
  8977. domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
  8978. if (domain == NULL) {
  8979. XFREE(store, heap, DYNAMIC_TYPE_X509);
  8980. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8981. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  8982. #endif
  8983. return MEMORY_E;
  8984. }
  8985. #endif /* WOLFSSL_SMALL_STACK */
  8986. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  8987. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8988. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  8989. #endif
  8990. domain[0] = '\0';
  8991. /* build subject CN as string to return in store */
  8992. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  8993. int subjectCNLen = args->dCert->subjectCNLen;
  8994. if (subjectCNLen > ASN_NAME_MAX-1)
  8995. subjectCNLen = ASN_NAME_MAX-1;
  8996. if (subjectCNLen > 0) {
  8997. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  8998. domain[subjectCNLen] = '\0';
  8999. }
  9000. }
  9001. store->error = ret;
  9002. store->error_depth = args->certIdx;
  9003. store->discardSessionCerts = 0;
  9004. store->domain = domain;
  9005. store->userCtx = (ssl != NULL) ? ssl->verifyCbCtx : cm;
  9006. store->certs = args->certs;
  9007. store->totalCerts = args->totalCerts;
  9008. #if (defined(HAVE_EX_DATA) || defined(FORTRESS)) && \
  9009. (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  9010. if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
  9011. != WOLFSSL_SUCCESS) {
  9012. WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
  9013. }
  9014. #endif
  9015. if (ssl != NULL) {
  9016. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  9017. if (ssl->ctx->x509_store_pt != NULL) {
  9018. store->store = ssl->ctx->x509_store_pt;
  9019. }
  9020. else {
  9021. store->store = &ssl->ctx->x509_store;
  9022. }
  9023. #if defined(OPENSSL_EXTRA)
  9024. store->depth = args->count;
  9025. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  9026. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  9027. heap, DYNAMIC_TYPE_OPENSSL);
  9028. if (store->param == NULL) {
  9029. #ifdef WOLFSSL_SMALL_STACK
  9030. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  9031. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9032. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  9033. #endif
  9034. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  9035. #endif
  9036. return MEMORY_E;
  9037. }
  9038. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  9039. /* Overwrite with non-default param values in SSL */
  9040. if (ssl->param) {
  9041. if (ssl->param->check_time)
  9042. store->param->check_time = ssl->param->check_time;
  9043. if (ssl->param->flags)
  9044. store->param->flags = ssl->param->flags;
  9045. if (ssl->param->hostName[0])
  9046. XMEMCPY(store->param->hostName, ssl->param->hostName,
  9047. WOLFSSL_HOST_NAME_MAX);
  9048. }
  9049. #endif /* defined(OPENSSL_EXTRA) */
  9050. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  9051. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9052. #ifdef KEEP_PEER_CERT
  9053. if (args->certIdx == 0) {
  9054. store->current_cert = &ssl->peerCert; /* use existing X509 */
  9055. }
  9056. else
  9057. #endif
  9058. {
  9059. InitX509(x509, 0, heap);
  9060. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  9061. store->current_cert = x509;
  9062. x509Free = 1;
  9063. }
  9064. else {
  9065. FreeX509(x509);
  9066. }
  9067. }
  9068. #endif
  9069. #ifdef SESSION_CERTS
  9070. store->sesChain = &ssl->session.chain;
  9071. #endif
  9072. }
  9073. #ifndef NO_WOLFSSL_CM_VERIFY
  9074. /* non-zero return code indicates failure override */
  9075. if (cm->verifyCallback != NULL) {
  9076. store->userCtx = cm;
  9077. if (cm->verifyCallback(verify_ok, store)) {
  9078. if (ret != 0) {
  9079. WOLFSSL_MSG("Verify CM callback overriding error!");
  9080. ret = 0;
  9081. }
  9082. }
  9083. else {
  9084. verifyFail = 1;
  9085. }
  9086. }
  9087. #endif
  9088. if (ssl != NULL) {
  9089. #ifdef OPENSSL_ALL
  9090. /* non-zero return code indicates failure override */
  9091. if (ssl->ctx->verifyCertCb) {
  9092. if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
  9093. if (ret != 0) {
  9094. WOLFSSL_MSG("Verify Cert callback overriding error!");
  9095. ret = 0;
  9096. }
  9097. }
  9098. else {
  9099. verifyFail = 1;
  9100. }
  9101. }
  9102. #endif
  9103. /* non-zero return code indicates failure override */
  9104. if (ssl->verifyCallback) {
  9105. if (ssl->verifyCallback(verify_ok, store)) {
  9106. if (ret != 0) {
  9107. WOLFSSL_MSG("Verify callback overriding error!");
  9108. ret = 0;
  9109. }
  9110. }
  9111. else {
  9112. verifyFail = 1;
  9113. }
  9114. }
  9115. }
  9116. if (verifyFail) {
  9117. /* induce error if one not present */
  9118. if (ret == 0) {
  9119. ret = VERIFY_CERT_ERROR;
  9120. }
  9121. /* mark as verify error */
  9122. args->verifyErr = 1;
  9123. }
  9124. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9125. if (x509Free) {
  9126. FreeX509(x509);
  9127. }
  9128. #endif
  9129. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  9130. wolfSSL_sk_X509_free(store->chain);
  9131. store->chain = NULL;
  9132. #endif
  9133. #ifdef SESSION_CERTS
  9134. if ((ssl != NULL) && (store->discardSessionCerts)) {
  9135. WOLFSSL_MSG("Verify callback requested discard sess certs");
  9136. ssl->session.chain.count = 0;
  9137. #ifdef WOLFSSL_ALT_CERT_CHAINS
  9138. ssl->session.altChain.count = 0;
  9139. #endif
  9140. }
  9141. #endif /* SESSION_CERTS */
  9142. #ifdef OPENSSL_EXTRA
  9143. if ((ssl != NULL) && (store->param)) {
  9144. XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL);
  9145. }
  9146. #endif
  9147. #ifdef WOLFSSL_SMALL_STACK
  9148. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  9149. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9150. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  9151. #endif
  9152. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  9153. #endif
  9154. }
  9155. (void)heap;
  9156. return ret;
  9157. }
  9158. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  9159. {
  9160. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  9161. (void)ssl;
  9162. if (args->certs) {
  9163. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  9164. args->certs = NULL;
  9165. }
  9166. #ifdef WOLFSSL_TLS13
  9167. if (args->exts) {
  9168. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  9169. args->exts = NULL;
  9170. }
  9171. #endif
  9172. if (args->dCert) {
  9173. if (args->dCertInit) {
  9174. FreeDecodedCert(args->dCert);
  9175. args->dCertInit = 0;
  9176. }
  9177. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  9178. args->dCert = NULL;
  9179. }
  9180. }
  9181. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  9182. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  9183. {
  9184. int ret = 0;
  9185. buffer* cert;
  9186. byte* subjectHash = NULL;
  9187. int alreadySigner = 0;
  9188. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9189. int sigRet = 0;
  9190. #endif
  9191. if (ssl == NULL || args == NULL)
  9192. return BAD_FUNC_ARG;
  9193. /* check to make sure certificate index is valid */
  9194. if (args->certIdx > args->count)
  9195. return BUFFER_E;
  9196. /* check if returning from non-blocking OCSP */
  9197. /* skip this section because cert is already initialized and parsed */
  9198. #ifdef WOLFSSL_NONBLOCK_OCSP
  9199. if (args->lastErr == OCSP_WANT_READ) {
  9200. args->lastErr = 0; /* clear error */
  9201. return 0;
  9202. }
  9203. #endif
  9204. #ifdef WOLFSSL_TRUST_PEER_CERT
  9205. /* we have trusted peer */
  9206. if (args->haveTrustPeer) {
  9207. return 0;
  9208. }
  9209. #endif
  9210. /* get certificate buffer */
  9211. cert = &args->certs[args->certIdx];
  9212. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9213. if (verify == VERIFY) {
  9214. /* for small cert verify, release decoded cert during signature check to
  9215. reduce peak memory usage */
  9216. if (args->dCert != NULL) {
  9217. if (args->dCertInit) {
  9218. FreeDecodedCert(args->dCert);
  9219. args->dCertInit = 0;
  9220. }
  9221. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  9222. args->dCert = NULL;
  9223. }
  9224. /* perform cert parsing and signature check */
  9225. sigRet = CheckCertSignature(cert->buffer, cert->length,
  9226. ssl->heap, ssl->ctx->cm);
  9227. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  9228. /* verify name only in ParseCertRelative below, signature check done */
  9229. verify = VERIFY_NAME;
  9230. }
  9231. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  9232. /* make sure the decoded cert structure is allocated and initialized */
  9233. if (!args->dCertInit
  9234. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9235. || args->dCert == NULL
  9236. #endif
  9237. ) {
  9238. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9239. if (args->dCert == NULL) {
  9240. args->dCert = (DecodedCert*)XMALLOC(
  9241. sizeof(DecodedCert), ssl->heap,
  9242. DYNAMIC_TYPE_DCERT);
  9243. if (args->dCert == NULL) {
  9244. return MEMORY_E;
  9245. }
  9246. }
  9247. #endif
  9248. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  9249. args->dCertInit = 1;
  9250. args->dCert->sigCtx.devId = ssl->devId;
  9251. #ifdef WOLFSSL_ASYNC_CRYPT
  9252. args->dCert->sigCtx.asyncCtx = ssl;
  9253. #endif
  9254. #ifdef HAVE_PK_CALLBACKS
  9255. /* setup the PK callback context */
  9256. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  9257. if (ret != 0)
  9258. return ret;
  9259. #endif
  9260. }
  9261. /* Parse Certificate */
  9262. ret = ParseCertRelative(args->dCert, certType, verify, ssl->ctx->cm);
  9263. /* perform below checks for date failure cases */
  9264. if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) {
  9265. /* get subject and determine if already loaded */
  9266. #ifndef NO_SKID
  9267. if (args->dCert->extAuthKeyIdSet)
  9268. subjectHash = args->dCert->extSubjKeyId;
  9269. else
  9270. #endif
  9271. subjectHash = args->dCert->subjectHash;
  9272. alreadySigner = AlreadySigner(ssl->ctx->cm, subjectHash);
  9273. }
  9274. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9275. /* get signature check failures from above */
  9276. if (ret == 0)
  9277. ret = sigRet;
  9278. #endif
  9279. if (pSubjectHash)
  9280. *pSubjectHash = subjectHash;
  9281. if (pAlreadySigner)
  9282. *pAlreadySigner = alreadySigner;
  9283. #ifdef WOLFSSL_ASYNC_CRYPT
  9284. if (ret == WC_PENDING_E) {
  9285. ret = wolfSSL_AsyncPush(ssl,
  9286. args->dCert->sigCtx.asyncDev);
  9287. }
  9288. #endif
  9289. return ret;
  9290. }
  9291. /* Check key sizes for certs. Is redundant check since
  9292. ProcessBuffer also performs this check. */
  9293. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  9294. {
  9295. int ret = 0;
  9296. if (ssl->options.verifyNone) {
  9297. return ret;
  9298. }
  9299. switch (args->dCert->keyOID) {
  9300. #ifndef NO_RSA
  9301. case RSAk:
  9302. if (ssl->options.minRsaKeySz < 0 ||
  9303. args->dCert->pubKeySize <
  9304. (word16)ssl->options.minRsaKeySz) {
  9305. WOLFSSL_MSG(
  9306. "RSA key size in cert chain error");
  9307. ret = RSA_KEY_SIZE_E;
  9308. }
  9309. break;
  9310. #endif /* !NO_RSA */
  9311. #ifdef HAVE_ECC
  9312. case ECDSAk:
  9313. if (ssl->options.minEccKeySz < 0 ||
  9314. args->dCert->pubKeySize <
  9315. (word16)ssl->options.minEccKeySz) {
  9316. WOLFSSL_MSG(
  9317. "ECC key size in cert chain error");
  9318. ret = ECC_KEY_SIZE_E;
  9319. }
  9320. break;
  9321. #endif /* HAVE_ECC */
  9322. #ifdef HAVE_ED25519
  9323. case ED25519k:
  9324. if (ssl->options.minEccKeySz < 0 ||
  9325. ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  9326. WOLFSSL_MSG(
  9327. "ECC key size in cert chain error");
  9328. ret = ECC_KEY_SIZE_E;
  9329. }
  9330. break;
  9331. #endif /* HAVE_ED25519 */
  9332. #ifdef HAVE_ED448
  9333. case ED448k:
  9334. if (ssl->options.minEccKeySz < 0 ||
  9335. ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  9336. WOLFSSL_MSG(
  9337. "ECC key size in cert chain error");
  9338. ret = ECC_KEY_SIZE_E;
  9339. }
  9340. break;
  9341. #endif /* HAVE_ED448 */
  9342. default:
  9343. WOLFSSL_MSG("Key size not checked");
  9344. /* key not being checked for size if not in
  9345. switch */
  9346. break;
  9347. }
  9348. return ret;
  9349. }
  9350. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  9351. word32 totalSz)
  9352. {
  9353. int ret = 0;
  9354. #ifdef WOLFSSL_ASYNC_CRYPT
  9355. ProcPeerCertArgs* args = (ProcPeerCertArgs*)ssl->async.args;
  9356. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  9357. (void)sizeof(args_test);
  9358. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  9359. ProcPeerCertArgs* args = ssl->nonblockarg;
  9360. #elif defined(WOLFSSL_SMALL_STACK)
  9361. ProcPeerCertArgs* args = NULL;
  9362. #else
  9363. ProcPeerCertArgs args[1];
  9364. #endif
  9365. byte* subjectHash = NULL;
  9366. int alreadySigner = 0;
  9367. WOLFSSL_ENTER("ProcessPeerCerts");
  9368. #ifdef WOLFSSL_ASYNC_CRYPT
  9369. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  9370. if (ret != WC_NOT_PENDING_E) {
  9371. /* Check for error */
  9372. if (ret < 0)
  9373. goto exit_ppc;
  9374. }
  9375. else
  9376. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  9377. if (args == NULL) {
  9378. args = (ProcPeerCertArgs*)XMALLOC(
  9379. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9380. if (args == NULL) {
  9381. ERROR_OUT(MEMORY_E, exit_ppc);
  9382. }
  9383. }
  9384. if (ssl->nonblockarg == NULL) /* new args */
  9385. #elif defined(WOLFSSL_SMALL_STACK)
  9386. args = (ProcPeerCertArgs*)XMALLOC(
  9387. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9388. if (args == NULL) {
  9389. ERROR_OUT(MEMORY_E, exit_ppc);
  9390. }
  9391. #endif
  9392. {
  9393. /* Reset state */
  9394. ret = 0;
  9395. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  9396. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  9397. args->idx = *inOutIdx;
  9398. args->begin = *inOutIdx;
  9399. #ifdef WOLFSSL_ASYNC_CRYPT
  9400. ssl->async.freeArgs = FreeProcPeerCertArgs;
  9401. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  9402. ssl->nonblockarg = args;
  9403. #endif
  9404. }
  9405. switch (ssl->options.asyncState)
  9406. {
  9407. case TLS_ASYNC_BEGIN:
  9408. {
  9409. word32 listSz;
  9410. #ifdef WOLFSSL_CALLBACKS
  9411. if (ssl->hsInfoOn)
  9412. AddPacketName(ssl, "Certificate");
  9413. if (ssl->toInfoOn)
  9414. AddLateName("Certificate", &ssl->timeoutInfo);
  9415. #endif
  9416. #ifdef WOLFSSL_TLS13
  9417. if (ssl->options.tls1_3) {
  9418. byte ctxSz;
  9419. /* Certificate Request Context */
  9420. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  9421. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9422. ctxSz = *(input + args->idx);
  9423. args->idx++;
  9424. if ((args->idx - args->begin) + ctxSz > totalSz)
  9425. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9426. #ifndef NO_WOLFSSL_CLIENT
  9427. /* Must be empty when received from server. */
  9428. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9429. if (ctxSz != 0) {
  9430. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  9431. }
  9432. }
  9433. #endif
  9434. #ifndef NO_WOLFSSL_SERVER
  9435. /* Must contain value sent in request. */
  9436. if (ssl->options.side == WOLFSSL_SERVER_END) {
  9437. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  9438. ctxSz != 0) {
  9439. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  9440. }
  9441. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  9442. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  9443. CertReqCtx* curr = ssl->certReqCtx;
  9444. CertReqCtx* prev = NULL;
  9445. while (curr != NULL) {
  9446. if ((ctxSz == curr->len) &&
  9447. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  9448. == 0) {
  9449. if (prev != NULL)
  9450. prev->next = curr->next;
  9451. else
  9452. ssl->certReqCtx = curr->next;
  9453. XFREE(curr, ssl->heap,
  9454. DYNAMIC_TYPE_TMP_BUFFER);
  9455. break;
  9456. }
  9457. prev = curr;
  9458. curr = curr->next;
  9459. }
  9460. if (curr == NULL)
  9461. #endif
  9462. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  9463. }
  9464. }
  9465. #endif
  9466. args->idx += ctxSz;
  9467. #ifdef OPENSSL_EXTRA
  9468. /* allocate buffer for cert extensions */
  9469. args->exts = (buffer*)XMALLOC(sizeof(buffer) *
  9470. (ssl->verifyDepth + 1), ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  9471. if (args->exts == NULL) {
  9472. ERROR_OUT(MEMORY_E, exit_ppc);
  9473. }
  9474. #else
  9475. /* allocate buffer for cert extensions */
  9476. args->exts = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  9477. ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  9478. if (args->exts == NULL) {
  9479. ERROR_OUT(MEMORY_E, exit_ppc);
  9480. }
  9481. #endif
  9482. }
  9483. #endif
  9484. /* allocate buffer for certs */
  9485. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  9486. ssl->heap, DYNAMIC_TYPE_DER);
  9487. if (args->certs == NULL) {
  9488. ERROR_OUT(MEMORY_E, exit_ppc);
  9489. }
  9490. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  9491. /* Certificate List */
  9492. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  9493. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9494. }
  9495. c24to32(input + args->idx, &listSz);
  9496. args->idx += OPAQUE24_LEN;
  9497. if (listSz > MAX_CERTIFICATE_SZ) {
  9498. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9499. }
  9500. if ((args->idx - args->begin) + listSz != totalSz) {
  9501. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9502. }
  9503. WOLFSSL_MSG("Loading peer's cert chain");
  9504. /* first put cert chain into buffer so can verify top down
  9505. we're sent bottom up */
  9506. while (listSz) {
  9507. word32 certSz;
  9508. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9509. if (args->totalCerts >= MAX_CHAIN_DEPTH) {
  9510. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  9511. ret = MAX_CHAIN_ERROR;
  9512. WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
  9513. break; /* break out to avoid reading more certs then buffer
  9514. * can hold */
  9515. }
  9516. #else
  9517. if (args->totalCerts >= ssl->verifyDepth ||
  9518. args->totalCerts >= MAX_CHAIN_DEPTH) {
  9519. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  9520. }
  9521. #endif
  9522. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  9523. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9524. }
  9525. c24to32(input + args->idx, &certSz);
  9526. args->idx += OPAQUE24_LEN;
  9527. if ((args->idx - args->begin) + certSz > totalSz) {
  9528. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9529. }
  9530. args->certs[args->totalCerts].length = certSz;
  9531. args->certs[args->totalCerts].buffer = input + args->idx;
  9532. #ifdef SESSION_CERTS
  9533. AddSessionCertToChain(&ssl->session.chain,
  9534. input + args->idx, certSz);
  9535. #endif /* SESSION_CERTS */
  9536. args->idx += certSz;
  9537. listSz -= certSz + CERT_HEADER_SZ;
  9538. #ifdef WOLFSSL_TLS13
  9539. /* Extensions */
  9540. if (ssl->options.tls1_3) {
  9541. word16 extSz;
  9542. if (args->exts == NULL) {
  9543. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9544. }
  9545. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  9546. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9547. }
  9548. ato16(input + args->idx, &extSz);
  9549. args->idx += OPAQUE16_LEN;
  9550. if ((args->idx - args->begin) + extSz > totalSz) {
  9551. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9552. }
  9553. /* Store extension data info for later processing. */
  9554. args->exts[args->totalCerts].length = extSz;
  9555. args->exts[args->totalCerts].buffer = input + args->idx;
  9556. args->idx += extSz;
  9557. listSz -= extSz + OPAQUE16_LEN;
  9558. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  9559. args->exts[args->totalCerts].length, certificate, NULL);
  9560. if (ret < 0) {
  9561. ERROR_OUT(ret, exit_ppc);
  9562. }
  9563. }
  9564. #endif
  9565. args->totalCerts++;
  9566. WOLFSSL_MSG("\tPut another cert into chain");
  9567. } /* while (listSz) */
  9568. args->count = args->totalCerts;
  9569. args->certIdx = 0; /* select peer cert (first one) */
  9570. if (args->count == 0 && (ssl->options.mutualAuth ||
  9571. (ssl->options.failNoCert && IsAtLeastTLSv1_3(ssl->version))) &&
  9572. ssl->options.side == WOLFSSL_SERVER_END) {
  9573. ret = NO_PEER_CERT;
  9574. DoCertFatalAlert(ssl, ret);
  9575. }
  9576. args->dCertInit = 0;
  9577. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  9578. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  9579. DYNAMIC_TYPE_DCERT);
  9580. if (args->dCert == NULL) {
  9581. ERROR_OUT(MEMORY_E, exit_ppc);
  9582. }
  9583. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  9584. #endif
  9585. /* Advance state and proceed */
  9586. ssl->options.asyncState = TLS_ASYNC_BUILD;
  9587. } /* case TLS_ASYNC_BEGIN */
  9588. FALL_THROUGH;
  9589. case TLS_ASYNC_BUILD:
  9590. {
  9591. if (args->count > 0) {
  9592. /* check for trusted peer and get untrustedDepth */
  9593. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  9594. if (args->certIdx == 0) {
  9595. #ifdef WOLFSSL_TRUST_PEER_CERT
  9596. TrustedPeerCert* tp;
  9597. int matchType = WC_MATCH_NAME;
  9598. #endif
  9599. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  9600. &subjectHash, &alreadySigner);
  9601. if (ret != 0)
  9602. goto exit_ppc;
  9603. #ifdef OPENSSL_EXTRA
  9604. /* Determine untrusted depth */
  9605. if (!alreadySigner && (!args->dCert ||
  9606. !args->dCertInit || !args->dCert->selfSigned)) {
  9607. args->untrustedDepth = 1;
  9608. }
  9609. #endif
  9610. #ifdef WOLFSSL_TRUST_PEER_CERT
  9611. #ifndef NO_SKID
  9612. if (args->dCert->extAuthKeyIdSet)
  9613. matchType = WC_MATCH_SKID;
  9614. #endif
  9615. tp = GetTrustedPeer(ssl->ctx->cm, subjectHash, matchType);
  9616. WOLFSSL_MSG("Checking for trusted peer cert");
  9617. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  9618. WOLFSSL_MSG("Found matching trusted peer cert");
  9619. args->haveTrustPeer = 1;
  9620. }
  9621. else if (tp == NULL) {
  9622. /* no trusted peer cert */
  9623. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  9624. }
  9625. else {
  9626. WOLFSSL_MSG("Trusted peer cert did not match!");
  9627. }
  9628. if (!args->haveTrustPeer)
  9629. #endif
  9630. {
  9631. /* free cert if not trusted peer */
  9632. FreeDecodedCert(args->dCert);
  9633. args->dCertInit = 0;
  9634. }
  9635. }
  9636. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  9637. /* check certificate up to peer's first */
  9638. /* do not verify chain if trusted peer cert found */
  9639. while (args->count > 1
  9640. #ifdef WOLFSSL_TRUST_PEER_CERT
  9641. && !args->haveTrustPeer
  9642. #endif /* WOLFSSL_TRUST_PEER_CERT */
  9643. ) {
  9644. int skipAddCA = 0;
  9645. /* select last certificate */
  9646. args->certIdx = args->count - 1;
  9647. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  9648. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  9649. &subjectHash, &alreadySigner);
  9650. #ifdef WOLFSSL_ASYNC_CRYPT
  9651. if (ret == WC_PENDING_E)
  9652. goto exit_ppc;
  9653. #endif
  9654. if (ret == 0) {
  9655. ret = ProcessPeerCertCheckKey(ssl, args);
  9656. }
  9657. if (ret == 0 && args->dCert->isCA == 0) {
  9658. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  9659. }
  9660. else if (ret == 0 && ssl->options.verifyNone) {
  9661. WOLFSSL_MSG("Chain cert not verified by option, "
  9662. "not adding as CA");
  9663. }
  9664. else if (ret == 0) {
  9665. #ifdef OPENSSL_EXTRA
  9666. if (args->certIdx > args->untrustedDepth) {
  9667. args->untrustedDepth = (char)args->certIdx + 1;
  9668. }
  9669. #endif
  9670. if (alreadySigner) {
  9671. WOLFSSL_MSG("Verified CA from chain and already had it");
  9672. }
  9673. }
  9674. else {
  9675. WOLFSSL_MSG("Failed to verify CA from chain");
  9676. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9677. ssl->peerVerifyRet = X509_V_ERR_INVALID_CA;
  9678. #endif
  9679. }
  9680. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  9681. if (ret == 0) {
  9682. int doCrlLookup = 1;
  9683. #ifdef HAVE_OCSP
  9684. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  9685. if (ssl->status_request_v2) {
  9686. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  9687. args->dCert, 0, ssl->heap);
  9688. }
  9689. else /* skips OCSP and force CRL check */
  9690. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  9691. if (ssl->ctx->cm->ocspEnabled &&
  9692. ssl->ctx->cm->ocspCheckAll) {
  9693. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  9694. ret = CheckCertOCSP_ex(ssl->ctx->cm->ocsp,
  9695. args->dCert, NULL, ssl);
  9696. #ifdef WOLFSSL_NONBLOCK_OCSP
  9697. if (ret == OCSP_WANT_READ) {
  9698. args->lastErr = ret;
  9699. goto exit_ppc;
  9700. }
  9701. #endif
  9702. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  9703. if (ret != 0) {
  9704. doCrlLookup = 0;
  9705. WOLFSSL_MSG("\tOCSP Lookup not ok");
  9706. }
  9707. }
  9708. #endif /* HAVE_OCSP */
  9709. #ifdef HAVE_CRL
  9710. if (ret == 0 && doCrlLookup &&
  9711. ssl->ctx->cm->crlEnabled &&
  9712. ssl->ctx->cm->crlCheckAll) {
  9713. WOLFSSL_MSG("Doing Non Leaf CRL check");
  9714. ret = CheckCertCRL(ssl->ctx->cm->crl, args->dCert);
  9715. #ifdef WOLFSSL_NONBLOCK_OCSP
  9716. if (ret == OCSP_WANT_READ) {
  9717. args->lastErr = ret;
  9718. goto exit_ppc;
  9719. }
  9720. #endif
  9721. if (ret != 0) {
  9722. WOLFSSL_MSG("\tCRL check not ok");
  9723. }
  9724. }
  9725. #endif /* HAVE_CRL */
  9726. (void)doCrlLookup;
  9727. }
  9728. #endif /* HAVE_OCSP || HAVE_CRL */
  9729. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9730. if (ret == 0 &&
  9731. /* extend the limit "+1" until reaching
  9732. * an ultimately trusted issuer.*/
  9733. args->count > (ssl->verifyDepth + 1)) {
  9734. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  9735. ret = MAX_CHAIN_ERROR;
  9736. }
  9737. #endif
  9738. /* Do verify callback */
  9739. ret = DoVerifyCallback(ssl->ctx->cm, ssl, ret, args);
  9740. if (ssl->options.verifyNone &&
  9741. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED)) {
  9742. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  9743. ret = ssl->error = 0;
  9744. }
  9745. #ifdef WOLFSSL_ALT_CERT_CHAINS
  9746. /* For alternate cert chain, its okay for a CA cert to fail
  9747. with ASN_NO_SIGNER_E here. The "alternate" certificate
  9748. chain mode only requires that the peer certificate
  9749. validate to a trusted CA */
  9750. if (ret != 0 && args->dCert->isCA) {
  9751. if (ret == ASN_NO_SIGNER_E) {
  9752. if (!ssl->options.usingAltCertChain) {
  9753. WOLFSSL_MSG("Trying alternate cert chain");
  9754. ssl->options.usingAltCertChain = 1;
  9755. }
  9756. ret = 0; /* clear errors and continue */
  9757. args->verifyErr = 0;
  9758. }
  9759. /* do not add to certificate manager */
  9760. skipAddCA = 1;
  9761. }
  9762. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  9763. /* If valid CA then add to Certificate Manager */
  9764. if (ret == 0 && args->dCert->isCA &&
  9765. !ssl->options.verifyNone && !skipAddCA) {
  9766. buffer* cert = &args->certs[args->certIdx];
  9767. /* Is valid CA */
  9768. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  9769. /* if using alternate chain, store the cert used */
  9770. if (ssl->options.usingAltCertChain) {
  9771. AddSessionCertToChain(&ssl->session.altChain,
  9772. cert->buffer, cert->length);
  9773. }
  9774. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  9775. if (!alreadySigner) {
  9776. DerBuffer* add = NULL;
  9777. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  9778. if (ret < 0)
  9779. goto exit_ppc;
  9780. XMEMCPY(add->buffer, cert->buffer, cert->length);
  9781. /* CA already verified above in ParseCertRelative */
  9782. WOLFSSL_MSG("Adding CA from chain");
  9783. ret = AddCA(ssl->ctx->cm, &add, WOLFSSL_CHAIN_CA,
  9784. NO_VERIFY);
  9785. if (ret == WOLFSSL_SUCCESS) {
  9786. ret = 0;
  9787. }
  9788. }
  9789. }
  9790. /* Handle error codes */
  9791. if (ret != 0) {
  9792. if (!ssl->options.verifyNone) {
  9793. DoCertFatalAlert(ssl, ret);
  9794. }
  9795. ssl->error = ret; /* Report SSL error */
  9796. if (args->lastErr == 0) {
  9797. args->lastErr = ret; /* save error from last time */
  9798. ret = 0; /* reset error */
  9799. }
  9800. }
  9801. FreeDecodedCert(args->dCert);
  9802. args->dCertInit = 0;
  9803. args->count--;
  9804. } /* while (count > 0 && !args->haveTrustPeer) */
  9805. } /* if (count > 0) */
  9806. /* Check for error */
  9807. if (ret != 0) {
  9808. goto exit_ppc;
  9809. }
  9810. /* Advance state and proceed */
  9811. ssl->options.asyncState = TLS_ASYNC_DO;
  9812. } /* case TLS_ASYNC_BUILD */
  9813. FALL_THROUGH;
  9814. case TLS_ASYNC_DO:
  9815. {
  9816. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  9817. if (args->count > 0) {
  9818. WOLFSSL_MSG("Verifying Peer's cert");
  9819. /* select peer cert (first one) */
  9820. args->certIdx = 0;
  9821. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  9822. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  9823. &subjectHash, &alreadySigner);
  9824. #ifdef WOLFSSL_ASYNC_CRYPT
  9825. if (ret == WC_PENDING_E)
  9826. goto exit_ppc;
  9827. #endif
  9828. if (ret == 0) {
  9829. WOLFSSL_MSG("Verified Peer's cert");
  9830. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9831. ssl->peerVerifyRet = X509_V_OK;
  9832. #endif
  9833. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  9834. /* if using alternate chain, store the cert used */
  9835. if (ssl->options.usingAltCertChain) {
  9836. buffer* cert = &args->certs[args->certIdx];
  9837. AddSessionCertToChain(&ssl->session.altChain,
  9838. cert->buffer, cert->length);
  9839. }
  9840. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  9841. /* Check peer's certificate version number. TLS 1.2 / 1.3
  9842. * requires the clients certificate be version 3 unless a
  9843. * different version has been negotiated using RFC 7250 */
  9844. if ((ret == 0) &&
  9845. (ssl->options.side == WOLFSSL_SERVER_END)) {
  9846. if (args->dCert->version != WOLFSSL_X509_V3) {
  9847. WOLFSSL_MSG("Peers certificate was not version 3!");
  9848. args->lastErr = ASN_VERSION_E;
  9849. /* setting last error but not considering it fatal
  9850. * giving the user a chance to override */
  9851. }
  9852. }
  9853. /* check if fatal error */
  9854. if (args->verifyErr) {
  9855. args->fatal = 1;
  9856. ret = args->lastErr;
  9857. }
  9858. else {
  9859. args->fatal = 0;
  9860. }
  9861. }
  9862. else if (ret == ASN_PARSE_E || ret == BUFFER_E) {
  9863. WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR");
  9864. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
  9865. defined(OPENSSL_EXTRA_X509_SMALL)
  9866. DoCertFatalAlert(ssl, ret);
  9867. #endif
  9868. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9869. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  9870. #endif
  9871. args->fatal = 1;
  9872. }
  9873. else {
  9874. WOLFSSL_MSG("Failed to verify Peer's cert");
  9875. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9876. ssl->peerVerifyRet = X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  9877. #endif
  9878. if (ssl->verifyCallback) {
  9879. WOLFSSL_MSG(
  9880. "\tCallback override available, will continue");
  9881. /* check if fatal error */
  9882. args->fatal = (args->verifyErr) ? 1 : 0;
  9883. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  9884. defined(OPENSSL_EXTRA) || \
  9885. defined(OPENSSL_EXTRA_X509_SMALL)
  9886. if (args->fatal)
  9887. DoCertFatalAlert(ssl, ret);
  9888. #endif
  9889. }
  9890. else {
  9891. WOLFSSL_MSG("\tNo callback override available, fatal");
  9892. args->fatal = 1;
  9893. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  9894. defined(OPENSSL_EXTRA) || \
  9895. defined(OPENSSL_EXTRA_X509_SMALL)
  9896. DoCertFatalAlert(ssl, ret);
  9897. #endif
  9898. }
  9899. }
  9900. #ifdef HAVE_SECURE_RENEGOTIATION
  9901. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  9902. && ssl->secure_renegotiation
  9903. && ssl->secure_renegotiation->enabled) {
  9904. if (IsEncryptionOn(ssl, 0)) {
  9905. /* compare against previous time */
  9906. if (ssl->secure_renegotiation->subject_hash_set) {
  9907. if (XMEMCMP(args->dCert->subjectHash,
  9908. ssl->secure_renegotiation->subject_hash,
  9909. KEYID_SIZE) != 0) {
  9910. WOLFSSL_MSG(
  9911. "Peer sent different cert during scr, fatal");
  9912. args->fatal = 1;
  9913. ret = SCR_DIFFERENT_CERT_E;
  9914. }
  9915. }
  9916. }
  9917. /* cache peer's hash */
  9918. if (args->fatal == 0) {
  9919. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  9920. args->dCert->subjectHash, KEYID_SIZE);
  9921. ssl->secure_renegotiation->subject_hash_set = 1;
  9922. }
  9923. }
  9924. #endif /* HAVE_SECURE_RENEGOTIATION */
  9925. } /* if (count > 0) */
  9926. /* Check for error */
  9927. if (args->fatal && ret != 0) {
  9928. goto exit_ppc;
  9929. }
  9930. /* Advance state and proceed */
  9931. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  9932. } /* case TLS_ASYNC_DO */
  9933. FALL_THROUGH;
  9934. case TLS_ASYNC_VERIFY:
  9935. {
  9936. if (args->count > 0) {
  9937. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  9938. if (args->fatal == 0) {
  9939. int doLookup = 1;
  9940. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9941. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  9942. if (ssl->status_request) {
  9943. args->fatal = (TLSX_CSR_InitRequest(ssl->extensions,
  9944. args->dCert, ssl->heap) != 0);
  9945. doLookup = 0;
  9946. #if defined(WOLFSSL_TLS13)
  9947. if (ssl->options.tls1_3) {
  9948. TLSX* ext = TLSX_Find(ssl->extensions,
  9949. TLSX_STATUS_REQUEST);
  9950. if (ext != NULL) {
  9951. word32 idx = 0;
  9952. CertificateStatusRequest* csr =
  9953. (CertificateStatusRequest*)ext->data;
  9954. ret = ProcessCSR(ssl, csr->response.buffer,
  9955. &idx, csr->response.length);
  9956. if (ret < 0)
  9957. goto exit_ppc;
  9958. }
  9959. }
  9960. #endif
  9961. }
  9962. /* Ensure a stapling response was seen */
  9963. else if (ssl->options.tls1_3 &&
  9964. ssl->ctx->cm->ocspMustStaple) {
  9965. ret = OCSP_CERT_UNKNOWN;
  9966. goto exit_ppc;
  9967. }
  9968. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  9969. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  9970. if (ssl->status_request_v2) {
  9971. args->fatal = (TLSX_CSR2_InitRequests(ssl->extensions,
  9972. args->dCert, 1, ssl->heap) != 0);
  9973. doLookup = 0;
  9974. }
  9975. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  9976. }
  9977. #ifdef HAVE_OCSP
  9978. if (doLookup && ssl->ctx->cm->ocspEnabled) {
  9979. WOLFSSL_MSG("Doing Leaf OCSP check");
  9980. ret = CheckCertOCSP_ex(ssl->ctx->cm->ocsp,
  9981. args->dCert, NULL, ssl);
  9982. #ifdef WOLFSSL_NONBLOCK_OCSP
  9983. if (ret == OCSP_WANT_READ) {
  9984. goto exit_ppc;
  9985. }
  9986. #endif
  9987. doLookup = (ret == OCSP_CERT_UNKNOWN);
  9988. if (ret != 0) {
  9989. WOLFSSL_MSG("\tOCSP Lookup not ok");
  9990. args->fatal = 0;
  9991. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9992. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  9993. #endif
  9994. }
  9995. }
  9996. #endif /* HAVE_OCSP */
  9997. #ifdef HAVE_CRL
  9998. if (doLookup && ssl->ctx->cm->crlEnabled) {
  9999. WOLFSSL_MSG("Doing Leaf CRL check");
  10000. ret = CheckCertCRL(ssl->ctx->cm->crl, args->dCert);
  10001. #ifdef WOLFSSL_NONBLOCK_OCSP
  10002. if (ret == OCSP_WANT_READ) {
  10003. goto exit_ppc;
  10004. }
  10005. #endif
  10006. if (ret != 0) {
  10007. WOLFSSL_MSG("\tCRL check not ok");
  10008. args->fatal = 0;
  10009. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10010. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  10011. #endif
  10012. }
  10013. }
  10014. #endif /* HAVE_CRL */
  10015. (void)doLookup;
  10016. }
  10017. #endif /* HAVE_OCSP || HAVE_CRL */
  10018. #ifdef KEEP_PEER_CERT
  10019. if (args->fatal == 0) {
  10020. int copyRet = 0;
  10021. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  10022. if (ssl->options.handShakeDone) {
  10023. FreeX509(&ssl->peerCert);
  10024. InitX509(&ssl->peerCert, 0, ssl->heap);
  10025. }
  10026. else
  10027. #endif
  10028. #ifdef HAVE_SECURE_RENEGOTIATION
  10029. if (ssl->secure_renegotiation &&
  10030. ssl->secure_renegotiation->enabled) {
  10031. /* free old peer cert */
  10032. FreeX509(&ssl->peerCert);
  10033. InitX509(&ssl->peerCert, 0, ssl->heap);
  10034. }
  10035. else
  10036. #endif
  10037. {
  10038. }
  10039. /* set X509 format for peer cert */
  10040. copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
  10041. if (copyRet == MEMORY_E) {
  10042. args->fatal = 1;
  10043. }
  10044. }
  10045. #endif /* KEEP_PEER_CERT */
  10046. #ifndef IGNORE_KEY_EXTENSIONS
  10047. #if defined(OPENSSL_EXTRA)
  10048. /* when compatibility layer is turned on and no verify is
  10049. * set then ignore the certificate key extension */
  10050. if (args->dCert->extKeyUsageSet &&
  10051. args->dCert->extKeyUsageCrit == 0 &&
  10052. ssl->options.verifyNone) {
  10053. WOLFSSL_MSG("Not verifying certificate key usage");
  10054. }
  10055. else
  10056. #endif
  10057. if (args->dCert->extKeyUsageSet) {
  10058. if ((ssl->specs.kea == rsa_kea) &&
  10059. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  10060. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  10061. ret = KEYUSE_ENCIPHER_E;
  10062. }
  10063. if ((ssl->specs.sig_algo == rsa_sa_algo ||
  10064. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  10065. !ssl->specs.static_ecdh)) &&
  10066. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  10067. WOLFSSL_MSG("KeyUse Digital Sig not set");
  10068. ret = KEYUSE_SIGNATURE_E;
  10069. }
  10070. }
  10071. #if defined(OPENSSL_EXTRA)
  10072. /* when compatibility layer is turned on and no verify is
  10073. * set then ignore the certificate key extension */
  10074. if (args->dCert->extExtKeyUsageSet &&
  10075. args->dCert->extExtKeyUsageCrit == 0 &&
  10076. ssl->options.verifyNone) {
  10077. WOLFSSL_MSG("Not verifying certificate ext key usage");
  10078. }
  10079. else
  10080. #endif
  10081. if (args->dCert->extExtKeyUsageSet) {
  10082. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10083. if ((args->dCert->extExtKeyUsage &
  10084. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  10085. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  10086. ret = EXTKEYUSE_AUTH_E;
  10087. }
  10088. }
  10089. else {
  10090. if ((args->dCert->extExtKeyUsage &
  10091. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  10092. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  10093. ret = EXTKEYUSE_AUTH_E;
  10094. }
  10095. }
  10096. }
  10097. #endif /* IGNORE_KEY_EXTENSIONS */
  10098. if (args->fatal) {
  10099. ssl->error = ret;
  10100. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10101. SendAlert(ssl, alert_fatal, bad_certificate);
  10102. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  10103. #endif
  10104. goto exit_ppc;
  10105. }
  10106. ssl->options.havePeerCert = 1;
  10107. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  10108. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  10109. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  10110. * are to be bound into a certificate, the subject
  10111. * alternative name extension MUST be used." */
  10112. if (args->dCert->altNames) {
  10113. if (CheckForAltNames(args->dCert,
  10114. (char*)ssl->buffers.domainName.buffer,
  10115. NULL) != 1) {
  10116. WOLFSSL_MSG("DomainName match on alt names failed");
  10117. /* try to get peer key still */
  10118. ret = DOMAIN_NAME_MISMATCH;
  10119. }
  10120. }
  10121. else {
  10122. if (MatchDomainName(
  10123. args->dCert->subjectCN,
  10124. args->dCert->subjectCNLen,
  10125. (char*)ssl->buffers.domainName.buffer) == 0) {
  10126. WOLFSSL_MSG("DomainName match on common name failed");
  10127. ret = DOMAIN_NAME_MISMATCH;
  10128. }
  10129. }
  10130. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  10131. /* Old behavior. */
  10132. if (MatchDomainName(args->dCert->subjectCN,
  10133. args->dCert->subjectCNLen,
  10134. (char*)ssl->buffers.domainName.buffer) == 0) {
  10135. WOLFSSL_MSG("DomainName match on common name failed");
  10136. if (CheckForAltNames(args->dCert,
  10137. (char*)ssl->buffers.domainName.buffer,
  10138. NULL) != 1) {
  10139. WOLFSSL_MSG(
  10140. "DomainName match on alt names failed too");
  10141. /* try to get peer key still */
  10142. ret = DOMAIN_NAME_MISMATCH;
  10143. }
  10144. }
  10145. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  10146. }
  10147. /* decode peer key */
  10148. switch (args->dCert->keyOID) {
  10149. #ifndef NO_RSA
  10150. case RSAk:
  10151. {
  10152. word32 keyIdx = 0;
  10153. int keyRet = 0;
  10154. if (ssl->peerRsaKey == NULL) {
  10155. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  10156. (void**)&ssl->peerRsaKey);
  10157. } else if (ssl->peerRsaKeyPresent) {
  10158. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  10159. ssl->peerRsaKey);
  10160. ssl->peerRsaKeyPresent = 0;
  10161. }
  10162. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  10163. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  10164. args->dCert->pubKeySize) != 0) {
  10165. ret = PEER_KEY_ERROR;
  10166. }
  10167. else {
  10168. ssl->peerRsaKeyPresent = 1;
  10169. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  10170. /* copy encrypted tsip key index into ssl object */
  10171. if (args->dCert->tsip_encRsaKeyIdx) {
  10172. if (!ssl->peerTsipEncRsaKeyIndex) {
  10173. ssl->peerTsipEncRsaKeyIndex = (byte*)XMALLOC(
  10174. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  10175. ssl->heap, DYNAMIC_TYPE_RSA);
  10176. if (!ssl->peerTsipEncRsaKeyIndex) {
  10177. args->lastErr = MEMORY_E;
  10178. goto exit_ppc;
  10179. }
  10180. }
  10181. XMEMCPY(ssl->peerTsipEncRsaKeyIndex,
  10182. args->dCert->tsip_encRsaKeyIdx,
  10183. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  10184. }
  10185. #endif
  10186. #ifdef HAVE_PK_CALLBACKS
  10187. #ifndef NO_RSA
  10188. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  10189. defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  10190. if (ssl->buffers.peerRsaKey.buffer) {
  10191. XFREE(ssl->buffers.peerRsaKey.buffer,
  10192. ssl->heap, DYNAMIC_TYPE_RSA);
  10193. ssl->buffers.peerRsaKey.buffer = NULL;
  10194. }
  10195. #endif
  10196. ssl->buffers.peerRsaKey.buffer =
  10197. (byte*)XMALLOC(args->dCert->pubKeySize,
  10198. ssl->heap, DYNAMIC_TYPE_RSA);
  10199. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  10200. ret = MEMORY_ERROR;
  10201. }
  10202. else {
  10203. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  10204. args->dCert->publicKey,
  10205. args->dCert->pubKeySize);
  10206. ssl->buffers.peerRsaKey.length =
  10207. args->dCert->pubKeySize;
  10208. }
  10209. #endif /* NO_RSA */
  10210. #endif /* HAVE_PK_CALLBACKS */
  10211. }
  10212. /* check size of peer RSA key */
  10213. if (ret == 0 && ssl->peerRsaKeyPresent &&
  10214. !ssl->options.verifyNone &&
  10215. wc_RsaEncryptSize(ssl->peerRsaKey)
  10216. < ssl->options.minRsaKeySz) {
  10217. ret = RSA_KEY_SIZE_E;
  10218. WOLFSSL_MSG("Peer RSA key is too small");
  10219. }
  10220. break;
  10221. }
  10222. #endif /* NO_RSA */
  10223. #ifdef HAVE_NTRU
  10224. case NTRUk:
  10225. {
  10226. if (args->dCert->pubKeySize > sizeof(ssl->peerNtruKey)) {
  10227. ret = PEER_KEY_ERROR;
  10228. }
  10229. else {
  10230. XMEMCPY(ssl->peerNtruKey, args->dCert->publicKey,
  10231. args->dCert->pubKeySize);
  10232. ssl->peerNtruKeyLen =
  10233. (word16)args->dCert->pubKeySize;
  10234. ssl->peerNtruKeyPresent = 1;
  10235. }
  10236. break;
  10237. }
  10238. #endif /* HAVE_NTRU */
  10239. #ifdef HAVE_ECC
  10240. case ECDSAk:
  10241. {
  10242. int keyRet = 0;
  10243. word32 idx = 0;
  10244. if (ssl->peerEccDsaKey == NULL) {
  10245. /* alloc/init on demand */
  10246. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  10247. (void**)&ssl->peerEccDsaKey);
  10248. } else if (ssl->peerEccDsaKeyPresent) {
  10249. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  10250. ssl->peerEccDsaKey);
  10251. ssl->peerEccDsaKeyPresent = 0;
  10252. }
  10253. if (keyRet != 0 ||
  10254. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  10255. ssl->peerEccDsaKey,
  10256. args->dCert->pubKeySize) != 0) {
  10257. ret = PEER_KEY_ERROR;
  10258. }
  10259. else {
  10260. ssl->peerEccDsaKeyPresent = 1;
  10261. #ifdef HAVE_PK_CALLBACKS
  10262. if (ssl->buffers.peerEccDsaKey.buffer)
  10263. XFREE(ssl->buffers.peerEccDsaKey.buffer,
  10264. ssl->heap, DYNAMIC_TYPE_ECC);
  10265. ssl->buffers.peerEccDsaKey.buffer =
  10266. (byte*)XMALLOC(args->dCert->pubKeySize,
  10267. ssl->heap, DYNAMIC_TYPE_ECC);
  10268. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  10269. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  10270. }
  10271. else {
  10272. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  10273. args->dCert->publicKey,
  10274. args->dCert->pubKeySize);
  10275. ssl->buffers.peerEccDsaKey.length =
  10276. args->dCert->pubKeySize;
  10277. }
  10278. #endif /* HAVE_PK_CALLBACKS */
  10279. }
  10280. /* check size of peer ECC key */
  10281. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  10282. !ssl->options.verifyNone &&
  10283. wc_ecc_size(ssl->peerEccDsaKey)
  10284. < ssl->options.minEccKeySz) {
  10285. ret = ECC_KEY_SIZE_E;
  10286. WOLFSSL_MSG("Peer ECC key is too small");
  10287. }
  10288. /* populate curve oid - if missing */
  10289. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  10290. ssl->ecdhCurveOID = args->dCert->pkCurveOID;
  10291. break;
  10292. }
  10293. #endif /* HAVE_ECC */
  10294. #ifdef HAVE_ED25519
  10295. case ED25519k:
  10296. {
  10297. int keyRet = 0;
  10298. if (ssl->peerEd25519Key == NULL) {
  10299. /* alloc/init on demand */
  10300. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  10301. (void**)&ssl->peerEd25519Key);
  10302. } else if (ssl->peerEd25519KeyPresent) {
  10303. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  10304. ssl->peerEd25519Key);
  10305. ssl->peerEd25519KeyPresent = 0;
  10306. }
  10307. if (keyRet != 0 ||
  10308. wc_ed25519_import_public(args->dCert->publicKey,
  10309. args->dCert->pubKeySize,
  10310. ssl->peerEd25519Key)
  10311. != 0) {
  10312. ret = PEER_KEY_ERROR;
  10313. }
  10314. else {
  10315. ssl->peerEd25519KeyPresent = 1;
  10316. #ifdef HAVE_PK_CALLBACKS
  10317. ssl->buffers.peerEd25519Key.buffer =
  10318. (byte*)XMALLOC(args->dCert->pubKeySize,
  10319. ssl->heap, DYNAMIC_TYPE_ED25519);
  10320. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  10321. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  10322. }
  10323. else {
  10324. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  10325. args->dCert->publicKey,
  10326. args->dCert->pubKeySize);
  10327. ssl->buffers.peerEd25519Key.length =
  10328. args->dCert->pubKeySize;
  10329. }
  10330. #endif /*HAVE_PK_CALLBACKS */
  10331. }
  10332. /* check size of peer ECC key */
  10333. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  10334. !ssl->options.verifyNone &&
  10335. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  10336. ret = ECC_KEY_SIZE_E;
  10337. WOLFSSL_MSG("Peer ECC key is too small");
  10338. }
  10339. /* populate curve oid - if missing */
  10340. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  10341. ssl->ecdhCurveOID = ECC_X25519_OID;
  10342. break;
  10343. }
  10344. #endif /* HAVE_ED25519 */
  10345. #ifdef HAVE_ED448
  10346. case ED448k:
  10347. {
  10348. int keyRet = 0;
  10349. if (ssl->peerEd448Key == NULL) {
  10350. /* alloc/init on demand */
  10351. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
  10352. (void**)&ssl->peerEd448Key);
  10353. } else if (ssl->peerEd448KeyPresent) {
  10354. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
  10355. ssl->peerEd448Key);
  10356. ssl->peerEd448KeyPresent = 0;
  10357. }
  10358. if (keyRet != 0 ||
  10359. wc_ed448_import_public(args->dCert->publicKey,
  10360. args->dCert->pubKeySize,
  10361. ssl->peerEd448Key) != 0) {
  10362. ret = PEER_KEY_ERROR;
  10363. }
  10364. else {
  10365. ssl->peerEd448KeyPresent = 1;
  10366. #ifdef HAVE_PK_CALLBACKS
  10367. ssl->buffers.peerEd448Key.buffer =
  10368. (byte*)XMALLOC(args->dCert->pubKeySize,
  10369. ssl->heap, DYNAMIC_TYPE_ED448);
  10370. if (ssl->buffers.peerEd448Key.buffer == NULL) {
  10371. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  10372. }
  10373. else {
  10374. XMEMCPY(ssl->buffers.peerEd448Key.buffer,
  10375. args->dCert->publicKey,
  10376. args->dCert->pubKeySize);
  10377. ssl->buffers.peerEd448Key.length =
  10378. args->dCert->pubKeySize;
  10379. }
  10380. #endif /*HAVE_PK_CALLBACKS */
  10381. }
  10382. /* check size of peer ECC key */
  10383. if (ret == 0 && ssl->peerEd448KeyPresent &&
  10384. !ssl->options.verifyNone &&
  10385. ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  10386. ret = ECC_KEY_SIZE_E;
  10387. WOLFSSL_MSG("Peer ECC key is too small");
  10388. }
  10389. /* populate curve oid - if missing */
  10390. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  10391. ssl->ecdhCurveOID = ECC_X448_OID;
  10392. break;
  10393. }
  10394. #endif /* HAVE_ED448 */
  10395. default:
  10396. break;
  10397. }
  10398. /* args->dCert free'd in function cleanup after callback */
  10399. } /* if (count > 0) */
  10400. /* Check for error */
  10401. if (args->fatal && ret != 0) {
  10402. goto exit_ppc;
  10403. }
  10404. /* Advance state and proceed */
  10405. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  10406. } /* case TLS_ASYNC_VERIFY */
  10407. FALL_THROUGH;
  10408. case TLS_ASYNC_FINALIZE:
  10409. {
  10410. /* load last error */
  10411. if (args->lastErr != 0 && ret == 0) {
  10412. ret = args->lastErr;
  10413. }
  10414. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10415. if (args->untrustedDepth > ssl->options.verifyDepth) {
  10416. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  10417. ret = MAX_CHAIN_ERROR;
  10418. }
  10419. #endif
  10420. /* Do verify callback */
  10421. ret = DoVerifyCallback(ssl->ctx->cm, ssl, ret, args);
  10422. if (ssl->options.verifyNone &&
  10423. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED)) {
  10424. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  10425. ret = ssl->error = 0;
  10426. }
  10427. if (ret != 0) {
  10428. if (!ssl->options.verifyNone) {
  10429. DoCertFatalAlert(ssl, ret);
  10430. }
  10431. ssl->error = ret; /* Report SSL error */
  10432. }
  10433. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  10434. ssl->options.serverState = SERVER_CERT_COMPLETE;
  10435. }
  10436. if (IsEncryptionOn(ssl, 0)) {
  10437. args->idx += ssl->keys.padSz;
  10438. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10439. if (ssl->options.startedETMRead)
  10440. args->idx += MacSize(ssl);
  10441. #endif
  10442. }
  10443. /* Advance state and proceed */
  10444. ssl->options.asyncState = TLS_ASYNC_END;
  10445. } /* case TLS_ASYNC_FINALIZE */
  10446. FALL_THROUGH;
  10447. case TLS_ASYNC_END:
  10448. {
  10449. /* Set final index */
  10450. *inOutIdx = args->idx;
  10451. break;
  10452. }
  10453. default:
  10454. ret = INPUT_CASE_ERROR;
  10455. break;
  10456. } /* switch(ssl->options.asyncState) */
  10457. exit_ppc:
  10458. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  10459. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  10460. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  10461. /* Mark message as not received so it can process again */
  10462. ssl->msgsReceived.got_certificate = 0;
  10463. return ret;
  10464. }
  10465. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  10466. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) || \
  10467. defined(WOLFSSL_SMALL_STACK)
  10468. if (args)
  10469. {
  10470. FreeProcPeerCertArgs(ssl, args);
  10471. }
  10472. #else
  10473. FreeProcPeerCertArgs(ssl, args);
  10474. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
  10475. #if defined(WOLFSSL_ASYNC_CRYPT)
  10476. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  10477. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  10478. ssl->nonblockarg = NULL;
  10479. #elif defined(WOLFSSL_SMALL_STACK)
  10480. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  10481. #endif
  10482. FreeKeyExchange(ssl);
  10483. return ret;
  10484. }
  10485. #endif
  10486. #ifndef WOLFSSL_NO_TLS12
  10487. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  10488. /* handle processing of certificate (11) */
  10489. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10490. word32 size)
  10491. {
  10492. int ret;
  10493. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  10494. WOLFSSL_ENTER("DoCertificate");
  10495. #ifdef SESSION_CERTS
  10496. /* Reset the session cert chain count in case the session resume failed. */
  10497. ssl->session.chain.count = 0;
  10498. #ifdef WOLFSSL_ALT_CERT_CHAINS
  10499. ssl->session.altChain.count = 0;
  10500. #endif
  10501. #endif /* SESSION_CERTS */
  10502. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  10503. #ifdef WOLFSSL_EXTRA_ALERTS
  10504. if (ret == BUFFER_ERROR || ret == ASN_PARSE_E)
  10505. SendAlert(ssl, alert_fatal, decode_error);
  10506. #endif
  10507. #ifdef OPENSSL_EXTRA
  10508. ssl->options.serverState = SERVER_CERT_COMPLETE;
  10509. #endif
  10510. WOLFSSL_LEAVE("DoCertificate", ret);
  10511. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  10512. return ret;
  10513. }
  10514. /* handle processing of certificate_status (22) */
  10515. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10516. word32 size)
  10517. {
  10518. int ret = 0;
  10519. byte status_type;
  10520. word32 status_length;
  10521. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  10522. WOLFSSL_ENTER("DoCertificateStatus");
  10523. if (size < ENUM_LEN + OPAQUE24_LEN)
  10524. return BUFFER_ERROR;
  10525. status_type = input[(*inOutIdx)++];
  10526. c24to32(input + *inOutIdx, &status_length);
  10527. *inOutIdx += OPAQUE24_LEN;
  10528. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  10529. return BUFFER_ERROR;
  10530. switch (status_type) {
  10531. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  10532. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  10533. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  10534. case WOLFSSL_CSR2_OCSP:
  10535. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  10536. break;
  10537. #endif
  10538. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  10539. case WOLFSSL_CSR2_OCSP_MULTI: {
  10540. OcspRequest* request;
  10541. word32 list_length = status_length;
  10542. byte idx = 0;
  10543. #ifdef WOLFSSL_SMALL_STACK
  10544. CertStatus* status;
  10545. OcspEntry* single;
  10546. OcspResponse* response;
  10547. #else
  10548. CertStatus status[1];
  10549. OcspEntry single[1];
  10550. OcspResponse response[1];
  10551. #endif
  10552. do {
  10553. if (ssl->status_request_v2) {
  10554. ssl->status_request_v2 = 0;
  10555. break;
  10556. }
  10557. return BUFFER_ERROR;
  10558. } while(0);
  10559. #ifdef WOLFSSL_SMALL_STACK
  10560. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  10561. DYNAMIC_TYPE_OCSP_STATUS);
  10562. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  10563. DYNAMIC_TYPE_OCSP_ENTRY);
  10564. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  10565. DYNAMIC_TYPE_OCSP_REQUEST);
  10566. if (status == NULL || single == NULL || response == NULL) {
  10567. if (status)
  10568. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  10569. if (single)
  10570. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  10571. if (response)
  10572. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  10573. return MEMORY_ERROR;
  10574. }
  10575. #endif
  10576. while (list_length && ret == 0) {
  10577. if (OPAQUE24_LEN > list_length) {
  10578. ret = BUFFER_ERROR;
  10579. break;
  10580. }
  10581. c24to32(input + *inOutIdx, &status_length);
  10582. *inOutIdx += OPAQUE24_LEN;
  10583. list_length -= OPAQUE24_LEN;
  10584. if (status_length > list_length) {
  10585. ret = BUFFER_ERROR;
  10586. break;
  10587. }
  10588. if (status_length) {
  10589. InitOcspResponse(response, single, status, input +*inOutIdx,
  10590. status_length, ssl->heap);
  10591. if ((OcspResponseDecode(response, ssl->ctx->cm, ssl->heap,
  10592. 0) != 0)
  10593. || (response->responseStatus != OCSP_SUCCESSFUL)
  10594. || (response->single->status->status != CERT_GOOD))
  10595. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10596. while (ret == 0) {
  10597. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  10598. ssl->extensions, status_type, idx++);
  10599. if (request == NULL)
  10600. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10601. else if (CompareOcspReqResp(request, response) == 0)
  10602. break;
  10603. else if (idx == 1) /* server cert must be OK */
  10604. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10605. }
  10606. FreeOcspResponse(response);
  10607. *inOutIdx += status_length;
  10608. list_length -= status_length;
  10609. }
  10610. }
  10611. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  10612. ssl->status_request_v2 = 0;
  10613. #endif
  10614. #ifdef WOLFSSL_SMALL_STACK
  10615. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  10616. XFREE(single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
  10617. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  10618. #endif
  10619. }
  10620. break;
  10621. #endif
  10622. default:
  10623. ret = BUFFER_ERROR;
  10624. }
  10625. if (ret != 0)
  10626. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  10627. if (IsEncryptionOn(ssl, 0)) {
  10628. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10629. if (ssl->options.startedETMRead) {
  10630. word32 digestSz = MacSize(ssl);
  10631. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  10632. return BUFFER_E;
  10633. *inOutIdx += ssl->keys.padSz + digestSz;
  10634. }
  10635. else
  10636. #endif
  10637. {
  10638. if (*inOutIdx + ssl->keys.padSz > size)
  10639. return BUFFER_E;
  10640. *inOutIdx += ssl->keys.padSz;
  10641. }
  10642. }
  10643. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  10644. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  10645. return ret;
  10646. }
  10647. #endif
  10648. #endif /* !WOLFSSL_NO_TLS12 */
  10649. #endif /* !NO_CERTS */
  10650. #ifndef WOLFSSL_NO_TLS12
  10651. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  10652. word32 size, word32 totalSz)
  10653. {
  10654. (void)input;
  10655. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  10656. WOLFSSL_ENTER("DoHelloRequest");
  10657. if (size) /* must be 0 */
  10658. return BUFFER_ERROR;
  10659. if (IsEncryptionOn(ssl, 0)) {
  10660. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  10661. * about padding */
  10662. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10663. if (ssl->options.startedETMRead) {
  10664. word32 digestSz = MacSize(ssl);
  10665. if (size != totalSz &&
  10666. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  10667. return BUFFER_E;
  10668. *inOutIdx += ssl->keys.padSz + digestSz;
  10669. }
  10670. else
  10671. #endif
  10672. {
  10673. /* access beyond input + size should be checked against totalSz */
  10674. if (size != totalSz &&
  10675. *inOutIdx + ssl->keys.padSz > totalSz)
  10676. return BUFFER_E;
  10677. *inOutIdx += ssl->keys.padSz;
  10678. }
  10679. }
  10680. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10681. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  10682. return FATAL_ERROR;
  10683. }
  10684. #ifdef HAVE_SECURE_RENEGOTIATION
  10685. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  10686. ssl->secure_renegotiation->startScr = 1;
  10687. WOLFSSL_LEAVE("DoHelloRequest", 0);
  10688. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  10689. return 0;
  10690. }
  10691. #endif
  10692. else {
  10693. return SendAlert(ssl, alert_warning, no_renegotiation);
  10694. }
  10695. }
  10696. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  10697. word32 totalSz, int sniff)
  10698. {
  10699. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  10700. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  10701. WOLFSSL_ENTER("DoFinished");
  10702. if (finishedSz != size)
  10703. return BUFFER_ERROR;
  10704. /* check against totalSz
  10705. * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
  10706. * padding */
  10707. if (size != totalSz) {
  10708. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10709. if (ssl->options.startedETMRead) {
  10710. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  10711. return BUFFER_E;
  10712. }
  10713. else
  10714. #endif
  10715. {
  10716. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  10717. return BUFFER_E;
  10718. }
  10719. }
  10720. #ifdef WOLFSSL_CALLBACKS
  10721. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  10722. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  10723. #endif
  10724. if (sniff == NO_SNIFF) {
  10725. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  10726. WOLFSSL_MSG("Verify finished error on hashes");
  10727. #ifdef WOLFSSL_EXTRA_ALERTS
  10728. SendAlert(ssl, alert_fatal, decrypt_error);
  10729. #endif
  10730. return VERIFY_FINISHED_ERROR;
  10731. }
  10732. }
  10733. #ifdef HAVE_SECURE_RENEGOTIATION
  10734. if (ssl->secure_renegotiation) {
  10735. /* save peer's state */
  10736. if (ssl->options.side == WOLFSSL_CLIENT_END)
  10737. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  10738. input + *inOutIdx, TLS_FINISHED_SZ);
  10739. else
  10740. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  10741. input + *inOutIdx, TLS_FINISHED_SZ);
  10742. ssl->secure_renegotiation->verifySet = 1;
  10743. }
  10744. #endif
  10745. #ifdef OPENSSL_ALL
  10746. if (ssl->options.side == WOLFSSL_CLIENT_END)
  10747. XMEMCPY(ssl->serverFinished,
  10748. input + *inOutIdx, TLS_FINISHED_SZ);
  10749. else
  10750. XMEMCPY(ssl->clientFinished,
  10751. input + *inOutIdx, TLS_FINISHED_SZ);
  10752. #endif
  10753. /* force input exhaustion at ProcessReply consuming padSz */
  10754. *inOutIdx += size + ssl->keys.padSz;
  10755. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10756. if (ssl->options.startedETMRead)
  10757. *inOutIdx += MacSize(ssl);
  10758. #endif
  10759. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10760. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  10761. #ifdef OPENSSL_EXTRA
  10762. ssl->cbmode = SSL_CB_MODE_WRITE;
  10763. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  10764. #endif
  10765. if (!ssl->options.resuming) {
  10766. #ifdef OPENSSL_EXTRA
  10767. if (ssl->CBIS != NULL) {
  10768. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  10769. }
  10770. #endif
  10771. ssl->options.handShakeState = HANDSHAKE_DONE;
  10772. ssl->options.handShakeDone = 1;
  10773. }
  10774. }
  10775. else {
  10776. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  10777. #ifdef OPENSSL_EXTRA
  10778. ssl->cbmode = SSL_CB_MODE_READ;
  10779. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  10780. #endif
  10781. if (ssl->options.resuming) {
  10782. #ifdef OPENSSL_EXTRA
  10783. if (ssl->CBIS != NULL) {
  10784. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  10785. }
  10786. #endif
  10787. ssl->options.handShakeState = HANDSHAKE_DONE;
  10788. ssl->options.handShakeDone = 1;
  10789. }
  10790. }
  10791. #ifdef WOLFSSL_DTLS
  10792. if (ssl->options.dtls) {
  10793. if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
  10794. (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
  10795. DtlsMsgPoolReset(ssl);
  10796. ssl->keys.dtls_handshake_number = 0;
  10797. ssl->keys.dtls_expected_peer_handshake_number = 0;
  10798. }
  10799. }
  10800. #endif
  10801. WOLFSSL_LEAVE("DoFinished", 0);
  10802. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  10803. return 0;
  10804. }
  10805. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  10806. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  10807. {
  10808. /* verify not a duplicate, mark received, check state */
  10809. switch (type) {
  10810. #ifndef NO_WOLFSSL_CLIENT
  10811. case hello_request:
  10812. if (ssl->msgsReceived.got_hello_request) {
  10813. WOLFSSL_MSG("Duplicate HelloRequest received");
  10814. return DUPLICATE_MSG_E;
  10815. }
  10816. ssl->msgsReceived.got_hello_request = 1;
  10817. break;
  10818. #endif
  10819. #ifndef NO_WOLFSSL_SERVER
  10820. case client_hello:
  10821. if (ssl->msgsReceived.got_client_hello) {
  10822. WOLFSSL_MSG("Duplicate ClientHello received");
  10823. #ifdef WOLFSSL_EXTRA_ALERTS
  10824. SendAlert(ssl, alert_fatal, unexpected_message);
  10825. #endif
  10826. return DUPLICATE_MSG_E;
  10827. }
  10828. ssl->msgsReceived.got_client_hello = 1;
  10829. break;
  10830. #endif
  10831. #ifndef NO_WOLFSSL_CLIENT
  10832. case server_hello:
  10833. if (ssl->msgsReceived.got_server_hello) {
  10834. WOLFSSL_MSG("Duplicate ServerHello received");
  10835. return DUPLICATE_MSG_E;
  10836. }
  10837. ssl->msgsReceived.got_server_hello = 1;
  10838. break;
  10839. #endif
  10840. #ifndef NO_WOLFSSL_CLIENT
  10841. case hello_verify_request:
  10842. if (ssl->msgsReceived.got_hello_verify_request) {
  10843. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  10844. return DUPLICATE_MSG_E;
  10845. }
  10846. ssl->msgsReceived.got_hello_verify_request = 1;
  10847. break;
  10848. #endif
  10849. #ifndef NO_WOLFSSL_CLIENT
  10850. case session_ticket:
  10851. if (ssl->msgsReceived.got_session_ticket) {
  10852. WOLFSSL_MSG("Duplicate SessionTicket received");
  10853. return DUPLICATE_MSG_E;
  10854. }
  10855. ssl->msgsReceived.got_session_ticket = 1;
  10856. break;
  10857. #endif
  10858. case certificate:
  10859. if (ssl->msgsReceived.got_certificate) {
  10860. WOLFSSL_MSG("Duplicate Certificate received");
  10861. return DUPLICATE_MSG_E;
  10862. }
  10863. ssl->msgsReceived.got_certificate = 1;
  10864. #ifndef NO_WOLFSSL_CLIENT
  10865. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10866. if ( ssl->msgsReceived.got_server_hello == 0) {
  10867. WOLFSSL_MSG("No ServerHello before Cert");
  10868. return OUT_OF_ORDER_E;
  10869. }
  10870. }
  10871. #endif
  10872. #ifndef NO_WOLFSSL_SERVER
  10873. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10874. if ( ssl->msgsReceived.got_client_hello == 0) {
  10875. WOLFSSL_MSG("No ClientHello before Cert");
  10876. return OUT_OF_ORDER_E;
  10877. }
  10878. }
  10879. #endif
  10880. break;
  10881. #ifndef NO_WOLFSSL_CLIENT
  10882. case certificate_status:
  10883. if (ssl->msgsReceived.got_certificate_status) {
  10884. WOLFSSL_MSG("Duplicate CertificateSatatus received");
  10885. return DUPLICATE_MSG_E;
  10886. }
  10887. ssl->msgsReceived.got_certificate_status = 1;
  10888. if (ssl->msgsReceived.got_certificate == 0) {
  10889. WOLFSSL_MSG("No Certificate before CertificateStatus");
  10890. return OUT_OF_ORDER_E;
  10891. }
  10892. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  10893. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  10894. return OUT_OF_ORDER_E;
  10895. }
  10896. break;
  10897. #endif
  10898. #ifndef NO_WOLFSSL_CLIENT
  10899. case server_key_exchange:
  10900. if (ssl->msgsReceived.got_server_key_exchange) {
  10901. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  10902. return DUPLICATE_MSG_E;
  10903. }
  10904. ssl->msgsReceived.got_server_key_exchange = 1;
  10905. if (ssl->msgsReceived.got_server_hello == 0) {
  10906. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  10907. return OUT_OF_ORDER_E;
  10908. }
  10909. if (ssl->msgsReceived.got_certificate_status == 0) {
  10910. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  10911. if (ssl->status_request) {
  10912. int ret;
  10913. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  10914. if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0)
  10915. return ret;
  10916. }
  10917. #endif
  10918. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10919. if (ssl->status_request_v2) {
  10920. int ret;
  10921. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  10922. if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0)
  10923. return ret;
  10924. }
  10925. #endif
  10926. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  10927. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  10928. /* Check that a status request extension was seen as the
  10929. * CertificateStatus wasn't when an OCSP staple is required.
  10930. */
  10931. if (
  10932. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  10933. !ssl->status_request &&
  10934. #endif
  10935. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10936. !ssl->status_request_v2 &&
  10937. #endif
  10938. ssl->ctx->cm->ocspMustStaple) {
  10939. return OCSP_CERT_UNKNOWN;
  10940. }
  10941. #endif
  10942. }
  10943. break;
  10944. #endif
  10945. #ifndef NO_WOLFSSL_CLIENT
  10946. case certificate_request:
  10947. if (ssl->msgsReceived.got_certificate_request) {
  10948. WOLFSSL_MSG("Duplicate CertificateRequest received");
  10949. return DUPLICATE_MSG_E;
  10950. }
  10951. ssl->msgsReceived.got_certificate_request = 1;
  10952. break;
  10953. #endif
  10954. #ifndef NO_WOLFSSL_CLIENT
  10955. case server_hello_done:
  10956. if (ssl->msgsReceived.got_server_hello_done) {
  10957. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  10958. return DUPLICATE_MSG_E;
  10959. }
  10960. ssl->msgsReceived.got_server_hello_done = 1;
  10961. if (ssl->msgsReceived.got_certificate == 0) {
  10962. if (ssl->specs.kea == psk_kea ||
  10963. ssl->specs.kea == dhe_psk_kea ||
  10964. ssl->specs.kea == ecdhe_psk_kea ||
  10965. ssl->options.usingAnon_cipher) {
  10966. WOLFSSL_MSG("No Cert required");
  10967. } else {
  10968. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  10969. return OUT_OF_ORDER_E;
  10970. }
  10971. }
  10972. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  10973. int pskNoServerHint = 0; /* not required in this case */
  10974. #ifndef NO_PSK
  10975. if (ssl->specs.kea == psk_kea &&
  10976. ssl->arrays != NULL &&
  10977. ssl->arrays->server_hint[0] == 0)
  10978. pskNoServerHint = 1;
  10979. #endif
  10980. if (ssl->specs.static_ecdh == 1 ||
  10981. ssl->specs.kea == rsa_kea ||
  10982. ssl->specs.kea == ntru_kea ||
  10983. pskNoServerHint) {
  10984. WOLFSSL_MSG("No KeyExchange required");
  10985. } else {
  10986. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  10987. return OUT_OF_ORDER_E;
  10988. }
  10989. }
  10990. break;
  10991. #endif
  10992. #ifndef NO_WOLFSSL_SERVER
  10993. case certificate_verify:
  10994. if (ssl->msgsReceived.got_certificate_verify) {
  10995. WOLFSSL_MSG("Duplicate CertificateVerify received");
  10996. return DUPLICATE_MSG_E;
  10997. }
  10998. ssl->msgsReceived.got_certificate_verify = 1;
  10999. if ( ssl->msgsReceived.got_certificate == 0) {
  11000. WOLFSSL_MSG("No Cert before CertVerify");
  11001. return OUT_OF_ORDER_E;
  11002. }
  11003. break;
  11004. #endif
  11005. #ifndef NO_WOLFSSL_SERVER
  11006. case client_key_exchange:
  11007. if (ssl->msgsReceived.got_client_key_exchange) {
  11008. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  11009. #ifdef WOLFSSL_EXTRA_ALERTS
  11010. SendAlert(ssl, alert_fatal, unexpected_message);
  11011. #endif
  11012. return DUPLICATE_MSG_E;
  11013. }
  11014. ssl->msgsReceived.got_client_key_exchange = 1;
  11015. if (ssl->msgsReceived.got_client_hello == 0) {
  11016. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  11017. return OUT_OF_ORDER_E;
  11018. }
  11019. break;
  11020. #endif
  11021. case finished:
  11022. if (ssl->msgsReceived.got_finished) {
  11023. WOLFSSL_MSG("Duplicate Finished received");
  11024. return DUPLICATE_MSG_E;
  11025. }
  11026. #ifdef WOLFSSL_DTLS
  11027. if (ssl->options.dtls) {
  11028. if (ssl->keys.curEpoch == 0) {
  11029. WOLFSSL_MSG("Finished received with epoch 0");
  11030. return SEQUENCE_ERROR;
  11031. }
  11032. }
  11033. #endif
  11034. ssl->msgsReceived.got_finished = 1;
  11035. if (ssl->msgsReceived.got_change_cipher == 0) {
  11036. WOLFSSL_MSG("Finished received before ChangeCipher");
  11037. #ifdef WOLFSSL_EXTRA_ALERTS
  11038. SendAlert(ssl, alert_fatal, unexpected_message);
  11039. #endif
  11040. return NO_CHANGE_CIPHER_E;
  11041. }
  11042. break;
  11043. case change_cipher_hs:
  11044. if (ssl->msgsReceived.got_change_cipher) {
  11045. WOLFSSL_MSG("Duplicate ChangeCipher received");
  11046. return DUPLICATE_MSG_E;
  11047. }
  11048. /* DTLS is going to ignore the CCS message if the client key
  11049. * exchange message wasn't received yet. */
  11050. if (!ssl->options.dtls)
  11051. ssl->msgsReceived.got_change_cipher = 1;
  11052. #ifndef NO_WOLFSSL_CLIENT
  11053. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11054. if (!ssl->options.resuming) {
  11055. if (ssl->msgsReceived.got_server_hello_done == 0) {
  11056. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  11057. return OUT_OF_ORDER_E;
  11058. }
  11059. }
  11060. else {
  11061. if (ssl->msgsReceived.got_server_hello == 0) {
  11062. WOLFSSL_MSG("No ServerHello before ChangeCipher on Resume");
  11063. return OUT_OF_ORDER_E;
  11064. }
  11065. }
  11066. #ifdef HAVE_SESSION_TICKET
  11067. if (ssl->expect_session_ticket) {
  11068. WOLFSSL_MSG("Expected session ticket missing");
  11069. #ifdef WOLFSSL_DTLS
  11070. if (ssl->options.dtls)
  11071. return OUT_OF_ORDER_E;
  11072. #endif
  11073. return SESSION_TICKET_EXPECT_E;
  11074. }
  11075. #endif
  11076. }
  11077. #endif
  11078. #ifndef NO_WOLFSSL_SERVER
  11079. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11080. if (!ssl->options.resuming &&
  11081. ssl->msgsReceived.got_client_key_exchange == 0) {
  11082. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  11083. #ifdef WOLFSSL_EXTRA_ALERTS
  11084. SendAlert(ssl, alert_fatal, unexpected_message);
  11085. #endif
  11086. return OUT_OF_ORDER_E;
  11087. }
  11088. #ifndef NO_CERTS
  11089. if (ssl->options.verifyPeer &&
  11090. ssl->options.havePeerCert) {
  11091. if (!ssl->options.havePeerVerify ||
  11092. !ssl->msgsReceived.got_certificate_verify) {
  11093. WOLFSSL_MSG("client didn't send cert verify");
  11094. #ifdef WOLFSSL_DTLS
  11095. if (ssl->options.dtls)
  11096. return OUT_OF_ORDER_E;
  11097. #endif
  11098. return NO_PEER_VERIFY;
  11099. }
  11100. }
  11101. #endif
  11102. }
  11103. #endif
  11104. if (ssl->options.dtls)
  11105. ssl->msgsReceived.got_change_cipher = 1;
  11106. break;
  11107. default:
  11108. WOLFSSL_MSG("Unknown message type");
  11109. return SANITY_MSG_E;
  11110. }
  11111. return 0;
  11112. }
  11113. static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11114. byte type, word32 size, word32 totalSz)
  11115. {
  11116. int ret = 0;
  11117. word32 expectedIdx;
  11118. WOLFSSL_ENTER("DoHandShakeMsgType");
  11119. #ifdef WOLFSSL_TLS13
  11120. if (type == hello_retry_request) {
  11121. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  11122. totalSz);
  11123. }
  11124. #endif
  11125. /* make sure can read the message */
  11126. if (*inOutIdx + size > totalSz) {
  11127. WOLFSSL_MSG("Incomplete Data");
  11128. return INCOMPLETE_DATA;
  11129. }
  11130. expectedIdx = *inOutIdx + size +
  11131. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  11132. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11133. if (ssl->options.startedETMRead && ssl->keys.encryptionOn)
  11134. expectedIdx += MacSize(ssl);
  11135. #endif
  11136. #if !defined(NO_WOLFSSL_SERVER) && \
  11137. defined(HAVE_SECURE_RENEGOTIATION) && \
  11138. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  11139. if (ssl->options.handShakeDone && type == client_hello &&
  11140. ssl->secure_renegotiation &&
  11141. ssl->secure_renegotiation->enabled)
  11142. {
  11143. WOLFSSL_MSG("Reset handshake state");
  11144. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  11145. ssl->options.serverState = NULL_STATE;
  11146. ssl->options.clientState = NULL_STATE;
  11147. ssl->options.connectState = CONNECT_BEGIN;
  11148. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  11149. ssl->options.handShakeState = NULL_STATE;
  11150. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  11151. ret = InitHandshakeHashes(ssl);
  11152. if (ret != 0)
  11153. return ret;
  11154. }
  11155. #endif
  11156. /* sanity check msg received */
  11157. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  11158. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  11159. return ret;
  11160. }
  11161. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  11162. /* add name later, add on record and handshake header part back on */
  11163. if (ssl->toInfoOn) {
  11164. int add = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  11165. AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - add,
  11166. size + add, READ_PROTO, ssl->heap);
  11167. #ifdef WOLFSSL_CALLBACKS
  11168. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  11169. #endif
  11170. }
  11171. #endif
  11172. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  11173. WOLFSSL_MSG("HandShake message after handshake complete");
  11174. SendAlert(ssl, alert_fatal, unexpected_message);
  11175. return OUT_OF_ORDER_E;
  11176. }
  11177. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  11178. ssl->options.serverState == NULL_STATE && type != server_hello) {
  11179. WOLFSSL_MSG("First server message not server hello");
  11180. SendAlert(ssl, alert_fatal, unexpected_message);
  11181. return OUT_OF_ORDER_E;
  11182. }
  11183. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  11184. type == server_hello_done &&
  11185. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  11186. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  11187. SendAlert(ssl, alert_fatal, unexpected_message);
  11188. return OUT_OF_ORDER_E;
  11189. }
  11190. if (ssl->options.side == WOLFSSL_SERVER_END &&
  11191. ssl->options.clientState == NULL_STATE && type != client_hello) {
  11192. WOLFSSL_MSG("First client message not client hello");
  11193. SendAlert(ssl, alert_fatal, unexpected_message);
  11194. return OUT_OF_ORDER_E;
  11195. }
  11196. /* above checks handshake state */
  11197. /* hello_request not hashed */
  11198. /* Also, skip hashing the client_hello message here for DTLS. It will be
  11199. * hashed later if the DTLS cookie is correct. */
  11200. if (type != hello_request &&
  11201. !(IsDtlsNotSctpMode(ssl) && type == client_hello)
  11202. #ifdef WOLFSSL_ASYNC_CRYPT
  11203. && ssl->error != WC_PENDING_E
  11204. #endif
  11205. #ifdef WOLFSSL_NONBLOCK_OCSP
  11206. && ssl->error != OCSP_WANT_READ
  11207. #endif
  11208. ) {
  11209. ret = HashInput(ssl, input + *inOutIdx, size);
  11210. if (ret != 0) {
  11211. WOLFSSL_MSG("Incomplete handshake hashes");
  11212. return ret;
  11213. }
  11214. }
  11215. #ifdef OPENSSL_EXTRA
  11216. if (ssl->CBIS != NULL){
  11217. ssl->cbmode = SSL_CB_MODE_READ;
  11218. ssl->cbtype = type;
  11219. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  11220. }
  11221. #endif
  11222. switch (type) {
  11223. case hello_request:
  11224. WOLFSSL_MSG("processing hello request");
  11225. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  11226. break;
  11227. #ifndef NO_WOLFSSL_CLIENT
  11228. case hello_verify_request:
  11229. WOLFSSL_MSG("processing hello verify request");
  11230. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  11231. if (IsEncryptionOn(ssl, 0)) {
  11232. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11233. if (ssl->options.startedETMRead) {
  11234. word32 digestSz = MacSize(ssl);
  11235. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11236. return BUFFER_E;
  11237. *inOutIdx += ssl->keys.padSz + digestSz;
  11238. }
  11239. else
  11240. #endif
  11241. {
  11242. /* access beyond input + size should be checked against totalSz
  11243. */
  11244. if (*inOutIdx + ssl->keys.padSz > totalSz)
  11245. return BUFFER_E;
  11246. *inOutIdx += ssl->keys.padSz;
  11247. }
  11248. }
  11249. break;
  11250. case server_hello:
  11251. WOLFSSL_MSG("processing server hello");
  11252. ret = DoServerHello(ssl, input, inOutIdx, size);
  11253. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  11254. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  11255. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  11256. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  11257. IsAtLeastTLSv1_3(ssl->version)) {
  11258. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11259. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  11260. #endif
  11261. {
  11262. ssl->options.cacheMessages = 0;
  11263. if (ssl->hsHashes->messages != NULL) {
  11264. XFREE(ssl->hsHashes->messages, ssl->heap,
  11265. DYNAMIC_TYPE_HASHES);
  11266. ssl->hsHashes->messages = NULL;
  11267. }
  11268. }
  11269. }
  11270. #endif
  11271. break;
  11272. #ifndef NO_CERTS
  11273. case certificate_request:
  11274. WOLFSSL_MSG("processing certificate request");
  11275. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  11276. break;
  11277. #endif
  11278. case server_key_exchange:
  11279. WOLFSSL_MSG("processing server key exchange");
  11280. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  11281. break;
  11282. #ifdef HAVE_SESSION_TICKET
  11283. case session_ticket:
  11284. WOLFSSL_MSG("processing session ticket");
  11285. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  11286. break;
  11287. #endif /* HAVE_SESSION_TICKET */
  11288. #endif
  11289. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  11290. !defined(WOLFSSL_NO_CLIENT_AUTH))
  11291. case certificate:
  11292. WOLFSSL_MSG("processing certificate");
  11293. ret = DoCertificate(ssl, input, inOutIdx, size);
  11294. break;
  11295. case certificate_status:
  11296. WOLFSSL_MSG("processing certificate status");
  11297. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  11298. break;
  11299. #endif
  11300. case server_hello_done:
  11301. WOLFSSL_MSG("processing server hello done");
  11302. #ifdef WOLFSSL_CALLBACKS
  11303. if (ssl->hsInfoOn)
  11304. AddPacketName(ssl, "ServerHelloDone");
  11305. if (ssl->toInfoOn)
  11306. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  11307. #endif
  11308. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  11309. if (IsEncryptionOn(ssl, 0)) {
  11310. *inOutIdx += ssl->keys.padSz;
  11311. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11312. if (ssl->options.startedETMRead)
  11313. *inOutIdx += MacSize(ssl);
  11314. #endif
  11315. }
  11316. if (ssl->options.resuming) {
  11317. WOLFSSL_MSG("Not resuming as thought");
  11318. ssl->options.resuming = 0;
  11319. }
  11320. break;
  11321. case finished:
  11322. WOLFSSL_MSG("processing finished");
  11323. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  11324. break;
  11325. #ifndef NO_WOLFSSL_SERVER
  11326. case client_hello:
  11327. WOLFSSL_MSG("processing client hello");
  11328. ret = DoClientHello(ssl, input, inOutIdx, size);
  11329. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  11330. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  11331. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  11332. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  11333. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  11334. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11335. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  11336. #endif
  11337. {
  11338. ssl->options.cacheMessages = 0;
  11339. if (ssl->hsHashes->messages != NULL) {
  11340. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  11341. ssl->hsHashes->messages = NULL;
  11342. }
  11343. }
  11344. }
  11345. #endif
  11346. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  11347. * about padding */
  11348. if (IsEncryptionOn(ssl, 0)) {
  11349. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11350. if (ssl->options.startedETMRead) {
  11351. word32 digestSz = MacSize(ssl);
  11352. if (size != totalSz &&
  11353. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11354. return BUFFER_E;
  11355. *inOutIdx += ssl->keys.padSz + digestSz;
  11356. }
  11357. else
  11358. #endif
  11359. {
  11360. /* access beyond input + size should be checked against totalSz
  11361. */
  11362. if (size != totalSz &&
  11363. *inOutIdx + ssl->keys.padSz > totalSz)
  11364. return BUFFER_E;
  11365. *inOutIdx += ssl->keys.padSz;
  11366. }
  11367. }
  11368. break;
  11369. case client_key_exchange:
  11370. WOLFSSL_MSG("processing client key exchange");
  11371. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  11372. break;
  11373. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  11374. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  11375. case certificate_verify:
  11376. WOLFSSL_MSG("processing certificate verify");
  11377. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  11378. break;
  11379. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  11380. #endif /* !NO_WOLFSSL_SERVER */
  11381. default:
  11382. WOLFSSL_MSG("Unknown handshake message type");
  11383. ret = UNKNOWN_HANDSHAKE_TYPE;
  11384. break;
  11385. }
  11386. if (ret == 0 && expectedIdx != *inOutIdx) {
  11387. WOLFSSL_MSG("Extra data in handshake message");
  11388. if (!ssl->options.dtls)
  11389. SendAlert(ssl, alert_fatal, decode_error);
  11390. ret = DECODE_E;
  11391. }
  11392. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag
  11393. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11394. /* do not shrink input for async or non-block */
  11395. && ssl->error != WC_PENDING_E && ssl->error != OCSP_WANT_READ
  11396. #endif
  11397. ) {
  11398. if (IsEncryptionOn(ssl, 0)) {
  11399. word32 extra = ssl->keys.padSz;
  11400. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11401. if (ssl->options.startedETMRead)
  11402. extra += MacSize(ssl);
  11403. #endif
  11404. if (extra > ssl->buffers.inputBuffer.idx)
  11405. return BUFFER_E;
  11406. ssl->buffers.inputBuffer.idx -= extra;
  11407. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  11408. ssl->buffers.inputBuffer.idx += extra;
  11409. }
  11410. else {
  11411. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  11412. }
  11413. }
  11414. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11415. /* if async, offset index so this msg will be processed again */
  11416. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  11417. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  11418. #ifdef WOLFSSL_DTLS
  11419. if (ssl->options.dtls) {
  11420. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  11421. }
  11422. #endif
  11423. }
  11424. /* make sure async error is cleared */
  11425. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  11426. ssl->error = 0;
  11427. }
  11428. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  11429. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  11430. return ret;
  11431. }
  11432. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11433. word32 totalSz)
  11434. {
  11435. int ret = 0;
  11436. word32 inputLength;
  11437. WOLFSSL_ENTER("DoHandShakeMsg()");
  11438. if (ssl->arrays == NULL) {
  11439. byte type;
  11440. word32 size;
  11441. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0)
  11442. return PARSE_ERROR;
  11443. ssl->options.handShakeState = type;
  11444. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  11445. }
  11446. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  11447. /* If there is a pending fragmented handshake message,
  11448. * pending message size will be non-zero. */
  11449. if (ssl->arrays->pendingMsgSz == 0) {
  11450. byte type;
  11451. word32 size;
  11452. if (GetHandShakeHeader(ssl,input, inOutIdx, &type, &size, totalSz) != 0)
  11453. return PARSE_ERROR;
  11454. /* Cap the maximum size of a handshake message to something reasonable.
  11455. * By default is the maximum size of a certificate message assuming
  11456. * nine 2048-bit RSA certificates in the chain. */
  11457. if (size > MAX_HANDSHAKE_SZ) {
  11458. WOLFSSL_MSG("Handshake message too large");
  11459. return HANDSHAKE_SIZE_ERROR;
  11460. }
  11461. /* size is the size of the certificate message payload */
  11462. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  11463. ssl->arrays->pendingMsgType = type;
  11464. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  11465. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  11466. ssl->heap,
  11467. DYNAMIC_TYPE_ARRAYS);
  11468. if (ssl->arrays->pendingMsg == NULL)
  11469. return MEMORY_E;
  11470. XMEMCPY(ssl->arrays->pendingMsg,
  11471. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  11472. inputLength);
  11473. ssl->arrays->pendingMsgOffset = inputLength;
  11474. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  11475. return 0;
  11476. }
  11477. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  11478. }
  11479. else {
  11480. word32 pendSz =
  11481. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  11482. /* Catch the case where there may be the remainder of a fragmented
  11483. * handshake message and the next handshake message in the same
  11484. * record. */
  11485. if (inputLength > pendSz)
  11486. inputLength = pendSz;
  11487. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  11488. input + *inOutIdx, inputLength);
  11489. ssl->arrays->pendingMsgOffset += inputLength;
  11490. *inOutIdx += inputLength;
  11491. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  11492. {
  11493. word32 idx = HANDSHAKE_HEADER_SZ;
  11494. ret = DoHandShakeMsgType(ssl,
  11495. ssl->arrays->pendingMsg,
  11496. &idx, ssl->arrays->pendingMsgType,
  11497. ssl->arrays->pendingMsgSz - idx,
  11498. ssl->arrays->pendingMsgSz);
  11499. #ifdef WOLFSSL_ASYNC_CRYPT
  11500. if (ret == WC_PENDING_E) {
  11501. /* setup to process fragment again */
  11502. ssl->arrays->pendingMsgOffset -= inputLength;
  11503. *inOutIdx -= inputLength;
  11504. }
  11505. else
  11506. #endif
  11507. {
  11508. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  11509. ssl->arrays->pendingMsg = NULL;
  11510. ssl->arrays->pendingMsgSz = 0;
  11511. }
  11512. }
  11513. }
  11514. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  11515. return ret;
  11516. }
  11517. #endif /* !WOLFSSL_NO_TLS12 */
  11518. #ifdef WOLFSSL_DTLS
  11519. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl)
  11520. {
  11521. word32* window;
  11522. word16 cur_hi, next_hi;
  11523. word32 cur_lo, next_lo, diff;
  11524. int curLT;
  11525. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  11526. if (!ssl->options.haveMcast)
  11527. peerSeq = ssl->keys.peerSeq;
  11528. else {
  11529. #ifdef WOLFSSL_MULTICAST
  11530. WOLFSSL_DTLS_PEERSEQ* p;
  11531. int i;
  11532. for (i = 0, p = ssl->keys.peerSeq;
  11533. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  11534. i++, p++) {
  11535. if (p->peerId == ssl->keys.curPeerId) {
  11536. peerSeq = p;
  11537. break;
  11538. }
  11539. }
  11540. #endif
  11541. }
  11542. if (peerSeq == NULL) {
  11543. WOLFSSL_MSG("Could not find peer sequence");
  11544. return 0;
  11545. }
  11546. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  11547. next_hi = peerSeq->nextSeq_hi;
  11548. next_lo = peerSeq->nextSeq_lo;
  11549. window = peerSeq->window;
  11550. }
  11551. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  11552. next_hi = peerSeq->prevSeq_hi;
  11553. next_lo = peerSeq->prevSeq_lo;
  11554. window = peerSeq->prevWindow;
  11555. }
  11556. else {
  11557. return 0;
  11558. }
  11559. cur_hi = ssl->keys.curSeq_hi;
  11560. cur_lo = ssl->keys.curSeq_lo;
  11561. /* If the difference between next and cur is > 2^32, way outside window. */
  11562. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  11563. WOLFSSL_MSG("Current record from way too far in the future.");
  11564. return 0;
  11565. }
  11566. if (cur_hi == next_hi) {
  11567. curLT = cur_lo < next_lo;
  11568. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  11569. }
  11570. else {
  11571. curLT = cur_hi < next_hi;
  11572. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  11573. }
  11574. /* Check to see that the next value is greater than the number of messages
  11575. * trackable in the window, and that the difference between the next
  11576. * expected sequence number and the received sequence number is inside the
  11577. * window. */
  11578. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  11579. curLT && (diff > DTLS_SEQ_BITS)) {
  11580. WOLFSSL_MSG("Current record sequence number from the past.");
  11581. return 0;
  11582. }
  11583. #ifndef WOLFSSL_DTLS_ALLOW_FUTURE
  11584. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  11585. WOLFSSL_MSG("Rejecting message too far into the future.");
  11586. return 0;
  11587. }
  11588. #endif
  11589. else if (curLT) {
  11590. word32 idx;
  11591. word32 newDiff;
  11592. if (diff == 0) {
  11593. WOLFSSL_MSG("DTLS sanity check failed");
  11594. return 0;
  11595. }
  11596. diff--;
  11597. idx = diff / DTLS_WORD_BITS;
  11598. newDiff = diff % DTLS_WORD_BITS;
  11599. /* verify idx is valid for window array */
  11600. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  11601. WOLFSSL_MSG("Invalid DTLS windows index");
  11602. return 0;
  11603. }
  11604. if (window[idx] & (1 << newDiff)) {
  11605. WOLFSSL_MSG("Current record sequence number already received.");
  11606. return 0;
  11607. }
  11608. }
  11609. return 1;
  11610. }
  11611. #ifdef WOLFSSL_MULTICAST
  11612. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  11613. word32 second, word32 high)
  11614. {
  11615. word32 newCur = 0;
  11616. if (cur < first)
  11617. newCur = first;
  11618. else if (cur < second)
  11619. newCur = second;
  11620. else if (cur < high)
  11621. newCur = high;
  11622. return newCur;
  11623. }
  11624. #endif /* WOLFSSL_MULTICAST */
  11625. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl)
  11626. {
  11627. word32* window;
  11628. word32* next_lo;
  11629. word16* next_hi;
  11630. int curLT;
  11631. word32 cur_lo, diff;
  11632. word16 cur_hi;
  11633. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  11634. cur_hi = ssl->keys.curSeq_hi;
  11635. cur_lo = ssl->keys.curSeq_lo;
  11636. #ifdef WOLFSSL_MULTICAST
  11637. if (ssl->options.haveMcast) {
  11638. WOLFSSL_DTLS_PEERSEQ* p;
  11639. int i;
  11640. peerSeq = NULL;
  11641. for (i = 0, p = ssl->keys.peerSeq;
  11642. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  11643. i++, p++) {
  11644. if (p->peerId == ssl->keys.curPeerId) {
  11645. peerSeq = p;
  11646. break;
  11647. }
  11648. }
  11649. if (peerSeq == NULL) {
  11650. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  11651. return 0;
  11652. }
  11653. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  11654. int cbError = 0;
  11655. if (ssl->ctx->mcastHwCb)
  11656. cbError = ssl->ctx->mcastHwCb(p->peerId,
  11657. ssl->ctx->mcastMaxSeq,
  11658. cur_lo, ssl->mcastHwCbCtx);
  11659. if (cbError) {
  11660. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  11661. return MCAST_HIGHWATER_CB_E;
  11662. }
  11663. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  11664. ssl->ctx->mcastFirstSeq,
  11665. ssl->ctx->mcastSecondSeq,
  11666. ssl->ctx->mcastMaxSeq);
  11667. }
  11668. }
  11669. #endif
  11670. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  11671. next_hi = &peerSeq->nextSeq_hi;
  11672. next_lo = &peerSeq->nextSeq_lo;
  11673. window = peerSeq->window;
  11674. }
  11675. else {
  11676. next_hi = &peerSeq->prevSeq_hi;
  11677. next_lo = &peerSeq->prevSeq_lo;
  11678. window = peerSeq->prevWindow;
  11679. }
  11680. if (cur_hi == *next_hi) {
  11681. curLT = cur_lo < *next_lo;
  11682. diff = curLT ? *next_lo - cur_lo - 1 : cur_lo - *next_lo + 1;
  11683. }
  11684. else {
  11685. curLT = cur_hi < *next_hi;
  11686. diff = curLT ? cur_lo - *next_lo - 1 : *next_lo - cur_lo + 1;
  11687. }
  11688. if (curLT) {
  11689. word32 idx = diff / DTLS_WORD_BITS;
  11690. word32 newDiff = diff % DTLS_WORD_BITS;
  11691. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  11692. window[idx] |= (1 << newDiff);
  11693. }
  11694. else {
  11695. if (diff >= DTLS_SEQ_BITS)
  11696. XMEMSET(window, 0, DTLS_SEQ_SZ);
  11697. else {
  11698. word32 idx, newDiff, temp, i;
  11699. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  11700. temp = 0;
  11701. idx = diff / DTLS_WORD_BITS;
  11702. newDiff = diff % DTLS_WORD_BITS;
  11703. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  11704. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  11705. if (i < idx)
  11706. window[i] = 0;
  11707. else {
  11708. temp |= (oldWindow[i-idx] << newDiff);
  11709. window[i] = temp;
  11710. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - newDiff - 1);
  11711. }
  11712. }
  11713. }
  11714. window[0] |= 1;
  11715. *next_lo = cur_lo + 1;
  11716. if (*next_lo < cur_lo)
  11717. (*next_hi)++;
  11718. }
  11719. return 1;
  11720. }
  11721. static int DtlsMsgDrain(WOLFSSL* ssl)
  11722. {
  11723. DtlsMsg* item = ssl->dtls_rx_msg_list;
  11724. int ret = 0;
  11725. WOLFSSL_ENTER("DtlsMsgDrain()");
  11726. /* While there is an item in the store list, and it is the expected
  11727. * message, and it is complete, and there hasn't been an error in the
  11728. * last message... */
  11729. while (item != NULL &&
  11730. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  11731. item->fragSz == item->sz &&
  11732. ret == 0) {
  11733. word32 idx = 0;
  11734. if ((ret = DoHandShakeMsgType(ssl, item->msg, &idx, item->type,
  11735. item->sz, item->sz)) == 0) {
  11736. if (item->type != finished)
  11737. ssl->keys.dtls_expected_peer_handshake_number++;
  11738. DtlsTxMsgListClean(ssl);
  11739. }
  11740. #ifdef WOLFSSL_ASYNC_CRYPT
  11741. if (ret == WC_PENDING_E) {
  11742. break;
  11743. }
  11744. #endif
  11745. ssl->dtls_rx_msg_list = item->next;
  11746. DtlsMsgDelete(item, ssl->heap);
  11747. item = ssl->dtls_rx_msg_list;
  11748. ssl->dtls_rx_msg_list_sz--;
  11749. }
  11750. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  11751. return ret;
  11752. }
  11753. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11754. word32 totalSz)
  11755. {
  11756. byte type;
  11757. word32 size;
  11758. word32 fragOffset, fragSz;
  11759. int ret = 0;
  11760. int ignoreFinished = 0;
  11761. WOLFSSL_ENTER("DoDtlsHandShakeMsg()");
  11762. /* parse header */
  11763. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  11764. &size, &fragOffset, &fragSz, totalSz) != 0) {
  11765. WOLFSSL_ERROR(PARSE_ERROR);
  11766. return PARSE_ERROR;
  11767. }
  11768. /* Cap the maximum size of a handshake message to something reasonable.
  11769. * By default is the maximum size of a certificate message assuming
  11770. * nine 2048-bit RSA certificates in the chain. */
  11771. if (size > MAX_HANDSHAKE_SZ) {
  11772. WOLFSSL_MSG("Handshake message too large");
  11773. return HANDSHAKE_SIZE_ERROR;
  11774. }
  11775. /* check that we have complete fragment */
  11776. if (*inOutIdx + fragSz > totalSz) {
  11777. WOLFSSL_ERROR(INCOMPLETE_DATA);
  11778. return INCOMPLETE_DATA;
  11779. }
  11780. if (type == finished && ssl->keys.dtls_peer_handshake_number >=
  11781. ssl->keys.dtls_expected_peer_handshake_number &&
  11782. ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
  11783. /* finished msg should be ignore from the current epoch
  11784. * if it comes from a previous handshake */
  11785. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11786. ignoreFinished = ssl->options.connectState < FINISHED_DONE;
  11787. }
  11788. else {
  11789. ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
  11790. }
  11791. }
  11792. /* Check the handshake sequence number first. If out of order,
  11793. * add the current message to the list. If the message is in order,
  11794. * but it is a fragment, add the current message to the list, then
  11795. * check the head of the list to see if it is complete, if so, pop
  11796. * it out as the current message. If the message is complete and in
  11797. * order, process it. Check the head of the list to see if it is in
  11798. * order, if so, process it. (Repeat until list exhausted.) If the
  11799. * head is out of order, return for more processing.
  11800. */
  11801. if (ssl->keys.dtls_peer_handshake_number >
  11802. ssl->keys.dtls_expected_peer_handshake_number &&
  11803. /* Only client_hello shouldn't be ignored if the handshake
  11804. * num is greater */
  11805. (type == client_hello ||
  11806. ssl->options.handShakeState != HANDSHAKE_DONE) &&
  11807. !ignoreFinished) {
  11808. /* Current message is out of order. It will get stored in the list.
  11809. * Storing also takes care of defragmentation. If the messages is a
  11810. * client hello, we need to process this out of order; the server
  11811. * is not supposed to keep state, but the second client hello will
  11812. * have a different handshake sequence number than is expected, and
  11813. * the server shouldn't be expecting any particular handshake sequence
  11814. * number. (If the cookie changes multiple times in quick succession,
  11815. * the client could be sending multiple new client hello messages
  11816. * with newer and newer cookies.) */
  11817. WOLFSSL_MSG("Current message is out of order");
  11818. if (type != client_hello) {
  11819. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  11820. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  11821. ssl->keys.dtls_peer_handshake_number,
  11822. input + *inOutIdx, size, type,
  11823. fragOffset, fragSz, ssl->heap);
  11824. }
  11825. *inOutIdx += fragSz;
  11826. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11827. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  11828. word32 digestSz = MacSize(ssl);
  11829. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11830. return BUFFER_E;
  11831. *inOutIdx += digestSz;
  11832. }
  11833. else
  11834. #endif
  11835. {
  11836. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  11837. WOLFSSL_ERROR(BUFFER_E);
  11838. return BUFFER_E;
  11839. }
  11840. }
  11841. *inOutIdx += ssl->keys.padSz;
  11842. ret = 0;
  11843. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  11844. /* If we receive an out of order last flight msg then retransmit */
  11845. if (type == server_hello_done || type == finished) {
  11846. ret = DtlsMsgPoolSend(ssl, 0);
  11847. }
  11848. #endif
  11849. }
  11850. else {
  11851. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  11852. if (ret == 0) {
  11853. ssl->keys.dtls_expected_peer_handshake_number =
  11854. ssl->keys.dtls_peer_handshake_number + 1;
  11855. }
  11856. }
  11857. }
  11858. else if (ssl->keys.dtls_peer_handshake_number <
  11859. ssl->keys.dtls_expected_peer_handshake_number ||
  11860. /* ignore all handshake messages if we are done with the
  11861. * handshake */
  11862. (ssl->keys.dtls_peer_handshake_number >
  11863. ssl->keys.dtls_expected_peer_handshake_number &&
  11864. ssl->options.handShakeState == HANDSHAKE_DONE) ||
  11865. ignoreFinished) {
  11866. /* Already saw this message and processed it. It can be ignored. */
  11867. WOLFSSL_MSG("Already saw this message and processed it");
  11868. *inOutIdx += fragSz;
  11869. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11870. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  11871. word32 digestSz = MacSize(ssl);
  11872. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11873. return BUFFER_E;
  11874. *inOutIdx += digestSz;
  11875. }
  11876. else
  11877. #endif
  11878. {
  11879. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  11880. WOLFSSL_ERROR(BUFFER_E);
  11881. return BUFFER_E;
  11882. }
  11883. }
  11884. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  11885. if (IsDtlsNotSctpMode(ssl) &&
  11886. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  11887. ret = DtlsMsgPoolSend(ssl, 0);
  11888. }
  11889. #endif
  11890. *inOutIdx += ssl->keys.padSz;
  11891. }
  11892. else if (fragSz < size) {
  11893. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  11894. * be pointing to the message with this fragment in it. Check it to see
  11895. * if it is completed. */
  11896. WOLFSSL_MSG("Branch is in order, but fragmented");
  11897. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  11898. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  11899. ssl->keys.dtls_peer_handshake_number,
  11900. input + *inOutIdx, size, type,
  11901. fragOffset, fragSz, ssl->heap);
  11902. }
  11903. *inOutIdx += fragSz;
  11904. *inOutIdx += ssl->keys.padSz;
  11905. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11906. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  11907. word32 digestSz = MacSize(ssl);
  11908. if (*inOutIdx + digestSz > totalSz)
  11909. return BUFFER_E;
  11910. *inOutIdx += digestSz;
  11911. }
  11912. #endif
  11913. ret = 0;
  11914. if (ssl->dtls_rx_msg_list != NULL &&
  11915. ssl->dtls_rx_msg_list->fragSz >= ssl->dtls_rx_msg_list->sz)
  11916. ret = DtlsMsgDrain(ssl);
  11917. }
  11918. else {
  11919. /* This branch is in order next, and a complete message. On success
  11920. * clean the tx list. */
  11921. #ifdef WOLFSSL_ASYNC_CRYPT
  11922. word32 idx = *inOutIdx;
  11923. #endif
  11924. WOLFSSL_MSG("Branch is in order and a complete message");
  11925. #ifdef WOLFSSL_ASYNC_CRYPT
  11926. /* In async mode always store the message and process it with
  11927. * DtlsMsgDrain because in case of a WC_PENDING_E it will be
  11928. * easier this way. */
  11929. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  11930. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  11931. ssl->keys.dtls_peer_handshake_number,
  11932. input + idx, size, type,
  11933. fragOffset, fragSz, ssl->heap);
  11934. }
  11935. if (idx + fragSz + ssl->keys.padSz > totalSz)
  11936. return BUFFER_E;
  11937. *inOutIdx = idx + fragSz + ssl->keys.padSz;
  11938. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11939. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  11940. word32 digestSz = MacSize(ssl);
  11941. if (*inOutIdx + digestSz > totalSz)
  11942. return BUFFER_E;
  11943. *inOutIdx += digestSz;
  11944. }
  11945. #endif
  11946. ret = DtlsMsgDrain(ssl);
  11947. #else
  11948. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  11949. if (ret == 0) {
  11950. DtlsTxMsgListClean(ssl);
  11951. if (type != finished)
  11952. ssl->keys.dtls_expected_peer_handshake_number++;
  11953. if (ssl->dtls_rx_msg_list != NULL) {
  11954. ret = DtlsMsgDrain(ssl);
  11955. }
  11956. }
  11957. #endif
  11958. }
  11959. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  11960. return ret;
  11961. }
  11962. #endif
  11963. #ifndef WOLFSSL_NO_TLS12
  11964. #ifdef HAVE_AEAD
  11965. #if (!defined(NO_PUBLIC_GCM_SET_IV) && \
  11966. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  11967. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
  11968. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
  11969. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  11970. {
  11971. int i;
  11972. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  11973. if (++ssl->keys.aead_exp_IV[i]) return;
  11974. }
  11975. }
  11976. #endif
  11977. #if defined(HAVE_POLY1305) && defined(HAVE_CHACHA)
  11978. /* Used for the older version of creating AEAD tags with Poly1305 */
  11979. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  11980. byte* cipher, word16 sz, byte* tag)
  11981. {
  11982. int ret = 0;
  11983. int msglen = (sz - ssl->specs.aead_mac_size);
  11984. word32 keySz = 32;
  11985. byte padding[8]; /* used to temporarily store lengths */
  11986. #ifdef CHACHA_AEAD_TEST
  11987. printf("Using old version of poly1305 input.\n");
  11988. #endif
  11989. if (msglen < 0)
  11990. return INPUT_CASE_ERROR;
  11991. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  11992. return ret;
  11993. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  11994. AEAD_AUTH_DATA_SZ)) != 0)
  11995. return ret;
  11996. /* length of additional input plus padding */
  11997. XMEMSET(padding, 0, sizeof(padding));
  11998. padding[0] = AEAD_AUTH_DATA_SZ;
  11999. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  12000. sizeof(padding))) != 0)
  12001. return ret;
  12002. /* add cipher info and then its length */
  12003. XMEMSET(padding, 0, sizeof(padding));
  12004. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  12005. return ret;
  12006. /* 32 bit size of cipher to 64 bit endian */
  12007. padding[0] = msglen & 0xff;
  12008. padding[1] = (msglen >> 8) & 0xff;
  12009. padding[2] = ((word32)msglen >> 16) & 0xff;
  12010. padding[3] = ((word32)msglen >> 24) & 0xff;
  12011. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  12012. != 0)
  12013. return ret;
  12014. /* generate tag */
  12015. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  12016. return ret;
  12017. return ret;
  12018. }
  12019. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  12020. * the implementation follows an older draft for creating the nonce and MAC.
  12021. * The flag oldPoly gets set automatically depending on what cipher suite was
  12022. * negotiated in the handshake. This is able to be done because the IDs for the
  12023. * cipher suites was updated in RFC7905 giving unique values for the older
  12024. * draft in comparison to the more recent RFC.
  12025. *
  12026. * ssl WOLFSSL structure to get cipher and TLS state from
  12027. * out output buffer to hold encrypted data
  12028. * input data to encrypt
  12029. * sz size of input
  12030. *
  12031. * Return 0 on success negative values in error case
  12032. */
  12033. static int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  12034. word16 sz)
  12035. {
  12036. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  12037. int ret = 0;
  12038. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  12039. byte tag[POLY1305_AUTH_SZ];
  12040. byte add[AEAD_AUTH_DATA_SZ];
  12041. byte nonce[CHACHA20_NONCE_SZ];
  12042. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  12043. #ifdef CHACHA_AEAD_TEST
  12044. int i;
  12045. #endif
  12046. XMEMSET(tag, 0, sizeof(tag));
  12047. XMEMSET(nonce, 0, sizeof(nonce));
  12048. XMEMSET(poly, 0, sizeof(poly));
  12049. XMEMSET(add, 0, sizeof(add));
  12050. /* opaque SEQ number stored for AD */
  12051. WriteSEQ(ssl, CUR_ORDER, add);
  12052. if (ssl->options.oldPoly != 0) {
  12053. /* get nonce. SEQ should not be incremented again here */
  12054. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  12055. }
  12056. /* Store the type, version. Unfortunately, they are in
  12057. * the input buffer ahead of the plaintext. */
  12058. #ifdef WOLFSSL_DTLS
  12059. if (ssl->options.dtls) {
  12060. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  12061. }
  12062. #endif
  12063. /* add TLS message size to additional data */
  12064. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  12065. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  12066. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  12067. #ifdef CHACHA_AEAD_TEST
  12068. printf("Encrypt Additional : ");
  12069. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  12070. printf("%02x", add[i]);
  12071. }
  12072. printf("\n\n");
  12073. printf("input before encryption :\n");
  12074. for (i = 0; i < sz; i++) {
  12075. printf("%02x", input[i]);
  12076. if ((i + 1) % 16 == 0)
  12077. printf("\n");
  12078. }
  12079. printf("\n");
  12080. #endif
  12081. if (ssl->options.oldPoly == 0) {
  12082. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  12083. * record sequence number XORed with client_write_IV/server_write_IV */
  12084. XMEMCPY(nonce, ssl->keys.aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  12085. nonce[4] ^= add[0];
  12086. nonce[5] ^= add[1];
  12087. nonce[6] ^= add[2];
  12088. nonce[7] ^= add[3];
  12089. nonce[8] ^= add[4];
  12090. nonce[9] ^= add[5];
  12091. nonce[10] ^= add[6];
  12092. nonce[11] ^= add[7];
  12093. }
  12094. /* set the nonce for chacha and get poly1305 key */
  12095. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  12096. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12097. return ret;
  12098. }
  12099. /* create Poly1305 key using chacha20 keystream */
  12100. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  12101. poly, sizeof(poly))) != 0) {
  12102. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12103. return ret;
  12104. }
  12105. /* set the counter after getting poly1305 key */
  12106. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
  12107. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12108. return ret;
  12109. }
  12110. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  12111. /* encrypt the plain text */
  12112. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  12113. input, msgLen)) != 0) {
  12114. ForceZero(poly, sizeof(poly));
  12115. return ret;
  12116. }
  12117. /* get the poly1305 tag using either old padding scheme or more recent */
  12118. if (ssl->options.oldPoly != 0) {
  12119. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  12120. poly, sz, tag)) != 0) {
  12121. ForceZero(poly, sizeof(poly));
  12122. return ret;
  12123. }
  12124. }
  12125. else {
  12126. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  12127. sizeof(poly))) != 0) {
  12128. ForceZero(poly, sizeof(poly));
  12129. return ret;
  12130. }
  12131. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  12132. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  12133. ForceZero(poly, sizeof(poly));
  12134. return ret;
  12135. }
  12136. }
  12137. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  12138. /* append tag to ciphertext */
  12139. XMEMCPY(out + msgLen, tag, sizeof(tag));
  12140. AeadIncrementExpIV(ssl);
  12141. #ifdef CHACHA_AEAD_TEST
  12142. printf("mac tag :\n");
  12143. for (i = 0; i < 16; i++) {
  12144. printf("%02x", tag[i]);
  12145. if ((i + 1) % 16 == 0)
  12146. printf("\n");
  12147. }
  12148. printf("\n\noutput after encrypt :\n");
  12149. for (i = 0; i < sz; i++) {
  12150. printf("%02x", out[i]);
  12151. if ((i + 1) % 16 == 0)
  12152. printf("\n");
  12153. }
  12154. printf("\n");
  12155. #endif
  12156. return ret;
  12157. }
  12158. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  12159. * the implementation follows an older draft for creating the nonce and MAC.
  12160. * The flag oldPoly gets set automatically depending on what cipher suite was
  12161. * negotiated in the handshake. This is able to be done because the IDs for the
  12162. * cipher suites was updated in RFC7905 giving unique values for the older
  12163. * draft in comparison to the more recent RFC.
  12164. *
  12165. * ssl WOLFSSL structure to get cipher and TLS state from
  12166. * plain output buffer to hold decrypted data
  12167. * input data to decrypt
  12168. * sz size of input
  12169. *
  12170. * Return 0 on success negative values in error case
  12171. */
  12172. static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  12173. word16 sz)
  12174. {
  12175. byte add[AEAD_AUTH_DATA_SZ];
  12176. byte nonce[CHACHA20_NONCE_SZ];
  12177. byte tag[POLY1305_AUTH_SZ];
  12178. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  12179. int ret = 0;
  12180. int msgLen = (sz - ssl->specs.aead_mac_size);
  12181. #ifdef CHACHA_AEAD_TEST
  12182. int i;
  12183. printf("input before decrypt :\n");
  12184. for (i = 0; i < sz; i++) {
  12185. printf("%02x", input[i]);
  12186. if ((i + 1) % 16 == 0)
  12187. printf("\n");
  12188. }
  12189. printf("\n");
  12190. #endif
  12191. XMEMSET(tag, 0, sizeof(tag));
  12192. XMEMSET(poly, 0, sizeof(poly));
  12193. XMEMSET(nonce, 0, sizeof(nonce));
  12194. XMEMSET(add, 0, sizeof(add));
  12195. /* sequence number field is 64-bits */
  12196. WriteSEQ(ssl, PEER_ORDER, add);
  12197. if (ssl->options.oldPoly != 0) {
  12198. /* get nonce, SEQ should not be incremented again here */
  12199. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  12200. }
  12201. /* get AD info */
  12202. /* Store the type, version. */
  12203. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  12204. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  12205. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  12206. /* add TLS message size to additional data */
  12207. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  12208. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  12209. #ifdef CHACHA_AEAD_TEST
  12210. printf("Decrypt Additional : ");
  12211. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  12212. printf("%02x", add[i]);
  12213. }
  12214. printf("\n\n");
  12215. #endif
  12216. if (ssl->options.oldPoly == 0) {
  12217. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  12218. * record sequence number XORed with client_write_IV/server_write_IV */
  12219. XMEMCPY(nonce, ssl->keys.aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  12220. nonce[4] ^= add[0];
  12221. nonce[5] ^= add[1];
  12222. nonce[6] ^= add[2];
  12223. nonce[7] ^= add[3];
  12224. nonce[8] ^= add[4];
  12225. nonce[9] ^= add[5];
  12226. nonce[10] ^= add[6];
  12227. nonce[11] ^= add[7];
  12228. }
  12229. /* set nonce and get poly1305 key */
  12230. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  12231. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12232. return ret;
  12233. }
  12234. /* use chacha20 keystream to get poly1305 key for tag */
  12235. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  12236. poly, sizeof(poly))) != 0) {
  12237. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12238. return ret;
  12239. }
  12240. /* set counter after getting poly1305 key */
  12241. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
  12242. ForceZero(nonce, CHACHA20_NONCE_SZ);
  12243. return ret;
  12244. }
  12245. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  12246. /* get the tag using Poly1305 */
  12247. if (ssl->options.oldPoly != 0) {
  12248. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  12249. ForceZero(poly, sizeof(poly));
  12250. return ret;
  12251. }
  12252. }
  12253. else {
  12254. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  12255. sizeof(poly))) != 0) {
  12256. ForceZero(poly, sizeof(poly));
  12257. return ret;
  12258. }
  12259. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  12260. sizeof(add), (byte*)input, msgLen, tag, sizeof(tag))) != 0) {
  12261. ForceZero(poly, sizeof(poly));
  12262. return ret;
  12263. }
  12264. }
  12265. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  12266. /* check tag sent along with packet */
  12267. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  12268. WOLFSSL_MSG("MAC did not match");
  12269. if (!ssl->options.dtls)
  12270. SendAlert(ssl, alert_fatal, bad_record_mac);
  12271. return VERIFY_MAC_ERROR;
  12272. }
  12273. /* if the tag was good decrypt message */
  12274. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  12275. input, msgLen)) != 0)
  12276. return ret;
  12277. #ifdef CHACHA_AEAD_TEST
  12278. printf("plain after decrypt :\n");
  12279. for (i = 0; i < sz; i++) {
  12280. printf("%02x", plain[i]);
  12281. if ((i + 1) % 16 == 0)
  12282. printf("\n");
  12283. }
  12284. printf("\n");
  12285. #endif
  12286. return ret;
  12287. }
  12288. #endif /* HAVE_CHACHA && HAVE_POLY1305 */
  12289. #endif /* HAVE_AEAD */
  12290. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12291. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  12292. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  12293. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  12294. /* The following type is used to share code between AES-GCM and AES-CCM. */
  12295. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  12296. const byte* in, word32 sz,
  12297. byte* iv, word32 ivSz,
  12298. byte* authTag, word32 authTagSz,
  12299. const byte* authIn, word32 authInSz);
  12300. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  12301. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  12302. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  12303. #else
  12304. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  12305. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  12306. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  12307. #endif
  12308. #endif
  12309. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  12310. word16 sz, int asyncOkay)
  12311. {
  12312. int ret = 0;
  12313. #ifdef WOLFSSL_ASYNC_CRYPT
  12314. WC_ASYNC_DEV* asyncDev = NULL;
  12315. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  12316. #else
  12317. (void)asyncOkay;
  12318. #endif
  12319. (void)out;
  12320. (void)input;
  12321. (void)sz;
  12322. switch (ssl->specs.bulk_cipher_algorithm) {
  12323. #ifdef BUILD_ARC4
  12324. case wolfssl_rc4:
  12325. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  12326. break;
  12327. #endif
  12328. #ifdef BUILD_DES3
  12329. case wolfssl_triple_des:
  12330. #ifdef WOLFSSL_ASYNC_CRYPT
  12331. /* initialize event */
  12332. asyncDev = &ssl->encrypt.des3->asyncDev;
  12333. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  12334. if (ret != 0)
  12335. break;
  12336. #endif
  12337. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  12338. #ifdef WOLFSSL_ASYNC_CRYPT
  12339. if (ret == WC_PENDING_E && asyncOkay) {
  12340. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  12341. }
  12342. #endif
  12343. break;
  12344. #endif
  12345. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  12346. case wolfssl_aes:
  12347. #ifdef WOLFSSL_ASYNC_CRYPT
  12348. /* initialize event */
  12349. asyncDev = &ssl->encrypt.aes->asyncDev;
  12350. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  12351. if (ret != 0)
  12352. break;
  12353. #endif
  12354. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  12355. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  12356. if (tsip_useable(ssl)) {
  12357. ret = wc_tsip_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  12358. } else
  12359. #endif
  12360. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  12361. #ifdef WOLFSSL_ASYNC_CRYPT
  12362. if (ret == WC_PENDING_E && asyncOkay) {
  12363. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  12364. }
  12365. #endif
  12366. break;
  12367. #endif
  12368. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12369. case wolfssl_aes_gcm:
  12370. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  12371. {
  12372. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  12373. const byte* additionalSrc;
  12374. #ifdef WOLFSSL_ASYNC_CRYPT
  12375. /* initialize event */
  12376. asyncDev = &ssl->encrypt.aes->asyncDev;
  12377. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  12378. if (ret != 0)
  12379. break;
  12380. #endif
  12381. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  12382. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  12383. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  12384. #elif defined(BUILD_AESGCM)
  12385. aes_auth_fn = AES_GCM_ENCRYPT;
  12386. #else
  12387. aes_auth_fn = AES_CCM_ENCRYPT;
  12388. #endif
  12389. additionalSrc = input - 5;
  12390. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  12391. /* sequence number field is 64-bits */
  12392. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  12393. /* Store the type, version. Unfortunately, they are in
  12394. * the input buffer ahead of the plaintext. */
  12395. #ifdef WOLFSSL_DTLS
  12396. if (ssl->options.dtls) {
  12397. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  12398. }
  12399. #endif
  12400. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  12401. additionalSrc, 3);
  12402. /* Store the length of the plain text minus the explicit
  12403. * IV length minus the authentication tag size. */
  12404. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  12405. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  12406. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  12407. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  12408. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  12409. XMEMCPY(ssl->encrypt.nonce,
  12410. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  12411. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  12412. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  12413. #endif
  12414. ret = aes_auth_fn(ssl->encrypt.aes,
  12415. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  12416. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  12417. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  12418. out + sz - ssl->specs.aead_mac_size,
  12419. ssl->specs.aead_mac_size,
  12420. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  12421. #ifdef WOLFSSL_ASYNC_CRYPT
  12422. if (ret == WC_PENDING_E && asyncOkay) {
  12423. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  12424. }
  12425. #endif
  12426. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  12427. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  12428. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  12429. XMEMCPY(out,
  12430. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  12431. #endif
  12432. }
  12433. break;
  12434. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12435. #ifdef HAVE_CAMELLIA
  12436. case wolfssl_camellia:
  12437. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  12438. break;
  12439. #endif
  12440. #ifdef HAVE_HC128
  12441. case wolfssl_hc128:
  12442. ret = wc_Hc128_Process(ssl->encrypt.hc128, out, input, sz);
  12443. break;
  12444. #endif
  12445. #ifdef BUILD_RABBIT
  12446. case wolfssl_rabbit:
  12447. ret = wc_RabbitProcess(ssl->encrypt.rabbit, out, input, sz);
  12448. break;
  12449. #endif
  12450. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  12451. case wolfssl_chacha:
  12452. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  12453. break;
  12454. #endif
  12455. #ifdef HAVE_NULL_CIPHER
  12456. case wolfssl_cipher_null:
  12457. if (input != out) {
  12458. XMEMMOVE(out, input, sz);
  12459. }
  12460. break;
  12461. #endif
  12462. #ifdef HAVE_IDEA
  12463. case wolfssl_idea:
  12464. ret = wc_IdeaCbcEncrypt(ssl->encrypt.idea, out, input, sz);
  12465. break;
  12466. #endif
  12467. default:
  12468. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  12469. ret = ENCRYPT_ERROR;
  12470. }
  12471. #ifdef WOLFSSL_ASYNC_CRYPT
  12472. /* if async is not okay, then block */
  12473. if (ret == WC_PENDING_E && !asyncOkay) {
  12474. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  12475. }
  12476. #endif
  12477. return ret;
  12478. }
  12479. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz,
  12480. int asyncOkay)
  12481. {
  12482. int ret = 0;
  12483. #ifdef WOLFSSL_ASYNC_CRYPT
  12484. if (ssl->error == WC_PENDING_E) {
  12485. ssl->error = 0; /* clear async */
  12486. }
  12487. #endif
  12488. switch (ssl->encrypt.state) {
  12489. case CIPHER_STATE_BEGIN:
  12490. {
  12491. if (ssl->encrypt.setup == 0) {
  12492. WOLFSSL_MSG("Encrypt ciphers not setup");
  12493. return ENCRYPT_ERROR;
  12494. }
  12495. #ifdef HAVE_FUZZER
  12496. if (ssl->fuzzerCb)
  12497. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  12498. #endif
  12499. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12500. /* make sure AES GCM/CCM memory is allocated */
  12501. /* free for these happens in FreeCiphers */
  12502. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  12503. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  12504. /* make sure auth iv and auth are allocated */
  12505. if (ssl->encrypt.additional == NULL)
  12506. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  12507. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  12508. if (ssl->encrypt.nonce == NULL)
  12509. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  12510. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  12511. if (ssl->encrypt.additional == NULL ||
  12512. ssl->encrypt.nonce == NULL) {
  12513. return MEMORY_E;
  12514. }
  12515. }
  12516. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12517. /* Advance state and proceed */
  12518. ssl->encrypt.state = CIPHER_STATE_DO;
  12519. }
  12520. FALL_THROUGH;
  12521. case CIPHER_STATE_DO:
  12522. {
  12523. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  12524. /* Advance state */
  12525. ssl->encrypt.state = CIPHER_STATE_END;
  12526. #ifdef WOLFSSL_ASYNC_CRYPT
  12527. /* If pending, then leave and return will resume below */
  12528. if (ret == WC_PENDING_E) {
  12529. return ret;
  12530. }
  12531. #endif
  12532. }
  12533. FALL_THROUGH;
  12534. case CIPHER_STATE_END:
  12535. {
  12536. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12537. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  12538. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  12539. {
  12540. /* finalize authentication cipher */
  12541. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  12542. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  12543. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  12544. AeadIncrementExpIV(ssl);
  12545. #endif
  12546. if (ssl->encrypt.nonce)
  12547. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  12548. }
  12549. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12550. break;
  12551. }
  12552. }
  12553. /* Reset state */
  12554. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  12555. return ret;
  12556. }
  12557. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  12558. word16 sz)
  12559. {
  12560. int ret = 0;
  12561. (void)plain;
  12562. (void)input;
  12563. (void)sz;
  12564. switch (ssl->specs.bulk_cipher_algorithm)
  12565. {
  12566. #ifdef BUILD_ARC4
  12567. case wolfssl_rc4:
  12568. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  12569. break;
  12570. #endif
  12571. #ifdef BUILD_DES3
  12572. case wolfssl_triple_des:
  12573. #ifdef WOLFSSL_ASYNC_CRYPT
  12574. /* initialize event */
  12575. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  12576. WC_ASYNC_FLAG_CALL_AGAIN);
  12577. if (ret != 0)
  12578. break;
  12579. #endif
  12580. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  12581. #ifdef WOLFSSL_ASYNC_CRYPT
  12582. if (ret == WC_PENDING_E) {
  12583. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  12584. }
  12585. #endif
  12586. break;
  12587. #endif
  12588. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  12589. case wolfssl_aes:
  12590. #ifdef WOLFSSL_ASYNC_CRYPT
  12591. /* initialize event */
  12592. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  12593. WC_ASYNC_FLAG_CALL_AGAIN);
  12594. if (ret != 0)
  12595. break;
  12596. #endif
  12597. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  12598. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  12599. if (tsip_useable(ssl)) {
  12600. ret = wc_tsip_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  12601. } else
  12602. #endif
  12603. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  12604. #ifdef WOLFSSL_ASYNC_CRYPT
  12605. if (ret == WC_PENDING_E) {
  12606. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  12607. }
  12608. #endif
  12609. break;
  12610. #endif
  12611. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12612. case wolfssl_aes_gcm:
  12613. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  12614. {
  12615. wc_AesAuthDecryptFunc aes_auth_fn;
  12616. #ifdef WOLFSSL_ASYNC_CRYPT
  12617. /* initialize event */
  12618. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  12619. WC_ASYNC_FLAG_CALL_AGAIN);
  12620. if (ret != 0)
  12621. break;
  12622. #endif
  12623. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  12624. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  12625. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  12626. #elif defined(BUILD_AESGCM)
  12627. aes_auth_fn = wc_AesGcmDecrypt;
  12628. #else
  12629. aes_auth_fn = wc_AesCcmDecrypt;
  12630. #endif
  12631. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  12632. /* sequence number field is 64-bits */
  12633. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  12634. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  12635. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  12636. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  12637. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  12638. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  12639. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  12640. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  12641. XMEMCPY(ssl->decrypt.nonce,
  12642. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  12643. AESGCM_IMP_IV_SZ);
  12644. else
  12645. #endif
  12646. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  12647. AESGCM_IMP_IV_SZ);
  12648. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  12649. AESGCM_EXP_IV_SZ);
  12650. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  12651. plain + AESGCM_EXP_IV_SZ,
  12652. input + AESGCM_EXP_IV_SZ,
  12653. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  12654. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  12655. input + sz - ssl->specs.aead_mac_size,
  12656. ssl->specs.aead_mac_size,
  12657. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  12658. #ifdef WOLFSSL_ASYNC_CRYPT
  12659. if (ret == WC_PENDING_E) {
  12660. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  12661. }
  12662. #endif
  12663. }
  12664. }
  12665. break;
  12666. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12667. #ifdef HAVE_CAMELLIA
  12668. case wolfssl_camellia:
  12669. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  12670. break;
  12671. #endif
  12672. #ifdef HAVE_HC128
  12673. case wolfssl_hc128:
  12674. ret = wc_Hc128_Process(ssl->decrypt.hc128, plain, input, sz);
  12675. break;
  12676. #endif
  12677. #ifdef BUILD_RABBIT
  12678. case wolfssl_rabbit:
  12679. ret = wc_RabbitProcess(ssl->decrypt.rabbit, plain, input, sz);
  12680. break;
  12681. #endif
  12682. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  12683. case wolfssl_chacha:
  12684. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  12685. break;
  12686. #endif
  12687. #ifdef HAVE_NULL_CIPHER
  12688. case wolfssl_cipher_null:
  12689. if (input != plain) {
  12690. XMEMMOVE(plain, input, sz);
  12691. }
  12692. break;
  12693. #endif
  12694. #ifdef HAVE_IDEA
  12695. case wolfssl_idea:
  12696. ret = wc_IdeaCbcDecrypt(ssl->decrypt.idea, plain, input, sz);
  12697. break;
  12698. #endif
  12699. default:
  12700. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  12701. ret = DECRYPT_ERROR;
  12702. }
  12703. return ret;
  12704. }
  12705. static WC_INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  12706. word16 sz)
  12707. {
  12708. int ret = 0;
  12709. #ifdef WOLFSSL_ASYNC_CRYPT
  12710. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  12711. if (ret != WC_NOT_PENDING_E) {
  12712. /* check for still pending */
  12713. if (ret == WC_PENDING_E)
  12714. return ret;
  12715. ssl->error = 0; /* clear async */
  12716. /* let failures through so CIPHER_STATE_END logic is run */
  12717. }
  12718. else
  12719. #endif
  12720. {
  12721. /* Reset state */
  12722. ret = 0;
  12723. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  12724. }
  12725. switch (ssl->decrypt.state) {
  12726. case CIPHER_STATE_BEGIN:
  12727. {
  12728. if (ssl->decrypt.setup == 0) {
  12729. WOLFSSL_MSG("Decrypt ciphers not setup");
  12730. return DECRYPT_ERROR;
  12731. }
  12732. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12733. /* make sure AES GCM/CCM memory is allocated */
  12734. /* free for these happens in FreeCiphers */
  12735. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  12736. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  12737. /* make sure auth iv and auth are allocated */
  12738. if (ssl->decrypt.additional == NULL)
  12739. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  12740. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  12741. if (ssl->decrypt.nonce == NULL)
  12742. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  12743. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  12744. if (ssl->decrypt.additional == NULL ||
  12745. ssl->decrypt.nonce == NULL) {
  12746. return MEMORY_E;
  12747. }
  12748. }
  12749. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12750. /* Advance state and proceed */
  12751. ssl->decrypt.state = CIPHER_STATE_DO;
  12752. }
  12753. FALL_THROUGH;
  12754. case CIPHER_STATE_DO:
  12755. {
  12756. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  12757. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  12758. /* For epochs >1 the current cipher parameters are located in
  12759. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  12760. * parameters and for epoch 1 use ssl->keys */
  12761. if (ssl->keys.curEpoch ==
  12762. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  12763. if (ssl->decrypt.src != SCR) {
  12764. ssl->secure_renegotiation->cache_status =
  12765. SCR_CACHE_NEEDED;
  12766. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  12767. break;
  12768. }
  12769. }
  12770. else {
  12771. if (ssl->decrypt.src != KEYS) {
  12772. ssl->secure_renegotiation->cache_status =
  12773. SCR_CACHE_NULL;
  12774. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  12775. break;
  12776. }
  12777. }
  12778. }
  12779. #endif
  12780. ret = DecryptDo(ssl, plain, input, sz);
  12781. /* Advance state */
  12782. ssl->decrypt.state = CIPHER_STATE_END;
  12783. #ifdef WOLFSSL_ASYNC_CRYPT
  12784. /* If pending, leave and return below */
  12785. if (ret == WC_PENDING_E) {
  12786. return ret;
  12787. }
  12788. #endif
  12789. }
  12790. FALL_THROUGH;
  12791. case CIPHER_STATE_END:
  12792. {
  12793. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12794. /* make sure AES GCM/CCM nonce is cleared */
  12795. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  12796. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  12797. if (ssl->decrypt.nonce)
  12798. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  12799. if (ret < 0)
  12800. ret = VERIFY_MAC_ERROR;
  12801. }
  12802. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12803. break;
  12804. }
  12805. }
  12806. /* Reset state */
  12807. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  12808. /* handle mac error case */
  12809. if (ret == VERIFY_MAC_ERROR) {
  12810. if (!ssl->options.dtls)
  12811. SendAlert(ssl, alert_fatal, bad_record_mac);
  12812. #ifdef WOLFSSL_DTLS_DROP_STATS
  12813. ssl->macDropCount++;
  12814. #endif /* WOLFSSL_DTLS_DROP_STATS */
  12815. }
  12816. return ret;
  12817. }
  12818. #endif /* !WOLFSSL_NO_TLS12 */
  12819. /* Check conditions for a cipher to have an explicit IV.
  12820. *
  12821. * ssl The SSL/TLS object.
  12822. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  12823. */
  12824. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  12825. {
  12826. #ifdef WOLFSSL_TLS13
  12827. if (ssl->options.tls1_3)
  12828. return 0;
  12829. #endif
  12830. return (ssl->specs.cipher_type == aead) &&
  12831. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  12832. }
  12833. /* check cipher text size for sanity */
  12834. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  12835. {
  12836. #ifdef HAVE_TRUNCATED_HMAC
  12837. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  12838. : ssl->specs.hash_size;
  12839. #else
  12840. word32 minLength = ssl->specs.hash_size; /* covers stream */
  12841. #endif
  12842. #ifndef WOLFSSL_AEAD_ONLY
  12843. if (ssl->specs.cipher_type == block) {
  12844. #ifdef HAVE_ENCRYPT_THEN_MAC
  12845. if (ssl->options.startedETMRead) {
  12846. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  12847. WOLFSSL_MSG("Block ciphertext not block size");
  12848. return SANITY_CIPHER_E;
  12849. }
  12850. }
  12851. else
  12852. #endif
  12853. if (encryptSz % ssl->specs.block_size) {
  12854. WOLFSSL_MSG("Block ciphertext not block size");
  12855. return SANITY_CIPHER_E;
  12856. }
  12857. minLength++; /* pad byte */
  12858. if (ssl->specs.block_size > minLength)
  12859. minLength = ssl->specs.block_size;
  12860. if (ssl->options.tls1_1)
  12861. minLength += ssl->specs.block_size; /* explicit IV */
  12862. }
  12863. else
  12864. #endif
  12865. if (ssl->specs.cipher_type == aead) {
  12866. minLength = ssl->specs.aead_mac_size; /* authTag size */
  12867. if (CipherHasExpIV(ssl))
  12868. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  12869. }
  12870. if (encryptSz < minLength) {
  12871. WOLFSSL_MSG("Ciphertext not minimum size");
  12872. return SANITY_CIPHER_E;
  12873. }
  12874. return 0;
  12875. }
  12876. #ifndef WOLFSSL_AEAD_ONLY
  12877. /* check all length bytes for the pad value, return 0 on success */
  12878. static int PadCheck(const byte* a, byte pad, int length)
  12879. {
  12880. int i;
  12881. int compareSum = 0;
  12882. for (i = 0; i < length; i++) {
  12883. compareSum |= a[i] ^ pad;
  12884. }
  12885. return compareSum;
  12886. }
  12887. /* Mask the padding bytes with the expected values.
  12888. * Constant time implementation - does maximum pad size possible.
  12889. *
  12890. * data Message data.
  12891. * sz Size of the message including MAC and padding and padding length.
  12892. * macSz Size of the MAC.
  12893. * returns 0 on success, otherwise failure.
  12894. */
  12895. static byte MaskPadding(const byte* data, int sz, int macSz)
  12896. {
  12897. int i;
  12898. int checkSz = sz - 1;
  12899. byte paddingSz = data[sz - 1];
  12900. byte mask;
  12901. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  12902. if (checkSz > TLS_MAX_PAD_SZ)
  12903. checkSz = TLS_MAX_PAD_SZ;
  12904. for (i = 0; i < checkSz; i++) {
  12905. mask = ctMaskLTE(i, paddingSz);
  12906. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  12907. }
  12908. return good;
  12909. }
  12910. /* Mask the MAC in the message with the MAC calculated.
  12911. * Constant time implementation - starts looking for MAC where maximum padding
  12912. * size has it.
  12913. *
  12914. * data Message data.
  12915. * sz Size of the message including MAC and padding and padding length.
  12916. * macSz Size of the MAC data.
  12917. * expMac Expected MAC value.
  12918. * returns 0 on success, otherwise failure.
  12919. */
  12920. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  12921. {
  12922. int i, j;
  12923. unsigned char mac[WC_MAX_DIGEST_SIZE];
  12924. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  12925. int macEnd = sz - 1 - data[sz - 1];
  12926. int macStart = macEnd - macSz;
  12927. int r = 0;
  12928. unsigned char started, notEnded;
  12929. unsigned char good = 0;
  12930. scanStart &= ctMaskIntGTE(scanStart, 0);
  12931. macStart &= ctMaskIntGTE(macStart, 0);
  12932. /* Div on Intel has different speeds depending on value.
  12933. * Use a bitwise AND or mod a specific value (converted to mul). */
  12934. if ((macSz & (macSz - 1)) == 0)
  12935. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  12936. #ifndef NO_SHA
  12937. else if (macSz == WC_SHA_DIGEST_SIZE)
  12938. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  12939. #endif
  12940. #ifdef WOLFSSL_SHA384
  12941. else if (macSz == WC_SHA384_DIGEST_SIZE)
  12942. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  12943. #endif
  12944. XMEMSET(mac, 0, macSz);
  12945. for (i = scanStart; i < sz; i += macSz) {
  12946. for (j = 0; j < macSz && j + i < sz; j++) {
  12947. started = ctMaskGTE(i + j, macStart);
  12948. notEnded = ctMaskLT(i + j, macEnd);
  12949. mac[j] |= started & notEnded & data[i + j];
  12950. }
  12951. }
  12952. if ((macSz & (macSz - 1)) == 0) {
  12953. for (i = 0; i < macSz; i++)
  12954. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  12955. }
  12956. #ifndef NO_SHA
  12957. else if (macSz == WC_SHA_DIGEST_SIZE) {
  12958. for (i = 0; i < macSz; i++)
  12959. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  12960. }
  12961. #endif
  12962. #ifdef WOLFSSL_SHA384
  12963. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  12964. for (i = 0; i < macSz; i++)
  12965. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  12966. }
  12967. #endif
  12968. return good;
  12969. }
  12970. /* timing resistant pad/verify check, return 0 on success */
  12971. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  12972. int pLen, int content)
  12973. {
  12974. byte verify[WC_MAX_DIGEST_SIZE];
  12975. byte good;
  12976. int ret = 0;
  12977. good = MaskPadding(input, pLen, macSz);
  12978. /* 4th argument has potential to underflow, ssl->hmac function should
  12979. * either increment the size by (macSz + padLen + 1) before use or check on
  12980. * the size to make sure is valid. */
  12981. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  12982. content, 1, PEER_ORDER);
  12983. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  12984. /* Non-zero on failure. */
  12985. good = (byte)~(word32)good;
  12986. good &= good >> 4;
  12987. good &= good >> 2;
  12988. good &= good >> 1;
  12989. /* Make ret negative on masking failure. */
  12990. ret -= 1 - good;
  12991. /* Treat any failure as verify MAC error. */
  12992. if (ret != 0)
  12993. ret = VERIFY_MAC_ERROR;
  12994. return ret;
  12995. }
  12996. #endif
  12997. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx)
  12998. {
  12999. word32 msgSz = ssl->keys.encryptSz;
  13000. word32 idx = *inOutIdx;
  13001. int dataSz;
  13002. int ivExtra = 0;
  13003. byte* rawData = input + idx; /* keep current for hmac */
  13004. #ifdef HAVE_LIBZ
  13005. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  13006. #endif
  13007. #ifdef WOLFSSL_EARLY_DATA
  13008. if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
  13009. int process = 0;
  13010. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13011. ssl->earlyDataSz += ssl->curSize;
  13012. if ((ssl->earlyData != no_early_data) &&
  13013. (ssl->options.clientState == CLIENT_HELLO_COMPLETE)) {
  13014. process = 1;
  13015. }
  13016. if (!process && (ssl->earlyDataSz <= ssl->options.maxEarlyDataSz)) {
  13017. WOLFSSL_MSG("Ignoring EarlyData!");
  13018. *inOutIdx = ssl->buffers.inputBuffer.length;
  13019. return 0;
  13020. }
  13021. if (ssl->earlyDataSz > ssl->options.maxEarlyDataSz) {
  13022. WOLFSSL_MSG("Too much EarlyData!");
  13023. process = 0;
  13024. }
  13025. }
  13026. if (!process) {
  13027. WOLFSSL_MSG("Received App data before a handshake completed");
  13028. SendAlert(ssl, alert_fatal, unexpected_message);
  13029. return OUT_OF_ORDER_E;
  13030. }
  13031. }
  13032. else
  13033. #endif
  13034. if (ssl->options.handShakeDone == 0) {
  13035. WOLFSSL_MSG("Received App data before a handshake completed");
  13036. SendAlert(ssl, alert_fatal, unexpected_message);
  13037. return OUT_OF_ORDER_E;
  13038. }
  13039. #ifndef WOLFSSL_AEAD_ONLY
  13040. if (ssl->specs.cipher_type == block) {
  13041. if (ssl->options.tls1_1)
  13042. ivExtra = ssl->specs.block_size;
  13043. }
  13044. else
  13045. #endif
  13046. if (ssl->specs.cipher_type == aead) {
  13047. if (CipherHasExpIV(ssl))
  13048. ivExtra = AESGCM_EXP_IV_SZ;
  13049. }
  13050. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  13051. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13052. if (ssl->options.startedETMRead)
  13053. dataSz -= MacSize(ssl);
  13054. #endif
  13055. if (dataSz < 0) {
  13056. WOLFSSL_MSG("App data buffer error, malicious input?");
  13057. SendAlert(ssl, alert_fatal, unexpected_message);
  13058. return BUFFER_ERROR;
  13059. }
  13060. #ifdef WOLFSSL_EARLY_DATA
  13061. if (ssl->earlyData > early_data_ext) {
  13062. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  13063. SendAlert(ssl, alert_fatal, unexpected_message);
  13064. return WOLFSSL_FATAL_ERROR;
  13065. }
  13066. ssl->earlyDataSz += dataSz;
  13067. }
  13068. #endif
  13069. /* read data */
  13070. if (dataSz) {
  13071. int rawSz = dataSz; /* keep raw size for idx adjustment */
  13072. #ifdef HAVE_LIBZ
  13073. if (ssl->options.usingCompression) {
  13074. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  13075. if (dataSz < 0) return dataSz;
  13076. }
  13077. #endif
  13078. idx += rawSz;
  13079. ssl->buffers.clearOutputBuffer.buffer = rawData;
  13080. ssl->buffers.clearOutputBuffer.length = dataSz;
  13081. }
  13082. idx += ssl->keys.padSz;
  13083. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13084. if (ssl->options.startedETMRead)
  13085. idx += MacSize(ssl);
  13086. #endif
  13087. #ifdef HAVE_LIBZ
  13088. /* decompress could be bigger, overwrite after verify */
  13089. if (ssl->options.usingCompression)
  13090. XMEMMOVE(rawData, decomp, dataSz);
  13091. #endif
  13092. *inOutIdx = idx;
  13093. #ifdef HAVE_SECURE_RENEGOTIATION
  13094. if (IsSCR(ssl)) {
  13095. /* Reset the processReply state since
  13096. * we finished processing this message. */
  13097. ssl->options.processReply = doProcessInit;
  13098. /* If we are in a secure renegotiation then APP DATA is treated
  13099. * differently */
  13100. return APP_DATA_READY;
  13101. }
  13102. #endif
  13103. return 0;
  13104. }
  13105. /* process alert, return level */
  13106. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type,
  13107. word32 totalSz)
  13108. {
  13109. byte level;
  13110. byte code;
  13111. word32 dataSz = totalSz - *inOutIdx;
  13112. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13113. if (ssl->hsInfoOn)
  13114. AddPacketName(ssl, "Alert");
  13115. if (ssl->toInfoOn)
  13116. /* add record header back on to info + alert bytes level/code */
  13117. AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx -
  13118. RECORD_HEADER_SZ, RECORD_HEADER_SZ + ALERT_SIZE,
  13119. READ_PROTO, ssl->heap);
  13120. #endif
  13121. if (IsEncryptionOn(ssl, 0)) {
  13122. dataSz -= ssl->keys.padSz;
  13123. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13124. if (ssl->options.startedETMRead)
  13125. dataSz -= MacSize(ssl);
  13126. #endif
  13127. }
  13128. /* make sure can read the message */
  13129. if (dataSz != ALERT_SIZE) {
  13130. #ifdef WOLFSSL_EXTRA_ALERTS
  13131. SendAlert(ssl, alert_fatal, unexpected_message);
  13132. #endif
  13133. return BUFFER_E;
  13134. }
  13135. level = input[(*inOutIdx)++];
  13136. code = input[(*inOutIdx)++];
  13137. ssl->alert_history.last_rx.code = code;
  13138. ssl->alert_history.last_rx.level = level;
  13139. *type = code;
  13140. if (level == alert_fatal) {
  13141. ssl->options.isClosed = 1; /* Don't send close_notify */
  13142. }
  13143. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  13144. WOLFSSL_MSG("Alert count exceeded");
  13145. #ifdef WOLFSSL_EXTRA_ALERTS
  13146. if (level != alert_warning || code != close_notify)
  13147. SendAlert(ssl, alert_fatal, unexpected_message);
  13148. #endif
  13149. return ALERT_COUNT_E;
  13150. }
  13151. WOLFSSL_MSG("Got alert");
  13152. if (*type == close_notify) {
  13153. WOLFSSL_MSG("\tclose notify");
  13154. ssl->options.closeNotify = 1;
  13155. }
  13156. #ifdef WOLFSSL_TLS13
  13157. if (*type == decode_error) {
  13158. WOLFSSL_MSG("\tdecode error");
  13159. }
  13160. if (*type == illegal_parameter) {
  13161. WOLFSSL_MSG("\tillegal parameter");
  13162. }
  13163. #endif
  13164. WOLFSSL_ERROR(*type);
  13165. if (IsEncryptionOn(ssl, 0)) {
  13166. *inOutIdx += ssl->keys.padSz;
  13167. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13168. if (ssl->options.startedETMRead)
  13169. *inOutIdx += MacSize(ssl);
  13170. #endif
  13171. }
  13172. return level;
  13173. }
  13174. static int GetInputData(WOLFSSL *ssl, word32 size)
  13175. {
  13176. int in;
  13177. int inSz;
  13178. int maxLength;
  13179. int usedLength;
  13180. int dtlsExtra = 0;
  13181. /* check max input length */
  13182. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  13183. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  13184. inSz = (int)(size - usedLength); /* from last partial read */
  13185. #ifdef WOLFSSL_DTLS
  13186. if (ssl->options.dtls) {
  13187. if (size < ssl->dtls_expected_rx)
  13188. dtlsExtra = (int)(ssl->dtls_expected_rx - size);
  13189. inSz = ssl->dtls_expected_rx;
  13190. }
  13191. #endif
  13192. /* check that no lengths or size values are negative */
  13193. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  13194. return BUFFER_ERROR;
  13195. }
  13196. if (inSz > maxLength) {
  13197. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  13198. return MEMORY_E;
  13199. }
  13200. /* Put buffer data at start if not there */
  13201. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  13202. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  13203. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  13204. usedLength);
  13205. /* remove processed data */
  13206. ssl->buffers.inputBuffer.idx = 0;
  13207. ssl->buffers.inputBuffer.length = usedLength;
  13208. /* read data from network */
  13209. do {
  13210. in = wolfSSLReceive(ssl,
  13211. ssl->buffers.inputBuffer.buffer +
  13212. ssl->buffers.inputBuffer.length,
  13213. inSz);
  13214. if (in == WANT_READ)
  13215. return WANT_READ;
  13216. if (in < 0)
  13217. return SOCKET_ERROR_E;
  13218. if (in > inSz)
  13219. return RECV_OVERFLOW_E;
  13220. ssl->buffers.inputBuffer.length += in;
  13221. inSz -= in;
  13222. } while (ssl->buffers.inputBuffer.length < size);
  13223. #ifdef WOLFSSL_DEBUG_TLS
  13224. if (ssl->buffers.inputBuffer.idx == 0) {
  13225. WOLFSSL_MSG("Data received");
  13226. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  13227. ssl->buffers.inputBuffer.length);
  13228. }
  13229. #endif
  13230. return 0;
  13231. }
  13232. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13233. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  13234. int content)
  13235. {
  13236. int ret;
  13237. #ifdef HAVE_TRUNCATED_HMAC
  13238. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  13239. : ssl->specs.hash_size;
  13240. #else
  13241. word32 digestSz = ssl->specs.hash_size;
  13242. #endif
  13243. byte verify[WC_MAX_DIGEST_SIZE];
  13244. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  13245. if (msgSz < digestSz) {
  13246. return VERIFY_MAC_ERROR;
  13247. }
  13248. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
  13249. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  13250. if (ret != 0) {
  13251. return VERIFY_MAC_ERROR;
  13252. }
  13253. return 0;
  13254. }
  13255. #endif
  13256. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  13257. int content, word32* padSz)
  13258. {
  13259. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  13260. int ivExtra = 0;
  13261. int ret;
  13262. word32 pad = 0;
  13263. word32 padByte = 0;
  13264. #ifdef HAVE_TRUNCATED_HMAC
  13265. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  13266. : ssl->specs.hash_size;
  13267. #else
  13268. word32 digestSz = ssl->specs.hash_size;
  13269. #endif
  13270. byte verify[WC_MAX_DIGEST_SIZE];
  13271. if (ssl->specs.cipher_type == block) {
  13272. if (ssl->options.tls1_1)
  13273. ivExtra = ssl->specs.block_size;
  13274. pad = *(input + msgSz - ivExtra - 1);
  13275. padByte = 1;
  13276. if (ssl->options.tls) {
  13277. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  13278. content);
  13279. if (ret != 0)
  13280. return ret;
  13281. }
  13282. else { /* sslv3, some implementations have bad padding, but don't
  13283. * allow bad read */
  13284. int badPadLen = 0;
  13285. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  13286. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  13287. (void)dmy;
  13288. if (pad > (msgSz - digestSz - 1)) {
  13289. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  13290. pad = 0; /* no bad read */
  13291. badPadLen = 1;
  13292. }
  13293. PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  13294. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
  13295. pad, content, 1, PEER_ORDER);
  13296. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  13297. digestSz) != 0)
  13298. return VERIFY_MAC_ERROR;
  13299. if (ret != 0 || badPadLen)
  13300. return VERIFY_MAC_ERROR;
  13301. }
  13302. }
  13303. else if (ssl->specs.cipher_type == stream) {
  13304. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
  13305. PEER_ORDER);
  13306. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0){
  13307. return VERIFY_MAC_ERROR;
  13308. }
  13309. if (ret != 0)
  13310. return VERIFY_MAC_ERROR;
  13311. }
  13312. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  13313. if (ssl->specs.cipher_type == aead) {
  13314. *padSz = ssl->specs.aead_mac_size;
  13315. }
  13316. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  13317. else {
  13318. *padSz = digestSz + pad + padByte;
  13319. }
  13320. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  13321. (void)input;
  13322. (void)msgSz;
  13323. (void)content;
  13324. return 0;
  13325. }
  13326. /* process input requests, return 0 is done, 1 is call again to complete, and
  13327. negative number is error */
  13328. int ProcessReply(WOLFSSL* ssl)
  13329. {
  13330. int ret = 0, type, readSz;
  13331. int atomicUser = 0;
  13332. word32 startIdx = 0;
  13333. #if defined(WOLFSSL_DTLS)
  13334. int used;
  13335. #endif
  13336. #ifdef ATOMIC_USER
  13337. if (ssl->ctx->DecryptVerifyCb)
  13338. atomicUser = 1;
  13339. #endif
  13340. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  13341. #ifdef HAVE_SECURE_RENEGOTIATION
  13342. && ssl->error != APP_DATA_READY
  13343. #endif
  13344. #ifdef WOLFSSL_ASYNC_CRYPT
  13345. && ssl->error != WC_PENDING_E
  13346. #endif
  13347. #ifdef WOLFSSL_NONBLOCK_OCSP
  13348. && ssl->error != OCSP_WANT_READ
  13349. #endif
  13350. ) {
  13351. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  13352. return ssl->error;
  13353. }
  13354. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
  13355. /* process any pending DTLS messages - this flow can happen with async */
  13356. if (ssl->dtls_rx_msg_list != NULL) {
  13357. ret = DtlsMsgDrain(ssl);
  13358. if (ret != 0) {
  13359. WOLFSSL_ERROR(ret);
  13360. return ret;
  13361. }
  13362. }
  13363. #endif
  13364. for (;;) {
  13365. switch (ssl->options.processReply) {
  13366. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  13367. * old client hello */
  13368. case doProcessInit:
  13369. readSz = RECORD_HEADER_SZ;
  13370. #ifdef WOLFSSL_DTLS
  13371. if (ssl->options.dtls)
  13372. readSz = DTLS_RECORD_HEADER_SZ;
  13373. #endif
  13374. /* get header or return error */
  13375. if (!ssl->options.dtls) {
  13376. if ((ret = GetInputData(ssl, readSz)) < 0)
  13377. return ret;
  13378. } else {
  13379. #ifdef WOLFSSL_DTLS
  13380. /* read ahead may already have header */
  13381. used = ssl->buffers.inputBuffer.length -
  13382. ssl->buffers.inputBuffer.idx;
  13383. if (used < readSz) {
  13384. if ((ret = GetInputData(ssl, readSz)) < 0)
  13385. return ret;
  13386. }
  13387. #endif
  13388. }
  13389. #ifdef OLD_HELLO_ALLOWED
  13390. /* see if sending SSLv2 client hello */
  13391. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  13392. ssl->options.clientState == NULL_STATE &&
  13393. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  13394. != handshake) {
  13395. byte b0, b1;
  13396. ssl->options.processReply = runProcessOldClientHello;
  13397. /* sanity checks before getting size at front */
  13398. if (ssl->buffers.inputBuffer.buffer[
  13399. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  13400. WOLFSSL_MSG("Not a valid old client hello");
  13401. return PARSE_ERROR;
  13402. }
  13403. if (ssl->buffers.inputBuffer.buffer[
  13404. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  13405. ssl->buffers.inputBuffer.buffer[
  13406. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  13407. WOLFSSL_MSG("Not a valid version in old client hello");
  13408. return PARSE_ERROR;
  13409. }
  13410. /* how many bytes need ProcessOldClientHello */
  13411. b0 =
  13412. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  13413. b1 =
  13414. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  13415. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  13416. }
  13417. else {
  13418. ssl->options.processReply = getRecordLayerHeader;
  13419. continue;
  13420. }
  13421. FALL_THROUGH;
  13422. /* in the WOLFSSL_SERVER case, run the old client hello */
  13423. case runProcessOldClientHello:
  13424. /* get sz bytes or return error */
  13425. if (!ssl->options.dtls) {
  13426. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  13427. return ret;
  13428. } else {
  13429. #ifdef WOLFSSL_DTLS
  13430. /* read ahead may already have */
  13431. used = ssl->buffers.inputBuffer.length -
  13432. ssl->buffers.inputBuffer.idx;
  13433. if (used < ssl->curSize)
  13434. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  13435. return ret;
  13436. #endif /* WOLFSSL_DTLS */
  13437. }
  13438. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  13439. &ssl->buffers.inputBuffer.idx,
  13440. ssl->buffers.inputBuffer.length -
  13441. ssl->buffers.inputBuffer.idx,
  13442. ssl->curSize);
  13443. if (ret < 0)
  13444. return ret;
  13445. else if (ssl->buffers.inputBuffer.idx ==
  13446. ssl->buffers.inputBuffer.length) {
  13447. ssl->options.processReply = doProcessInit;
  13448. return 0;
  13449. }
  13450. #endif /* OLD_HELLO_ALLOWED */
  13451. FALL_THROUGH;
  13452. /* get the record layer header */
  13453. case getRecordLayerHeader:
  13454. ret = GetRecordHeader(ssl, ssl->buffers.inputBuffer.buffer,
  13455. &ssl->buffers.inputBuffer.idx,
  13456. &ssl->curRL, &ssl->curSize);
  13457. #ifdef WOLFSSL_DTLS
  13458. if (ssl->options.dtls && ret == SEQUENCE_ERROR) {
  13459. WOLFSSL_MSG("Silently dropping out of order DTLS message");
  13460. ssl->options.processReply = doProcessInit;
  13461. ssl->buffers.inputBuffer.length = 0;
  13462. ssl->buffers.inputBuffer.idx = 0;
  13463. #ifdef WOLFSSL_DTLS_DROP_STATS
  13464. ssl->replayDropCount++;
  13465. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13466. continue;
  13467. }
  13468. #endif
  13469. if (ret != 0)
  13470. return ret;
  13471. #ifdef WOLFSSL_TLS13
  13472. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  13473. ssl->curRL.type != application_data &&
  13474. ssl->curRL.type != change_cipher_spec) {
  13475. SendAlert(ssl, alert_fatal, unexpected_message);
  13476. return PARSE_ERROR;
  13477. }
  13478. #endif
  13479. ssl->options.processReply = getData;
  13480. FALL_THROUGH;
  13481. /* retrieve record layer data */
  13482. case getData:
  13483. /* get sz bytes or return error */
  13484. if (!ssl->options.dtls) {
  13485. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  13486. #ifdef WOLFSSL_EXTRA_ALERTS
  13487. if (ret != WANT_READ)
  13488. SendAlert(ssl, alert_fatal, bad_record_mac);
  13489. #endif
  13490. return ret;
  13491. }
  13492. }
  13493. else {
  13494. #ifdef WOLFSSL_DTLS
  13495. /* read ahead may already have */
  13496. used = ssl->buffers.inputBuffer.length -
  13497. ssl->buffers.inputBuffer.idx;
  13498. if (used < ssl->curSize)
  13499. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  13500. return ret;
  13501. #endif
  13502. }
  13503. if (IsEncryptionOn(ssl, 0)) {
  13504. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  13505. int tooLong = 0;
  13506. #endif
  13507. #ifdef WOLFSSL_TLS13
  13508. if (IsAtLeastTLSv1_3(ssl->version)) {
  13509. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  13510. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  13511. MAX_TLS13_PLAIN_SZ;
  13512. }
  13513. #endif
  13514. #ifdef WOLFSSL_EXTRA_ALERTS
  13515. if (!IsAtLeastTLSv1_3(ssl->version))
  13516. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  13517. #endif
  13518. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  13519. if (tooLong) {
  13520. WOLFSSL_MSG("Encrypted data too long");
  13521. SendAlert(ssl, alert_fatal, record_overflow);
  13522. return BUFFER_ERROR;
  13523. }
  13524. #endif
  13525. }
  13526. ssl->keys.padSz = 0;
  13527. ssl->options.processReply = verifyEncryptedMessage;
  13528. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  13529. FALL_THROUGH;
  13530. /* verify digest of encrypted message */
  13531. case verifyEncryptedMessage:
  13532. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13533. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  13534. !atomicUser && ssl->options.startedETMRead) {
  13535. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  13536. ssl->buffers.inputBuffer.idx,
  13537. ssl->curSize, ssl->curRL.type);
  13538. #ifdef WOLFSSL_ASYNC_CRYPT
  13539. if (ret == WC_PENDING_E)
  13540. return ret;
  13541. #endif
  13542. if (ret < 0) {
  13543. WOLFSSL_MSG("VerifyMacEnc failed");
  13544. WOLFSSL_ERROR(ret);
  13545. #ifdef WOLFSSL_DTLS
  13546. /* If in DTLS mode, if the decrypt fails for any
  13547. * reason, pretend the datagram never happened. */
  13548. if (ssl->options.dtls) {
  13549. ssl->options.processReply = doProcessInit;
  13550. ssl->buffers.inputBuffer.idx =
  13551. ssl->buffers.inputBuffer.length;
  13552. #ifdef WOLFSSL_DTLS_DROP_STATS
  13553. ssl->macDropCount++;
  13554. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13555. }
  13556. #endif /* WOLFSSL_DTLS */
  13557. #ifdef WOLFSSL_EXTRA_ALERTS
  13558. if (!ssl->options.dtls)
  13559. SendAlert(ssl, alert_fatal, bad_record_mac);
  13560. #endif
  13561. return DECRYPT_ERROR;
  13562. }
  13563. ssl->keys.encryptSz = ssl->curSize;
  13564. }
  13565. #endif
  13566. ssl->options.processReply = decryptMessage;
  13567. FALL_THROUGH;
  13568. /* decrypt message */
  13569. case decryptMessage:
  13570. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  13571. (!IsAtLeastTLSv1_3(ssl->version) ||
  13572. ssl->curRL.type != change_cipher_spec))
  13573. {
  13574. bufferStatic* in = &ssl->buffers.inputBuffer;
  13575. ret = SanityCheckCipherText(ssl, ssl->curSize);
  13576. if (ret < 0) {
  13577. #ifdef WOLFSSL_EXTRA_ALERTS
  13578. SendAlert(ssl, alert_fatal, bad_record_mac);
  13579. #endif
  13580. return ret;
  13581. }
  13582. if (atomicUser) {
  13583. #ifdef ATOMIC_USER
  13584. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13585. if (ssl->options.startedETMRead) {
  13586. ret = ssl->ctx->VerifyDecryptCb(ssl,
  13587. in->buffer + in->idx, in->buffer + in->idx,
  13588. ssl->curSize - MacSize(ssl),
  13589. ssl->curRL.type, 1, &ssl->keys.padSz,
  13590. ssl->DecryptVerifyCtx);
  13591. }
  13592. else
  13593. #endif
  13594. {
  13595. ret = ssl->ctx->DecryptVerifyCb(ssl,
  13596. in->buffer + in->idx,
  13597. in->buffer + in->idx,
  13598. ssl->curSize, ssl->curRL.type, 1,
  13599. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  13600. }
  13601. #endif /* ATOMIC_USER */
  13602. }
  13603. else {
  13604. if (!ssl->options.tls1_3) {
  13605. #ifndef WOLFSSL_NO_TLS12
  13606. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13607. if (ssl->options.startedETMRead) {
  13608. word32 digestSz = MacSize(ssl);
  13609. ret = Decrypt(ssl,
  13610. in->buffer + in->idx,
  13611. in->buffer + in->idx,
  13612. ssl->curSize - digestSz);
  13613. if (ret == 0) {
  13614. ssl->keys.padSz =
  13615. in->buffer[in->idx + ssl->curSize -
  13616. digestSz - 1];
  13617. ssl->keys.padSz += 1;
  13618. ssl->keys.decryptedCur = 1;
  13619. }
  13620. }
  13621. else
  13622. #endif
  13623. {
  13624. ret = Decrypt(ssl,
  13625. in->buffer + in->idx,
  13626. in->buffer + in->idx,
  13627. ssl->curSize);
  13628. }
  13629. #else
  13630. ret = DECRYPT_ERROR;
  13631. #endif
  13632. }
  13633. else
  13634. {
  13635. #ifdef WOLFSSL_TLS13
  13636. ret = DecryptTls13(ssl,
  13637. in->buffer + in->idx,
  13638. in->buffer + in->idx,
  13639. ssl->curSize,
  13640. (byte*)&ssl->curRL, RECORD_HEADER_SZ);
  13641. #else
  13642. ret = DECRYPT_ERROR;
  13643. #endif /* WOLFSSL_TLS13 */
  13644. }
  13645. }
  13646. #ifdef WOLFSSL_ASYNC_CRYPT
  13647. if (ret == WC_PENDING_E)
  13648. return ret;
  13649. #endif
  13650. if (ret >= 0) {
  13651. #ifndef WOLFSSL_NO_TLS12
  13652. /* handle success */
  13653. #ifndef WOLFSSL_AEAD_ONLY
  13654. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  13655. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  13656. #endif
  13657. /* go past TLSv1.1 IV */
  13658. if (CipherHasExpIV(ssl))
  13659. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  13660. #endif
  13661. }
  13662. else {
  13663. WOLFSSL_MSG("Decrypt failed");
  13664. WOLFSSL_ERROR(ret);
  13665. #ifdef WOLFSSL_EARLY_DATA
  13666. if (ssl->options.tls1_3) {
  13667. if (ssl->options.side == WOLFSSL_SERVER_END &&
  13668. ssl->earlyData != no_early_data &&
  13669. ssl->options.clientState <
  13670. CLIENT_FINISHED_COMPLETE) {
  13671. ssl->earlyDataSz += ssl->curSize;
  13672. if (ssl->earlyDataSz <=
  13673. ssl->options.maxEarlyDataSz) {
  13674. WOLFSSL_MSG("Ignoring EarlyData!");
  13675. if (ssl->keys.peer_sequence_number_lo-- == 0)
  13676. ssl->keys.peer_sequence_number_hi--;
  13677. ssl->options.processReply = doProcessInit;
  13678. ssl->buffers.inputBuffer.idx =
  13679. ssl->buffers.inputBuffer.length;
  13680. return 0;
  13681. }
  13682. WOLFSSL_MSG("Too much EarlyData!");
  13683. }
  13684. SendAlert(ssl, alert_fatal, bad_record_mac);
  13685. }
  13686. #endif
  13687. #ifdef WOLFSSL_DTLS
  13688. /* If in DTLS mode, if the decrypt fails for any
  13689. * reason, pretend the datagram never happened. */
  13690. if (ssl->options.dtls) {
  13691. ssl->options.processReply = doProcessInit;
  13692. ssl->buffers.inputBuffer.idx =
  13693. ssl->buffers.inputBuffer.length;
  13694. #ifdef WOLFSSL_DTLS_DROP_STATS
  13695. ssl->macDropCount++;
  13696. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13697. }
  13698. #endif /* WOLFSSL_DTLS */
  13699. return DECRYPT_ERROR;
  13700. }
  13701. }
  13702. ssl->options.processReply = verifyMessage;
  13703. FALL_THROUGH;
  13704. /* verify digest of message */
  13705. case verifyMessage:
  13706. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  13707. (!IsAtLeastTLSv1_3(ssl->version) ||
  13708. ssl->curRL.type != change_cipher_spec))
  13709. {
  13710. if (!atomicUser
  13711. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13712. && !ssl->options.startedETMRead
  13713. #endif
  13714. ) {
  13715. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  13716. ssl->buffers.inputBuffer.idx,
  13717. ssl->curSize, ssl->curRL.type,
  13718. &ssl->keys.padSz);
  13719. #ifdef WOLFSSL_ASYNC_CRYPT
  13720. if (ret == WC_PENDING_E)
  13721. return ret;
  13722. #endif
  13723. if (ret < 0) {
  13724. WOLFSSL_MSG("VerifyMac failed");
  13725. WOLFSSL_ERROR(ret);
  13726. #ifdef WOLFSSL_DTLS
  13727. /* If in DTLS mode, if the decrypt fails for any
  13728. * reason, pretend the datagram never happened. */
  13729. if (ssl->options.dtls) {
  13730. ssl->options.processReply = doProcessInit;
  13731. ssl->buffers.inputBuffer.idx =
  13732. ssl->buffers.inputBuffer.length;
  13733. #ifdef WOLFSSL_DTLS_DROP_STATS
  13734. ssl->macDropCount++;
  13735. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13736. }
  13737. #endif /* WOLFSSL_DTLS */
  13738. #ifdef WOLFSSL_EXTRA_ALERTS
  13739. if (!ssl->options.dtls)
  13740. SendAlert(ssl, alert_fatal, bad_record_mac);
  13741. #endif
  13742. return DECRYPT_ERROR;
  13743. }
  13744. }
  13745. ssl->keys.encryptSz = ssl->curSize;
  13746. ssl->keys.decryptedCur = 1;
  13747. #ifdef WOLFSSL_TLS13
  13748. if (ssl->options.tls1_3) {
  13749. word16 i = (word16)(ssl->buffers.inputBuffer.length -
  13750. ssl->keys.padSz);
  13751. /* sanity check on underflow */
  13752. if (ssl->keys.padSz >= ssl->buffers.inputBuffer.length) {
  13753. WOLFSSL_ERROR(DECRYPT_ERROR);
  13754. return DECRYPT_ERROR;
  13755. }
  13756. /* Remove padding from end of plain text. */
  13757. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  13758. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  13759. break;
  13760. }
  13761. /* Get the real content type from the end of the data. */
  13762. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  13763. ssl->keys.padSz = ssl->buffers.inputBuffer.length - i;
  13764. }
  13765. #endif
  13766. }
  13767. ssl->options.processReply = runProcessingOneMessage;
  13768. FALL_THROUGH;
  13769. /* the record layer is here */
  13770. case runProcessingOneMessage:
  13771. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13772. if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
  13773. if ((ssl->buffers.inputBuffer.length -
  13774. ssl->keys.padSz -
  13775. MacSize(ssl) -
  13776. ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ)
  13777. #ifdef WOLFSSL_ASYNC_CRYPT
  13778. && ssl->buffers.inputBuffer.length !=
  13779. ssl->buffers.inputBuffer.idx
  13780. #endif
  13781. ) {
  13782. WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
  13783. #if defined(WOLFSSL_EXTRA_ALERTS)
  13784. SendAlert(ssl, alert_fatal, record_overflow);
  13785. #endif
  13786. return BUFFER_ERROR;
  13787. }
  13788. }
  13789. else
  13790. #endif
  13791. if (ssl->buffers.inputBuffer.length -
  13792. ssl->keys.padSz -
  13793. ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ
  13794. #ifdef WOLFSSL_ASYNC_CRYPT
  13795. && ssl->buffers.inputBuffer.length !=
  13796. ssl->buffers.inputBuffer.idx
  13797. #endif
  13798. ) {
  13799. WOLFSSL_MSG("Plaintext too long");
  13800. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  13801. SendAlert(ssl, alert_fatal, record_overflow);
  13802. #endif
  13803. return BUFFER_ERROR;
  13804. }
  13805. #ifdef WOLFSSL_DTLS
  13806. if (IsDtlsNotSctpMode(ssl)) {
  13807. DtlsUpdateWindow(ssl);
  13808. }
  13809. #endif /* WOLFSSL_DTLS */
  13810. WOLFSSL_MSG("received record layer msg");
  13811. switch (ssl->curRL.type) {
  13812. case handshake :
  13813. WOLFSSL_MSG("got HANDSHAKE");
  13814. /* debugging in DoHandShakeMsg */
  13815. if (ssl->options.dtls) {
  13816. #ifdef WOLFSSL_DTLS
  13817. ret = DoDtlsHandShakeMsg(ssl,
  13818. ssl->buffers.inputBuffer.buffer,
  13819. &ssl->buffers.inputBuffer.idx,
  13820. ssl->buffers.inputBuffer.length);
  13821. #endif
  13822. }
  13823. else if (!IsAtLeastTLSv1_3(ssl->version)
  13824. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  13825. || !TLSv1_3_Capable(ssl)
  13826. #endif
  13827. ) {
  13828. #ifndef WOLFSSL_NO_TLS12
  13829. ret = DoHandShakeMsg(ssl,
  13830. ssl->buffers.inputBuffer.buffer,
  13831. &ssl->buffers.inputBuffer.idx,
  13832. ssl->buffers.inputBuffer.length);
  13833. #else
  13834. ret = BUFFER_ERROR;
  13835. #endif
  13836. }
  13837. else {
  13838. #ifdef WOLFSSL_TLS13
  13839. ssl->msgsReceived.got_change_cipher = 0;
  13840. ret = DoTls13HandShakeMsg(ssl,
  13841. ssl->buffers.inputBuffer.buffer,
  13842. &ssl->buffers.inputBuffer.idx,
  13843. ssl->buffers.inputBuffer.length);
  13844. #ifdef WOLFSSL_EARLY_DATA
  13845. if (ret != 0)
  13846. return ret;
  13847. if (ssl->options.side == WOLFSSL_SERVER_END &&
  13848. ssl->earlyData > early_data_ext &&
  13849. ssl->options.handShakeState == HANDSHAKE_DONE) {
  13850. ssl->earlyData = no_early_data;
  13851. ssl->options.processReply = doProcessInit;
  13852. return ZERO_RETURN;
  13853. }
  13854. #endif
  13855. #else
  13856. ret = BUFFER_ERROR;
  13857. #endif
  13858. }
  13859. if (ret != 0
  13860. #ifdef WOLFSSL_ASYNC_CRYPT
  13861. /* In async case, on pending, move onto next message.
  13862. * Current message should have been DtlsMsgStore'ed and
  13863. * should be processed with DtlsMsgDrain */
  13864. && (!ssl->options.dtls
  13865. || ret != WC_PENDING_E)
  13866. #endif
  13867. ) {
  13868. WOLFSSL_ERROR(ret);
  13869. return ret;
  13870. }
  13871. break;
  13872. case change_cipher_spec:
  13873. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  13874. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13875. if (ssl->hsInfoOn)
  13876. AddPacketName(ssl, "ChangeCipher");
  13877. /* add record header back on info */
  13878. if (ssl->toInfoOn) {
  13879. AddPacketInfo(ssl, "ChangeCipher",
  13880. change_cipher_spec,
  13881. ssl->buffers.inputBuffer.buffer +
  13882. ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ -
  13883. (ssl->options.dtls ? DTLS_RECORD_EXTRA : 0),
  13884. 1 + RECORD_HEADER_SZ, READ_PROTO, ssl->heap);
  13885. #ifdef WOLFSSL_CALLBACKS
  13886. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  13887. #endif
  13888. }
  13889. #endif
  13890. #ifdef WOLFSSL_TLS13
  13891. if (IsAtLeastTLSv1_3(ssl->version)) {
  13892. word32 i = ssl->buffers.inputBuffer.idx;
  13893. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  13894. SendAlert(ssl, alert_fatal, unexpected_message);
  13895. return UNKNOWN_RECORD_TYPE;
  13896. }
  13897. if (ssl->curSize != 1 ||
  13898. ssl->buffers.inputBuffer.buffer[i] != 1) {
  13899. SendAlert(ssl, alert_fatal, illegal_parameter);
  13900. return UNKNOWN_RECORD_TYPE;
  13901. }
  13902. ssl->buffers.inputBuffer.idx++;
  13903. if (!ssl->msgsReceived.got_change_cipher) {
  13904. ssl->msgsReceived.got_change_cipher = 1;
  13905. }
  13906. else {
  13907. SendAlert(ssl, alert_fatal, illegal_parameter);
  13908. return UNKNOWN_RECORD_TYPE;
  13909. }
  13910. break;
  13911. }
  13912. #endif
  13913. #ifndef WOLFSSL_NO_TLS12
  13914. if (ssl->buffers.inputBuffer.buffer[
  13915. ssl->buffers.inputBuffer.idx] != 1) {
  13916. WOLFSSL_MSG("ChangeCipher msg wrong value");
  13917. return LENGTH_ERROR;
  13918. }
  13919. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  13920. #ifdef HAVE_AEAD
  13921. if (ssl->specs.cipher_type == aead) {
  13922. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  13923. ssl->curSize -= AESGCM_EXP_IV_SZ;
  13924. ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
  13925. ssl->curSize -= ssl->specs.aead_mac_size;
  13926. }
  13927. else
  13928. #endif
  13929. {
  13930. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  13931. ssl->curSize -= (word16)ssl->keys.padSz;
  13932. ssl->curSize -= ssl->specs.iv_size;
  13933. }
  13934. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13935. if (ssl->options.startedETMRead) {
  13936. word32 digestSz = MacSize(ssl);
  13937. ssl->buffers.inputBuffer.idx += digestSz;
  13938. ssl->curSize -= digestSz;
  13939. }
  13940. #endif
  13941. }
  13942. if (ssl->curSize != 1) {
  13943. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  13944. return LENGTH_ERROR;
  13945. }
  13946. ssl->buffers.inputBuffer.idx++;
  13947. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  13948. if (ret != 0) {
  13949. if (!ssl->options.dtls) {
  13950. return ret;
  13951. }
  13952. else {
  13953. #ifdef WOLFSSL_DTLS
  13954. /* Check for duplicate CCS message in DTLS mode.
  13955. * DTLS allows for duplicate messages, and it should be
  13956. * skipped. Also skip if out of order. */
  13957. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  13958. return ret;
  13959. /* Reset error */
  13960. ret = 0;
  13961. break;
  13962. #endif /* WOLFSSL_DTLS */
  13963. }
  13964. }
  13965. ssl->keys.encryptionOn = 1;
  13966. /* setup decrypt keys for following messages */
  13967. /* XXX This might not be what we want to do when
  13968. * receiving a CCS with multicast. We update the
  13969. * key when the application updates them. */
  13970. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  13971. return ret;
  13972. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13973. ssl->options.startedETMRead = ssl->options.encThenMac;
  13974. #endif
  13975. #ifdef WOLFSSL_DTLS
  13976. if (ssl->options.dtls) {
  13977. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  13978. #ifdef WOLFSSL_MULTICAST
  13979. if (ssl->options.haveMcast) {
  13980. peerSeq += ssl->keys.curPeerId;
  13981. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  13982. ssl->ctx->mcastFirstSeq,
  13983. ssl->ctx->mcastSecondSeq,
  13984. ssl->ctx->mcastMaxSeq);
  13985. }
  13986. #endif
  13987. peerSeq->nextEpoch++;
  13988. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  13989. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  13990. peerSeq->nextSeq_lo = 0;
  13991. peerSeq->nextSeq_hi = 0;
  13992. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  13993. DTLS_SEQ_SZ);
  13994. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  13995. }
  13996. #endif
  13997. #ifdef HAVE_LIBZ
  13998. if (ssl->options.usingCompression)
  13999. if ( (ret = InitStreams(ssl)) != 0)
  14000. return ret;
  14001. #endif
  14002. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  14003. ssl->options.side == WOLFSSL_CLIENT_END ?
  14004. server : client);
  14005. if (ret != 0)
  14006. return ret;
  14007. #endif /* !WOLFSSL_NO_TLS12 */
  14008. break;
  14009. case application_data:
  14010. WOLFSSL_MSG("got app DATA");
  14011. #ifdef WOLFSSL_DTLS
  14012. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  14013. #ifdef HAVE_SECURE_RENEGOTIATION
  14014. /*
  14015. * Only free HS resources when not in the process of a
  14016. * secure renegotiation and we have received APP DATA
  14017. * from the current epoch
  14018. */
  14019. if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
  14020. || !DtlsSCRKeysSet(ssl))) {
  14021. FreeHandshakeResources(ssl);
  14022. ssl->options.dtlsHsRetain = 0;
  14023. }
  14024. #else
  14025. FreeHandshakeResources(ssl);
  14026. ssl->options.dtlsHsRetain = 0;
  14027. #endif
  14028. }
  14029. #endif
  14030. #ifdef WOLFSSL_TLS13
  14031. if (ssl->keys.keyUpdateRespond) {
  14032. WOLFSSL_MSG("No KeyUpdate from peer seen");
  14033. return SANITY_MSG_E;
  14034. }
  14035. #endif
  14036. if ((ret = DoApplicationData(ssl,
  14037. ssl->buffers.inputBuffer.buffer,
  14038. &ssl->buffers.inputBuffer.idx))
  14039. != 0) {
  14040. WOLFSSL_ERROR(ret);
  14041. return ret;
  14042. }
  14043. break;
  14044. case alert:
  14045. WOLFSSL_MSG("got ALERT!");
  14046. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  14047. &ssl->buffers.inputBuffer.idx, &type,
  14048. ssl->buffers.inputBuffer.length);
  14049. if (ret == alert_fatal)
  14050. return FATAL_ERROR;
  14051. else if (ret < 0)
  14052. return ret;
  14053. /* catch warnings that are handled as errors */
  14054. if (type == close_notify)
  14055. return ssl->error = ZERO_RETURN;
  14056. if (type == decrypt_error)
  14057. return FATAL_ERROR;
  14058. /* Reset error if we got an alert level in ret */
  14059. if (ret > 0)
  14060. ret = 0;
  14061. break;
  14062. default:
  14063. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  14064. return UNKNOWN_RECORD_TYPE;
  14065. }
  14066. ssl->options.processReply = doProcessInit;
  14067. /* input exhausted */
  14068. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
  14069. #ifdef WOLFSSL_DTLS
  14070. /* If app data was processed then return now to avoid
  14071. * dropping any app data. */
  14072. || (ssl->options.dtls && ssl->curRL.type == application_data)
  14073. #endif
  14074. )
  14075. return ret;
  14076. /* more messages per record */
  14077. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  14078. WOLFSSL_MSG("More messages in record");
  14079. ssl->options.processReply = runProcessingOneMessage;
  14080. if (IsEncryptionOn(ssl, 0)) {
  14081. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  14082. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14083. if (ssl->options.startedETMRead) {
  14084. word32 digestSz = MacSize(ssl);
  14085. if (ssl->buffers.inputBuffer.idx >=
  14086. ssl->keys.padSz + digestSz) {
  14087. ssl->buffers.inputBuffer.idx -=
  14088. ssl->keys.padSz + digestSz;
  14089. }
  14090. else {
  14091. WOLFSSL_MSG("\tmiddle padding error");
  14092. return FATAL_ERROR;
  14093. }
  14094. }
  14095. else
  14096. #endif
  14097. {
  14098. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  14099. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  14100. }
  14101. else {
  14102. WOLFSSL_MSG("\tmiddle padding error");
  14103. return FATAL_ERROR;
  14104. }
  14105. }
  14106. }
  14107. }
  14108. /* more records */
  14109. else {
  14110. WOLFSSL_MSG("More records in input");
  14111. }
  14112. #ifdef WOLFSSL_ASYNC_CRYPT
  14113. /* We are setup to read next message/record but we had an error
  14114. * (probably WC_PENDING_E) so return that so it can be handled
  14115. * by higher layers. */
  14116. if (ret != 0)
  14117. return ret;
  14118. #endif
  14119. continue;
  14120. default:
  14121. WOLFSSL_MSG("Bad process input state, programming error");
  14122. return INPUT_CASE_ERROR;
  14123. }
  14124. }
  14125. }
  14126. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  14127. (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
  14128. int SendChangeCipher(WOLFSSL* ssl)
  14129. {
  14130. byte *output;
  14131. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  14132. int idx = RECORD_HEADER_SZ;
  14133. int ret;
  14134. #ifdef OPENSSL_EXTRA
  14135. ssl->cbmode = SSL_CB_MODE_WRITE;
  14136. if (ssl->options.side == WOLFSSL_SERVER_END){
  14137. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  14138. if (ssl->CBIS != NULL)
  14139. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  14140. }
  14141. else{
  14142. ssl->options.clientState =
  14143. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  14144. if (ssl->CBIS != NULL)
  14145. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  14146. }
  14147. #endif
  14148. #ifdef WOLFSSL_DTLS
  14149. if (ssl->options.dtls) {
  14150. sendSz += DTLS_RECORD_EXTRA;
  14151. idx += DTLS_RECORD_EXTRA;
  14152. }
  14153. #endif
  14154. /* are we in scr */
  14155. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  14156. sendSz += MAX_MSG_EXTRA;
  14157. }
  14158. /* check for available size */
  14159. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  14160. return ret;
  14161. /* get output buffer */
  14162. output = ssl->buffers.outputBuffer.buffer +
  14163. ssl->buffers.outputBuffer.length;
  14164. AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
  14165. output[idx] = 1; /* turn it on */
  14166. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  14167. byte input[ENUM_LEN];
  14168. int inputSz = ENUM_LEN;
  14169. input[0] = 1; /* turn it on */
  14170. #ifdef WOLFSSL_DTLS
  14171. if (IsDtlsNotSctpMode(ssl) &&
  14172. (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
  14173. return ret;
  14174. }
  14175. #endif
  14176. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  14177. change_cipher_spec, 0, 0, 0, CUR_ORDER);
  14178. if (sendSz < 0) {
  14179. return sendSz;
  14180. }
  14181. }
  14182. #ifdef WOLFSSL_DTLS
  14183. else {
  14184. if (IsDtlsNotSctpMode(ssl)) {
  14185. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
  14186. return ret;
  14187. DtlsSEQIncrement(ssl, CUR_ORDER);
  14188. }
  14189. }
  14190. #endif
  14191. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14192. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  14193. if (ssl->toInfoOn)
  14194. AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  14195. sendSz, WRITE_PROTO, ssl->heap);
  14196. #endif
  14197. ssl->buffers.outputBuffer.length += sendSz;
  14198. #ifdef WOLFSSL_TLS13
  14199. if (!ssl->options.tls1_3)
  14200. #endif
  14201. {
  14202. /* setup encrypt keys */
  14203. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  14204. return ret;
  14205. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14206. ssl->options.startedETMWrite = ssl->options.encThenMac;
  14207. #endif
  14208. }
  14209. if (ssl->options.groupMessages)
  14210. return 0;
  14211. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  14212. else if (ssl->options.dtls) {
  14213. /* If using DTLS, force the ChangeCipherSpec message to be in the
  14214. * same datagram as the finished message. */
  14215. return 0;
  14216. }
  14217. #endif
  14218. else
  14219. return SendBuffered(ssl);
  14220. }
  14221. #endif
  14222. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  14223. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  14224. int padLen, int content, int verify, int epochOrder)
  14225. {
  14226. byte result[WC_MAX_DIGEST_SIZE];
  14227. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  14228. word32 padSz = ssl->specs.pad_size;
  14229. int ret = 0;
  14230. wc_Md5 md5;
  14231. wc_Sha sha;
  14232. /* data */
  14233. byte seq[SEQ_SZ];
  14234. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  14235. const byte* macSecret = NULL;
  14236. (void)padLen;
  14237. #ifdef HAVE_FUZZER
  14238. if (ssl->fuzzerCb)
  14239. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  14240. #endif
  14241. #ifdef WOLFSSL_DTLS
  14242. if (ssl->options.dtls)
  14243. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  14244. else
  14245. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  14246. #else
  14247. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  14248. #endif
  14249. XMEMSET(seq, 0, SEQ_SZ);
  14250. conLen[0] = (byte)content;
  14251. c16toa((word16)sz, &conLen[ENUM_LEN]);
  14252. WriteSEQ(ssl, epochOrder, seq);
  14253. if (ssl->specs.mac_algorithm == md5_mac) {
  14254. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  14255. if (ret != 0)
  14256. return ret;
  14257. /* inner */
  14258. ret = wc_Md5Update(&md5, macSecret, digestSz);
  14259. ret |= wc_Md5Update(&md5, PAD1, padSz);
  14260. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  14261. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  14262. /* in buffer */
  14263. ret |= wc_Md5Update(&md5, in, sz);
  14264. if (ret != 0)
  14265. return VERIFY_MAC_ERROR;
  14266. ret = wc_Md5Final(&md5, result);
  14267. #ifdef WOLFSSL_ASYNC_CRYPT
  14268. /* TODO: Make non-blocking */
  14269. if (ret == WC_PENDING_E) {
  14270. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  14271. }
  14272. #endif
  14273. if (ret != 0)
  14274. return VERIFY_MAC_ERROR;
  14275. /* outer */
  14276. ret = wc_Md5Update(&md5, macSecret, digestSz);
  14277. ret |= wc_Md5Update(&md5, PAD2, padSz);
  14278. ret |= wc_Md5Update(&md5, result, digestSz);
  14279. if (ret != 0)
  14280. return VERIFY_MAC_ERROR;
  14281. ret = wc_Md5Final(&md5, digest);
  14282. #ifdef WOLFSSL_ASYNC_CRYPT
  14283. /* TODO: Make non-blocking */
  14284. if (ret == WC_PENDING_E) {
  14285. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  14286. }
  14287. #endif
  14288. if (ret != 0)
  14289. return VERIFY_MAC_ERROR;
  14290. wc_Md5Free(&md5);
  14291. }
  14292. else {
  14293. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  14294. if (ret != 0)
  14295. return ret;
  14296. /* inner */
  14297. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  14298. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  14299. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  14300. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  14301. /* in buffer */
  14302. ret |= wc_ShaUpdate(&sha, in, sz);
  14303. if (ret != 0)
  14304. return VERIFY_MAC_ERROR;
  14305. ret = wc_ShaFinal(&sha, result);
  14306. #ifdef WOLFSSL_ASYNC_CRYPT
  14307. /* TODO: Make non-blocking */
  14308. if (ret == WC_PENDING_E) {
  14309. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  14310. }
  14311. #endif
  14312. if (ret != 0)
  14313. return VERIFY_MAC_ERROR;
  14314. /* outer */
  14315. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  14316. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  14317. ret |= wc_ShaUpdate(&sha, result, digestSz);
  14318. if (ret != 0)
  14319. return VERIFY_MAC_ERROR;
  14320. ret = wc_ShaFinal(&sha, digest);
  14321. #ifdef WOLFSSL_ASYNC_CRYPT
  14322. /* TODO: Make non-blocking */
  14323. if (ret == WC_PENDING_E) {
  14324. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  14325. }
  14326. #endif
  14327. if (ret != 0)
  14328. return VERIFY_MAC_ERROR;
  14329. wc_ShaFree(&sha);
  14330. }
  14331. return 0;
  14332. }
  14333. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  14334. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  14335. static int BuildMD5_CertVerify(WOLFSSL* ssl, byte* digest)
  14336. {
  14337. int ret;
  14338. byte md5_result[WC_MD5_DIGEST_SIZE];
  14339. #ifdef WOLFSSL_SMALL_STACK
  14340. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  14341. #else
  14342. wc_Md5 md5[1];
  14343. #endif
  14344. /* make md5 inner */
  14345. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  14346. if (ret == 0)
  14347. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  14348. if (ret == 0)
  14349. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  14350. if (ret == 0)
  14351. ret = wc_Md5Final(md5, md5_result);
  14352. /* make md5 outer */
  14353. if (ret == 0) {
  14354. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  14355. if (ret == 0) {
  14356. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  14357. if (ret == 0)
  14358. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  14359. if (ret == 0)
  14360. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  14361. if (ret == 0)
  14362. ret = wc_Md5Final(md5, digest);
  14363. wc_Md5Free(md5);
  14364. }
  14365. }
  14366. #ifdef WOLFSSL_SMALL_STACK
  14367. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  14368. #endif
  14369. return ret;
  14370. }
  14371. #endif /* !NO_MD5 && !NO_OLD_TLS */
  14372. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  14373. defined(WOLFSSL_ALLOW_TLS_SHA1))
  14374. static int BuildSHA_CertVerify(WOLFSSL* ssl, byte* digest)
  14375. {
  14376. int ret;
  14377. byte sha_result[WC_SHA_DIGEST_SIZE];
  14378. #ifdef WOLFSSL_SMALL_STACK
  14379. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  14380. #else
  14381. wc_Sha sha[1];
  14382. #endif
  14383. /* make sha inner */
  14384. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  14385. if (ret == 0)
  14386. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  14387. if (ret == 0)
  14388. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  14389. if (ret == 0)
  14390. ret = wc_ShaFinal(sha, sha_result);
  14391. /* make sha outer */
  14392. if (ret == 0) {
  14393. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  14394. if (ret == 0) {
  14395. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  14396. if (ret == 0)
  14397. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  14398. if (ret == 0)
  14399. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  14400. if (ret == 0)
  14401. ret = wc_ShaFinal(sha, digest);
  14402. wc_ShaFree(sha);
  14403. }
  14404. }
  14405. #ifdef WOLFSSL_SMALL_STACK
  14406. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  14407. #endif
  14408. return ret;
  14409. }
  14410. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  14411. int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes)
  14412. {
  14413. int ret = 0;
  14414. (void)hashes;
  14415. if (ssl->options.tls) {
  14416. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  14417. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  14418. if (ret != 0)
  14419. return ret;
  14420. #endif
  14421. #if !defined(NO_SHA)
  14422. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  14423. if (ret != 0)
  14424. return ret;
  14425. #endif
  14426. if (IsAtLeastTLSv1_2(ssl)) {
  14427. #ifndef NO_SHA256
  14428. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  14429. hashes->sha256);
  14430. if (ret != 0)
  14431. return ret;
  14432. #endif
  14433. #ifdef WOLFSSL_SHA384
  14434. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  14435. hashes->sha384);
  14436. if (ret != 0)
  14437. return ret;
  14438. #endif
  14439. #ifdef WOLFSSL_SHA512
  14440. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  14441. hashes->sha512);
  14442. if (ret != 0)
  14443. return ret;
  14444. #endif
  14445. }
  14446. }
  14447. else {
  14448. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  14449. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  14450. if (ret != 0)
  14451. return ret;
  14452. #endif
  14453. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  14454. defined(WOLFSSL_ALLOW_TLS_SHA1))
  14455. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  14456. if (ret != 0)
  14457. return ret;
  14458. #endif
  14459. }
  14460. return ret;
  14461. }
  14462. #ifndef WOLFSSL_NO_TLS12
  14463. void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
  14464. {
  14465. if (args) {
  14466. if (ssl && args->iv)
  14467. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  14468. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  14469. }
  14470. }
  14471. #endif
  14472. /* Build SSL Message, encrypted */
  14473. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  14474. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
  14475. int epochOrder)
  14476. {
  14477. #ifndef WOLFSSL_NO_TLS12
  14478. int ret = 0;
  14479. BuildMsgArgs* args;
  14480. BuildMsgArgs lcl_args;
  14481. #ifdef WOLFSSL_ASYNC_CRYPT
  14482. args = &ssl->async.buildArgs;
  14483. #endif
  14484. #endif
  14485. WOLFSSL_ENTER("BuildMessage");
  14486. if (ssl == NULL) {
  14487. return BAD_FUNC_ARG;
  14488. }
  14489. (void)epochOrder;
  14490. #ifdef WOLFSSL_NO_TLS12
  14491. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  14492. hashOutput, sizeOnly, asyncOkay);
  14493. #else
  14494. #ifdef WOLFSSL_TLS13
  14495. if (ssl->options.tls1_3) {
  14496. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  14497. hashOutput, sizeOnly, asyncOkay);
  14498. }
  14499. #endif
  14500. ret = WC_NOT_PENDING_E;
  14501. #ifdef WOLFSSL_ASYNC_CRYPT
  14502. if (asyncOkay) {
  14503. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  14504. if (ret != WC_NOT_PENDING_E) {
  14505. /* Check for error */
  14506. if (ret < 0)
  14507. goto exit_buildmsg;
  14508. }
  14509. }
  14510. else
  14511. #endif
  14512. {
  14513. args = &lcl_args;
  14514. }
  14515. /* Reset state */
  14516. if (ret == WC_NOT_PENDING_E) {
  14517. ret = 0;
  14518. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  14519. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  14520. args->sz = RECORD_HEADER_SZ + inSz;
  14521. args->idx = RECORD_HEADER_SZ;
  14522. args->headerSz = RECORD_HEADER_SZ;
  14523. }
  14524. switch (ssl->options.buildMsgState) {
  14525. case BUILD_MSG_BEGIN:
  14526. {
  14527. /* catch mistaken sizeOnly parameter */
  14528. if (!sizeOnly && (output == NULL || input == NULL) ) {
  14529. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  14530. }
  14531. if (sizeOnly && (output || input) ) {
  14532. WOLFSSL_MSG("BuildMessage w/sizeOnly doesn't need input/output");
  14533. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  14534. }
  14535. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  14536. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  14537. /* For epochs >1 the current cipher parameters are located in
  14538. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  14539. * parameters and for epoch 1 use ssl->keys */
  14540. switch (epochOrder) {
  14541. case PREV_ORDER:
  14542. if (ssl->encrypt.src != KEYS) {
  14543. ssl->secure_renegotiation->cache_status =
  14544. SCR_CACHE_NULL;
  14545. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  14546. ERROR_OUT(ret, exit_buildmsg);
  14547. }
  14548. break;
  14549. case CUR_ORDER:
  14550. if (ssl->keys.dtls_epoch ==
  14551. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  14552. if (ssl->encrypt.src != SCR) {
  14553. ssl->secure_renegotiation->cache_status =
  14554. SCR_CACHE_NEEDED;
  14555. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  14556. != 0)
  14557. ERROR_OUT(ret, exit_buildmsg);
  14558. }
  14559. }
  14560. else {
  14561. if (ssl->encrypt.src != KEYS) {
  14562. ssl->secure_renegotiation->cache_status =
  14563. SCR_CACHE_NULL;
  14564. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  14565. != 0)
  14566. ERROR_OUT(ret, exit_buildmsg);
  14567. }
  14568. }
  14569. break;
  14570. default:
  14571. WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
  14572. "CUR_ORDER");
  14573. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  14574. }
  14575. }
  14576. #endif
  14577. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  14578. }
  14579. FALL_THROUGH;
  14580. case BUILD_MSG_SIZE:
  14581. {
  14582. args->digestSz = ssl->specs.hash_size;
  14583. #ifdef HAVE_TRUNCATED_HMAC
  14584. if (ssl->truncated_hmac)
  14585. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  14586. #endif
  14587. args->sz += args->digestSz;
  14588. #ifdef WOLFSSL_DTLS
  14589. if (ssl->options.dtls) {
  14590. args->sz += DTLS_RECORD_EXTRA;
  14591. args->idx += DTLS_RECORD_EXTRA;
  14592. args->headerSz += DTLS_RECORD_EXTRA;
  14593. }
  14594. #endif
  14595. #ifndef WOLFSSL_AEAD_ONLY
  14596. if (ssl->specs.cipher_type == block) {
  14597. word32 blockSz = ssl->specs.block_size;
  14598. if (ssl->options.tls1_1) {
  14599. args->ivSz = blockSz;
  14600. args->sz += args->ivSz;
  14601. if (args->ivSz > MAX_IV_SZ)
  14602. ERROR_OUT(BUFFER_E, exit_buildmsg);
  14603. }
  14604. args->sz += 1; /* pad byte */
  14605. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14606. if (ssl->options.startedETMWrite) {
  14607. args->pad = (args->sz - args->headerSz -
  14608. args->digestSz) % blockSz;
  14609. }
  14610. else
  14611. #endif
  14612. args->pad = (args->sz - args->headerSz) % blockSz;
  14613. #ifdef OPENSSL_EXTRA
  14614. if(args->pad != 0)
  14615. #endif
  14616. args->pad = blockSz - args->pad;
  14617. args->sz += args->pad;
  14618. }
  14619. #endif /* WOLFSSL_AEAD_ONLY */
  14620. #ifdef HAVE_AEAD
  14621. if (ssl->specs.cipher_type == aead) {
  14622. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  14623. args->ivSz = AESGCM_EXP_IV_SZ;
  14624. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  14625. }
  14626. #endif
  14627. /* done with size calculations */
  14628. if (sizeOnly)
  14629. goto exit_buildmsg;
  14630. if (args->sz > (word32)outSz) {
  14631. WOLFSSL_MSG("Oops, want to write past output buffer size");
  14632. ERROR_OUT(BUFFER_E, exit_buildmsg);
  14633. }
  14634. if (args->ivSz > 0) {
  14635. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap, DYNAMIC_TYPE_SALT);
  14636. if (args->iv == NULL)
  14637. ERROR_OUT(MEMORY_E, exit_buildmsg);
  14638. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  14639. if (ret != 0)
  14640. goto exit_buildmsg;
  14641. }
  14642. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  14643. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  14644. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  14645. defined(HAVE_AEAD))
  14646. if (ssl->specs.cipher_type == aead) {
  14647. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  14648. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  14649. }
  14650. #endif
  14651. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  14652. AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
  14653. /* write to output */
  14654. if (args->ivSz > 0) {
  14655. XMEMCPY(output + args->idx, args->iv,
  14656. min(args->ivSz, MAX_IV_SZ));
  14657. args->idx += args->ivSz;
  14658. }
  14659. XMEMCPY(output + args->idx, input, inSz);
  14660. args->idx += inSz;
  14661. ssl->options.buildMsgState = BUILD_MSG_HASH;
  14662. }
  14663. FALL_THROUGH;
  14664. case BUILD_MSG_HASH:
  14665. {
  14666. if (type == handshake && hashOutput) {
  14667. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  14668. if (ret != 0)
  14669. goto exit_buildmsg;
  14670. }
  14671. #ifndef WOLFSSL_AEAD_ONLY
  14672. if (ssl->specs.cipher_type == block) {
  14673. word32 tmpIdx;
  14674. word32 i;
  14675. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14676. if (ssl->options.startedETMWrite)
  14677. tmpIdx = args->idx;
  14678. else
  14679. #endif
  14680. tmpIdx = args->idx + args->digestSz;
  14681. for (i = 0; i <= args->pad; i++)
  14682. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  14683. }
  14684. #endif
  14685. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  14686. }
  14687. FALL_THROUGH;
  14688. case BUILD_MSG_VERIFY_MAC:
  14689. {
  14690. /* User Record Layer Callback handling */
  14691. #ifdef ATOMIC_USER
  14692. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14693. if (ssl->options.startedETMWrite) {
  14694. if (ssl->ctx->EncryptMacCb) {
  14695. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  14696. args->pad + 1, type, 0,
  14697. output + args->headerSz,
  14698. output + args->headerSz,
  14699. args->size - args->digestSz,
  14700. ssl->MacEncryptCtx);
  14701. goto exit_buildmsg;
  14702. }
  14703. }
  14704. else
  14705. #endif
  14706. {
  14707. if (ssl->ctx->MacEncryptCb) {
  14708. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  14709. output + args->headerSz + args->ivSz, inSz,
  14710. type, 0, output + args->headerSz,
  14711. output + args->headerSz, args->size,
  14712. ssl->MacEncryptCtx);
  14713. goto exit_buildmsg;
  14714. }
  14715. }
  14716. #endif
  14717. #ifndef WOLFSSL_AEAD_ONLY
  14718. if (ssl->specs.cipher_type != aead
  14719. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14720. && !ssl->options.startedETMWrite
  14721. #endif
  14722. ) {
  14723. #ifdef HAVE_TRUNCATED_HMAC
  14724. if (ssl->truncated_hmac &&
  14725. ssl->specs.hash_size > args->digestSz) {
  14726. #ifdef WOLFSSL_SMALL_STACK
  14727. byte* hmac;
  14728. #else
  14729. byte hmac[WC_MAX_DIGEST_SIZE];
  14730. #endif
  14731. #ifdef WOLFSSL_SMALL_STACK
  14732. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  14733. DYNAMIC_TYPE_DIGEST);
  14734. if (hmac == NULL)
  14735. ERROR_OUT(MEMORY_E, exit_buildmsg);
  14736. #endif
  14737. ret = ssl->hmac(ssl, hmac,
  14738. output + args->headerSz + args->ivSz, inSz,
  14739. -1, type, 0, epochOrder);
  14740. XMEMCPY(output + args->idx, hmac, args->digestSz);
  14741. #ifdef WOLFSSL_SMALL_STACK
  14742. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  14743. #endif
  14744. }
  14745. else
  14746. #endif
  14747. {
  14748. ret = ssl->hmac(ssl, output + args->idx, output +
  14749. args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
  14750. }
  14751. }
  14752. #endif /* WOLFSSL_AEAD_ONLY */
  14753. if (ret != 0)
  14754. goto exit_buildmsg;
  14755. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  14756. }
  14757. FALL_THROUGH;
  14758. case BUILD_MSG_ENCRYPT:
  14759. {
  14760. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  14761. /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
  14762. * for all encryption algos that use it for encryption parameters */
  14763. word16 dtls_epoch = 0;
  14764. word16 dtls_sequence_number_hi = 0;
  14765. word32 dtls_sequence_number_lo = 0;
  14766. int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
  14767. DtlsUseSCRKeys(ssl);
  14768. if (swap_seq) {
  14769. dtls_epoch = ssl->keys.dtls_epoch;
  14770. dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
  14771. dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
  14772. ssl->keys.dtls_epoch--;
  14773. ssl->keys.dtls_sequence_number_hi =
  14774. ssl->keys.dtls_prev_sequence_number_hi;
  14775. ssl->keys.dtls_sequence_number_lo =
  14776. ssl->keys.dtls_prev_sequence_number_lo;
  14777. }
  14778. #endif
  14779. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14780. if (ssl->options.startedETMWrite) {
  14781. ret = Encrypt(ssl, output + args->headerSz,
  14782. output + args->headerSz,
  14783. args->size - args->digestSz, asyncOkay);
  14784. }
  14785. else
  14786. #endif
  14787. {
  14788. ret = Encrypt(ssl, output + args->headerSz,
  14789. output + args->headerSz, args->size, asyncOkay);
  14790. }
  14791. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  14792. /* Restore sequence numbers */
  14793. if (swap_seq) {
  14794. ssl->keys.dtls_epoch = dtls_epoch;
  14795. ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
  14796. ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
  14797. }
  14798. #endif
  14799. if (ret != 0)
  14800. goto exit_buildmsg;
  14801. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  14802. }
  14803. FALL_THROUGH;
  14804. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  14805. {
  14806. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14807. if (ssl->options.startedETMWrite) {
  14808. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  14809. #ifdef HAVE_TRUNCATED_HMAC
  14810. if (ssl->truncated_hmac &&
  14811. ssl->specs.hash_size > args->digestSz) {
  14812. #ifdef WOLFSSL_SMALL_STACK
  14813. byte* hmac = NULL;
  14814. #else
  14815. byte hmac[WC_MAX_DIGEST_SIZE];
  14816. #endif
  14817. #ifdef WOLFSSL_SMALL_STACK
  14818. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  14819. DYNAMIC_TYPE_DIGEST);
  14820. if (hmac == NULL)
  14821. ERROR_OUT(MEMORY_E, exit_buildmsg);
  14822. #endif
  14823. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  14824. args->ivSz + inSz + args->pad + 1, -1, type,
  14825. 0, epochOrder);
  14826. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  14827. args->digestSz);
  14828. #ifdef WOLFSSL_SMALL_STACK
  14829. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  14830. #endif
  14831. }
  14832. else
  14833. #endif
  14834. {
  14835. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  14836. output + args->headerSz,
  14837. args->ivSz + inSz + args->pad + 1, -1, type,
  14838. 0, epochOrder);
  14839. }
  14840. }
  14841. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  14842. }
  14843. }
  14844. exit_buildmsg:
  14845. WOLFSSL_LEAVE("BuildMessage", ret);
  14846. #ifdef WOLFSSL_ASYNC_CRYPT
  14847. if (ret == WC_PENDING_E) {
  14848. return ret;
  14849. }
  14850. #endif
  14851. /* make sure build message state is reset */
  14852. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  14853. #ifdef WOLFSSL_DTLS
  14854. if (ret == 0 && ssl->options.dtls)
  14855. DtlsSEQIncrement(ssl, epochOrder);
  14856. #endif
  14857. /* return sz on success */
  14858. if (ret == 0)
  14859. ret = args->sz;
  14860. /* Final cleanup */
  14861. FreeBuildMsgArgs(ssl, args);
  14862. return ret;
  14863. #endif /* !WOLFSSL_NO_TLS12 */
  14864. }
  14865. #ifndef WOLFSSL_NO_TLS12
  14866. int SendFinished(WOLFSSL* ssl)
  14867. {
  14868. int sendSz,
  14869. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  14870. FINISHED_SZ;
  14871. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  14872. byte *output;
  14873. Hashes* hashes;
  14874. int ret;
  14875. int headerSz = HANDSHAKE_HEADER_SZ;
  14876. int outputSz;
  14877. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  14878. WOLFSSL_ENTER("SendFinished");
  14879. /* check for available size */
  14880. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  14881. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  14882. return ret;
  14883. #ifdef WOLFSSL_DTLS
  14884. if (ssl->options.dtls) {
  14885. headerSz += DTLS_HANDSHAKE_EXTRA;
  14886. ssl->keys.dtls_epoch++;
  14887. ssl->keys.dtls_prev_sequence_number_hi =
  14888. ssl->keys.dtls_sequence_number_hi;
  14889. ssl->keys.dtls_prev_sequence_number_lo =
  14890. ssl->keys.dtls_sequence_number_lo;
  14891. ssl->keys.dtls_sequence_number_hi = 0;
  14892. ssl->keys.dtls_sequence_number_lo = 0;
  14893. }
  14894. #endif
  14895. /* get output buffer */
  14896. output = ssl->buffers.outputBuffer.buffer +
  14897. ssl->buffers.outputBuffer.length;
  14898. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  14899. /* make finished hashes */
  14900. hashes = (Hashes*)&input[headerSz];
  14901. ret = BuildFinished(ssl, hashes,
  14902. ssl->options.side == WOLFSSL_CLIENT_END ? client : server);
  14903. if (ret != 0) return ret;
  14904. #ifdef HAVE_SECURE_RENEGOTIATION
  14905. if (ssl->secure_renegotiation) {
  14906. if (ssl->options.side == WOLFSSL_CLIENT_END)
  14907. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  14908. TLS_FINISHED_SZ);
  14909. else
  14910. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  14911. TLS_FINISHED_SZ);
  14912. }
  14913. #endif
  14914. #ifdef OPENSSL_ALL
  14915. if (ssl->options.side == WOLFSSL_CLIENT_END)
  14916. XMEMCPY(ssl->clientFinished,
  14917. hashes, TLS_FINISHED_SZ);
  14918. else
  14919. XMEMCPY(ssl->serverFinished,
  14920. hashes, TLS_FINISHED_SZ);
  14921. #endif
  14922. #ifdef WOLFSSL_DTLS
  14923. if (IsDtlsNotSctpMode(ssl)) {
  14924. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz, finished)) != 0)
  14925. return ret;
  14926. }
  14927. #endif
  14928. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  14929. handshake, 1, 0, 0, CUR_ORDER);
  14930. if (sendSz < 0)
  14931. return BUILD_MSG_ERROR;
  14932. if (!ssl->options.resuming) {
  14933. #ifndef NO_SESSION_CACHE
  14934. AddSession(ssl); /* just try */
  14935. #endif
  14936. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14937. #ifdef OPENSSL_EXTRA
  14938. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  14939. ssl->cbmode = SSL_CB_MODE_WRITE;
  14940. if (ssl->CBIS != NULL)
  14941. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  14942. #endif
  14943. ssl->options.handShakeState = HANDSHAKE_DONE;
  14944. ssl->options.handShakeDone = 1;
  14945. }
  14946. }
  14947. else {
  14948. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14949. #ifdef OPENSSL_EXTRA
  14950. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  14951. ssl->cbmode = SSL_CB_MODE_WRITE;
  14952. if (ssl->CBIS != NULL)
  14953. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  14954. #endif
  14955. ssl->options.handShakeState = HANDSHAKE_DONE;
  14956. ssl->options.handShakeDone = 1;
  14957. }
  14958. }
  14959. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14960. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  14961. if (ssl->toInfoOn)
  14962. AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  14963. WRITE_PROTO, ssl->heap);
  14964. #endif
  14965. ssl->buffers.outputBuffer.length += sendSz;
  14966. ret = SendBuffered(ssl);
  14967. #ifdef WOLFSSL_DTLS
  14968. if ((!ssl->options.resuming &&
  14969. ssl->options.side == WOLFSSL_SERVER_END) ||
  14970. (ssl->options.resuming &&
  14971. ssl->options.side == WOLFSSL_CLIENT_END)) {
  14972. ssl->keys.dtls_handshake_number = 0;
  14973. ssl->keys.dtls_expected_peer_handshake_number = 0;
  14974. }
  14975. #endif
  14976. WOLFSSL_LEAVE("SendFinished", ret);
  14977. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  14978. return ret;
  14979. }
  14980. #endif /* WOLFSSL_NO_TLS12 */
  14981. #ifndef NO_WOLFSSL_SERVER
  14982. #if (!defined(WOLFSSL_NO_TLS12) && \
  14983. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  14984. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  14985. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  14986. /* Parses and decodes the certificate then initializes "request". In the case
  14987. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  14988. *
  14989. * Returns 0 on success
  14990. */
  14991. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  14992. DecodedCert* cert, byte* certData, word32 length)
  14993. {
  14994. int ret;
  14995. if (request != NULL)
  14996. XMEMSET(request, 0, sizeof(OcspRequest));
  14997. InitDecodedCert(cert, certData, length, ssl->heap);
  14998. /* TODO: Setup async support here */
  14999. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, ssl->ctx->cm);
  15000. if (ret != 0) {
  15001. WOLFSSL_MSG("ParseCert failed");
  15002. }
  15003. if (ret == 0)
  15004. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  15005. if (ret == 0) {
  15006. /* make sure ctx OCSP request is updated */
  15007. if (!ssl->buffers.weOwnCert) {
  15008. wolfSSL_Mutex* ocspLock = &ssl->ctx->cm->ocsp_stapling->ocspLock;
  15009. if (wc_LockMutex(ocspLock) == 0) {
  15010. if (ssl->ctx->certOcspRequest == NULL)
  15011. ssl->ctx->certOcspRequest = request;
  15012. wc_UnLockMutex(ocspLock);
  15013. }
  15014. }
  15015. }
  15016. FreeDecodedCert(cert);
  15017. return ret;
  15018. }
  15019. /* Creates OCSP response and places it in variable "response". Memory
  15020. * management for "buffer* response" is up to the caller.
  15021. *
  15022. * Also creates an OcspRequest in the case that ocspRequest is null or that
  15023. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  15024. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  15025. * be set to point to "ocspRequest" and it then should not be free'd since
  15026. * wolfSSL_CTX_free will take care of it.
  15027. *
  15028. * Returns 0 on success
  15029. */
  15030. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  15031. buffer* response)
  15032. {
  15033. int ret = 0;
  15034. OcspRequest* request = NULL;
  15035. byte createdRequest = 0;
  15036. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  15037. return BAD_FUNC_ARG;
  15038. XMEMSET(response, 0, sizeof(*response));
  15039. request = *ocspRequest;
  15040. /* unable to fetch status. skip. */
  15041. if (ssl->ctx->cm == NULL || ssl->ctx->cm->ocspStaplingEnabled == 0)
  15042. return 0;
  15043. if (request == NULL || ssl->buffers.weOwnCert) {
  15044. DerBuffer* der = ssl->buffers.certificate;
  15045. #ifdef WOLFSSL_SMALL_STACK
  15046. DecodedCert* cert = NULL;
  15047. #else
  15048. DecodedCert cert[1];
  15049. #endif
  15050. /* unable to fetch status. skip. */
  15051. if (der->buffer == NULL || der->length == 0)
  15052. return 0;
  15053. #ifdef WOLFSSL_SMALL_STACK
  15054. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  15055. DYNAMIC_TYPE_DCERT);
  15056. if (cert == NULL)
  15057. return MEMORY_E;
  15058. #endif
  15059. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  15060. DYNAMIC_TYPE_OCSP_REQUEST);
  15061. if (request == NULL)
  15062. ret = MEMORY_E;
  15063. createdRequest = 1;
  15064. if (ret == 0) {
  15065. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  15066. der->length);
  15067. }
  15068. if (ret != 0) {
  15069. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15070. request = NULL;
  15071. }
  15072. #ifdef WOLFSSL_SMALL_STACK
  15073. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  15074. #endif
  15075. }
  15076. if (ret == 0) {
  15077. request->ssl = ssl;
  15078. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling, request, response);
  15079. /* Suppressing, not critical */
  15080. if (ret == OCSP_CERT_REVOKED ||
  15081. ret == OCSP_CERT_UNKNOWN ||
  15082. ret == OCSP_LOOKUP_FAIL) {
  15083. ret = 0;
  15084. }
  15085. }
  15086. /* free request up if error case found otherwise return it */
  15087. if (ret != 0 && createdRequest) {
  15088. FreeOcspRequest(request);
  15089. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15090. }
  15091. if (ret == 0)
  15092. *ocspRequest = request;
  15093. return ret;
  15094. }
  15095. #endif
  15096. #endif /* !NO_WOLFSSL_SERVER */
  15097. #if (!defined(WOLFSSL_NO_TLS12) && !defined(NO_CERTS)) \
  15098. || (defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER))
  15099. static int cipherExtraData(WOLFSSL* ssl)
  15100. {
  15101. /* Cipher data that may be added by BuildMessage */
  15102. return ssl->specs.hash_size + ssl->specs.block_size +
  15103. ssl->specs.aead_mac_size + ssl->specs.iv_size +
  15104. ssl->specs.pad_size;
  15105. }
  15106. #endif
  15107. #ifndef WOLFSSL_NO_TLS12
  15108. #ifndef NO_CERTS
  15109. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  15110. /* handle generation of certificate (11) */
  15111. int SendCertificate(WOLFSSL* ssl)
  15112. {
  15113. int ret = 0;
  15114. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  15115. word32 length, maxFragment;
  15116. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  15117. WOLFSSL_ENTER("SendCertificate");
  15118. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  15119. return 0; /* not needed */
  15120. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  15121. #ifdef OPENSSL_EXTRA
  15122. if (ssl->version.major == SSLv3_MAJOR
  15123. && ssl->version.minor == SSLv3_MINOR){
  15124. SendAlert(ssl, alert_warning, no_certificate);
  15125. return 0;
  15126. } else {
  15127. #endif
  15128. certSz = 0;
  15129. certChainSz = 0;
  15130. headerSz = CERT_HEADER_SZ;
  15131. length = CERT_HEADER_SZ;
  15132. listSz = 0;
  15133. #ifdef OPENSSL_EXTRA
  15134. }
  15135. #endif
  15136. }
  15137. else {
  15138. if (!ssl->buffers.certificate) {
  15139. WOLFSSL_MSG("Send Cert missing certificate buffer");
  15140. return BUFFER_ERROR;
  15141. }
  15142. certSz = ssl->buffers.certificate->length;
  15143. headerSz = 2 * CERT_HEADER_SZ;
  15144. /* list + cert size */
  15145. length = certSz + headerSz;
  15146. listSz = certSz + CERT_HEADER_SZ;
  15147. /* may need to send rest of chain, already has leading size(s) */
  15148. if (certSz && ssl->buffers.certChain) {
  15149. certChainSz = ssl->buffers.certChain->length;
  15150. length += certChainSz;
  15151. listSz += certChainSz;
  15152. }
  15153. else
  15154. certChainSz = 0;
  15155. }
  15156. payloadSz = length;
  15157. if (ssl->fragOffset != 0)
  15158. length -= (ssl->fragOffset + headerSz);
  15159. maxFragment = MAX_RECORD_SIZE;
  15160. if (ssl->options.dtls) {
  15161. #ifdef WOLFSSL_DTLS
  15162. /* The 100 bytes is used to account for the UDP and IP headers.
  15163. It can also include the record padding and MAC if the
  15164. SendCertificate is called for a secure renegotiation. */
  15165. maxFragment = MAX_MTU - DTLS_RECORD_HEADER_SZ
  15166. - DTLS_HANDSHAKE_HEADER_SZ - 100;
  15167. #endif /* WOLFSSL_DTLS */
  15168. }
  15169. maxFragment = wolfSSL_GetMaxRecordSize(ssl, maxFragment);
  15170. while (length > 0 && ret == 0) {
  15171. byte* output = NULL;
  15172. word32 fragSz = 0;
  15173. word32 i = RECORD_HEADER_SZ;
  15174. int sendSz = RECORD_HEADER_SZ;
  15175. if (!ssl->options.dtls) {
  15176. if (ssl->fragOffset == 0) {
  15177. if (headerSz + certSz + certChainSz <=
  15178. maxFragment - HANDSHAKE_HEADER_SZ) {
  15179. fragSz = headerSz + certSz + certChainSz;
  15180. }
  15181. else {
  15182. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  15183. }
  15184. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  15185. i += HANDSHAKE_HEADER_SZ;
  15186. }
  15187. else {
  15188. fragSz = min(length, maxFragment);
  15189. sendSz += fragSz;
  15190. }
  15191. if (IsEncryptionOn(ssl, 1))
  15192. sendSz += MAX_MSG_EXTRA;
  15193. }
  15194. else {
  15195. #ifdef WOLFSSL_DTLS
  15196. fragSz = min(length, maxFragment);
  15197. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA
  15198. + HANDSHAKE_HEADER_SZ;
  15199. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA
  15200. + HANDSHAKE_HEADER_SZ;
  15201. #endif
  15202. }
  15203. if (IsEncryptionOn(ssl, 1))
  15204. sendSz += cipherExtraData(ssl);
  15205. /* check for available size */
  15206. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  15207. return ret;
  15208. /* get output buffer */
  15209. output = ssl->buffers.outputBuffer.buffer +
  15210. ssl->buffers.outputBuffer.length;
  15211. if (ssl->fragOffset == 0) {
  15212. if (!ssl->options.dtls) {
  15213. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  15214. if (!IsEncryptionOn(ssl, 1))
  15215. HashRaw(ssl, output + RECORD_HEADER_SZ,
  15216. HANDSHAKE_HEADER_SZ);
  15217. }
  15218. else {
  15219. #ifdef WOLFSSL_DTLS
  15220. AddHeaders(output, payloadSz, certificate, ssl);
  15221. HashRaw(ssl,
  15222. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  15223. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  15224. /* Adding the headers increments these, decrement them for
  15225. * actual message header. */
  15226. ssl->keys.dtls_handshake_number--;
  15227. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  15228. ssl->keys.dtls_handshake_number--;
  15229. #endif /* WOLFSSL_DTLS */
  15230. }
  15231. /* list total */
  15232. c32to24(listSz, output + i);
  15233. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  15234. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  15235. i += CERT_HEADER_SZ;
  15236. length -= CERT_HEADER_SZ;
  15237. fragSz -= CERT_HEADER_SZ;
  15238. if (certSz) {
  15239. c32to24(certSz, output + i);
  15240. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  15241. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  15242. i += CERT_HEADER_SZ;
  15243. length -= CERT_HEADER_SZ;
  15244. fragSz -= CERT_HEADER_SZ;
  15245. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
  15246. HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  15247. if (certChainSz)
  15248. HashRaw(ssl, ssl->buffers.certChain->buffer,
  15249. certChainSz);
  15250. }
  15251. }
  15252. }
  15253. else {
  15254. if (!ssl->options.dtls) {
  15255. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  15256. }
  15257. else {
  15258. #ifdef WOLFSSL_DTLS
  15259. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  15260. payloadSz, certificate, ssl);
  15261. ssl->keys.dtls_handshake_number--;
  15262. #endif /* WOLFSSL_DTLS */
  15263. }
  15264. }
  15265. /* member */
  15266. if (certSz && ssl->fragOffset < certSz) {
  15267. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  15268. XMEMCPY(output + i,
  15269. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  15270. i += copySz;
  15271. ssl->fragOffset += copySz;
  15272. length -= copySz;
  15273. fragSz -= copySz;
  15274. }
  15275. if (certChainSz && fragSz) {
  15276. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  15277. XMEMCPY(output + i,
  15278. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  15279. copySz);
  15280. i += copySz;
  15281. ssl->fragOffset += copySz;
  15282. length -= copySz;
  15283. }
  15284. if (IsEncryptionOn(ssl, 1)) {
  15285. byte* input = NULL;
  15286. int inputSz = i; /* build msg adds rec hdr */
  15287. int recordHeaderSz = RECORD_HEADER_SZ;
  15288. if (ssl->options.dtls)
  15289. recordHeaderSz += DTLS_RECORD_EXTRA;
  15290. inputSz -= recordHeaderSz;
  15291. if (inputSz < 0) {
  15292. WOLFSSL_MSG("Send Cert bad inputSz");
  15293. return BUFFER_E;
  15294. }
  15295. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  15296. input = (byte*)XMALLOC(inputSz, ssl->heap,
  15297. DYNAMIC_TYPE_IN_BUFFER);
  15298. if (input == NULL)
  15299. return MEMORY_E;
  15300. XMEMCPY(input, output + recordHeaderSz, inputSz);
  15301. }
  15302. #ifndef WOLFSSL_DTLS
  15303. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15304. handshake, 1, 0, 0, CUR_ORDER);
  15305. #else
  15306. if (!ssl->options.dtls)
  15307. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15308. handshake, 1, 0, 0, CUR_ORDER);
  15309. else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
  15310. * calculate the hash ourselves above */ {
  15311. if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
  15312. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15313. return ret;
  15314. }
  15315. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15316. handshake, 0, 0, 0, CUR_ORDER);
  15317. }
  15318. #endif
  15319. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15320. if (sendSz < 0)
  15321. return sendSz;
  15322. }
  15323. else {
  15324. sendSz = i;
  15325. #ifdef WOLFSSL_DTLS
  15326. if (IsDtlsNotSctpMode(ssl)) {
  15327. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
  15328. return ret;
  15329. }
  15330. if (ssl->options.dtls)
  15331. DtlsSEQIncrement(ssl, CUR_ORDER);
  15332. #endif
  15333. }
  15334. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15335. if (ssl->hsInfoOn)
  15336. AddPacketName(ssl, "Certificate");
  15337. if (ssl->toInfoOn)
  15338. AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  15339. WRITE_PROTO, ssl->heap);
  15340. #endif
  15341. ssl->buffers.outputBuffer.length += sendSz;
  15342. if (!ssl->options.groupMessages)
  15343. ret = SendBuffered(ssl);
  15344. }
  15345. if (ret != WANT_WRITE) {
  15346. /* Clean up the fragment offset. */
  15347. ssl->fragOffset = 0;
  15348. #ifdef WOLFSSL_DTLS
  15349. if (ssl->options.dtls)
  15350. ssl->keys.dtls_handshake_number++;
  15351. #endif
  15352. if (ssl->options.side == WOLFSSL_SERVER_END){
  15353. ssl->options.serverState = SERVER_CERT_COMPLETE;
  15354. }
  15355. }
  15356. WOLFSSL_LEAVE("SendCertificate", ret);
  15357. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  15358. return ret;
  15359. }
  15360. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  15361. /* handle generation of certificate_request (13) */
  15362. int SendCertificateRequest(WOLFSSL* ssl)
  15363. {
  15364. byte *output;
  15365. int ret;
  15366. int sendSz;
  15367. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  15368. word32 dnLen = 0;
  15369. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  15370. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  15371. #endif
  15372. int typeTotal = 1; /* only 1 for now */
  15373. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  15374. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  15375. WOLFSSL_ENTER("SendCertificateRequest");
  15376. if (IsAtLeastTLSv1_2(ssl))
  15377. reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz;
  15378. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  15379. /* Certificate Authorities */
  15380. names = ssl->ctx->ca_names;
  15381. while (names != NULL) {
  15382. byte seq[MAX_SEQ_SZ];
  15383. /* 16-bit length | SEQ | Len | DER of name */
  15384. dnLen += OPAQUE16_LEN + SetSequence(names->data.name->rawLen, seq) +
  15385. names->data.name->rawLen;
  15386. names = names->next;
  15387. }
  15388. reqSz += dnLen;
  15389. #endif
  15390. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  15391. return 0; /* not needed */
  15392. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  15393. if (!ssl->options.dtls) {
  15394. if (IsEncryptionOn(ssl, 1))
  15395. sendSz += MAX_MSG_EXTRA;
  15396. }
  15397. else {
  15398. #ifdef WOLFSSL_DTLS
  15399. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  15400. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  15401. #endif
  15402. }
  15403. if (IsEncryptionOn(ssl, 1))
  15404. sendSz += cipherExtraData(ssl);
  15405. /* check for available size */
  15406. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  15407. return ret;
  15408. /* get output buffer */
  15409. output = ssl->buffers.outputBuffer.buffer +
  15410. ssl->buffers.outputBuffer.length;
  15411. AddHeaders(output, reqSz, certificate_request, ssl);
  15412. /* write to output */
  15413. output[i++] = (byte)typeTotal; /* # of types */
  15414. #ifdef HAVE_ECC
  15415. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  15416. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  15417. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  15418. output[i++] = ecdsa_sign;
  15419. } else
  15420. #endif /* HAVE_ECC */
  15421. {
  15422. output[i++] = rsa_sign;
  15423. }
  15424. /* supported hash/sig */
  15425. if (IsAtLeastTLSv1_2(ssl)) {
  15426. c16toa(ssl->suites->hashSigAlgoSz, &output[i]);
  15427. i += OPAQUE16_LEN;
  15428. XMEMCPY(&output[i],
  15429. ssl->suites->hashSigAlgo, ssl->suites->hashSigAlgoSz);
  15430. i += ssl->suites->hashSigAlgoSz;
  15431. }
  15432. /* Certificate Authorities */
  15433. c16toa((word16)dnLen, &output[i]); /* auth's */
  15434. i += REQ_HEADER_SZ;
  15435. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  15436. names = ssl->ctx->ca_names;
  15437. while (names != NULL) {
  15438. byte seq[MAX_SEQ_SZ];
  15439. c16toa((word16)names->data.name->rawLen +
  15440. SetSequence(names->data.name->rawLen, seq), &output[i]);
  15441. i += OPAQUE16_LEN;
  15442. i += SetSequence(names->data.name->rawLen, output + i);
  15443. XMEMCPY(output + i, names->data.name->raw, names->data.name->rawLen);
  15444. i += names->data.name->rawLen;
  15445. names = names->next;
  15446. }
  15447. #endif
  15448. (void)i;
  15449. if (IsEncryptionOn(ssl, 1)) {
  15450. byte* input = NULL;
  15451. int inputSz = i; /* build msg adds rec hdr */
  15452. int recordHeaderSz = RECORD_HEADER_SZ;
  15453. if (ssl->options.dtls)
  15454. recordHeaderSz += DTLS_RECORD_EXTRA;
  15455. inputSz -= recordHeaderSz;
  15456. if (inputSz <= 0) {
  15457. WOLFSSL_MSG("Send Cert Req bad inputSz");
  15458. return BUFFER_E;
  15459. }
  15460. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15461. if (input == NULL)
  15462. return MEMORY_E;
  15463. XMEMCPY(input, output + recordHeaderSz, inputSz);
  15464. #ifdef WOLFSSL_DTLS
  15465. if (IsDtlsNotSctpMode(ssl) &&
  15466. (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
  15467. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15468. return ret;
  15469. }
  15470. #endif
  15471. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15472. handshake, 1, 0, 0, CUR_ORDER);
  15473. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15474. if (sendSz < 0)
  15475. return sendSz;
  15476. } else {
  15477. sendSz = i;
  15478. #ifdef WOLFSSL_DTLS
  15479. if (IsDtlsNotSctpMode(ssl)) {
  15480. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
  15481. return ret;
  15482. }
  15483. if (ssl->options.dtls)
  15484. DtlsSEQIncrement(ssl, CUR_ORDER);
  15485. #endif
  15486. ret = HashOutput(ssl, output, sendSz, 0);
  15487. if (ret != 0)
  15488. return ret;
  15489. }
  15490. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15491. if (ssl->hsInfoOn)
  15492. AddPacketName(ssl, "CertificateRequest");
  15493. if (ssl->toInfoOn)
  15494. AddPacketInfo(ssl, "CertificateRequest", handshake, output, sendSz,
  15495. WRITE_PROTO, ssl->heap);
  15496. #endif
  15497. ssl->buffers.outputBuffer.length += sendSz;
  15498. if (ssl->options.groupMessages)
  15499. ret = 0;
  15500. else
  15501. ret = SendBuffered(ssl);
  15502. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  15503. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  15504. return ret;
  15505. }
  15506. #ifndef NO_WOLFSSL_SERVER
  15507. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  15508. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  15509. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  15510. byte count)
  15511. {
  15512. byte* output = NULL;
  15513. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  15514. word32 length = ENUM_LEN;
  15515. int sendSz = 0;
  15516. int ret = 0;
  15517. int i = 0;
  15518. WOLFSSL_ENTER("BuildCertificateStatus");
  15519. switch (type) {
  15520. case WOLFSSL_CSR2_OCSP_MULTI:
  15521. length += OPAQUE24_LEN;
  15522. FALL_THROUGH; /* followed by */
  15523. case WOLFSSL_CSR2_OCSP:
  15524. for (i = 0; i < count; i++)
  15525. length += OPAQUE24_LEN + status[i].length;
  15526. break;
  15527. default:
  15528. return 0;
  15529. }
  15530. sendSz = idx + length;
  15531. if (ssl->keys.encryptionOn)
  15532. sendSz += MAX_MSG_EXTRA;
  15533. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  15534. output = ssl->buffers.outputBuffer.buffer +
  15535. ssl->buffers.outputBuffer.length;
  15536. AddHeaders(output, length, certificate_status, ssl);
  15537. output[idx++] = type;
  15538. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  15539. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  15540. idx += OPAQUE24_LEN;
  15541. }
  15542. for (i = 0; i < count; i++) {
  15543. c32to24(status[i].length, output + idx);
  15544. idx += OPAQUE24_LEN;
  15545. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  15546. idx += status[i].length;
  15547. }
  15548. if (IsEncryptionOn(ssl, 1)) {
  15549. byte* input;
  15550. int inputSz = idx; /* build msg adds rec hdr */
  15551. int recordHeaderSz = RECORD_HEADER_SZ;
  15552. if (ssl->options.dtls)
  15553. recordHeaderSz += DTLS_RECORD_EXTRA;
  15554. inputSz -= recordHeaderSz;
  15555. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15556. if (input == NULL)
  15557. return MEMORY_E;
  15558. XMEMCPY(input, output + recordHeaderSz, inputSz);
  15559. #ifdef WOLFSSL_DTLS
  15560. ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
  15561. #endif
  15562. if (ret == 0)
  15563. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15564. handshake, 1, 0, 0, CUR_ORDER);
  15565. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15566. if (sendSz < 0)
  15567. ret = sendSz;
  15568. }
  15569. else {
  15570. #ifdef WOLFSSL_DTLS
  15571. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  15572. ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
  15573. if (ret == 0 && ssl->options.dtls)
  15574. DtlsSEQIncrement(ssl, CUR_ORDER);
  15575. #endif
  15576. ret = HashOutput(ssl, output, sendSz, 0);
  15577. }
  15578. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15579. if (ret == 0 && ssl->hsInfoOn)
  15580. AddPacketName(ssl, "CertificateStatus");
  15581. if (ret == 0 && ssl->toInfoOn)
  15582. AddPacketInfo(ssl, "CertificateStatus", handshake, output, sendSz,
  15583. WRITE_PROTO, ssl->heap);
  15584. #endif
  15585. if (ret == 0) {
  15586. ssl->buffers.outputBuffer.length += sendSz;
  15587. if (!ssl->options.groupMessages)
  15588. ret = SendBuffered(ssl);
  15589. }
  15590. }
  15591. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  15592. return ret;
  15593. }
  15594. #endif
  15595. #endif /* NO_WOLFSSL_SERVER */
  15596. /* handle generation of certificate_status (22) */
  15597. int SendCertificateStatus(WOLFSSL* ssl)
  15598. {
  15599. int ret = 0;
  15600. byte status_type = 0;
  15601. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  15602. WOLFSSL_ENTER("SendCertificateStatus");
  15603. (void) ssl;
  15604. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  15605. status_type = ssl->status_request;
  15606. #endif
  15607. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  15608. status_type = status_type ? status_type : ssl->status_request_v2;
  15609. #endif
  15610. switch (status_type) {
  15611. #ifndef NO_WOLFSSL_SERVER
  15612. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  15613. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  15614. /* case WOLFSSL_CSR_OCSP: */
  15615. case WOLFSSL_CSR2_OCSP:
  15616. {
  15617. OcspRequest* request = ssl->ctx->certOcspRequest;
  15618. buffer response;
  15619. ret = CreateOcspResponse(ssl, &request, &response);
  15620. /* if a request was successfully created and not stored in
  15621. * ssl->ctx then free it */
  15622. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  15623. FreeOcspRequest(request);
  15624. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15625. request = NULL;
  15626. }
  15627. if (ret == 0 && response.buffer) {
  15628. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  15629. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15630. response.buffer = NULL;
  15631. }
  15632. break;
  15633. }
  15634. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  15635. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  15636. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  15637. case WOLFSSL_CSR2_OCSP_MULTI:
  15638. {
  15639. OcspRequest* request = ssl->ctx->certOcspRequest;
  15640. buffer responses[1 + MAX_CHAIN_DEPTH];
  15641. int i = 0;
  15642. XMEMSET(responses, 0, sizeof(responses));
  15643. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  15644. /* if a request was successfully created and not stored in
  15645. * ssl->ctx then free it */
  15646. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  15647. FreeOcspRequest(request);
  15648. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15649. request = NULL;
  15650. }
  15651. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  15652. || ssl->buffers.weOwnCertChain)) {
  15653. buffer der;
  15654. word32 idx = 0;
  15655. #ifdef WOLFSSL_SMALL_STACK
  15656. DecodedCert* cert;
  15657. #else
  15658. DecodedCert cert[1];
  15659. #endif
  15660. DerBuffer* chain;
  15661. #ifdef WOLFSSL_SMALL_STACK
  15662. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  15663. DYNAMIC_TYPE_DCERT);
  15664. if (cert == NULL)
  15665. return MEMORY_E;
  15666. #endif
  15667. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  15668. DYNAMIC_TYPE_OCSP_REQUEST);
  15669. if (request == NULL) {
  15670. #ifdef WOLFSSL_SMALL_STACK
  15671. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  15672. #endif
  15673. return MEMORY_E;
  15674. }
  15675. /* use certChain if available, otherwise use peer certificate */
  15676. chain = ssl->buffers.certChain;
  15677. if (chain == NULL) {
  15678. chain = ssl->buffers.certificate;
  15679. }
  15680. while (chain && idx + OPAQUE24_LEN < chain->length) {
  15681. c24to32(chain->buffer + idx, &der.length);
  15682. idx += OPAQUE24_LEN;
  15683. der.buffer = chain->buffer + idx;
  15684. idx += der.length;
  15685. if (idx > chain->length)
  15686. break;
  15687. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  15688. der.length);
  15689. if (ret == 0) {
  15690. request->ssl = ssl;
  15691. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling,
  15692. request, &responses[i + 1]);
  15693. /* Suppressing, not critical */
  15694. if (ret == OCSP_CERT_REVOKED ||
  15695. ret == OCSP_CERT_UNKNOWN ||
  15696. ret == OCSP_LOOKUP_FAIL) {
  15697. ret = 0;
  15698. }
  15699. i++;
  15700. FreeOcspRequest(request);
  15701. }
  15702. }
  15703. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15704. #ifdef WOLFSSL_SMALL_STACK
  15705. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  15706. #endif
  15707. }
  15708. else {
  15709. while (ret == 0 &&
  15710. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  15711. request->ssl = ssl;
  15712. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling,
  15713. request, &responses[++i]);
  15714. /* Suppressing, not critical */
  15715. if (ret == OCSP_CERT_REVOKED ||
  15716. ret == OCSP_CERT_UNKNOWN ||
  15717. ret == OCSP_LOOKUP_FAIL) {
  15718. ret = 0;
  15719. }
  15720. }
  15721. }
  15722. if (responses[0].buffer) {
  15723. if (ret == 0) {
  15724. ret = BuildCertificateStatus(ssl, status_type, responses,
  15725. (byte)i + 1);
  15726. }
  15727. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  15728. if (responses[i].buffer) {
  15729. XFREE(responses[i].buffer, ssl->heap,
  15730. DYNAMIC_TYPE_OCSP_REQUEST);
  15731. }
  15732. }
  15733. }
  15734. break;
  15735. }
  15736. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  15737. #endif /* NO_WOLFSSL_SERVER */
  15738. default:
  15739. break;
  15740. }
  15741. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  15742. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  15743. return ret;
  15744. }
  15745. #endif /* !NO_CERTS */
  15746. #endif /* WOLFSSL_NO_TLS12 */
  15747. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  15748. /**
  15749. * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
  15750. */
  15751. int DtlsSCRKeysSet(WOLFSSL* ssl)
  15752. {
  15753. return ssl->secure_renegotiation &&
  15754. ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
  15755. }
  15756. /**
  15757. * ssl->keys contains the current cipher parameters only for epoch 1. For
  15758. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  15759. * cipher parameters. This function checks if the message currently being
  15760. * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  15761. */
  15762. int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
  15763. {
  15764. return DtlsSCRKeysSet(ssl) &&
  15765. ssl->keys.curEpoch ==
  15766. ssl->secure_renegotiation->tmp_keys.dtls_epoch;
  15767. }
  15768. /**
  15769. * ssl->keys contains the current cipher parameters only for epoch 1. For
  15770. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  15771. * cipher parameters. This function checks if the message currently being
  15772. * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  15773. */
  15774. int DtlsUseSCRKeys(WOLFSSL* ssl)
  15775. {
  15776. return DtlsSCRKeysSet(ssl) &&
  15777. ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
  15778. ssl->keys.dtls_epoch;
  15779. }
  15780. /**
  15781. * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
  15782. * then PREV_ORDER refers to the current epoch.
  15783. * */
  15784. int DtlsCheckOrder(WOLFSSL* ssl, int order)
  15785. {
  15786. if (order == PREV_ORDER && ssl->secure_renegotiation &&
  15787. ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
  15788. return CUR_ORDER;
  15789. }
  15790. else {
  15791. return order;
  15792. }
  15793. }
  15794. #endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
  15795. /* If secure renegotiation is disabled, this will always return false.
  15796. * Otherwise it checks to see if we are currently renegotiating. */
  15797. int IsSCR(WOLFSSL* ssl)
  15798. {
  15799. #ifndef HAVE_SECURE_RENEGOTIATION
  15800. (void)ssl;
  15801. #else /* HAVE_SECURE_RENEGOTIATION */
  15802. if (ssl->secure_renegotiation &&
  15803. ssl->secure_renegotiation->enabled && /* Is SCR enabled? */
  15804. ssl->options.handShakeDone && /* At least one handshake done? */
  15805. ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
  15806. return 1;
  15807. #endif /* HAVE_SECURE_RENEGOTIATION */
  15808. return 0;
  15809. }
  15810. int SendData(WOLFSSL* ssl, const void* data, int sz)
  15811. {
  15812. int sent = 0, /* plainText size */
  15813. sendSz,
  15814. ret,
  15815. dtlsExtra = 0;
  15816. int groupMsgs = 0;
  15817. if (ssl->error == WANT_WRITE
  15818. #ifdef WOLFSSL_ASYNC_CRYPT
  15819. || ssl->error == WC_PENDING_E
  15820. #endif
  15821. ) {
  15822. ssl->error = 0;
  15823. }
  15824. /* don't allow write after decrypt or mac error */
  15825. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  15826. /* For DTLS allow these possible errors and allow the session
  15827. to continue despite them */
  15828. if (ssl->options.dtls) {
  15829. ssl->error = 0;
  15830. }
  15831. else {
  15832. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  15833. return WOLFSSL_FATAL_ERROR;
  15834. }
  15835. }
  15836. #ifdef WOLFSSL_EARLY_DATA
  15837. if (ssl->earlyData != no_early_data) {
  15838. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  15839. WOLFSSL_MSG("handshake complete, trying to send early data");
  15840. ssl->error = BUILD_MSG_ERROR;
  15841. return WOLFSSL_FATAL_ERROR;
  15842. }
  15843. #ifdef WOLFSSL_EARLY_DATA_GROUP
  15844. groupMsgs = 1;
  15845. #endif
  15846. }
  15847. else
  15848. #endif
  15849. if (ssl->options.handShakeState != HANDSHAKE_DONE && !IsSCR(ssl)) {
  15850. int err;
  15851. WOLFSSL_MSG("handshake not complete, trying to finish");
  15852. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  15853. #ifdef WOLFSSL_ASYNC_CRYPT
  15854. /* if async would block return WANT_WRITE */
  15855. if (ssl->error == WC_PENDING_E) {
  15856. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  15857. }
  15858. #endif
  15859. return err;
  15860. }
  15861. }
  15862. /* last time system socket output buffer was full, try again to send */
  15863. if (!groupMsgs && ssl->buffers.outputBuffer.length > 0) {
  15864. WOLFSSL_MSG("output buffer was full, trying to send again");
  15865. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  15866. WOLFSSL_ERROR(ssl->error);
  15867. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  15868. ssl->options.isClosed)) {
  15869. ssl->error = SOCKET_PEER_CLOSED_E;
  15870. WOLFSSL_ERROR(ssl->error);
  15871. return 0; /* peer reset or closed */
  15872. }
  15873. return ssl->error;
  15874. }
  15875. else {
  15876. /* advance sent to previous sent + plain size just sent */
  15877. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  15878. WOLFSSL_MSG("sent write buffered data");
  15879. if (sent > sz) {
  15880. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  15881. return ssl->error = BAD_FUNC_ARG;
  15882. }
  15883. }
  15884. }
  15885. #ifdef WOLFSSL_DTLS
  15886. if (ssl->options.dtls) {
  15887. dtlsExtra = DTLS_RECORD_EXTRA;
  15888. }
  15889. #endif
  15890. for (;;) {
  15891. int len;
  15892. byte* out;
  15893. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  15894. int buffSz; /* may switch on comp */
  15895. int outputSz;
  15896. #ifdef HAVE_LIBZ
  15897. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  15898. #endif
  15899. if (sent == sz) break;
  15900. len = wolfSSL_GetMaxRecordSize(ssl, sz - sent);
  15901. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
  15902. if (ssl->options.dtls && (len < sz - sent)) {
  15903. ssl->error = DTLS_SIZE_ERROR;
  15904. WOLFSSL_ERROR(ssl->error);
  15905. return ssl->error;
  15906. }
  15907. #endif
  15908. buffSz = len;
  15909. /* check for available size */
  15910. outputSz = len + COMP_EXTRA + dtlsExtra + MAX_MSG_EXTRA;
  15911. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  15912. return ssl->error = ret;
  15913. /* get output buffer */
  15914. out = ssl->buffers.outputBuffer.buffer +
  15915. ssl->buffers.outputBuffer.length;
  15916. #ifdef HAVE_LIBZ
  15917. if (ssl->options.usingCompression) {
  15918. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  15919. if (buffSz < 0) {
  15920. return buffSz;
  15921. }
  15922. sendBuffer = comp;
  15923. }
  15924. #endif
  15925. if (!ssl->options.tls1_3) {
  15926. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  15927. application_data, 0, 0, 1, CUR_ORDER);
  15928. }
  15929. else {
  15930. #ifdef WOLFSSL_TLS13
  15931. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  15932. application_data, 0, 0, 1);
  15933. #else
  15934. sendSz = BUFFER_ERROR;
  15935. #endif
  15936. }
  15937. if (sendSz < 0) {
  15938. #ifdef WOLFSSL_ASYNC_CRYPT
  15939. if (sendSz == WC_PENDING_E)
  15940. ssl->error = sendSz;
  15941. #endif
  15942. return BUILD_MSG_ERROR;
  15943. }
  15944. ssl->buffers.outputBuffer.length += sendSz;
  15945. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  15946. WOLFSSL_ERROR(ssl->error);
  15947. /* store for next call if WANT_WRITE or user embedSend() that
  15948. doesn't present like WANT_WRITE */
  15949. ssl->buffers.plainSz = len;
  15950. ssl->buffers.prevSent = sent;
  15951. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  15952. ssl->options.isClosed)) {
  15953. ssl->error = SOCKET_PEER_CLOSED_E;
  15954. WOLFSSL_ERROR(ssl->error);
  15955. return 0; /* peer reset or closed */
  15956. }
  15957. return ssl->error;
  15958. }
  15959. sent += len;
  15960. /* only one message per attempt */
  15961. if (ssl->options.partialWrite == 1) {
  15962. WOLFSSL_MSG("Partial Write on, only sending one record");
  15963. break;
  15964. }
  15965. }
  15966. return sent;
  15967. }
  15968. /* process input data */
  15969. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  15970. {
  15971. int size;
  15972. WOLFSSL_ENTER("ReceiveData()");
  15973. /* reset error state */
  15974. if (ssl->error == WANT_READ) {
  15975. ssl->error = 0;
  15976. }
  15977. #ifdef WOLFSSL_DTLS
  15978. if (ssl->options.dtls) {
  15979. /* In DTLS mode, we forgive some errors and allow the session
  15980. * to continue despite them. */
  15981. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR)
  15982. ssl->error = 0;
  15983. }
  15984. #endif /* WOLFSSL_DTLS */
  15985. if (ssl->error != 0 && ssl->error != WANT_WRITE
  15986. #ifdef WOLFSSL_ASYNC_CRYPT
  15987. && ssl->error != WC_PENDING_E
  15988. #endif
  15989. #ifdef HAVE_SECURE_RENEGOTIATION
  15990. && ssl->error != APP_DATA_READY
  15991. #endif
  15992. ) {
  15993. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  15994. return ssl->error;
  15995. }
  15996. #ifdef WOLFSSL_EARLY_DATA
  15997. if (ssl->earlyData != no_early_data) {
  15998. }
  15999. else
  16000. #endif
  16001. {
  16002. int negotiate = 0;
  16003. #ifdef HAVE_SECURE_RENEGOTIATION
  16004. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  16005. if (ssl->options.handShakeState != HANDSHAKE_DONE
  16006. && ssl->buffers.clearOutputBuffer.length == 0)
  16007. negotiate = 1;
  16008. }
  16009. else
  16010. #endif
  16011. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  16012. negotiate = 1;
  16013. if (negotiate) {
  16014. int err;
  16015. WOLFSSL_MSG("Handshake not complete, trying to finish");
  16016. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  16017. #ifdef WOLFSSL_ASYNC_CRYPT
  16018. /* if async would block return WANT_WRITE */
  16019. if (ssl->error == WC_PENDING_E) {
  16020. return WOLFSSL_CBIO_ERR_WANT_READ;
  16021. }
  16022. #endif
  16023. return err;
  16024. }
  16025. }
  16026. }
  16027. #ifdef HAVE_SECURE_RENEGOTIATION
  16028. startScr:
  16029. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  16030. int ret;
  16031. WOLFSSL_MSG("Need to start scr, server requested");
  16032. ret = wolfSSL_Rehandshake(ssl);
  16033. ssl->secure_renegotiation->startScr = 0; /* only start once */
  16034. if (ret != WOLFSSL_SUCCESS)
  16035. return ret;
  16036. }
  16037. #endif
  16038. while (ssl->buffers.clearOutputBuffer.length == 0) {
  16039. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  16040. WOLFSSL_ERROR(ssl->error);
  16041. if (ssl->error == ZERO_RETURN) {
  16042. WOLFSSL_MSG("Zero return, no more data coming");
  16043. return 0; /* no more data coming */
  16044. }
  16045. if (ssl->error == SOCKET_ERROR_E) {
  16046. if (ssl->options.connReset || ssl->options.isClosed) {
  16047. WOLFSSL_MSG("Peer reset or closed, connection done");
  16048. ssl->error = SOCKET_PEER_CLOSED_E;
  16049. WOLFSSL_ERROR(ssl->error);
  16050. return 0; /* peer reset or closed */
  16051. }
  16052. }
  16053. return ssl->error;
  16054. }
  16055. #ifdef HAVE_SECURE_RENEGOTIATION
  16056. if (ssl->secure_renegotiation &&
  16057. ssl->secure_renegotiation->startScr) {
  16058. goto startScr;
  16059. }
  16060. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  16061. ssl->options.handShakeState != HANDSHAKE_DONE
  16062. && ssl->buffers.clearOutputBuffer.length == 0) {
  16063. /* ProcessReply processed a handshake packet and not any APP DATA
  16064. * so let's move the handshake along */
  16065. int err;
  16066. WOLFSSL_MSG("Handshake not complete, trying to finish");
  16067. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  16068. #ifdef WOLFSSL_ASYNC_CRYPT
  16069. /* if async would block return WANT_WRITE */
  16070. if (ssl->error == WC_PENDING_E) {
  16071. return WOLFSSL_CBIO_ERR_WANT_READ;
  16072. }
  16073. #endif
  16074. return err;
  16075. }
  16076. }
  16077. #endif
  16078. #ifdef WOLFSSL_TLS13
  16079. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
  16080. ssl->curRL.type == handshake && peek) {
  16081. WOLFSSL_MSG("Got Handshake Messge in APP data");
  16082. if (ssl->buffers.inputBuffer.length == 0) {
  16083. ssl->error = WOLFSSL_ERROR_WANT_READ;
  16084. return 0;
  16085. }
  16086. }
  16087. #endif
  16088. }
  16089. size = min(sz, (int)ssl->buffers.clearOutputBuffer.length);
  16090. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  16091. if (peek == 0) {
  16092. ssl->buffers.clearOutputBuffer.length -= size;
  16093. ssl->buffers.clearOutputBuffer.buffer += size;
  16094. }
  16095. if (ssl->buffers.clearOutputBuffer.length == 0 &&
  16096. ssl->buffers.inputBuffer.dynamicFlag)
  16097. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  16098. WOLFSSL_LEAVE("ReceiveData()", size);
  16099. return size;
  16100. }
  16101. /* send alert message */
  16102. int SendAlert(WOLFSSL* ssl, int severity, int type)
  16103. {
  16104. byte input[ALERT_SIZE];
  16105. byte *output;
  16106. int sendSz;
  16107. int ret;
  16108. int outputSz;
  16109. int dtlsExtra = 0;
  16110. WOLFSSL_ENTER("SendAlert");
  16111. #ifdef HAVE_WRITE_DUP
  16112. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  16113. int notifyErr = 0;
  16114. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  16115. if (type == close_notify) {
  16116. notifyErr = ZERO_RETURN;
  16117. } else if (severity == alert_fatal) {
  16118. notifyErr = FATAL_ERROR;
  16119. }
  16120. if (notifyErr != 0) {
  16121. return NotifyWriteSide(ssl, notifyErr);
  16122. }
  16123. return 0;
  16124. }
  16125. #endif
  16126. /* if sendalert is called again for nonblocking */
  16127. if (ssl->options.sendAlertState != 0) {
  16128. ret = SendBuffered(ssl);
  16129. if (ret == 0)
  16130. ssl->options.sendAlertState = 0;
  16131. return ret;
  16132. }
  16133. #ifdef OPENSSL_EXTRA
  16134. if (ssl->CBIS != NULL) {
  16135. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  16136. }
  16137. #endif
  16138. #ifdef WOLFSSL_DTLS
  16139. if (ssl->options.dtls)
  16140. dtlsExtra = DTLS_RECORD_EXTRA;
  16141. #endif
  16142. /* check for available size */
  16143. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  16144. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  16145. return ret;
  16146. /* Check output buffer */
  16147. if (ssl->buffers.outputBuffer.buffer == NULL)
  16148. return BUFFER_E;
  16149. /* get output buffer */
  16150. output = ssl->buffers.outputBuffer.buffer +
  16151. ssl->buffers.outputBuffer.length;
  16152. input[0] = (byte)severity;
  16153. input[1] = (byte)type;
  16154. ssl->alert_history.last_tx.code = type;
  16155. ssl->alert_history.last_tx.level = severity;
  16156. if (severity == alert_fatal) {
  16157. ssl->options.isClosed = 1; /* Don't send close_notify */
  16158. }
  16159. /* send encrypted alert if encryption is on - can be a rehandshake over
  16160. * an existing encrypted channel.
  16161. * TLS 1.3 encrypts handshake packets after the ServerHello
  16162. */
  16163. if (IsEncryptionOn(ssl, 1)) {
  16164. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  16165. 0, 0, 0, CUR_ORDER);
  16166. }
  16167. else {
  16168. AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
  16169. output += RECORD_HEADER_SZ;
  16170. #ifdef WOLFSSL_DTLS
  16171. if (ssl->options.dtls)
  16172. output += DTLS_RECORD_EXTRA;
  16173. #endif
  16174. XMEMCPY(output, input, ALERT_SIZE);
  16175. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  16176. #ifdef WOLFSSL_DTLS
  16177. if (ssl->options.dtls)
  16178. sendSz += DTLS_RECORD_EXTRA;
  16179. #endif
  16180. }
  16181. if (sendSz < 0)
  16182. return BUILD_MSG_ERROR;
  16183. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16184. if (ssl->hsInfoOn)
  16185. AddPacketName(ssl, "Alert");
  16186. if (ssl->toInfoOn)
  16187. AddPacketInfo(ssl, "Alert", alert, output, sendSz, WRITE_PROTO,
  16188. ssl->heap);
  16189. #endif
  16190. ssl->buffers.outputBuffer.length += sendSz;
  16191. ssl->options.sendAlertState = 1;
  16192. ret = SendBuffered(ssl);
  16193. WOLFSSL_LEAVE("SendAlert", ret);
  16194. return ret;
  16195. }
  16196. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  16197. {
  16198. #ifdef NO_ERROR_STRINGS
  16199. (void)e;
  16200. return "no support for error strings built in";
  16201. #else
  16202. int error = (int)e;
  16203. /* pass to wolfCrypt */
  16204. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  16205. return wc_GetErrorString(error);
  16206. }
  16207. switch (error) {
  16208. #ifdef WOLFSSL_WPAS
  16209. case 0 :
  16210. return "ok";
  16211. #endif
  16212. case UNSUPPORTED_SUITE :
  16213. return "unsupported cipher suite";
  16214. case INPUT_CASE_ERROR :
  16215. return "input state error";
  16216. case PREFIX_ERROR :
  16217. return "bad index to key rounds";
  16218. case MEMORY_ERROR :
  16219. return "out of memory";
  16220. case VERIFY_FINISHED_ERROR :
  16221. return "verify problem on finished";
  16222. case VERIFY_MAC_ERROR :
  16223. return "verify mac problem";
  16224. case PARSE_ERROR :
  16225. return "parse error on header";
  16226. case SIDE_ERROR :
  16227. return "wrong client/server type";
  16228. case NO_PEER_CERT :
  16229. return "peer didn't send cert";
  16230. case UNKNOWN_HANDSHAKE_TYPE :
  16231. return "weird handshake type";
  16232. case SOCKET_ERROR_E :
  16233. return "error state on socket";
  16234. case SOCKET_NODATA :
  16235. return "expected data, not there";
  16236. case INCOMPLETE_DATA :
  16237. return "don't have enough data to complete task";
  16238. case UNKNOWN_RECORD_TYPE :
  16239. return "unknown type in record hdr";
  16240. case DECRYPT_ERROR :
  16241. return "error during decryption";
  16242. case FATAL_ERROR :
  16243. return "received alert fatal error";
  16244. case ENCRYPT_ERROR :
  16245. return "error during encryption";
  16246. case FREAD_ERROR :
  16247. return "fread problem";
  16248. case NO_PEER_KEY :
  16249. return "need peer's key";
  16250. case NO_PRIVATE_KEY :
  16251. return "need the private key";
  16252. case NO_DH_PARAMS :
  16253. return "server missing DH params";
  16254. case RSA_PRIVATE_ERROR :
  16255. return "error during rsa priv op";
  16256. case MATCH_SUITE_ERROR :
  16257. return "can't match cipher suite";
  16258. case COMPRESSION_ERROR :
  16259. return "compression mismatch error";
  16260. case BUILD_MSG_ERROR :
  16261. return "build message failure";
  16262. case BAD_HELLO :
  16263. return "client hello malformed";
  16264. case DOMAIN_NAME_MISMATCH :
  16265. return "peer subject name mismatch";
  16266. case IPADDR_MISMATCH :
  16267. return "peer ip address mismatch";
  16268. case WANT_READ :
  16269. case WOLFSSL_ERROR_WANT_READ :
  16270. return "non-blocking socket wants data to be read";
  16271. case NOT_READY_ERROR :
  16272. return "handshake layer not ready yet, complete first";
  16273. case VERSION_ERROR :
  16274. return "record layer version error";
  16275. case WANT_WRITE :
  16276. case WOLFSSL_ERROR_WANT_WRITE :
  16277. return "non-blocking socket write buffer full";
  16278. case BUFFER_ERROR :
  16279. return "malformed buffer input error";
  16280. case VERIFY_CERT_ERROR :
  16281. return "verify problem on certificate";
  16282. case VERIFY_SIGN_ERROR :
  16283. return "verify problem based on signature";
  16284. case CLIENT_ID_ERROR :
  16285. return "psk client identity error";
  16286. case SERVER_HINT_ERROR:
  16287. return "psk server hint error";
  16288. case PSK_KEY_ERROR:
  16289. return "psk key callback error";
  16290. case NTRU_KEY_ERROR:
  16291. return "NTRU key error";
  16292. case NTRU_DRBG_ERROR:
  16293. return "NTRU drbg error";
  16294. case NTRU_ENCRYPT_ERROR:
  16295. return "NTRU encrypt error";
  16296. case NTRU_DECRYPT_ERROR:
  16297. return "NTRU decrypt error";
  16298. case GETTIME_ERROR:
  16299. return "gettimeofday() error";
  16300. case GETITIMER_ERROR:
  16301. return "getitimer() error";
  16302. case SIGACT_ERROR:
  16303. return "sigaction() error";
  16304. case SETITIMER_ERROR:
  16305. return "setitimer() error";
  16306. case LENGTH_ERROR:
  16307. return "record layer length error";
  16308. case PEER_KEY_ERROR:
  16309. return "cant decode peer key";
  16310. case ZERO_RETURN:
  16311. case WOLFSSL_ERROR_ZERO_RETURN:
  16312. return "peer sent close notify alert";
  16313. case ECC_CURVETYPE_ERROR:
  16314. return "Bad ECC Curve Type or unsupported";
  16315. case ECC_CURVE_ERROR:
  16316. return "Bad ECC Curve or unsupported";
  16317. case ECC_PEERKEY_ERROR:
  16318. return "Bad ECC Peer Key";
  16319. case ECC_MAKEKEY_ERROR:
  16320. return "ECC Make Key failure";
  16321. case ECC_EXPORT_ERROR:
  16322. return "ECC Export Key failure";
  16323. case ECC_SHARED_ERROR:
  16324. return "ECC DHE shared failure";
  16325. case NOT_CA_ERROR:
  16326. return "Not a CA by basic constraint error";
  16327. case HTTP_TIMEOUT:
  16328. return "HTTP timeout for OCSP or CRL req";
  16329. case BAD_CERT_MANAGER_ERROR:
  16330. return "Bad Cert Manager error";
  16331. case OCSP_CERT_REVOKED:
  16332. return "OCSP Cert revoked";
  16333. case CRL_CERT_REVOKED:
  16334. return "CRL Cert revoked";
  16335. case CRL_MISSING:
  16336. return "CRL missing, not loaded";
  16337. case MONITOR_SETUP_E:
  16338. return "CRL monitor setup error";
  16339. case THREAD_CREATE_E:
  16340. return "Thread creation problem";
  16341. case OCSP_NEED_URL:
  16342. return "OCSP need URL";
  16343. case OCSP_CERT_UNKNOWN:
  16344. return "OCSP Cert unknown";
  16345. case OCSP_LOOKUP_FAIL:
  16346. return "OCSP Responder lookup fail";
  16347. case MAX_CHAIN_ERROR:
  16348. return "Maximum Chain Depth Exceeded";
  16349. case COOKIE_ERROR:
  16350. return "DTLS Cookie Error";
  16351. case SEQUENCE_ERROR:
  16352. return "DTLS Sequence Error";
  16353. case SUITES_ERROR:
  16354. return "Suites Pointer Error";
  16355. case OUT_OF_ORDER_E:
  16356. return "Out of order message, fatal";
  16357. case BAD_KEA_TYPE_E:
  16358. return "Bad KEA type found";
  16359. case SANITY_CIPHER_E:
  16360. return "Sanity check on ciphertext failed";
  16361. case RECV_OVERFLOW_E:
  16362. return "Receive callback returned more than requested";
  16363. case GEN_COOKIE_E:
  16364. return "Generate Cookie Error";
  16365. case NO_PEER_VERIFY:
  16366. return "Need peer certificate verify Error";
  16367. case FWRITE_ERROR:
  16368. return "fwrite Error";
  16369. case CACHE_MATCH_ERROR:
  16370. return "Cache restore header match Error";
  16371. case UNKNOWN_SNI_HOST_NAME_E:
  16372. return "Unrecognized host name Error";
  16373. case UNKNOWN_MAX_FRAG_LEN_E:
  16374. return "Unrecognized max frag len Error";
  16375. case KEYUSE_SIGNATURE_E:
  16376. return "Key Use digitalSignature not set Error";
  16377. case KEYUSE_ENCIPHER_E:
  16378. return "Key Use keyEncipherment not set Error";
  16379. case EXTKEYUSE_AUTH_E:
  16380. return "Ext Key Use server/client auth not set Error";
  16381. case SEND_OOB_READ_E:
  16382. return "Send Callback Out of Bounds Read Error";
  16383. case SECURE_RENEGOTIATION_E:
  16384. return "Invalid Renegotiation Error";
  16385. case SESSION_TICKET_LEN_E:
  16386. return "Session Ticket Too Long Error";
  16387. case SESSION_TICKET_EXPECT_E:
  16388. return "Session Ticket Error";
  16389. case SESSION_SECRET_CB_E:
  16390. return "Session Secret Callback Error";
  16391. case NO_CHANGE_CIPHER_E:
  16392. return "Finished received from peer before Change Cipher Error";
  16393. case SANITY_MSG_E:
  16394. return "Sanity Check on message order Error";
  16395. case DUPLICATE_MSG_E:
  16396. return "Duplicate HandShake message Error";
  16397. case SNI_UNSUPPORTED:
  16398. return "Protocol version does not support SNI Error";
  16399. case SOCKET_PEER_CLOSED_E:
  16400. return "Peer closed underlying transport Error";
  16401. case BAD_TICKET_KEY_CB_SZ:
  16402. return "Bad user session ticket key callback Size Error";
  16403. case BAD_TICKET_MSG_SZ:
  16404. return "Bad session ticket message Size Error";
  16405. case BAD_TICKET_ENCRYPT:
  16406. return "Bad user ticket callback encrypt Error";
  16407. case DH_KEY_SIZE_E:
  16408. return "DH key too small Error";
  16409. case SNI_ABSENT_ERROR:
  16410. return "No Server Name Indication extension Error";
  16411. case RSA_SIGN_FAULT:
  16412. return "RSA Signature Fault Error";
  16413. case HANDSHAKE_SIZE_ERROR:
  16414. return "Handshake message too large Error";
  16415. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  16416. return "Unrecognized protocol name Error";
  16417. case BAD_CERTIFICATE_STATUS_ERROR:
  16418. return "Bad Certificate Status Message Error";
  16419. case OCSP_INVALID_STATUS:
  16420. return "Invalid OCSP Status Error";
  16421. case OCSP_WANT_READ:
  16422. return "OCSP nonblock wants read";
  16423. case RSA_KEY_SIZE_E:
  16424. return "RSA key too small";
  16425. case ECC_KEY_SIZE_E:
  16426. return "ECC key too small";
  16427. case DTLS_EXPORT_VER_E:
  16428. return "Version needs updated after code change or version mismatch";
  16429. case INPUT_SIZE_E:
  16430. return "Input size too large Error";
  16431. case CTX_INIT_MUTEX_E:
  16432. return "Initialize ctx mutex error";
  16433. case EXT_MASTER_SECRET_NEEDED_E:
  16434. return "Extended Master Secret must be enabled to resume EMS session";
  16435. case DTLS_POOL_SZ_E:
  16436. return "Maximum DTLS pool size exceeded";
  16437. case DECODE_E:
  16438. return "Decode handshake message error";
  16439. case WRITE_DUP_READ_E:
  16440. return "Write dup write side can't read error";
  16441. case WRITE_DUP_WRITE_E:
  16442. return "Write dup read side can't write error";
  16443. case INVALID_CERT_CTX_E:
  16444. return "Certificate context does not match request or not empty";
  16445. case BAD_KEY_SHARE_DATA:
  16446. return "The Key Share data contains group that wasn't in Client Hello";
  16447. case MISSING_HANDSHAKE_DATA:
  16448. return "The handshake message is missing required data";
  16449. case BAD_BINDER:
  16450. return "Binder value does not match value server calculated";
  16451. case EXT_NOT_ALLOWED:
  16452. return "Extension type not allowed in handshake message type";
  16453. case INVALID_PARAMETER:
  16454. return "The security parameter is invalid";
  16455. case UNSUPPORTED_EXTENSION:
  16456. return "TLS Extension not requested by the client";
  16457. case PRF_MISSING:
  16458. return "Pseudo-random function is not enabled";
  16459. case KEY_SHARE_ERROR:
  16460. return "Key share extension did not contain a valid named group";
  16461. case POST_HAND_AUTH_ERROR:
  16462. return "Client will not do post handshake authentication";
  16463. case HRR_COOKIE_ERROR:
  16464. return "Cookie does not match one sent in HelloRetryRequest";
  16465. case MCAST_HIGHWATER_CB_E:
  16466. return "Multicast highwater callback returned error";
  16467. case ALERT_COUNT_E:
  16468. return "Alert Count exceeded error";
  16469. case EXT_MISSING:
  16470. return "Required TLS extension missing";
  16471. case DTLS_RETX_OVER_TX:
  16472. return "DTLS interrupting flight transmit with retransmit";
  16473. case DH_PARAMS_NOT_FFDHE_E:
  16474. return "Server DH parameters were not from the FFDHE set as required";
  16475. case TCA_INVALID_ID_TYPE:
  16476. return "TLS Extension Trusted CA ID type invalid";
  16477. case TCA_ABSENT_ERROR:
  16478. return "TLS Extension Trusted CA ID response absent";
  16479. case TSIP_MAC_DIGSZ_E:
  16480. return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
  16481. case CLIENT_CERT_CB_ERROR:
  16482. return "Error importing client cert or key from callback";
  16483. case SSL_SHUTDOWN_ALREADY_DONE_E:
  16484. return "Shutdown has already occurred";
  16485. case TLS13_SECRET_CB_E:
  16486. return "TLS1.3 Secret Callback Error";
  16487. case DTLS_SIZE_ERROR:
  16488. return "DTLS trying to send too much in single datagram error";
  16489. case NO_CERT_ERROR:
  16490. return "TLS1.3 No Certificate Set Error";
  16491. case TOO_MUCH_EARLY_DATA:
  16492. return "Too much early data";
  16493. default :
  16494. return "unknown error number";
  16495. }
  16496. #endif /* NO_ERROR_STRINGS */
  16497. }
  16498. void SetErrorString(int error, char* str)
  16499. {
  16500. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  16501. str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
  16502. }
  16503. #ifdef NO_CIPHER_SUITE_ALIASES
  16504. #ifndef NO_ERROR_STRINGS
  16505. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16506. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  16507. #define SUITE_ALIAS(x,z,w,v,u)
  16508. #else
  16509. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  16510. #define SUITE_ALIAS(x,z,w,v,u)
  16511. #endif
  16512. #else
  16513. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16514. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  16515. #define SUITE_ALIAS(x,z,w,v,u)
  16516. #else
  16517. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  16518. #define SUITE_ALIAS(x,z,w,v,u)
  16519. #endif
  16520. #endif
  16521. #else /* !NO_CIPHER_SUITE_ALIASES */
  16522. /* note that the comma is included at the end of the SUITE_ALIAS() macro
  16523. * definitions, to allow aliases to be gated out by the above null macros
  16524. * in the NO_CIPHER_SUITE_ALIASES section.
  16525. */
  16526. #ifndef NO_ERROR_STRINGS
  16527. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  16528. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  16529. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  16530. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  16531. #else
  16532. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  16533. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  16534. #endif
  16535. #else
  16536. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  16537. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  16538. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  16539. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  16540. #else
  16541. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  16542. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  16543. #endif
  16544. #endif
  16545. #endif /* NO_CIPHER_SUITE_ALIASES */
  16546. static const CipherSuiteInfo cipher_names[] =
  16547. {
  16548. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  16549. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  16550. #endif
  16551. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  16552. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
  16553. #endif
  16554. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  16555. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  16556. #endif
  16557. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  16558. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  16559. #endif
  16560. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  16561. 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),
  16562. SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
  16563. #endif
  16564. #ifdef BUILD_TLS_SHA256_SHA256
  16565. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  16566. #endif
  16567. #ifdef BUILD_TLS_SHA384_SHA384
  16568. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
  16569. #endif
  16570. #ifndef WOLFSSL_NO_TLS12
  16571. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  16572. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16573. #endif
  16574. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  16575. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  16576. #endif
  16577. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  16578. 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),
  16579. #endif
  16580. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  16581. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16582. #endif
  16583. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  16584. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16585. #endif
  16586. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  16587. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  16588. #endif
  16589. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  16590. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16591. #endif
  16592. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  16593. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  16594. #endif
  16595. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  16596. 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),
  16597. #endif
  16598. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  16599. 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),
  16600. #endif
  16601. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  16602. 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),
  16603. #endif
  16604. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  16605. 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),
  16606. #endif
  16607. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  16608. 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),
  16609. #endif
  16610. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  16611. 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),
  16612. #endif
  16613. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  16614. 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),
  16615. #endif
  16616. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  16617. 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),
  16618. #endif
  16619. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  16620. 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),
  16621. #endif
  16622. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  16623. 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),
  16624. #endif
  16625. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  16626. 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),
  16627. #endif
  16628. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  16629. 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),
  16630. #endif
  16631. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  16632. 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),
  16633. #endif
  16634. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  16635. 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),
  16636. #endif
  16637. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  16638. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  16639. #endif
  16640. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  16641. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  16642. #endif
  16643. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  16644. 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),
  16645. SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  16646. #endif
  16647. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  16648. 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),
  16649. SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  16650. #endif
  16651. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  16652. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  16653. #endif
  16654. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  16655. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16656. #endif
  16657. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  16658. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  16659. #endif
  16660. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  16661. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16662. #endif
  16663. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  16664. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16665. #endif
  16666. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  16667. SUITE_INFO("HC128-MD5","TLS_RSA_WITH_HC_128_MD5",CIPHER_BYTE,TLS_RSA_WITH_HC_128_MD5,TLSv1_MINOR,SSLv3_MAJOR),
  16668. #endif
  16669. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  16670. SUITE_INFO("HC128-SHA","TLS_RSA_WITH_HC_128_SHA",CIPHER_BYTE,TLS_RSA_WITH_HC_128_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16671. #endif
  16672. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  16673. SUITE_INFO("RABBIT-SHA","TLS_RSA_WITH_RABBIT_SHA",CIPHER_BYTE,TLS_RSA_WITH_RABBIT_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16674. #endif
  16675. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  16676. SUITE_INFO("NTRU-RC4-SHA","TLS_NTRU_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16677. #endif
  16678. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  16679. SUITE_INFO("NTRU-DES-CBC3-SHA","TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16680. #endif
  16681. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  16682. SUITE_INFO("NTRU-AES128-SHA","TLS_NTRU_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16683. #endif
  16684. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  16685. SUITE_INFO("NTRU-AES256-SHA","TLS_NTRU_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16686. #endif
  16687. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  16688. 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),
  16689. SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  16690. #endif
  16691. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  16692. 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),
  16693. SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  16694. #endif
  16695. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  16696. 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),
  16697. #endif
  16698. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  16699. 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),
  16700. SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  16701. #endif
  16702. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  16703. 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),
  16704. SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  16705. #endif
  16706. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  16707. 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),
  16708. #endif
  16709. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  16710. 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),
  16711. #endif
  16712. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  16713. 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),
  16714. #endif
  16715. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  16716. 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),
  16717. #endif
  16718. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  16719. 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),
  16720. #endif
  16721. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  16722. 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),
  16723. #endif
  16724. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  16725. 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),
  16726. #endif
  16727. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  16728. 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),
  16729. #endif
  16730. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  16731. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
  16732. #endif
  16733. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  16734. 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),
  16735. #endif
  16736. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  16737. 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),
  16738. #endif
  16739. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  16740. 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),
  16741. #endif
  16742. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  16743. 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),
  16744. #endif
  16745. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  16746. 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),
  16747. #endif
  16748. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  16749. 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),
  16750. #endif
  16751. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  16752. 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),
  16753. #endif
  16754. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  16755. 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),
  16756. #endif
  16757. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  16758. 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),
  16759. #endif
  16760. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  16761. 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),
  16762. #endif
  16763. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  16764. 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),
  16765. #endif
  16766. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  16767. 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),
  16768. #endif
  16769. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  16770. 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),
  16771. #endif
  16772. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  16773. 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),
  16774. #endif
  16775. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  16776. 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),
  16777. #endif
  16778. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  16779. 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),
  16780. #endif
  16781. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  16782. 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),
  16783. #endif
  16784. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  16785. 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),
  16786. #endif
  16787. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  16788. 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),
  16789. #endif
  16790. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  16791. 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),
  16792. #endif
  16793. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  16794. 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),
  16795. #endif
  16796. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  16797. 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),
  16798. #endif
  16799. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  16800. 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),
  16801. #endif
  16802. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  16803. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16804. #endif
  16805. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  16806. 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),
  16807. #endif
  16808. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  16809. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16810. #endif
  16811. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  16812. 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),
  16813. #endif
  16814. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  16815. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16816. #endif
  16817. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  16818. 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),
  16819. #endif
  16820. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  16821. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16822. #endif
  16823. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  16824. 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),
  16825. #endif
  16826. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  16827. 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),
  16828. #endif
  16829. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  16830. 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),
  16831. #endif
  16832. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  16833. 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),
  16834. #endif
  16835. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  16836. 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),
  16837. #endif
  16838. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  16839. 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),
  16840. #endif
  16841. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  16842. 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),
  16843. #endif
  16844. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  16845. 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),
  16846. #endif
  16847. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  16848. 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),
  16849. #endif
  16850. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  16851. 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),
  16852. #endif
  16853. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  16854. 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),
  16855. #endif
  16856. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  16857. 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),
  16858. #endif
  16859. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  16860. 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),
  16861. #endif
  16862. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  16863. 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),
  16864. #endif
  16865. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  16866. 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),
  16867. #endif
  16868. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  16869. 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),
  16870. #endif
  16871. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  16872. 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),
  16873. #endif
  16874. #ifdef BUILD_TLS_QSH
  16875. SUITE_INFO("QSH","TLS_QSH",QSH_BYTE,TLS_QSH, TLSv1_MINOR, SSLv3_MAJOR),
  16876. #endif
  16877. #ifdef HAVE_RENEGOTIATION_INDICATION
  16878. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
  16879. #endif
  16880. #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA
  16881. SUITE_INFO("IDEA-CBC-SHA","SSL_RSA_WITH_IDEA_CBC_SHA",CIPHER_BYTE,SSL_RSA_WITH_IDEA_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16882. #endif
  16883. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  16884. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16885. #endif
  16886. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  16887. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16888. #endif
  16889. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  16890. 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),
  16891. #endif
  16892. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  16893. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  16894. #endif
  16895. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  16896. 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),
  16897. #endif
  16898. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  16899. 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),
  16900. #endif
  16901. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  16902. 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),
  16903. #endif
  16904. #ifdef BUILD_WDM_WITH_NULL_SHA256
  16905. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
  16906. #endif
  16907. #endif /* WOLFSSL_NO_TLS12 */
  16908. };
  16909. /* returns the cipher_names array */
  16910. const CipherSuiteInfo* GetCipherNames(void)
  16911. {
  16912. return cipher_names;
  16913. }
  16914. /* returns the number of elements in the cipher_names array */
  16915. int GetCipherNamesSize(void)
  16916. {
  16917. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  16918. }
  16919. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  16920. {
  16921. int i;
  16922. const char* nameInternal = "None";
  16923. for (i = 0; i < GetCipherNamesSize(); i++) {
  16924. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  16925. (cipher_names[i].cipherSuite == cipherSuite)
  16926. #ifndef NO_CIPHER_SUITE_ALIASES
  16927. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  16928. #endif
  16929. ) {
  16930. nameInternal = cipher_names[i].name;
  16931. break;
  16932. }
  16933. }
  16934. return nameInternal;
  16935. }
  16936. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  16937. const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
  16938. const char* keaStr = NULL;
  16939. const char *n0,*n1,*n2,*n3,*n4;
  16940. n0 = n[0];
  16941. n1 = n[1];
  16942. n2 = n[2];
  16943. n3 = n[3];
  16944. n4 = n[4];
  16945. #ifdef HAVE_NTRU
  16946. if (XSTRNCMP(n0,"NTRU",4) == 0)
  16947. return "NTRU";
  16948. #endif
  16949. if (XSTRNCMP(n0,"ECDHE",5) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  16950. keaStr = "ECDHEPSK";
  16951. else if (XSTRNCMP(n0,"ECDH",4) == 0)
  16952. keaStr = "ECDH";
  16953. else if (XSTRNCMP(n0,"DHE",3) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  16954. keaStr = "DHEPSK";
  16955. else if (XSTRNCMP(n0,"DHE",3) == 0)
  16956. keaStr = "DH";
  16957. else if (XSTRNCMP(n0,"RSA",3) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  16958. keaStr = "RSAPSK";
  16959. else if (XSTRNCMP(n0,"SRP",3) == 0)
  16960. keaStr = "SRP";
  16961. else if (XSTRNCMP(n0,"PSK",3) == 0)
  16962. keaStr = "PSK";
  16963. else if (XSTRNCMP(n0,"EDH",3) == 0)
  16964. keaStr = "EDH";
  16965. else if ((XSTRNCMP(n1,"SHA",3) == 0) || (XSTRNCMP(n2,"SHA",3) == 0) ||
  16966. (XSTRNCMP(n3,"SHA",3) == 0) || (XSTRNCMP(n4,"SHA",3) == 0) ||
  16967. (XSTRNCMP(n2,"RSA",3) == 0) || (XSTRNCMP(n0,"AES128",6) == 0) ||
  16968. (XSTRNCMP(n0,"AES256",6) == 0) || (XSTRNCMP(n1,"MD5",3) == 0))
  16969. keaStr = "RSA";
  16970. else
  16971. keaStr = "unknown";
  16972. return keaStr;
  16973. }
  16974. const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
  16975. const char* authStr = NULL;
  16976. const char *n0,*n1,*n2;
  16977. n0 = n[0];
  16978. n1 = n[1];
  16979. n2 = n[2];
  16980. #ifdef HAVE_NTRU
  16981. if (XSTRNCMP(n0,"NTRU",4) == 0)
  16982. return "NTRU";
  16983. #endif
  16984. if ((XSTRNCMP(n0,"AES128",6) == 0) || (XSTRNCMP(n0,"AES256",6) == 0) ||
  16985. ((XSTRNCMP(n0,"TLS13",5) == 0) && ((XSTRNCMP(n1,"AES128",6) == 0) ||
  16986. (XSTRNCMP(n1,"AES256",6) == 0) || (XSTRNCMP(n1,"CHACHA20",8) == 0))) ||
  16987. (XSTRNCMP(n0,"RSA",3) == 0) || (XSTRNCMP(n1,"RSA",3) == 0) ||
  16988. (XSTRNCMP(n1,"SHA",3) == 0) || (XSTRNCMP(n2,"SHA",3) == 0) ||
  16989. (XSTRNCMP(n1,"MD5",3) == 0))
  16990. authStr = "RSA";
  16991. else if (XSTRNCMP(n0,"PSK",3) == 0 || XSTRNCMP(n1,"PSK",3) == 0)
  16992. authStr = "PSK";
  16993. else if (XSTRNCMP(n0,"SRP",3) == 0 && XSTRNCMP(n1,"AES",3) == 0)
  16994. authStr = "SRP";
  16995. else if (XSTRNCMP(n1,"ECDSA",5) == 0)
  16996. authStr = "ECDSA";
  16997. else if (XSTRNCMP(n0,"ADH",3) == 0)
  16998. authStr = "None";
  16999. else
  17000. authStr = "unknown";
  17001. return authStr;
  17002. }
  17003. const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
  17004. const char* encStr = NULL;
  17005. const char *n0,*n1,*n2,*n3;
  17006. n0 = n[0];
  17007. n1 = n[1];
  17008. n2 = n[2];
  17009. n3 = n[3];
  17010. if ((XSTRNCMP(n0,"AES256",6) == 0 && XSTRNCMP(n1,"GCM",3) == 0) ||
  17011. (XSTRNCMP(n1,"AES256",6) == 0 && XSTRNCMP(n2,"GCM",3) == 0) ||
  17012. (XSTRNCMP(n2,"AES256",6) == 0 && XSTRNCMP(n3,"GCM",3) == 0))
  17013. encStr = "AESGCM(256)";
  17014. else if ((XSTRNCMP(n0,"AES128",6) == 0 && XSTRNCMP(n1,"GCM",3) == 0) ||
  17015. (XSTRNCMP(n1,"AES128",6) == 0 && XSTRNCMP(n2,"GCM",3) == 0) ||
  17016. (XSTRNCMP(n2,"AES128",6) == 0 && XSTRNCMP(n3,"GCM",3) == 0))
  17017. encStr = "AESGCM(128)";
  17018. else if ((XSTRNCMP(n0,"AES128",6) == 0 && XSTRNCMP(n1,"CCM",3) == 0) ||
  17019. (XSTRNCMP(n1,"AES128",6) == 0 && XSTRNCMP(n2,"CCM",3) == 0) ||
  17020. (XSTRNCMP(n2,"AES128",6) == 0 && XSTRNCMP(n3,"CCM",3) == 0))
  17021. encStr = "AESCCM(128)";
  17022. else if ((XSTRNCMP(n0,"AES128",6) == 0) ||
  17023. (XSTRNCMP(n1,"AES128",6) == 0) ||
  17024. (XSTRNCMP(n2,"AES128",6) == 0) ||
  17025. (XSTRNCMP(n1,"AES",3) == 0 && XSTRNCMP(n2,"128",3) == 0) ||
  17026. (XSTRNCMP(n2,"AES",3) == 0 && XSTRNCMP(n3,"128",3) == 0))
  17027. encStr = "AES(128)";
  17028. else if ((XSTRNCMP(n0,"AES256",6) == 0) ||
  17029. (XSTRNCMP(n1,"AES256",6) == 0) ||
  17030. (XSTRNCMP(n2,"AES256",6) == 0) ||
  17031. (XSTRNCMP(n1,"AES",3) == 0 && XSTRNCMP(n2,"256",3) == 0) ||
  17032. (XSTRNCMP(n2,"AES",3) == 0 && XSTRNCMP(n3,"256",3) == 0))
  17033. encStr = "AES(256)";
  17034. else if ((XSTRNCMP(n0,"CAMELLIA256",11) == 0) ||
  17035. (XSTRNCMP(n2,"CAMELLIA256",11) == 0))
  17036. encStr = "CAMELLIA(256)";
  17037. else if ((XSTRNCMP(n0,"CAMELLIA128",11) == 0) ||
  17038. (XSTRNCMP(n2,"CAMELLIA128",11) == 0))
  17039. encStr = "CAMELLIA(128)";
  17040. else if ((XSTRNCMP(n0,"RC4",3) == 0) || (XSTRNCMP(n1,"RC4",3) == 0) ||
  17041. (XSTRNCMP(n2,"RC4",3) == 0))
  17042. encStr = "RC4";
  17043. else if (((XSTRNCMP(n0,"DES",3) == 0) || (XSTRNCMP(n1,"DES",3) == 0) ||
  17044. (XSTRNCMP(n2,"DES",3) == 0)) &&
  17045. ((XSTRNCMP(n1,"CBC3",4) == 0) || (XSTRNCMP(n2,"CBC3",4) == 0) ||
  17046. (XSTRNCMP(n3,"CBC3",4) == 0)))
  17047. encStr = "3DES";
  17048. else if ((XSTRNCMP(n1,"CHACHA20",8) == 0 && XSTRNCMP(n2,"POLY1305",8) == 0) ||
  17049. (XSTRNCMP(n2,"CHACHA20",8) == 0 && XSTRNCMP(n3,"POLY1305",8) == 0))
  17050. encStr = "CHACHA20/POLY1305(256)";
  17051. else if ((XSTRNCMP(n0,"NULL",4) == 0) || (XSTRNCMP(n1,"NULL",4) == 0) ||
  17052. (XSTRNCMP(n2,"NULL",4) == 0) ||
  17053. ((XSTRNCMP(n0,"TLS13",5) == 0) && (XSTRNCMP(n3,"",0) == 0)))
  17054. encStr = "None";
  17055. else if ((XSTRNCMP(n0,"IDEA",4) == 0))
  17056. encStr = "IDEA";
  17057. else if ((XSTRNCMP(n0,"RABBIT",4) == 0))
  17058. encStr = "RABBIT";
  17059. else if ((XSTRNCMP(n0,"HC128",5) == 0))
  17060. encStr = "HC128";
  17061. else
  17062. encStr = "unknown";
  17063. return encStr;
  17064. }
  17065. /* Returns the MAC string of a cipher or "unknown" on failure */
  17066. const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
  17067. const char* macStr = NULL;
  17068. const char *n1,*n2,*n3,*n4;
  17069. n1 = n[1];
  17070. n2 = n[2];
  17071. n3 = n[3];
  17072. n4 = n[4];
  17073. if ((XSTRNCMP(n4,"SHA256",6) == 0) || (XSTRNCMP(n3,"SHA256",6) == 0) ||
  17074. (XSTRNCMP(n2,"SHA256",6) == 0) || (XSTRNCMP(n1,"SHA256",6) == 0))
  17075. macStr = "SHA256";
  17076. else if ((XSTRNCMP(n4,"SHA384",6) == 0) ||
  17077. (XSTRNCMP(n3,"SHA384",6) == 0) ||
  17078. (XSTRNCMP(n2,"SHA384",6) == 0) ||
  17079. (XSTRNCMP(n1,"SHA384",6) == 0))
  17080. macStr = "SHA384";
  17081. else if ((XSTRNCMP(n4,"SHA",3) == 0) || (XSTRNCMP(n3,"SHA",3) == 0) ||
  17082. (XSTRNCMP(n2,"SHA",3) == 0) || (XSTRNCMP(n1,"SHA",3) == 0) ||
  17083. (XSTRNCMP(n1,"MD5",3) == 0))
  17084. macStr = "SHA1";
  17085. else if ((XSTRNCMP(n3,"GCM",3) == 0) ||
  17086. (XSTRNCMP(n1,"CCM",3) == 0) ||
  17087. (XSTRNCMP(n2,"CCM",3) == 0) || (XSTRNCMP(n3,"CCM",3) == 0) ||
  17088. (XSTRNCMP(n1,"CHACHA20",8) == 0 && XSTRNCMP(n2,"POLY1305",8) == 0) ||
  17089. (XSTRNCMP(n2,"CHACHA20",8) == 0 && XSTRNCMP(n3,"POLY1305",8) == 0))
  17090. macStr = "AEAD";
  17091. else
  17092. macStr = "unknown";
  17093. return macStr;
  17094. }
  17095. /* Returns the number of bits based on the cipher enc string, or 0 on failure */
  17096. int SetCipherBits(const char* enc) {
  17097. int ret = WOLFSSL_FAILURE;
  17098. if ((XSTRNCMP(enc,"AESGCM(256)",11) == 0) ||
  17099. (XSTRNCMP(enc,"AES(256)",8) == 0) ||
  17100. (XSTRNCMP(enc,"CAMELLIA(256)",13) == 0) ||
  17101. (XSTRNCMP(enc,"CHACHA20/POLY1305(256)",22) == 0))
  17102. ret = 256;
  17103. else if
  17104. ((XSTRNCMP(enc,"3DES",4) == 0))
  17105. ret = 168;
  17106. else if
  17107. ((XSTRNCMP(enc,"AESGCM(128)",11) == 0) ||
  17108. (XSTRNCMP(enc,"AES(128)",8) == 0) ||
  17109. (XSTRNCMP(enc,"CAMELLIA(128)",13) == 0) ||
  17110. (XSTRNCMP(enc,"IDEA",4) == 0) ||
  17111. (XSTRNCMP(enc,"RC4",3) == 0))
  17112. ret = 128;
  17113. else if
  17114. ((XSTRNCMP(enc,"DES",3) == 0))
  17115. ret = 56;
  17116. return ret;
  17117. }
  17118. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  17119. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  17120. {
  17121. #ifndef NO_ERROR_STRINGS
  17122. int i;
  17123. const char* nameIana = "NONE";
  17124. for (i = 0; i < GetCipherNamesSize(); i++) {
  17125. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  17126. (cipher_names[i].cipherSuite == cipherSuite)
  17127. #ifndef NO_CIPHER_SUITE_ALIASES
  17128. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  17129. #endif
  17130. ) {
  17131. nameIana = cipher_names[i].name_iana;
  17132. break;
  17133. }
  17134. }
  17135. return nameIana;
  17136. #else
  17137. (void)cipherSuite0;
  17138. (void)cipherSuite;
  17139. return NULL;
  17140. #endif
  17141. }
  17142. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  17143. {
  17144. if (ssl == NULL) {
  17145. return NULL;
  17146. }
  17147. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  17148. }
  17149. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  17150. {
  17151. if (ssl == NULL) {
  17152. return NULL;
  17153. }
  17154. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  17155. }
  17156. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  17157. byte* cipherSuite, int* flags)
  17158. {
  17159. int ret = BAD_FUNC_ARG;
  17160. int i;
  17161. unsigned long len;
  17162. const char* nameDelim;
  17163. /* Support trailing : */
  17164. nameDelim = XSTRSTR(name, ":");
  17165. if (nameDelim)
  17166. len = (unsigned long)(nameDelim - name);
  17167. else
  17168. len = (unsigned long)XSTRLEN(name);
  17169. for (i = 0; i < GetCipherNamesSize(); i++) {
  17170. if ((XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
  17171. (cipher_names[i].name[len] == 0)) {
  17172. *cipherSuite0 = cipher_names[i].cipherSuite0;
  17173. *cipherSuite = cipher_names[i].cipherSuite;
  17174. *flags = cipher_names[i].flags;
  17175. ret = 0;
  17176. break;
  17177. }
  17178. }
  17179. return ret;
  17180. }
  17181. /**
  17182. Set the enabled cipher suites.
  17183. @param [out] suites Suites structure.
  17184. @param [in] list List of cipher suites, only supports full name from
  17185. cipher_names[] delimited by ':'.
  17186. @return true on success, else false.
  17187. */
  17188. int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list)
  17189. {
  17190. int ret = 0;
  17191. int idx = 0;
  17192. int haveRSAsig = 0;
  17193. int haveECDSAsig = 0;
  17194. int haveAnon = 0;
  17195. const int suiteSz = GetCipherNamesSize();
  17196. char* next = (char*)list;
  17197. if (suites == NULL || list == NULL) {
  17198. WOLFSSL_MSG("SetCipherList parameter error");
  17199. return 0;
  17200. }
  17201. if (next[0] == 0 || XSTRNCMP(next, "ALL", 3) == 0 ||
  17202. XSTRNCMP(next, "DEFAULT", 7) == 0)
  17203. return 1; /* wolfSSL default */
  17204. do {
  17205. char* current = next;
  17206. char name[MAX_SUITE_NAME + 1];
  17207. int i;
  17208. word32 length;
  17209. next = XSTRSTR(next, ":");
  17210. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /* last */
  17211. : (word32)(next - current));
  17212. XSTRNCPY(name, current, length);
  17213. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  17214. for (i = 0; i < suiteSz; i++) {
  17215. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  17216. #ifndef NO_ERROR_STRINGS
  17217. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  17218. #endif
  17219. ) {
  17220. #ifdef WOLFSSL_DTLS
  17221. /* don't allow stream ciphers with DTLS */
  17222. if (ctx->method->version.major == DTLS_MAJOR) {
  17223. if (XSTRSTR(name, "RC4") ||
  17224. XSTRSTR(name, "HC128") ||
  17225. XSTRSTR(name, "RABBIT"))
  17226. {
  17227. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  17228. continue;
  17229. }
  17230. }
  17231. #endif /* WOLFSSL_DTLS */
  17232. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  17233. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  17234. return 0; /* suites buffer not large enough, error out */
  17235. }
  17236. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  17237. suites->suites[idx++] = cipher_names[i].cipherSuite;
  17238. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  17239. * suites don't necessarily have RSA in the name. */
  17240. #ifdef WOLFSSL_TLS13
  17241. if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
  17242. (cipher_names[i].cipherSuite0 == ECC_BYTE &&
  17243. (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
  17244. cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
  17245. #ifndef NO_RSA
  17246. haveRSAsig = 1;
  17247. #endif
  17248. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  17249. defined(HAVE_ED448)
  17250. haveECDSAsig = 1;
  17251. #endif
  17252. }
  17253. else
  17254. #endif
  17255. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  17256. defined(HAVE_ED448)
  17257. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  17258. haveECDSAsig = 1;
  17259. else
  17260. #endif
  17261. #ifdef HAVE_ANON
  17262. if (XSTRSTR(name, "ADH"))
  17263. haveAnon = 1;
  17264. else
  17265. #endif
  17266. if (haveRSAsig == 0
  17267. #ifndef NO_PSK
  17268. && (XSTRSTR(name, "PSK") == NULL)
  17269. #endif
  17270. ) {
  17271. haveRSAsig = 1;
  17272. }
  17273. ret = 1; /* found at least one */
  17274. break;
  17275. }
  17276. }
  17277. }
  17278. while (next++); /* ++ needed to skip ':' */
  17279. if (ret) {
  17280. int keySz = 0;
  17281. #ifndef NO_CERTS
  17282. keySz = ctx->privateKeySz;
  17283. #endif
  17284. suites->setSuites = 1;
  17285. suites->suiteSz = (word16)idx;
  17286. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig, haveAnon, 1,
  17287. keySz);
  17288. }
  17289. (void)ctx;
  17290. return ret;
  17291. }
  17292. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  17293. static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
  17294. {
  17295. #ifdef HAVE_ED25519
  17296. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  17297. /* Certificate has Ed25519 key, only match with Ed25519 sig alg */
  17298. return sigAlgo == ed25519_sa_algo;
  17299. }
  17300. #endif
  17301. #ifdef HAVE_ED448
  17302. if (ssl->pkCurveOID == ECC_ED448_OID) {
  17303. /* Certificate has Ed448 key, only match with Ed448 sig alg */
  17304. return sigAlgo == ed448_sa_algo;
  17305. }
  17306. #endif
  17307. #ifdef WC_RSA_PSS
  17308. /* RSA certificate and PSS sig alg. */
  17309. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  17310. #if defined(WOLFSSL_TLS13)
  17311. /* TLS 1.3 only supports RSA-PSS. */
  17312. if (IsAtLeastTLSv1_3(ssl->version))
  17313. return sigAlgo == rsa_pss_sa_algo;
  17314. #endif
  17315. /* TLS 1.2 and below - RSA-PSS allowed. */
  17316. if (sigAlgo == rsa_pss_sa_algo)
  17317. return 1;
  17318. }
  17319. #endif
  17320. /* Signature algorithm matches certificate. */
  17321. return sigAlgo == ssl->suites->sigAlgo;
  17322. }
  17323. #if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
  17324. defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  17325. static int CmpEccStrength(int hashAlgo, int curveSz)
  17326. {
  17327. int dgstSz = GetMacDigestSize(hashAlgo);
  17328. if (dgstSz <= 0)
  17329. return -1;
  17330. return dgstSz - (curveSz & (~0x3));
  17331. }
  17332. #endif
  17333. static byte MinHashAlgo(WOLFSSL* ssl)
  17334. {
  17335. #ifdef WOLFSSL_TLS13
  17336. if (IsAtLeastTLSv1_3(ssl->version)) {
  17337. return sha256_mac;
  17338. }
  17339. #endif
  17340. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
  17341. if (IsAtLeastTLSv1_2(ssl)) {
  17342. return sha256_mac;
  17343. }
  17344. #endif /* WOLFSSL_NO_TLS12 */
  17345. (void)ssl;
  17346. return sha_mac;
  17347. }
  17348. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  17349. {
  17350. word32 i;
  17351. int ret = MATCH_SUITE_ERROR;
  17352. byte minHash;
  17353. /* set defaults */
  17354. if (IsAtLeastTLSv1_3(ssl->version)) {
  17355. #ifndef NO_CERTS
  17356. /* TLS 1.3 cipher suites don't have public key algorithms in them.
  17357. * Using the one in the certificate - if any.
  17358. */
  17359. ssl->suites->sigAlgo = ssl->buffers.keyType;
  17360. #endif
  17361. }
  17362. else
  17363. ssl->suites->sigAlgo = ssl->specs.sig_algo;
  17364. if (ssl->suites->sigAlgo == 0) {
  17365. /* PSK ciphersuite - get digest to use from cipher suite */
  17366. ssl->suites->hashAlgo = ssl->specs.mac_algorithm;
  17367. return 0;
  17368. }
  17369. ssl->suites->hashAlgo = minHash = MinHashAlgo(ssl);
  17370. /* No list means go with the defaults. */
  17371. if (hashSigAlgoSz == 0)
  17372. return 0;
  17373. /* i+1 since two bytes used to describe hash and signature algorithm */
  17374. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  17375. byte hashAlgo = 0, sigAlgo = 0;
  17376. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  17377. /* Keep looking if hash algorithm not strong enough. */
  17378. if (hashAlgo < minHash)
  17379. continue;
  17380. /* Keep looking if signature algorithm isn't supported by cert. */
  17381. if (!MatchSigAlgo(ssl, sigAlgo))
  17382. continue;
  17383. #ifdef HAVE_ED25519
  17384. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  17385. /* Matched Ed25519 - set chosen and finished. */
  17386. ssl->suites->sigAlgo = sigAlgo;
  17387. ssl->suites->hashAlgo = hashAlgo;
  17388. ret = 0;
  17389. break;
  17390. }
  17391. #endif
  17392. #ifdef HAVE_ED448
  17393. if (ssl->pkCurveOID == ECC_ED448_OID) {
  17394. /* Matched Ed448 - set chosen and finished. */
  17395. ssl->suites->sigAlgo = sigAlgo;
  17396. ssl->suites->hashAlgo = hashAlgo;
  17397. ret = 0;
  17398. break;
  17399. }
  17400. #endif
  17401. #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  17402. #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
  17403. "be used together"
  17404. #endif
  17405. #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
  17406. defined(WOLFSSL_ECDSA_MATCH_HASH))
  17407. if (sigAlgo == ecc_dsa_sa_algo
  17408. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  17409. && IsAtLeastTLSv1_3(ssl->version)
  17410. #endif
  17411. ) {
  17412. /* Must be exact match. */
  17413. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  17414. continue;
  17415. /* Matched ECDSA exaclty - set chosen and finished. */
  17416. ssl->suites->hashAlgo = hashAlgo;
  17417. ssl->suites->sigAlgo = sigAlgo;
  17418. ret = 0;
  17419. break;
  17420. }
  17421. #endif
  17422. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  17423. * algorithm that matches the ephemeral ECDHE key size or the next highest
  17424. * available. This workaround resolves issue with some peer's that do not
  17425. * properly support scenarios such as a P-256 key hashed with SHA512.
  17426. */
  17427. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  17428. if (sigAlgo == ecc_dsa_sa_algo) {
  17429. int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
  17430. /* Keep looking if digest not strong enough. */
  17431. if (cmp < 0)
  17432. continue;
  17433. /* Looking for exact match or next highest. */
  17434. if (ret != 0 || hashAlgo <= ssl->suites->hashAlgo) {
  17435. ssl->suites->hashAlgo = hashAlgo;
  17436. ssl->suites->sigAlgo = sigAlgo;
  17437. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  17438. ssl->namedGroup = 0;
  17439. #endif
  17440. ret = 0;
  17441. }
  17442. /* Continue looking if not the same strength. */
  17443. if (cmp > 0)
  17444. continue;
  17445. /* Exact match - finished. */
  17446. break;
  17447. }
  17448. #endif
  17449. switch (hashAlgo) {
  17450. #ifndef NO_SHA
  17451. case sha_mac:
  17452. #endif
  17453. #ifdef WOLFSSL_SHA224
  17454. case sha224_mac:
  17455. #endif
  17456. #ifndef NO_SHA256
  17457. case sha256_mac:
  17458. #endif
  17459. #ifdef WOLFSSL_SHA384
  17460. case sha384_mac:
  17461. #endif
  17462. #ifdef WOLFSSL_SHA512
  17463. case sha512_mac:
  17464. #endif
  17465. #ifdef WOLFSSL_STRONGEST_HASH_SIG
  17466. /* Is hash algorithm weaker than chosen/min? */
  17467. if (hashAlgo < ssl->suites->hashAlgo)
  17468. break;
  17469. #else
  17470. /* Is hash algorithm stonger than last chosen? */
  17471. if (ret == 0 && hashAlgo > ssl->suites->hashAlgo)
  17472. break;
  17473. #endif
  17474. /* The chosen one - but keep looking. */
  17475. ssl->suites->hashAlgo = hashAlgo;
  17476. ssl->suites->sigAlgo = sigAlgo;
  17477. ret = 0;
  17478. break;
  17479. default:
  17480. /* Support for hash algorithm not compiled in. */
  17481. break;
  17482. }
  17483. }
  17484. return ret;
  17485. }
  17486. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  17487. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17488. /* Initialize HandShakeInfo */
  17489. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  17490. {
  17491. int i;
  17492. info->ssl = ssl;
  17493. info->cipherName[0] = 0;
  17494. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  17495. info->packetNames[i][0] = 0;
  17496. info->numberPackets = 0;
  17497. info->negotiationError = 0;
  17498. }
  17499. /* Set Final HandShakeInfo parameters */
  17500. void FinishHandShakeInfo(HandShakeInfo* info)
  17501. {
  17502. int i;
  17503. int sz = GetCipherNamesSize();
  17504. for (i = 0; i < sz; i++) {
  17505. #ifndef NO_CIPHER_SUITE_ALIASES
  17506. if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  17507. continue;
  17508. #endif
  17509. if (info->ssl->options.cipherSuite ==
  17510. (byte)cipher_names[i].cipherSuite) {
  17511. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  17512. continue; /* ECC suites at end */
  17513. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  17514. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  17515. break;
  17516. }
  17517. }
  17518. /* error max and min are negative numbers */
  17519. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  17520. info->negotiationError = info->ssl->error;
  17521. }
  17522. /* Add name to info packet names, increase packet name count */
  17523. void AddPacketName(WOLFSSL* ssl, const char* name)
  17524. {
  17525. #ifdef WOLFSSL_CALLBACKS
  17526. HandShakeInfo* info = &ssl->handShakeInfo;
  17527. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  17528. char* packetName = info->packetNames[info->numberPackets];
  17529. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  17530. packetName[MAX_PACKETNAME_SZ] = '\0';
  17531. info->numberPackets++;
  17532. }
  17533. #endif
  17534. (void)ssl;
  17535. (void)name;
  17536. }
  17537. #ifdef WOLFSSL_CALLBACKS
  17538. /* Initialize TimeoutInfo */
  17539. void InitTimeoutInfo(TimeoutInfo* info)
  17540. {
  17541. int i;
  17542. info->timeoutName[0] = 0;
  17543. info->flags = 0;
  17544. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  17545. info->packets[i].packetName[0] = 0;
  17546. info->packets[i].timestamp.tv_sec = 0;
  17547. info->packets[i].timestamp.tv_usec = 0;
  17548. info->packets[i].bufferValue = 0;
  17549. info->packets[i].valueSz = 0;
  17550. }
  17551. info->numberPackets = 0;
  17552. info->timeoutValue.tv_sec = 0;
  17553. info->timeoutValue.tv_usec = 0;
  17554. }
  17555. /* Free TimeoutInfo */
  17556. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  17557. {
  17558. int i;
  17559. (void)heap;
  17560. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  17561. if (info->packets[i].bufferValue) {
  17562. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  17563. info->packets[i].bufferValue = 0;
  17564. }
  17565. }
  17566. /* Add packet name to previously added packet info */
  17567. void AddLateName(const char* name, TimeoutInfo* info)
  17568. {
  17569. /* make sure we have a valid previous one */
  17570. if (info->numberPackets > 0 && info->numberPackets <
  17571. MAX_PACKETS_HANDSHAKE) {
  17572. char* packetName = info->packets[info->numberPackets-1].packetName;
  17573. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  17574. packetName[MAX_PACKETNAME_SZ] = '\0';
  17575. }
  17576. }
  17577. /* Add record header to previously added packet info */
  17578. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  17579. {
  17580. /* make sure we have a valid previous one */
  17581. if (info->numberPackets > 0 && info->numberPackets <
  17582. MAX_PACKETS_HANDSHAKE) {
  17583. if (info->packets[info->numberPackets - 1].bufferValue)
  17584. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  17585. RECORD_HEADER_SZ);
  17586. else
  17587. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  17588. RECORD_HEADER_SZ);
  17589. }
  17590. }
  17591. #endif /* WOLFSSL_CALLBACKS */
  17592. /* Add PacketInfo to TimeoutInfo
  17593. *
  17594. * ssl WOLFSSL structure sending or receiving packet
  17595. * name name of packet being sent
  17596. * type type of packet being sent
  17597. * data data bing sent with packet
  17598. * sz size of data buffer
  17599. * written 1 if this packet is being written to wire, 0 if being read
  17600. * heap custom heap to use for mallocs/frees
  17601. */
  17602. void AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  17603. const byte* data, int sz, int written, void* heap)
  17604. {
  17605. #ifdef WOLFSSL_CALLBACKS
  17606. TimeoutInfo* info = &ssl->timeoutInfo;
  17607. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  17608. WOLFSSL_TIMEVAL currTime;
  17609. /* may add name after */
  17610. if (name) {
  17611. char* packetName = info->packets[info->numberPackets].packetName;
  17612. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  17613. packetName[MAX_PACKETNAME_SZ] = '\0';
  17614. }
  17615. /* add data, put in buffer if bigger than static buffer */
  17616. info->packets[info->numberPackets].valueSz = sz;
  17617. if (sz < MAX_VALUE_SZ)
  17618. XMEMCPY(info->packets[info->numberPackets].value, data, sz);
  17619. else {
  17620. info->packets[info->numberPackets].bufferValue =
  17621. (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_INFO);
  17622. if (!info->packets[info->numberPackets].bufferValue)
  17623. /* let next alloc catch, just don't fill, not fatal here */
  17624. info->packets[info->numberPackets].valueSz = 0;
  17625. else
  17626. XMEMCPY(info->packets[info->numberPackets].bufferValue,
  17627. data, sz);
  17628. }
  17629. gettimeofday(&currTime, 0);
  17630. info->packets[info->numberPackets].timestamp.tv_sec =
  17631. currTime.tv_sec;
  17632. info->packets[info->numberPackets].timestamp.tv_usec =
  17633. currTime.tv_usec;
  17634. info->numberPackets++;
  17635. }
  17636. #endif /* WOLFSSL_CALLBACKS */
  17637. #ifdef OPENSSL_EXTRA
  17638. if (ssl->protoMsgCb != NULL && sz > RECORD_HEADER_SZ) {
  17639. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  17640. 4096 from 16^3 */
  17641. int version = (ssl->version.minor & 0X0F) +
  17642. (ssl->version.minor & 0xF0) * 16 +
  17643. (ssl->version.major & 0X0F) * 256 +
  17644. (ssl->version.major & 0xF0) * 4096;
  17645. ssl->protoMsgCb(written, version, type,
  17646. (const void *)(data + RECORD_HEADER_SZ),
  17647. (size_t)(sz - RECORD_HEADER_SZ),
  17648. ssl, ssl->protoMsgCtx);
  17649. }
  17650. #endif /* OPENSSL_EXTRA */
  17651. (void)written;
  17652. (void)name;
  17653. (void)heap;
  17654. (void)type;
  17655. (void)ssl;
  17656. }
  17657. #endif /* WOLFSSL_CALLBACKS */
  17658. #if !defined(NO_CERTS)
  17659. #ifdef WOLF_CRYPTO_CB
  17660. /* Create a private key for a device.
  17661. *
  17662. * pkey Key object.
  17663. * data Data to identify key.
  17664. * length Length of data.
  17665. * hsType Type of the key to create.
  17666. * heap Custom heap to use for mallocs/frees
  17667. * devId Id for device.
  17668. * return 0 on success.
  17669. * return NOT_COMPILED_IN if algorithm type not supported.
  17670. * return MEMORY_E on memory allocation failure.
  17671. * return other internal error
  17672. */
  17673. int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
  17674. int label, int id, void* heap, int devId)
  17675. {
  17676. int ret = NOT_COMPILED_IN;
  17677. if (hsType == DYNAMIC_TYPE_RSA) {
  17678. #ifndef NO_RSA
  17679. RsaKey* rsaKey;
  17680. rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  17681. if (rsaKey == NULL) {
  17682. return MEMORY_E;
  17683. }
  17684. if (label) {
  17685. ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
  17686. }
  17687. else if (id) {
  17688. ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId);
  17689. }
  17690. if (ret == 0) {
  17691. *pkey = (void*)rsaKey;
  17692. }
  17693. else {
  17694. XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
  17695. }
  17696. #endif
  17697. }
  17698. else if (hsType == DYNAMIC_TYPE_ECC) {
  17699. #ifdef HAVE_ECC
  17700. ecc_key* ecKey;
  17701. ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  17702. if (ecKey == NULL) {
  17703. return MEMORY_E;
  17704. }
  17705. if (label) {
  17706. ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
  17707. }
  17708. else if (id) {
  17709. ret = wc_ecc_init_id(ecKey, data, length, heap, devId);
  17710. }
  17711. if (ret == 0) {
  17712. *pkey = (void*)ecKey;
  17713. }
  17714. else {
  17715. XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
  17716. }
  17717. #endif
  17718. }
  17719. return ret;
  17720. }
  17721. #endif
  17722. /* Decode the private key - RSA/ECC/Ed25519/Ed448 - and creates a key object.
  17723. * The signature type is set as well.
  17724. * The maximum length of a signature is returned.
  17725. *
  17726. * ssl The SSL/TLS object.
  17727. * length The length of a signature.
  17728. * returns 0 on success, otherwise failure.
  17729. */
  17730. int DecodePrivateKey(WOLFSSL *ssl, word16* length)
  17731. {
  17732. int ret = BAD_FUNC_ARG;
  17733. int keySz;
  17734. word32 idx;
  17735. #ifdef HAVE_PK_CALLBACKS
  17736. /* allow no private key if using PK callbacks and CB is set */
  17737. if (wolfSSL_IsPrivatePkSet(ssl)) {
  17738. *length = GetPrivateKeySigSize(ssl);
  17739. return 0;
  17740. }
  17741. else
  17742. #endif
  17743. /* make sure private key exists */
  17744. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  17745. WOLFSSL_MSG("Private key missing!");
  17746. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  17747. }
  17748. #ifdef HAVE_PKCS11
  17749. if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
  17750. ssl->buffers.keyLabel)) {
  17751. if (ssl->buffers.keyType == rsa_sa_algo)
  17752. ssl->hsType = DYNAMIC_TYPE_RSA;
  17753. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  17754. ssl->hsType = DYNAMIC_TYPE_ECC;
  17755. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17756. if (ret != 0) {
  17757. goto exit_dpk;
  17758. }
  17759. if (ssl->buffers.keyType == rsa_sa_algo) {
  17760. #ifndef NO_RSA
  17761. if (ssl->buffers.keyLabel) {
  17762. ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
  17763. (char*)ssl->buffers.key->buffer,
  17764. ssl->heap, ssl->buffers.keyDevId);
  17765. }
  17766. else if (ssl->buffers.keyId) {
  17767. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  17768. ssl->buffers.key->buffer,
  17769. ssl->buffers.key->length, ssl->heap,
  17770. ssl->buffers.keyDevId);
  17771. }
  17772. if (ret == 0) {
  17773. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  17774. WOLFSSL_MSG("RSA key size too small");
  17775. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  17776. }
  17777. /* Return the maximum signature length. */
  17778. *length = (word16)ssl->buffers.keySz;
  17779. }
  17780. #else
  17781. ret = NOT_COMPILED_IN;
  17782. #endif
  17783. }
  17784. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  17785. #ifdef HAVE_ECC
  17786. if (ssl->buffers.keyLabel) {
  17787. ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
  17788. (char*)ssl->buffers.key->buffer,
  17789. ssl->heap, ssl->buffers.keyDevId);
  17790. }
  17791. else if (ssl->buffers.keyId) {
  17792. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
  17793. ssl->buffers.key->buffer,
  17794. ssl->buffers.key->length, ssl->heap,
  17795. ssl->buffers.keyDevId);
  17796. }
  17797. if (ret == 0) {
  17798. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  17799. WOLFSSL_MSG("ECC key size too small");
  17800. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  17801. }
  17802. /* Return the maximum signature length. */
  17803. *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz);
  17804. }
  17805. #else
  17806. ret = NOT_COMPILED_IN;
  17807. #endif
  17808. }
  17809. goto exit_dpk;
  17810. }
  17811. #endif
  17812. #ifndef NO_RSA
  17813. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  17814. ssl->hsType = DYNAMIC_TYPE_RSA;
  17815. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17816. if (ret != 0) {
  17817. goto exit_dpk;
  17818. }
  17819. WOLFSSL_MSG("Trying RSA private key");
  17820. /* Set start of data to beginning of buffer. */
  17821. idx = 0;
  17822. /* Decode the key assuming it is an RSA private key. */
  17823. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  17824. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  17825. if (ret == 0) {
  17826. WOLFSSL_MSG("Using RSA private key");
  17827. /* It worked so check it meets minimum key size requirements. */
  17828. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  17829. if (keySz < 0) { /* check if keySz has error case */
  17830. ERROR_OUT(keySz, exit_dpk);
  17831. }
  17832. if (keySz < ssl->options.minRsaKeySz) {
  17833. WOLFSSL_MSG("RSA key size too small");
  17834. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  17835. }
  17836. /* Return the maximum signature length. */
  17837. *length = (word16)keySz;
  17838. goto exit_dpk;
  17839. }
  17840. }
  17841. #endif /* !NO_RSA */
  17842. #ifdef HAVE_ECC
  17843. #ifndef NO_RSA
  17844. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  17845. #endif /* !NO_RSA */
  17846. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0) {
  17847. ssl->hsType = DYNAMIC_TYPE_ECC;
  17848. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17849. if (ret != 0) {
  17850. goto exit_dpk;
  17851. }
  17852. #ifndef NO_RSA
  17853. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  17854. #else
  17855. WOLFSSL_MSG("Trying ECC private key");
  17856. #endif
  17857. /* Set start of data to beginning of buffer. */
  17858. idx = 0;
  17859. /* Decode the key assuming it is an ECC private key. */
  17860. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  17861. (ecc_key*)ssl->hsKey,
  17862. ssl->buffers.key->length);
  17863. if (ret == 0) {
  17864. WOLFSSL_MSG("Using ECC private key");
  17865. /* Check it meets the minimum ECC key size requirements. */
  17866. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  17867. if (keySz < ssl->options.minEccKeySz) {
  17868. WOLFSSL_MSG("ECC key size too small");
  17869. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  17870. }
  17871. /* Return the maximum signature length. */
  17872. *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  17873. goto exit_dpk;
  17874. }
  17875. }
  17876. #endif
  17877. #ifdef HAVE_ED25519
  17878. #if !defined(NO_RSA) || defined(HAVE_ECC)
  17879. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  17880. #endif
  17881. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  17882. ssl->hsType = DYNAMIC_TYPE_ED25519;
  17883. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17884. if (ret != 0) {
  17885. goto exit_dpk;
  17886. }
  17887. #ifdef HAVE_ECC
  17888. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  17889. #elif !defined(NO_RSA)
  17890. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  17891. #else
  17892. WOLFSSL_MSG("Trying ED25519 private key");
  17893. #endif
  17894. /* Set start of data to beginning of buffer. */
  17895. idx = 0;
  17896. /* Decode the key assuming it is an ED25519 private key. */
  17897. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  17898. (ed25519_key*)ssl->hsKey,
  17899. ssl->buffers.key->length);
  17900. if (ret == 0) {
  17901. WOLFSSL_MSG("Using ED25519 private key");
  17902. /* Check it meets the minimum ECC key size requirements. */
  17903. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  17904. WOLFSSL_MSG("ED25519 key size too small");
  17905. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  17906. }
  17907. /* Return the maximum signature length. */
  17908. *length = ED25519_SIG_SIZE;
  17909. goto exit_dpk;
  17910. }
  17911. }
  17912. #endif /* HAVE_ED25519 */
  17913. #ifdef HAVE_ED448
  17914. #if !defined(NO_RSA) || defined(HAVE_ECC)
  17915. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  17916. #endif
  17917. if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
  17918. ssl->hsType = DYNAMIC_TYPE_ED448;
  17919. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17920. if (ret != 0) {
  17921. goto exit_dpk;
  17922. }
  17923. #ifdef HAVE_ED25519
  17924. WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
  17925. #elif defined(HAVE_ECC)
  17926. WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
  17927. #elif !defined(NO_RSA)
  17928. WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
  17929. #else
  17930. WOLFSSL_MSG("Trying ED447 private key");
  17931. #endif
  17932. /* Set start of data to beginning of buffer. */
  17933. idx = 0;
  17934. /* Decode the key assuming it is an ED448 private key. */
  17935. ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  17936. (ed448_key*)ssl->hsKey,
  17937. ssl->buffers.key->length);
  17938. if (ret == 0) {
  17939. WOLFSSL_MSG("Using ED448 private key");
  17940. /* Check it meets the minimum ECC key size requirements. */
  17941. if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  17942. WOLFSSL_MSG("ED448 key size too small");
  17943. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  17944. }
  17945. /* Return the maximum signature length. */
  17946. *length = ED448_SIG_SIZE;
  17947. goto exit_dpk;
  17948. }
  17949. }
  17950. #endif /* HAVE_ED448 */
  17951. (void)idx;
  17952. (void)keySz;
  17953. (void)length;
  17954. exit_dpk:
  17955. return ret;
  17956. }
  17957. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  17958. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  17959. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  17960. int TLSv1_3_Capable(WOLFSSL* ssl)
  17961. {
  17962. #ifndef WOLFSSL_TLS13
  17963. return 0;
  17964. #else
  17965. int ret = 0;
  17966. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  17967. ret = 1;
  17968. }
  17969. #ifdef OPENSSL_EXTRA
  17970. if ((wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_3)) {
  17971. /* option set at run time to disable TLS 1.3 */
  17972. ret = 0;
  17973. }
  17974. #endif
  17975. return ret;
  17976. #endif
  17977. }
  17978. #endif /* WOLFSSL_TLS13 */
  17979. /* client only parts */
  17980. #ifndef NO_WOLFSSL_CLIENT
  17981. #ifndef WOLFSSL_NO_TLS12
  17982. /* handle generation of client_hello (1) */
  17983. int SendClientHello(WOLFSSL* ssl)
  17984. {
  17985. byte *output;
  17986. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  17987. int sendSz;
  17988. int idSz = ssl->options.resuming
  17989. ? ssl->session.sessionIDSz
  17990. : 0;
  17991. int ret;
  17992. word16 extSz = 0;
  17993. #ifdef WOLFSSL_TLS13
  17994. if (IsAtLeastTLSv1_3(ssl->version))
  17995. return SendTls13ClientHello(ssl);
  17996. #endif
  17997. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  17998. WOLFSSL_ENTER("SendClientHello");
  17999. if (ssl->suites == NULL) {
  18000. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  18001. return SUITES_ERROR;
  18002. }
  18003. #ifdef HAVE_SESSION_TICKET
  18004. if (ssl->options.resuming && ssl->session.ticketLen > 0) {
  18005. SessionTicket* ticket;
  18006. ticket = TLSX_SessionTicket_Create(0, ssl->session.ticket,
  18007. ssl->session.ticketLen, ssl->heap);
  18008. if (ticket == NULL) return MEMORY_E;
  18009. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  18010. if (ret != WOLFSSL_SUCCESS) {
  18011. TLSX_SessionTicket_Free(ticket, ssl->heap);
  18012. return ret;
  18013. }
  18014. idSz = 0;
  18015. }
  18016. #endif
  18017. length = VERSION_SZ + RAN_LEN
  18018. + idSz + ENUM_LEN
  18019. + ssl->suites->suiteSz + SUITE_LEN
  18020. + COMP_LEN + ENUM_LEN;
  18021. #ifdef HAVE_TLS_EXTENSIONS
  18022. /* auto populate extensions supported unless user defined */
  18023. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  18024. return ret;
  18025. #ifdef HAVE_QSH
  18026. if (QSH_Init(ssl) != 0)
  18027. return MEMORY_E;
  18028. #endif
  18029. extSz = 0;
  18030. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  18031. if (ret != 0)
  18032. return ret;
  18033. length += extSz;
  18034. #else
  18035. if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
  18036. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  18037. + ssl->suites->hashSigAlgoSz;
  18038. #ifdef HAVE_EXTENDED_MASTER
  18039. if (ssl->options.haveEMS)
  18040. extSz += HELLO_EXT_SZ;
  18041. #endif
  18042. if (extSz != 0)
  18043. length += extSz + HELLO_EXT_SZ_SZ;
  18044. #endif
  18045. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  18046. #ifdef WOLFSSL_DTLS
  18047. if (ssl->options.dtls) {
  18048. length += ENUM_LEN; /* cookie */
  18049. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  18050. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  18051. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  18052. }
  18053. #endif
  18054. if (IsEncryptionOn(ssl, 1))
  18055. sendSz += MAX_MSG_EXTRA;
  18056. /* check for available size */
  18057. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  18058. return ret;
  18059. /* get output buffer */
  18060. output = ssl->buffers.outputBuffer.buffer +
  18061. ssl->buffers.outputBuffer.length;
  18062. AddHeaders(output, length, client_hello, ssl);
  18063. /* client hello, first version */
  18064. output[idx++] = ssl->version.major;
  18065. output[idx++] = ssl->version.minor;
  18066. ssl->chVersion = ssl->version; /* store in case changed */
  18067. /* then random */
  18068. if (ssl->options.connectState == CONNECT_BEGIN) {
  18069. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  18070. if (ret != 0)
  18071. return ret;
  18072. /* store random */
  18073. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  18074. } else {
  18075. #ifdef WOLFSSL_DTLS
  18076. /* send same random on hello again */
  18077. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  18078. #endif
  18079. }
  18080. idx += RAN_LEN;
  18081. /* then session id */
  18082. output[idx++] = (byte)idSz;
  18083. if (idSz) {
  18084. XMEMCPY(output + idx, ssl->session.sessionID,
  18085. ssl->session.sessionIDSz);
  18086. idx += ssl->session.sessionIDSz;
  18087. }
  18088. /* then DTLS cookie */
  18089. #ifdef WOLFSSL_DTLS
  18090. if (ssl->options.dtls) {
  18091. byte cookieSz = ssl->arrays->cookieSz;
  18092. output[idx++] = cookieSz;
  18093. if (cookieSz) {
  18094. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  18095. idx += cookieSz;
  18096. }
  18097. }
  18098. #endif
  18099. /* then cipher suites */
  18100. c16toa(ssl->suites->suiteSz, output + idx);
  18101. idx += OPAQUE16_LEN;
  18102. XMEMCPY(output + idx, &ssl->suites->suites, ssl->suites->suiteSz);
  18103. idx += ssl->suites->suiteSz;
  18104. /* last, compression */
  18105. output[idx++] = COMP_LEN;
  18106. if (ssl->options.usingCompression)
  18107. output[idx++] = ZLIB_COMPRESSION;
  18108. else
  18109. output[idx++] = NO_COMPRESSION;
  18110. #ifdef HAVE_TLS_EXTENSIONS
  18111. extSz = 0;
  18112. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  18113. if (ret != 0)
  18114. return ret;
  18115. idx += extSz;
  18116. (void)idx; /* suppress analyzer warning, keep idx current */
  18117. #else
  18118. if (extSz != 0) {
  18119. c16toa(extSz, output + idx);
  18120. idx += HELLO_EXT_SZ_SZ;
  18121. if (IsAtLeastTLSv1_2(ssl)) {
  18122. if (ssl->suites->hashSigAlgoSz) {
  18123. word16 i;
  18124. /* extension type */
  18125. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  18126. idx += HELLO_EXT_TYPE_SZ;
  18127. /* extension data length */
  18128. c16toa(HELLO_EXT_SIGALGO_SZ + ssl->suites->hashSigAlgoSz,
  18129. output + idx);
  18130. idx += HELLO_EXT_SZ_SZ;
  18131. /* sig algos length */
  18132. c16toa(ssl->suites->hashSigAlgoSz, output + idx);
  18133. idx += HELLO_EXT_SIGALGO_SZ;
  18134. for (i=0; i < ssl->suites->hashSigAlgoSz; i++, idx++) {
  18135. output[idx] = ssl->suites->hashSigAlgo[i];
  18136. }
  18137. }
  18138. }
  18139. #ifdef HAVE_EXTENDED_MASTER
  18140. if (ssl->options.haveEMS) {
  18141. c16toa(HELLO_EXT_EXTMS, output + idx);
  18142. idx += HELLO_EXT_TYPE_SZ;
  18143. c16toa(0, output + idx);
  18144. idx += HELLO_EXT_SZ_SZ;
  18145. }
  18146. #endif
  18147. }
  18148. #endif
  18149. if (IsEncryptionOn(ssl, 1)) {
  18150. byte* input;
  18151. int inputSz = idx; /* build msg adds rec hdr */
  18152. int recordHeaderSz = RECORD_HEADER_SZ;
  18153. if (ssl->options.dtls)
  18154. recordHeaderSz += DTLS_RECORD_EXTRA;
  18155. inputSz -= recordHeaderSz;
  18156. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18157. if (input == NULL)
  18158. return MEMORY_E;
  18159. XMEMCPY(input, output + recordHeaderSz, inputSz);
  18160. #ifdef WOLFSSL_DTLS
  18161. if (IsDtlsNotSctpMode(ssl) &&
  18162. (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
  18163. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18164. return ret;
  18165. }
  18166. #endif
  18167. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  18168. handshake, 1, 0, 0, CUR_ORDER);
  18169. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18170. if (sendSz < 0)
  18171. return sendSz;
  18172. } else {
  18173. #ifdef WOLFSSL_DTLS
  18174. if (IsDtlsNotSctpMode(ssl)) {
  18175. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
  18176. return ret;
  18177. }
  18178. if (ssl->options.dtls)
  18179. DtlsSEQIncrement(ssl, CUR_ORDER);
  18180. #endif
  18181. ret = HashOutput(ssl, output, sendSz, 0);
  18182. if (ret != 0)
  18183. return ret;
  18184. }
  18185. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  18186. #ifdef OPENSSL_EXTRA
  18187. ssl->cbmode = SSL_CB_MODE_WRITE;
  18188. if (ssl->CBIS != NULL)
  18189. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  18190. #endif
  18191. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18192. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  18193. if (ssl->toInfoOn)
  18194. AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  18195. WRITE_PROTO, ssl->heap);
  18196. #endif
  18197. ssl->buffers.outputBuffer.length += sendSz;
  18198. ret = SendBuffered(ssl);
  18199. WOLFSSL_LEAVE("SendClientHello", ret);
  18200. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  18201. return ret;
  18202. }
  18203. /* handle processing of DTLS hello_verify_request (3) */
  18204. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input,
  18205. word32* inOutIdx, word32 size)
  18206. {
  18207. ProtocolVersion pv;
  18208. byte cookieSz;
  18209. word32 begin = *inOutIdx;
  18210. #ifdef WOLFSSL_CALLBACKS
  18211. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  18212. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  18213. #endif
  18214. #ifdef WOLFSSL_DTLS
  18215. if (ssl->options.dtls) {
  18216. DtlsMsgPoolReset(ssl);
  18217. }
  18218. #endif
  18219. if (OPAQUE16_LEN + OPAQUE8_LEN > size)
  18220. return BUFFER_ERROR;
  18221. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  18222. *inOutIdx += OPAQUE16_LEN;
  18223. if (pv.major != DTLS_MAJOR ||
  18224. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  18225. return VERSION_ERROR;
  18226. cookieSz = input[(*inOutIdx)++];
  18227. if (cookieSz) {
  18228. if ((*inOutIdx - begin) + cookieSz > size)
  18229. return BUFFER_ERROR;
  18230. #ifdef WOLFSSL_DTLS
  18231. if (cookieSz <= MAX_COOKIE_LEN) {
  18232. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  18233. ssl->arrays->cookieSz = cookieSz;
  18234. }
  18235. #endif
  18236. *inOutIdx += cookieSz;
  18237. }
  18238. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  18239. return 0;
  18240. }
  18241. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  18242. {
  18243. int ret = 0;
  18244. #ifdef HAVE_SECRET_CALLBACK
  18245. /* If a session secret callback exists, we are using that
  18246. * key instead of the saved session key. */
  18247. ret = ret || (ssl->sessionSecretCb != NULL);
  18248. #endif
  18249. #ifdef HAVE_SESSION_TICKET
  18250. /* server may send blank ticket which may not be expected to indicate
  18251. * existing one ok but will also be sending a new one */
  18252. ret = ret || (ssl->session.ticketLen > 0);
  18253. #endif
  18254. ret = ret ||
  18255. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  18256. ssl->session.sessionID, ID_LEN) == 0);
  18257. return ret;
  18258. }
  18259. /* Check the version in the received message is valid and set protocol
  18260. * version to use.
  18261. *
  18262. * ssl The SSL/TLS object.
  18263. * pv The protocol version from the packet.
  18264. * returns 0 on success, otherwise failure.
  18265. */
  18266. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  18267. {
  18268. #ifdef WOLFSSL_TLS13_DRAFT
  18269. if (pv.major == TLS_DRAFT_MAJOR) {
  18270. pv.major = SSLv3_MAJOR;
  18271. pv.minor = TLSv1_3_MINOR;
  18272. }
  18273. #endif
  18274. #ifdef OPENSSL_EXTRA
  18275. if (ssl->CBIS != NULL) {
  18276. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, SSL_SUCCESS);
  18277. }
  18278. #endif
  18279. if (pv.minor > ssl->version.minor) {
  18280. WOLFSSL_MSG("Server using higher version, fatal error");
  18281. return VERSION_ERROR;
  18282. }
  18283. if (pv.minor < ssl->version.minor) {
  18284. WOLFSSL_MSG("server using lower version");
  18285. /* Check for downgrade attack. */
  18286. if (!ssl->options.downgrade) {
  18287. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  18288. return VERSION_ERROR;
  18289. }
  18290. if (pv.minor < ssl->options.minDowngrade) {
  18291. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  18292. return VERSION_ERROR;
  18293. }
  18294. #ifdef HAVE_SECURE_RENEGOTIATION
  18295. if (ssl->secure_renegotiation &&
  18296. ssl->secure_renegotiation->enabled &&
  18297. ssl->options.handShakeDone) {
  18298. WOLFSSL_MSG("Server changed version during scr");
  18299. return VERSION_ERROR;
  18300. }
  18301. #endif
  18302. /* Checks made - OK to downgrade. */
  18303. if (pv.minor == SSLv3_MINOR) {
  18304. /* turn off tls */
  18305. WOLFSSL_MSG("\tdowngrading to SSLv3");
  18306. ssl->options.tls = 0;
  18307. ssl->options.tls1_1 = 0;
  18308. ssl->version.minor = SSLv3_MINOR;
  18309. }
  18310. else if (pv.minor == TLSv1_MINOR) {
  18311. /* turn off tls 1.1+ */
  18312. WOLFSSL_MSG("\tdowngrading to TLSv1");
  18313. ssl->options.tls1_1 = 0;
  18314. ssl->version.minor = TLSv1_MINOR;
  18315. }
  18316. else if (pv.minor == TLSv1_1_MINOR) {
  18317. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  18318. ssl->version.minor = TLSv1_1_MINOR;
  18319. }
  18320. else if (pv.minor == TLSv1_2_MINOR) {
  18321. WOLFSSL_MSG(" downgrading to TLSv1.2");
  18322. ssl->version.minor = TLSv1_2_MINOR;
  18323. }
  18324. }
  18325. #ifdef OPENSSL_EXTRA
  18326. /* check if option is set to not allow the current version
  18327. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  18328. if (!ssl->options.dtls && ssl->options.downgrade &&
  18329. ssl->options.mask > 0) {
  18330. if (ssl->version.minor == TLSv1_2_MINOR &&
  18331. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  18332. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  18333. ssl->version.minor = TLSv1_1_MINOR;
  18334. }
  18335. if (ssl->version.minor == TLSv1_1_MINOR &&
  18336. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  18337. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  18338. ssl->options.tls1_1 = 0;
  18339. ssl->version.minor = TLSv1_MINOR;
  18340. }
  18341. if (ssl->version.minor == TLSv1_MINOR &&
  18342. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  18343. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  18344. ssl->options.tls = 0;
  18345. ssl->options.tls1_1 = 0;
  18346. ssl->version.minor = SSLv3_MINOR;
  18347. }
  18348. if (ssl->version.minor == SSLv3_MINOR &&
  18349. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  18350. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  18351. return VERSION_ERROR;
  18352. }
  18353. if (ssl->version.minor < ssl->options.minDowngrade) {
  18354. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  18355. return VERSION_ERROR;
  18356. }
  18357. }
  18358. #endif
  18359. return 0;
  18360. }
  18361. /* handle processing of server_hello (2) */
  18362. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  18363. word32 helloSz)
  18364. {
  18365. byte cs0; /* cipher suite bytes 0, 1 */
  18366. byte cs1;
  18367. ProtocolVersion pv;
  18368. byte compression;
  18369. word32 i = *inOutIdx;
  18370. word32 begin = i;
  18371. int ret;
  18372. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  18373. WOLFSSL_ENTER("DoServerHello");
  18374. #ifdef WOLFSSL_CALLBACKS
  18375. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  18376. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  18377. #endif
  18378. /* protocol version, random and session id length check */
  18379. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  18380. return BUFFER_ERROR;
  18381. /* protocol version */
  18382. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  18383. i += OPAQUE16_LEN;
  18384. ret = CheckVersion(ssl, pv);
  18385. if (ret != 0)
  18386. return ret;
  18387. #ifdef WOLFSSL_TLS13
  18388. if (IsAtLeastTLSv1_3(pv)) {
  18389. byte type = server_hello;
  18390. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  18391. }
  18392. #endif
  18393. /* random */
  18394. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  18395. i += RAN_LEN;
  18396. /* session id */
  18397. ssl->arrays->sessionIDSz = input[i++];
  18398. if (ssl->arrays->sessionIDSz > ID_LEN) {
  18399. WOLFSSL_MSG("Invalid session ID size");
  18400. ssl->arrays->sessionIDSz = 0;
  18401. return BUFFER_ERROR;
  18402. }
  18403. else if (ssl->arrays->sessionIDSz) {
  18404. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  18405. return BUFFER_ERROR;
  18406. XMEMCPY(ssl->arrays->sessionID, input + i,
  18407. ssl->arrays->sessionIDSz);
  18408. i += ssl->arrays->sessionIDSz;
  18409. ssl->options.haveSessionId = 1;
  18410. }
  18411. /* suite and compression */
  18412. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  18413. return BUFFER_ERROR;
  18414. cs0 = input[i++];
  18415. cs1 = input[i++];
  18416. #ifdef HAVE_SECURE_RENEGOTIATION
  18417. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  18418. ssl->options.handShakeDone) {
  18419. if (ssl->options.cipherSuite0 != cs0 ||
  18420. ssl->options.cipherSuite != cs1) {
  18421. WOLFSSL_MSG("Server changed cipher suite during scr");
  18422. return MATCH_SUITE_ERROR;
  18423. }
  18424. }
  18425. #endif
  18426. ssl->options.cipherSuite0 = cs0;
  18427. ssl->options.cipherSuite = cs1;
  18428. compression = input[i++];
  18429. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  18430. {
  18431. word32 idx, found = 0;
  18432. /* confirm server_hello cipher suite is one sent in client_hello */
  18433. for (idx = 0; idx < ssl->suites->suiteSz; idx += 2) {
  18434. if (ssl->suites->suites[idx] == cs0 &&
  18435. ssl->suites->suites[idx+1] == cs1) {
  18436. found = 1;
  18437. break;
  18438. }
  18439. }
  18440. if (!found) {
  18441. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  18442. return MATCH_SUITE_ERROR;
  18443. }
  18444. }
  18445. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  18446. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  18447. WOLFSSL_MSG("Server forcing compression w/o support");
  18448. return COMPRESSION_ERROR;
  18449. }
  18450. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  18451. WOLFSSL_MSG("Server refused compression, turning off");
  18452. ssl->options.usingCompression = 0; /* turn off if server refused */
  18453. }
  18454. *inOutIdx = i;
  18455. #ifdef HAVE_TLS_EXTENSIONS
  18456. if ( (i - begin) < helloSz) {
  18457. if (TLSX_SupportExtensions(ssl)) {
  18458. word16 totalExtSz;
  18459. if ((i - begin) + OPAQUE16_LEN > helloSz)
  18460. return BUFFER_ERROR;
  18461. ato16(&input[i], &totalExtSz);
  18462. i += OPAQUE16_LEN;
  18463. if ((i - begin) + totalExtSz > helloSz)
  18464. return BUFFER_ERROR;
  18465. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  18466. server_hello, NULL)))
  18467. return ret;
  18468. i += totalExtSz;
  18469. *inOutIdx = i;
  18470. }
  18471. else
  18472. *inOutIdx = begin + helloSz; /* skip extensions */
  18473. }
  18474. else
  18475. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  18476. #else
  18477. {
  18478. int allowExt = 0;
  18479. byte pendingEMS = 0;
  18480. if ( (i - begin) < helloSz) {
  18481. if (ssl->version.major == SSLv3_MAJOR &&
  18482. ssl->version.minor >= TLSv1_MINOR) {
  18483. allowExt = 1;
  18484. }
  18485. #ifdef WOLFSSL_DTLS
  18486. if (ssl->version.major == DTLS_MAJOR)
  18487. allowExt = 1;
  18488. #endif
  18489. if (allowExt) {
  18490. word16 totalExtSz;
  18491. if ((i - begin) + OPAQUE16_LEN > helloSz)
  18492. return BUFFER_ERROR;
  18493. ato16(&input[i], &totalExtSz);
  18494. i += OPAQUE16_LEN;
  18495. if ((i - begin) + totalExtSz > helloSz)
  18496. return BUFFER_ERROR;
  18497. while (totalExtSz) {
  18498. word16 extId, extSz;
  18499. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  18500. return BUFFER_ERROR;
  18501. ato16(&input[i], &extId);
  18502. i += OPAQUE16_LEN;
  18503. ato16(&input[i], &extSz);
  18504. i += OPAQUE16_LEN;
  18505. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  18506. return BUFFER_ERROR;
  18507. if (extId == HELLO_EXT_EXTMS)
  18508. pendingEMS = 1;
  18509. else
  18510. i += extSz;
  18511. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  18512. }
  18513. *inOutIdx = i;
  18514. }
  18515. else
  18516. *inOutIdx = begin + helloSz; /* skip extensions */
  18517. }
  18518. if (!pendingEMS && ssl->options.haveEMS)
  18519. ssl->options.haveEMS = 0;
  18520. }
  18521. #endif
  18522. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  18523. if (IsEncryptionOn(ssl, 0)) {
  18524. *inOutIdx += ssl->keys.padSz;
  18525. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18526. if (ssl->options.startedETMWrite &&
  18527. ssl->specs.cipher_type == block) {
  18528. *inOutIdx += MacSize(ssl);
  18529. }
  18530. #endif
  18531. }
  18532. #ifdef HAVE_SECRET_CALLBACK
  18533. if (ssl->sessionSecretCb != NULL) {
  18534. int secretSz = SECRET_LEN;
  18535. ret = ssl->sessionSecretCb(ssl, ssl->session.masterSecret,
  18536. &secretSz, ssl->sessionSecretCtx);
  18537. if (ret != 0 || secretSz != SECRET_LEN)
  18538. return SESSION_SECRET_CB_E;
  18539. }
  18540. #endif /* HAVE_SECRET_CALLBACK */
  18541. ret = CompleteServerHello(ssl);
  18542. WOLFSSL_LEAVE("DoServerHello", ret);
  18543. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  18544. return ret;
  18545. }
  18546. int CompleteServerHello(WOLFSSL* ssl)
  18547. {
  18548. int ret;
  18549. if (!ssl->options.resuming) {
  18550. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  18551. TLS13_DOWNGRADE_SZ - 1;
  18552. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  18553. #ifdef WOLFSSL_TLS13
  18554. if (TLSv1_3_Capable(ssl)) {
  18555. /* TLS v1.3 capable client not allowed to downgrade when
  18556. * connecting to TLS v1.3 capable server unless cipher suite
  18557. * demands it.
  18558. */
  18559. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  18560. (vers == 0 || vers == 1)) {
  18561. SendAlert(ssl, alert_fatal, illegal_parameter);
  18562. return VERSION_ERROR;
  18563. }
  18564. }
  18565. else
  18566. #endif
  18567. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  18568. ssl->ctx->method->version.minor == TLSv1_2_MINOR
  18569. #ifdef OPENSSL_EXTRA
  18570. && (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0
  18571. #endif
  18572. ) {
  18573. /* TLS v1.2 capable client not allowed to downgrade when
  18574. * connecting to TLS v1.2 capable server.
  18575. */
  18576. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  18577. vers == 0) {
  18578. SendAlert(ssl, alert_fatal, illegal_parameter);
  18579. return VERSION_ERROR;
  18580. }
  18581. }
  18582. }
  18583. else {
  18584. if (DSH_CheckSessionId(ssl)) {
  18585. if (SetCipherSpecs(ssl) == 0) {
  18586. XMEMCPY(ssl->arrays->masterSecret,
  18587. ssl->session.masterSecret, SECRET_LEN);
  18588. #ifdef NO_OLD_TLS
  18589. ret = DeriveTlsKeys(ssl);
  18590. #else
  18591. ret = -1; /* default value */
  18592. #ifndef NO_TLS
  18593. if (ssl->options.tls)
  18594. ret = DeriveTlsKeys(ssl);
  18595. #endif
  18596. if (!ssl->options.tls)
  18597. ret = DeriveKeys(ssl);
  18598. #endif /* NO_OLD_TLS */
  18599. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  18600. return ret;
  18601. }
  18602. else {
  18603. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  18604. return UNSUPPORTED_SUITE;
  18605. }
  18606. }
  18607. else {
  18608. WOLFSSL_MSG("Server denied resumption attempt");
  18609. ssl->options.resuming = 0; /* server denied resumption try */
  18610. }
  18611. }
  18612. return SetCipherSpecs(ssl);
  18613. }
  18614. #endif /* !WOLFSSL_NO_TLS12 */
  18615. /* Make sure client setup is valid for this suite, true on success */
  18616. int VerifyClientSuite(WOLFSSL* ssl)
  18617. {
  18618. int havePSK = 0;
  18619. byte first = ssl->options.cipherSuite0;
  18620. byte second = ssl->options.cipherSuite;
  18621. WOLFSSL_ENTER("VerifyClientSuite");
  18622. #ifndef NO_PSK
  18623. havePSK = ssl->options.havePSK;
  18624. #endif
  18625. if (CipherRequires(first, second, REQUIRES_PSK)) {
  18626. WOLFSSL_MSG("Requires PSK");
  18627. if (havePSK == 0) {
  18628. WOLFSSL_MSG("Don't have PSK");
  18629. return 0;
  18630. }
  18631. }
  18632. return 1; /* success */
  18633. }
  18634. #ifndef WOLFSSL_NO_TLS12
  18635. #ifndef NO_CERTS
  18636. /* handle processing of certificate_request (13) */
  18637. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  18638. inOutIdx, word32 size)
  18639. {
  18640. word16 len;
  18641. word32 begin = *inOutIdx;
  18642. #ifdef OPENSSL_EXTRA
  18643. int ret;
  18644. WOLFSSL_X509* x509 = NULL;
  18645. WOLFSSL_EVP_PKEY* pkey = NULL;
  18646. #endif
  18647. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  18648. WOLFSSL_ENTER("DoCertificateRequest");
  18649. #ifdef WOLFSSL_CALLBACKS
  18650. if (ssl->hsInfoOn)
  18651. AddPacketName(ssl, "CertificateRequest");
  18652. if (ssl->toInfoOn)
  18653. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  18654. #endif
  18655. if (OPAQUE8_LEN > size)
  18656. return BUFFER_ERROR;
  18657. len = input[(*inOutIdx)++];
  18658. if ((*inOutIdx - begin) + len > size)
  18659. return BUFFER_ERROR;
  18660. /* types, read in here */
  18661. *inOutIdx += len;
  18662. /* signature and hash signature algorithm */
  18663. if (IsAtLeastTLSv1_2(ssl)) {
  18664. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  18665. return BUFFER_ERROR;
  18666. ato16(input + *inOutIdx, &len);
  18667. *inOutIdx += OPAQUE16_LEN;
  18668. if ((*inOutIdx - begin) + len > size)
  18669. return BUFFER_ERROR;
  18670. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  18671. ssl->buffers.certificate &&
  18672. ssl->buffers.certificate->buffer) {
  18673. #ifdef HAVE_PK_CALLBACKS
  18674. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  18675. WOLFSSL_MSG("Using PK for client private key");
  18676. return INVALID_PARAMETER;
  18677. }
  18678. #endif
  18679. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  18680. return INVALID_PARAMETER;
  18681. }
  18682. }
  18683. *inOutIdx += len;
  18684. #ifdef WC_RSA_PSS
  18685. ssl->pssAlgo = 0;
  18686. if (ssl->suites->sigAlgo == rsa_pss_sa_algo)
  18687. ssl->pssAlgo |= 1 << ssl->suites->hashAlgo;
  18688. #endif
  18689. }
  18690. /* authorities */
  18691. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  18692. return BUFFER_ERROR;
  18693. ato16(input + *inOutIdx, &len);
  18694. *inOutIdx += OPAQUE16_LEN;
  18695. if ((*inOutIdx - begin) + len > size)
  18696. return BUFFER_ERROR;
  18697. while (len) {
  18698. word16 dnSz;
  18699. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  18700. return BUFFER_ERROR;
  18701. ato16(input + *inOutIdx, &dnSz);
  18702. *inOutIdx += OPAQUE16_LEN;
  18703. if ((*inOutIdx - begin) + dnSz > size)
  18704. return BUFFER_ERROR;
  18705. *inOutIdx += dnSz;
  18706. len -= OPAQUE16_LEN + dnSz;
  18707. }
  18708. #ifdef OPENSSL_EXTRA
  18709. /* call client cert callback if no cert has been loaded */
  18710. if ((ssl->ctx->CBClientCert != NULL) &&
  18711. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  18712. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  18713. if (ret == 1) {
  18714. if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
  18715. (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
  18716. return CLIENT_CERT_CB_ERROR;
  18717. }
  18718. wolfSSL_X509_free(x509);
  18719. wolfSSL_EVP_PKEY_free(pkey);
  18720. } else if (ret < 0) {
  18721. return WOLFSSL_ERROR_WANT_X509_LOOKUP;
  18722. }
  18723. }
  18724. #endif
  18725. /* don't send client cert or cert verify if user hasn't provided
  18726. cert and private key */
  18727. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  18728. #ifdef HAVE_PK_CALLBACKS
  18729. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  18730. WOLFSSL_MSG("Using PK for client private key");
  18731. ssl->options.sendVerify = SEND_CERT;
  18732. }
  18733. #endif
  18734. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  18735. ssl->options.sendVerify = SEND_CERT;
  18736. }
  18737. }
  18738. #ifdef OPENSSL_EXTRA
  18739. else
  18740. #else
  18741. else if (IsTLS(ssl))
  18742. #endif
  18743. {
  18744. ssl->options.sendVerify = SEND_BLANK_CERT;
  18745. }
  18746. if (IsEncryptionOn(ssl, 0)) {
  18747. *inOutIdx += ssl->keys.padSz;
  18748. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18749. if (ssl->options.startedETMRead)
  18750. *inOutIdx += MacSize(ssl);
  18751. #endif
  18752. }
  18753. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  18754. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  18755. return 0;
  18756. }
  18757. #endif /* !NO_CERTS */
  18758. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  18759. static int CheckCurveId(int tlsCurveId)
  18760. {
  18761. int ret = ECC_CURVE_ERROR;
  18762. switch (tlsCurveId) {
  18763. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  18764. #ifndef NO_ECC_SECP
  18765. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  18766. #endif /* !NO_ECC_SECP */
  18767. #ifdef HAVE_ECC_SECPR2
  18768. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  18769. #endif /* HAVE_ECC_SECPR2 */
  18770. #ifdef HAVE_ECC_KOBLITZ
  18771. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  18772. #endif /* HAVE_ECC_KOBLITZ */
  18773. #endif
  18774. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  18775. #ifndef NO_ECC_SECP
  18776. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  18777. #endif /* !NO_ECC_SECP */
  18778. #ifdef HAVE_ECC_KOBLITZ
  18779. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  18780. #endif /* HAVE_ECC_KOBLITZ */
  18781. #endif
  18782. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  18783. #ifndef NO_ECC_SECP
  18784. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  18785. #endif /* !NO_ECC_SECP */
  18786. #ifdef HAVE_ECC_KOBLITZ
  18787. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  18788. #endif /* HAVE_ECC_KOBLITZ */
  18789. #endif
  18790. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  18791. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  18792. #endif
  18793. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  18794. #ifndef NO_ECC_SECP
  18795. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  18796. #endif /* !NO_ECC_SECP */
  18797. #ifdef HAVE_ECC_KOBLITZ
  18798. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  18799. #endif /* HAVE_ECC_KOBLITZ */
  18800. #ifdef HAVE_ECC_BRAINPOOL
  18801. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  18802. #endif /* HAVE_ECC_BRAINPOOL */
  18803. #endif
  18804. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  18805. case WOLFSSL_ECC_X448: return ECC_X448_OID;
  18806. #endif
  18807. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  18808. #ifndef NO_ECC_SECP
  18809. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  18810. #endif /* !NO_ECC_SECP */
  18811. #ifdef HAVE_ECC_BRAINPOOL
  18812. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  18813. #endif /* HAVE_ECC_BRAINPOOL */
  18814. #endif
  18815. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  18816. #ifdef HAVE_ECC_BRAINPOOL
  18817. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  18818. #endif /* HAVE_ECC_BRAINPOOL */
  18819. #endif
  18820. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  18821. #ifndef NO_ECC_SECP
  18822. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  18823. #endif /* !NO_ECC_SECP */
  18824. #endif
  18825. }
  18826. return ret;
  18827. }
  18828. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  18829. /* Persistable DoServerKeyExchange arguments */
  18830. typedef struct DskeArgs {
  18831. byte* output; /* not allocated */
  18832. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  18833. defined(HAVE_CURVE448)
  18834. byte* verifySig;
  18835. #endif
  18836. word32 idx;
  18837. word32 begin;
  18838. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  18839. defined(HAVE_CURVE448)
  18840. word16 verifySigSz;
  18841. #endif
  18842. word16 sigSz;
  18843. byte sigAlgo;
  18844. byte hashAlgo;
  18845. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  18846. int bits;
  18847. #endif
  18848. } DskeArgs;
  18849. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  18850. {
  18851. DskeArgs* args = (DskeArgs*)pArgs;
  18852. (void)ssl;
  18853. (void)args;
  18854. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  18855. defined(HAVE_CURVE448)
  18856. if (args->verifySig) {
  18857. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  18858. args->verifySig = NULL;
  18859. }
  18860. #endif
  18861. }
  18862. #ifndef NO_DH
  18863. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  18864. DskeArgs* args)
  18865. {
  18866. int ret = 0;
  18867. word16 length;
  18868. #ifdef HAVE_FFDHE
  18869. const DhParams* params = NULL;
  18870. int group = 0;
  18871. #endif
  18872. if (ssl->buffers.weOwnDH) {
  18873. if (ssl->buffers.serverDH_P.buffer) {
  18874. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  18875. DYNAMIC_TYPE_PUBLIC_KEY);
  18876. ssl->buffers.serverDH_P.buffer = NULL;
  18877. }
  18878. if (ssl->buffers.serverDH_G.buffer) {
  18879. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  18880. DYNAMIC_TYPE_PUBLIC_KEY);
  18881. ssl->buffers.serverDH_G.buffer = NULL;
  18882. }
  18883. }
  18884. if (ssl->buffers.serverDH_Pub.buffer) {
  18885. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
  18886. DYNAMIC_TYPE_PUBLIC_KEY);
  18887. ssl->buffers.serverDH_Pub.buffer = NULL;
  18888. }
  18889. /* p */
  18890. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  18891. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18892. }
  18893. ato16(input + args->idx, &length);
  18894. args->idx += OPAQUE16_LEN;
  18895. if ((args->idx - args->begin) + length > size) {
  18896. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18897. }
  18898. if (length < ssl->options.minDhKeySz) {
  18899. WOLFSSL_MSG("Server using a DH key that is too small");
  18900. SendAlert(ssl, alert_fatal, handshake_failure);
  18901. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  18902. }
  18903. if (length > ssl->options.maxDhKeySz) {
  18904. WOLFSSL_MSG("Server using a DH key that is too big");
  18905. SendAlert(ssl, alert_fatal, handshake_failure);
  18906. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  18907. }
  18908. ssl->buffers.serverDH_P.buffer =
  18909. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18910. if (ssl->buffers.serverDH_P.buffer) {
  18911. ssl->buffers.serverDH_P.length = length;
  18912. }
  18913. else {
  18914. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  18915. }
  18916. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  18917. length);
  18918. args->idx += length;
  18919. ssl->options.dhKeySz = length;
  18920. /* g */
  18921. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  18922. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  18923. DYNAMIC_TYPE_PUBLIC_KEY);
  18924. ssl->buffers.serverDH_P.buffer = NULL;
  18925. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18926. }
  18927. ato16(input + args->idx, &length);
  18928. args->idx += OPAQUE16_LEN;
  18929. if ((args->idx - args->begin) + length > size) {
  18930. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  18931. DYNAMIC_TYPE_PUBLIC_KEY);
  18932. ssl->buffers.serverDH_P.buffer = NULL;
  18933. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18934. }
  18935. if (length > ssl->options.maxDhKeySz) {
  18936. WOLFSSL_MSG("Server using a DH key generator that is too big");
  18937. SendAlert(ssl, alert_fatal, handshake_failure);
  18938. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  18939. DYNAMIC_TYPE_PUBLIC_KEY);
  18940. ssl->buffers.serverDH_P.buffer = NULL;
  18941. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  18942. }
  18943. ssl->buffers.serverDH_G.buffer =
  18944. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18945. if (ssl->buffers.serverDH_G.buffer) {
  18946. ssl->buffers.serverDH_G.length = length;
  18947. }
  18948. else {
  18949. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  18950. DYNAMIC_TYPE_PUBLIC_KEY);
  18951. ssl->buffers.serverDH_P.buffer = NULL;
  18952. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  18953. }
  18954. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  18955. length);
  18956. args->idx += length;
  18957. /* pub */
  18958. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  18959. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  18960. DYNAMIC_TYPE_PUBLIC_KEY);
  18961. ssl->buffers.serverDH_P.buffer = NULL;
  18962. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  18963. DYNAMIC_TYPE_PUBLIC_KEY);
  18964. ssl->buffers.serverDH_G.buffer = NULL;
  18965. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18966. }
  18967. ato16(input + args->idx, &length);
  18968. args->idx += OPAQUE16_LEN;
  18969. if ((args->idx - args->begin) + length > size) {
  18970. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  18971. DYNAMIC_TYPE_PUBLIC_KEY);
  18972. ssl->buffers.serverDH_P.buffer = NULL;
  18973. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  18974. DYNAMIC_TYPE_PUBLIC_KEY);
  18975. ssl->buffers.serverDH_G.buffer = NULL;
  18976. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18977. }
  18978. if (length > ssl->options.maxDhKeySz) {
  18979. WOLFSSL_MSG("Server using a public DH key that is too big");
  18980. SendAlert(ssl, alert_fatal, handshake_failure);
  18981. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  18982. DYNAMIC_TYPE_PUBLIC_KEY);
  18983. ssl->buffers.serverDH_P.buffer = NULL;
  18984. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  18985. DYNAMIC_TYPE_PUBLIC_KEY);
  18986. ssl->buffers.serverDH_G.buffer = NULL;
  18987. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  18988. }
  18989. ssl->buffers.serverDH_Pub.buffer =
  18990. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18991. if (ssl->buffers.serverDH_Pub.buffer) {
  18992. ssl->buffers.serverDH_Pub.length = length;
  18993. }
  18994. else {
  18995. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  18996. DYNAMIC_TYPE_PUBLIC_KEY);
  18997. ssl->buffers.serverDH_P.buffer = NULL;
  18998. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  18999. DYNAMIC_TYPE_PUBLIC_KEY);
  19000. ssl->buffers.serverDH_G.buffer = NULL;
  19001. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  19002. }
  19003. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  19004. length);
  19005. ssl->buffers.weOwnDH = 1;
  19006. args->idx += length;
  19007. #ifdef HAVE_FFDHE
  19008. switch (ssl->options.dhKeySz) {
  19009. #ifdef HAVE_FFDHE_2048
  19010. case 2048/8:
  19011. params = wc_Dh_ffdhe2048_Get();
  19012. group = WOLFSSL_FFDHE_2048;
  19013. break;
  19014. #endif
  19015. #ifdef HAVE_FFDHE_3072
  19016. case 3072/8:
  19017. params = wc_Dh_ffdhe3072_Get();
  19018. group = WOLFSSL_FFDHE_3072;
  19019. break;
  19020. #endif
  19021. #ifdef HAVE_FFDHE_4096
  19022. case 4096/8:
  19023. params = wc_Dh_ffdhe4096_Get();
  19024. group = WOLFSSL_FFDHE_4096;
  19025. break;
  19026. #endif
  19027. #ifdef HAVE_FFDHE_6144
  19028. case 6144/8:
  19029. params = wc_Dh_ffdhe6144_Get();
  19030. group = WOLFSSL_FFDHE_6144;
  19031. break;
  19032. #endif
  19033. #ifdef HAVE_FFDHE_8192
  19034. case 8192/8:
  19035. params = wc_Dh_ffdhe8192_Get();
  19036. group = WOLFSSL_FFDHE_8192;
  19037. break;
  19038. #endif
  19039. default:
  19040. break;
  19041. }
  19042. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  19043. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  19044. params->g_len) != 0) ||
  19045. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  19046. params->p_len) != 0)) {
  19047. WOLFSSL_MSG("Server not using FFDHE parameters");
  19048. #ifdef WOLFSSL_REQUIRE_FFDHE
  19049. SendAlert(ssl, alert_fatal, handshake_failure);
  19050. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  19051. #endif
  19052. }
  19053. else {
  19054. ssl->namedGroup = group;
  19055. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  19056. !defined(HAVE_SELFTEST)
  19057. ssl->options.dhDoKeyTest = 0;
  19058. #endif
  19059. }
  19060. #endif /* HAVE_FFDHE */
  19061. exit_gdpk:
  19062. return ret;
  19063. }
  19064. #endif
  19065. /* handle processing of server_key_exchange (12) */
  19066. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  19067. word32* inOutIdx, word32 size)
  19068. {
  19069. int ret = 0;
  19070. #ifdef WOLFSSL_ASYNC_CRYPT
  19071. DskeArgs* args = (DskeArgs*)ssl->async.args;
  19072. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  19073. (void)sizeof(args_test);
  19074. #else
  19075. DskeArgs args[1];
  19076. #endif
  19077. (void)input;
  19078. (void)size;
  19079. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  19080. WOLFSSL_ENTER("DoServerKeyExchange");
  19081. #ifdef WOLFSSL_ASYNC_CRYPT
  19082. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  19083. if (ret != WC_NOT_PENDING_E) {
  19084. /* Check for error */
  19085. if (ret < 0)
  19086. goto exit_dske;
  19087. }
  19088. else
  19089. #endif
  19090. {
  19091. /* Reset state */
  19092. ret = 0;
  19093. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  19094. XMEMSET(args, 0, sizeof(DskeArgs));
  19095. args->idx = *inOutIdx;
  19096. args->begin = *inOutIdx;
  19097. args->sigAlgo = ssl->specs.sig_algo;
  19098. args->hashAlgo = sha_mac;
  19099. #ifdef WOLFSSL_ASYNC_CRYPT
  19100. ssl->async.freeArgs = FreeDskeArgs;
  19101. #endif
  19102. }
  19103. switch(ssl->options.asyncState)
  19104. {
  19105. case TLS_ASYNC_BEGIN:
  19106. {
  19107. #ifdef WOLFSSL_CALLBACKS
  19108. if (ssl->hsInfoOn)
  19109. AddPacketName(ssl, "ServerKeyExchange");
  19110. if (ssl->toInfoOn)
  19111. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  19112. #endif
  19113. switch(ssl->specs.kea)
  19114. {
  19115. #ifndef NO_PSK
  19116. case psk_kea:
  19117. {
  19118. int srvHintLen;
  19119. word16 length;
  19120. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  19121. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19122. }
  19123. ato16(input + args->idx, &length);
  19124. args->idx += OPAQUE16_LEN;
  19125. if ((args->idx - args->begin) + length > size) {
  19126. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19127. }
  19128. /* get PSK server hint from the wire */
  19129. srvHintLen = min(length, MAX_PSK_ID_LEN);
  19130. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  19131. srvHintLen);
  19132. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  19133. args->idx += length;
  19134. break;
  19135. }
  19136. #endif /* !NO_PSK */
  19137. #ifndef NO_DH
  19138. case diffie_hellman_kea:
  19139. {
  19140. ret = GetDhPublicKey(ssl, input, size, args);
  19141. if (ret != 0)
  19142. goto exit_dske;
  19143. break;
  19144. }
  19145. #endif /* !NO_DH */
  19146. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  19147. defined(HAVE_CURVE448)
  19148. case ecc_diffie_hellman_kea:
  19149. {
  19150. byte b;
  19151. #ifdef HAVE_ECC
  19152. int curveId;
  19153. #endif
  19154. int curveOid;
  19155. word16 length;
  19156. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  19157. OPAQUE8_LEN > size) {
  19158. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19159. }
  19160. b = input[args->idx++];
  19161. if (b != named_curve) {
  19162. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  19163. }
  19164. args->idx += 1; /* curve type, eat leading 0 */
  19165. b = input[args->idx++];
  19166. if ((curveOid = CheckCurveId(b)) < 0) {
  19167. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  19168. }
  19169. ssl->ecdhCurveOID = curveOid;
  19170. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  19171. ssl->namedGroup = 0;
  19172. #endif
  19173. length = input[args->idx++];
  19174. if ((args->idx - args->begin) + length > size) {
  19175. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19176. }
  19177. #ifdef HAVE_CURVE25519
  19178. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  19179. if (ssl->peerX25519Key == NULL) {
  19180. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  19181. (void**)&ssl->peerX25519Key);
  19182. if (ret != 0) {
  19183. goto exit_dske;
  19184. }
  19185. } else if (ssl->peerX25519KeyPresent) {
  19186. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  19187. ssl->peerX25519Key);
  19188. ssl->peerX25519KeyPresent = 0;
  19189. if (ret != 0) {
  19190. goto exit_dske;
  19191. }
  19192. }
  19193. if ((ret = wc_curve25519_check_public(
  19194. input + args->idx, length,
  19195. EC25519_LITTLE_ENDIAN)) != 0) {
  19196. #ifdef WOLFSSL_EXTRA_ALERTS
  19197. if (ret == BUFFER_E)
  19198. SendAlert(ssl, alert_fatal, decode_error);
  19199. else if (ret == ECC_OUT_OF_RANGE_E)
  19200. SendAlert(ssl, alert_fatal, bad_record_mac);
  19201. else {
  19202. SendAlert(ssl, alert_fatal, illegal_parameter);
  19203. }
  19204. #endif
  19205. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19206. }
  19207. if (wc_curve25519_import_public_ex(input + args->idx,
  19208. length, ssl->peerX25519Key,
  19209. EC25519_LITTLE_ENDIAN) != 0) {
  19210. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19211. }
  19212. args->idx += length;
  19213. ssl->peerX25519KeyPresent = 1;
  19214. break;
  19215. }
  19216. #endif
  19217. #ifdef HAVE_CURVE448
  19218. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  19219. if (ssl->peerX448Key == NULL) {
  19220. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  19221. (void**)&ssl->peerX448Key);
  19222. if (ret != 0) {
  19223. goto exit_dske;
  19224. }
  19225. } else if (ssl->peerX448KeyPresent) {
  19226. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  19227. ssl->peerX448Key);
  19228. ssl->peerX448KeyPresent = 0;
  19229. if (ret != 0) {
  19230. goto exit_dske;
  19231. }
  19232. }
  19233. if ((ret = wc_curve448_check_public(
  19234. input + args->idx, length,
  19235. EC448_LITTLE_ENDIAN)) != 0) {
  19236. #ifdef WOLFSSL_EXTRA_ALERTS
  19237. if (ret == BUFFER_E)
  19238. SendAlert(ssl, alert_fatal, decode_error);
  19239. else if (ret == ECC_OUT_OF_RANGE_E)
  19240. SendAlert(ssl, alert_fatal, bad_record_mac);
  19241. else {
  19242. SendAlert(ssl, alert_fatal, illegal_parameter);
  19243. }
  19244. #endif
  19245. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19246. }
  19247. if (wc_curve448_import_public_ex(input + args->idx,
  19248. length, ssl->peerX448Key,
  19249. EC448_LITTLE_ENDIAN) != 0) {
  19250. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19251. }
  19252. args->idx += length;
  19253. ssl->peerX448KeyPresent = 1;
  19254. break;
  19255. }
  19256. #endif
  19257. #ifdef HAVE_ECC
  19258. if (ssl->peerEccKey == NULL) {
  19259. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  19260. (void**)&ssl->peerEccKey);
  19261. if (ret != 0) {
  19262. goto exit_dske;
  19263. }
  19264. } else if (ssl->peerEccKeyPresent) {
  19265. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  19266. ssl->peerEccKeyPresent = 0;
  19267. if (ret != 0) {
  19268. goto exit_dske;
  19269. }
  19270. }
  19271. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  19272. if (wc_ecc_import_x963_ex(input + args->idx, length,
  19273. ssl->peerEccKey, curveId) != 0) {
  19274. #ifdef WOLFSSL_EXTRA_ALERTS
  19275. SendAlert(ssl, alert_fatal, illegal_parameter);
  19276. #endif
  19277. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19278. }
  19279. args->idx += length;
  19280. ssl->peerEccKeyPresent = 1;
  19281. #endif
  19282. break;
  19283. }
  19284. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  19285. #if !defined(NO_DH) && !defined(NO_PSK)
  19286. case dhe_psk_kea:
  19287. {
  19288. int srvHintLen;
  19289. word16 length;
  19290. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  19291. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19292. }
  19293. ato16(input + args->idx, &length);
  19294. args->idx += OPAQUE16_LEN;
  19295. if ((args->idx - args->begin) + length > size) {
  19296. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19297. }
  19298. /* get PSK server hint from the wire */
  19299. srvHintLen = min(length, MAX_PSK_ID_LEN);
  19300. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  19301. srvHintLen);
  19302. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  19303. args->idx += length;
  19304. ret = GetDhPublicKey(ssl, input, size, args);
  19305. if (ret != 0)
  19306. goto exit_dske;
  19307. break;
  19308. }
  19309. #endif /* !NO_DH && !NO_PSK */
  19310. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  19311. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  19312. case ecdhe_psk_kea:
  19313. {
  19314. byte b;
  19315. int curveOid, curveId;
  19316. int srvHintLen;
  19317. word16 length;
  19318. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  19319. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19320. }
  19321. ato16(input + args->idx, &length);
  19322. args->idx += OPAQUE16_LEN;
  19323. if ((args->idx - args->begin) + length > size) {
  19324. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19325. }
  19326. /* get PSK server hint from the wire */
  19327. srvHintLen = min(length, MAX_PSK_ID_LEN);
  19328. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  19329. srvHintLen);
  19330. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  19331. args->idx += length;
  19332. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  19333. OPAQUE8_LEN > size) {
  19334. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19335. }
  19336. /* Check curve name and ID */
  19337. b = input[args->idx++];
  19338. if (b != named_curve) {
  19339. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  19340. }
  19341. args->idx += 1; /* curve type, eat leading 0 */
  19342. b = input[args->idx++];
  19343. if ((curveOid = CheckCurveId(b)) < 0) {
  19344. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  19345. }
  19346. length = input[args->idx++];
  19347. if ((args->idx - args->begin) + length > size) {
  19348. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19349. }
  19350. #ifdef HAVE_CURVE25519
  19351. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  19352. if (ssl->peerX25519Key == NULL) {
  19353. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  19354. (void**)&ssl->peerX25519Key);
  19355. if (ret != 0) {
  19356. goto exit_dske;
  19357. }
  19358. } else if (ssl->peerEccKeyPresent) {
  19359. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  19360. ssl->peerX25519Key);
  19361. ssl->peerX25519KeyPresent = 0;
  19362. if (ret != 0) {
  19363. goto exit_dske;
  19364. }
  19365. }
  19366. if ((ret = wc_curve25519_check_public(
  19367. input + args->idx, length,
  19368. EC25519_LITTLE_ENDIAN)) != 0) {
  19369. #ifdef WOLFSSL_EXTRA_ALERTS
  19370. if (ret == BUFFER_E)
  19371. SendAlert(ssl, alert_fatal, decode_error);
  19372. else if (ret == ECC_OUT_OF_RANGE_E)
  19373. SendAlert(ssl, alert_fatal, bad_record_mac);
  19374. else {
  19375. SendAlert(ssl, alert_fatal, illegal_parameter);
  19376. }
  19377. #endif
  19378. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19379. }
  19380. if (wc_curve25519_import_public_ex(input + args->idx,
  19381. length, ssl->peerX25519Key,
  19382. EC25519_LITTLE_ENDIAN) != 0) {
  19383. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19384. }
  19385. args->idx += length;
  19386. ssl->peerX25519KeyPresent = 1;
  19387. break;
  19388. }
  19389. #endif
  19390. #ifdef HAVE_CURVE448
  19391. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  19392. if (ssl->peerX448Key == NULL) {
  19393. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  19394. (void**)&ssl->peerX448Key);
  19395. if (ret != 0) {
  19396. goto exit_dske;
  19397. }
  19398. } else if (ssl->peerEccKeyPresent) {
  19399. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  19400. ssl->peerX448Key);
  19401. ssl->peerX448KeyPresent = 0;
  19402. if (ret != 0) {
  19403. goto exit_dske;
  19404. }
  19405. }
  19406. if ((ret = wc_curve448_check_public(
  19407. input + args->idx, length,
  19408. EC448_LITTLE_ENDIAN)) != 0) {
  19409. #ifdef WOLFSSL_EXTRA_ALERTS
  19410. if (ret == BUFFER_E)
  19411. SendAlert(ssl, alert_fatal, decode_error);
  19412. else if (ret == ECC_OUT_OF_RANGE_E)
  19413. SendAlert(ssl, alert_fatal, bad_record_mac);
  19414. else {
  19415. SendAlert(ssl, alert_fatal, illegal_parameter);
  19416. }
  19417. #endif
  19418. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19419. }
  19420. if (wc_curve448_import_public_ex(input + args->idx,
  19421. length, ssl->peerX448Key,
  19422. EC448_LITTLE_ENDIAN) != 0) {
  19423. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19424. }
  19425. args->idx += length;
  19426. ssl->peerX448KeyPresent = 1;
  19427. break;
  19428. }
  19429. #endif
  19430. if (ssl->peerEccKey == NULL) {
  19431. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  19432. (void**)&ssl->peerEccKey);
  19433. if (ret != 0) {
  19434. goto exit_dske;
  19435. }
  19436. } else if (ssl->peerEccKeyPresent) {
  19437. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  19438. ssl->peerEccKeyPresent = 0;
  19439. if (ret != 0) {
  19440. goto exit_dske;
  19441. }
  19442. }
  19443. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  19444. if (wc_ecc_import_x963_ex(input + args->idx, length,
  19445. ssl->peerEccKey, curveId) != 0) {
  19446. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  19447. }
  19448. args->idx += length;
  19449. ssl->peerEccKeyPresent = 1;
  19450. break;
  19451. }
  19452. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  19453. default:
  19454. ret = BAD_KEA_TYPE_E;
  19455. } /* switch(ssl->specs.kea) */
  19456. /* Check for error */
  19457. if (ret != 0) {
  19458. goto exit_dske;
  19459. }
  19460. /* Advance state and proceed */
  19461. ssl->options.asyncState = TLS_ASYNC_BUILD;
  19462. } /* case TLS_ASYNC_BEGIN */
  19463. FALL_THROUGH;
  19464. case TLS_ASYNC_BUILD:
  19465. {
  19466. switch(ssl->specs.kea)
  19467. {
  19468. case psk_kea:
  19469. case dhe_psk_kea:
  19470. case ecdhe_psk_kea:
  19471. {
  19472. /* Nothing to do in this sub-state */
  19473. break;
  19474. }
  19475. case diffie_hellman_kea:
  19476. case ecc_diffie_hellman_kea:
  19477. {
  19478. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  19479. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  19480. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  19481. #else
  19482. enum wc_HashType hashType;
  19483. word16 verifySz;
  19484. if (ssl->options.usingAnon_cipher) {
  19485. break;
  19486. }
  19487. verifySz = (word16)(args->idx - args->begin);
  19488. if (verifySz > MAX_DH_SZ) {
  19489. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19490. }
  19491. if (IsAtLeastTLSv1_2(ssl)) {
  19492. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  19493. size) {
  19494. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19495. }
  19496. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  19497. &args->sigAlgo);
  19498. args->idx += 2;
  19499. hashType = HashAlgoToType(args->hashAlgo);
  19500. if (hashType == WC_HASH_TYPE_NONE) {
  19501. ERROR_OUT(ALGO_ID_E, exit_dske);
  19502. }
  19503. } else {
  19504. /* only using sha and md5 for rsa */
  19505. #ifndef NO_OLD_TLS
  19506. hashType = WC_HASH_TYPE_SHA;
  19507. if (args->sigAlgo == rsa_sa_algo) {
  19508. hashType = WC_HASH_TYPE_MD5_SHA;
  19509. }
  19510. #else
  19511. ERROR_OUT(ALGO_ID_E, exit_dske);
  19512. #endif
  19513. }
  19514. /* signature */
  19515. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  19516. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19517. }
  19518. ato16(input + args->idx, &args->verifySigSz);
  19519. args->idx += OPAQUE16_LEN;
  19520. if ((args->idx - args->begin) + args->verifySigSz > size) {
  19521. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19522. }
  19523. /* buffer for signature */
  19524. ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + verifySz,
  19525. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  19526. if (ssl->buffers.sig.buffer == NULL) {
  19527. ERROR_OUT(MEMORY_E, exit_dske);
  19528. }
  19529. ssl->buffers.sig.length = SEED_LEN + verifySz;
  19530. /* build message to hash */
  19531. XMEMCPY(ssl->buffers.sig.buffer,
  19532. ssl->arrays->clientRandom, RAN_LEN);
  19533. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN],
  19534. ssl->arrays->serverRandom, RAN_LEN);
  19535. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2],
  19536. input + args->begin, verifySz); /* message */
  19537. if (args->sigAlgo != ed25519_sa_algo) {
  19538. int digest_sz = wc_HashGetDigestSize(hashType);
  19539. if (digest_sz <= 0) {
  19540. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19541. }
  19542. ssl->buffers.digest.length = (unsigned int)digest_sz;
  19543. /* buffer for hash */
  19544. ssl->buffers.digest.buffer = (byte*)XMALLOC(
  19545. ssl->buffers.digest.length, ssl->heap,
  19546. DYNAMIC_TYPE_DIGEST);
  19547. if (ssl->buffers.digest.buffer == NULL) {
  19548. ERROR_OUT(MEMORY_E, exit_dske);
  19549. }
  19550. /* Perform hash */
  19551. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  19552. ssl->buffers.sig.length,
  19553. ssl->buffers.digest.buffer,
  19554. ssl->buffers.digest.length);
  19555. if (ret != 0) {
  19556. goto exit_dske;
  19557. }
  19558. }
  19559. switch (args->sigAlgo)
  19560. {
  19561. #ifndef NO_RSA
  19562. #ifdef WC_RSA_PSS
  19563. case rsa_pss_sa_algo:
  19564. #endif
  19565. case rsa_sa_algo:
  19566. {
  19567. if (ssl->peerRsaKey == NULL ||
  19568. !ssl->peerRsaKeyPresent) {
  19569. ERROR_OUT(NO_PEER_KEY, exit_dske);
  19570. }
  19571. break;
  19572. }
  19573. #endif /* !NO_RSA */
  19574. #ifdef HAVE_ECC
  19575. case ecc_dsa_sa_algo:
  19576. {
  19577. if (!ssl->peerEccDsaKeyPresent) {
  19578. ERROR_OUT(NO_PEER_KEY, exit_dske);
  19579. }
  19580. break;
  19581. }
  19582. #endif /* HAVE_ECC */
  19583. #if defined(HAVE_ED25519)
  19584. case ed25519_sa_algo:
  19585. {
  19586. if (!ssl->peerEd25519KeyPresent) {
  19587. ERROR_OUT(NO_PEER_KEY, exit_dske);
  19588. }
  19589. break;
  19590. }
  19591. #endif /* HAVE_ED25519 */
  19592. #if defined(HAVE_ED448)
  19593. case ed448_sa_algo:
  19594. {
  19595. if (!ssl->peerEd448KeyPresent) {
  19596. ERROR_OUT(NO_PEER_KEY, exit_dske);
  19597. }
  19598. break;
  19599. }
  19600. #endif /* HAVE_ED448 */
  19601. default:
  19602. ret = ALGO_ID_E;
  19603. } /* switch (args->sigAlgo) */
  19604. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  19605. break;
  19606. }
  19607. default:
  19608. ret = BAD_KEA_TYPE_E;
  19609. } /* switch(ssl->specs.kea) */
  19610. /* Check for error */
  19611. if (ret != 0) {
  19612. goto exit_dske;
  19613. }
  19614. /* Advance state and proceed */
  19615. ssl->options.asyncState = TLS_ASYNC_DO;
  19616. } /* case TLS_ASYNC_BUILD */
  19617. FALL_THROUGH;
  19618. case TLS_ASYNC_DO:
  19619. {
  19620. switch(ssl->specs.kea)
  19621. {
  19622. case psk_kea:
  19623. case dhe_psk_kea:
  19624. case ecdhe_psk_kea:
  19625. {
  19626. /* Nothing to do in this sub-state */
  19627. break;
  19628. }
  19629. case diffie_hellman_kea:
  19630. case ecc_diffie_hellman_kea:
  19631. {
  19632. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  19633. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  19634. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  19635. #else
  19636. if (ssl->options.usingAnon_cipher) {
  19637. break;
  19638. }
  19639. if (args->verifySig == NULL) {
  19640. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  19641. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  19642. if (args->verifySig == NULL) {
  19643. ERROR_OUT(MEMORY_E, exit_dske);
  19644. }
  19645. XMEMCPY(args->verifySig, input + args->idx,
  19646. args->verifySigSz);
  19647. }
  19648. switch (args->sigAlgo)
  19649. {
  19650. #ifndef NO_RSA
  19651. #ifdef WC_RSA_PSS
  19652. case rsa_pss_sa_algo:
  19653. #endif
  19654. case rsa_sa_algo:
  19655. {
  19656. ret = RsaVerify(ssl,
  19657. args->verifySig, args->verifySigSz,
  19658. &args->output,
  19659. args->sigAlgo, args->hashAlgo,
  19660. ssl->peerRsaKey,
  19661. #ifdef HAVE_PK_CALLBACKS
  19662. &ssl->buffers.peerRsaKey
  19663. #else
  19664. NULL
  19665. #endif
  19666. );
  19667. if (ret >= 0) {
  19668. args->sigSz = (word16)ret;
  19669. #ifdef WC_RSA_PSS
  19670. args->bits = mp_count_bits(&ssl->peerRsaKey->n);
  19671. #endif
  19672. ret = 0;
  19673. }
  19674. #ifdef WOLFSSL_ASYNC_CRYPT
  19675. if (ret != WC_PENDING_E)
  19676. #endif
  19677. {
  19678. /* peerRsaKey */
  19679. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  19680. (void**)&ssl->peerRsaKey);
  19681. ssl->peerRsaKeyPresent = 0;
  19682. }
  19683. break;
  19684. }
  19685. #endif /* !NO_RSA */
  19686. #ifdef HAVE_ECC
  19687. case ecc_dsa_sa_algo:
  19688. {
  19689. ret = EccVerify(ssl,
  19690. args->verifySig, args->verifySigSz,
  19691. ssl->buffers.digest.buffer,
  19692. ssl->buffers.digest.length,
  19693. ssl->peerEccDsaKey,
  19694. #ifdef HAVE_PK_CALLBACKS
  19695. &ssl->buffers.peerEccDsaKey
  19696. #else
  19697. NULL
  19698. #endif
  19699. );
  19700. #ifdef WOLFSSL_ASYNC_CRYPT
  19701. if (ret != WC_PENDING_E)
  19702. #endif
  19703. {
  19704. /* peerEccDsaKey */
  19705. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  19706. (void**)&ssl->peerEccDsaKey);
  19707. ssl->peerEccDsaKeyPresent = 0;
  19708. }
  19709. break;
  19710. }
  19711. #endif /* HAVE_ECC */
  19712. #if defined(HAVE_ED25519)
  19713. case ed25519_sa_algo:
  19714. {
  19715. ret = Ed25519Verify(ssl,
  19716. args->verifySig, args->verifySigSz,
  19717. ssl->buffers.sig.buffer,
  19718. ssl->buffers.sig.length,
  19719. ssl->peerEd25519Key,
  19720. #ifdef HAVE_PK_CALLBACKS
  19721. &ssl->buffers.peerEd25519Key
  19722. #else
  19723. NULL
  19724. #endif
  19725. );
  19726. #ifdef WOLFSSL_ASYNC_CRYPT
  19727. if (ret != WC_PENDING_E)
  19728. #endif
  19729. {
  19730. /* peerEccDsaKey */
  19731. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  19732. (void**)&ssl->peerEd25519Key);
  19733. ssl->peerEd25519KeyPresent = 0;
  19734. }
  19735. break;
  19736. }
  19737. #endif /* HAVE_ED25519 */
  19738. #if defined(HAVE_ED448)
  19739. case ed448_sa_algo:
  19740. {
  19741. ret = Ed448Verify(ssl,
  19742. args->verifySig, args->verifySigSz,
  19743. ssl->buffers.sig.buffer,
  19744. ssl->buffers.sig.length,
  19745. ssl->peerEd448Key,
  19746. #ifdef HAVE_PK_CALLBACKS
  19747. &ssl->buffers.peerEd448Key
  19748. #else
  19749. NULL
  19750. #endif
  19751. );
  19752. #ifdef WOLFSSL_ASYNC_CRYPT
  19753. if (ret != WC_PENDING_E)
  19754. #endif
  19755. {
  19756. /* peerEccDsaKey */
  19757. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  19758. (void**)&ssl->peerEd448Key);
  19759. ssl->peerEd448KeyPresent = 0;
  19760. }
  19761. break;
  19762. }
  19763. #endif /* HAVE_ED448 */
  19764. default:
  19765. ret = ALGO_ID_E;
  19766. } /* switch (sigAlgo) */
  19767. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  19768. break;
  19769. }
  19770. default:
  19771. ret = BAD_KEA_TYPE_E;
  19772. } /* switch(ssl->specs.kea) */
  19773. /* Check for error */
  19774. if (ret != 0) {
  19775. goto exit_dske;
  19776. }
  19777. /* Advance state and proceed */
  19778. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  19779. } /* case TLS_ASYNC_DO */
  19780. FALL_THROUGH;
  19781. case TLS_ASYNC_VERIFY:
  19782. {
  19783. switch(ssl->specs.kea)
  19784. {
  19785. case psk_kea:
  19786. case dhe_psk_kea:
  19787. case ecdhe_psk_kea:
  19788. {
  19789. /* Nothing to do in this sub-state */
  19790. break;
  19791. }
  19792. case diffie_hellman_kea:
  19793. case ecc_diffie_hellman_kea:
  19794. {
  19795. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  19796. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  19797. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  19798. #else
  19799. if (ssl->options.usingAnon_cipher) {
  19800. break;
  19801. }
  19802. /* increment index after verify is done */
  19803. args->idx += args->verifySigSz;
  19804. switch(args->sigAlgo)
  19805. {
  19806. #ifndef NO_RSA
  19807. #ifdef WC_RSA_PSS
  19808. case rsa_pss_sa_algo:
  19809. #ifdef HAVE_SELFTEST
  19810. ret = wc_RsaPSS_CheckPadding(
  19811. ssl->buffers.digest.buffer,
  19812. ssl->buffers.digest.length,
  19813. args->output, args->sigSz,
  19814. HashAlgoToType(args->hashAlgo));
  19815. #else
  19816. ret = wc_RsaPSS_CheckPadding_ex(
  19817. ssl->buffers.digest.buffer,
  19818. ssl->buffers.digest.length,
  19819. args->output, args->sigSz,
  19820. HashAlgoToType(args->hashAlgo),
  19821. -1, args->bits);
  19822. #endif
  19823. if (ret != 0)
  19824. return ret;
  19825. break;
  19826. #endif
  19827. case rsa_sa_algo:
  19828. {
  19829. if (IsAtLeastTLSv1_2(ssl)) {
  19830. #ifdef WOLFSSL_SMALL_STACK
  19831. byte* encodedSig;
  19832. #else
  19833. byte encodedSig[MAX_ENCODED_SIG_SZ];
  19834. #endif
  19835. word32 encSigSz;
  19836. #ifdef WOLFSSL_SMALL_STACK
  19837. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  19838. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  19839. if (encodedSig == NULL) {
  19840. ERROR_OUT(MEMORY_E, exit_dske);
  19841. }
  19842. #endif
  19843. encSigSz = wc_EncodeSignature(encodedSig,
  19844. ssl->buffers.digest.buffer,
  19845. ssl->buffers.digest.length,
  19846. TypeHash(args->hashAlgo));
  19847. if (encSigSz != args->sigSz || !args->output ||
  19848. XMEMCMP(args->output, encodedSig,
  19849. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  19850. ret = VERIFY_SIGN_ERROR;
  19851. }
  19852. #ifdef WOLFSSL_SMALL_STACK
  19853. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  19854. #endif
  19855. if (ret != 0) {
  19856. goto exit_dske;
  19857. }
  19858. }
  19859. else if (args->sigSz != FINISHED_SZ ||
  19860. !args->output ||
  19861. XMEMCMP(args->output,
  19862. ssl->buffers.digest.buffer,
  19863. FINISHED_SZ) != 0) {
  19864. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  19865. }
  19866. break;
  19867. }
  19868. #endif /* !NO_RSA */
  19869. #ifdef HAVE_ECC
  19870. case ecc_dsa_sa_algo:
  19871. /* Nothing to do in this algo */
  19872. break;
  19873. #endif /* HAVE_ECC */
  19874. #if defined(HAVE_ED25519)
  19875. case ed25519_sa_algo:
  19876. /* Nothing to do in this algo */
  19877. break;
  19878. #endif /* HAVE_ED25519 */
  19879. #if defined(HAVE_ED448)
  19880. case ed448_sa_algo:
  19881. /* Nothing to do in this algo */
  19882. break;
  19883. #endif /* HAVE_ED448 */
  19884. default:
  19885. ret = ALGO_ID_E;
  19886. } /* switch (sigAlgo) */
  19887. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  19888. break;
  19889. }
  19890. default:
  19891. ret = BAD_KEA_TYPE_E;
  19892. } /* switch(ssl->specs.kea) */
  19893. /* Check for error */
  19894. if (ret != 0) {
  19895. goto exit_dske;
  19896. }
  19897. /* Advance state and proceed */
  19898. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  19899. } /* case TLS_ASYNC_VERIFY */
  19900. FALL_THROUGH;
  19901. case TLS_ASYNC_FINALIZE:
  19902. {
  19903. if (IsEncryptionOn(ssl, 0)) {
  19904. args->idx += ssl->keys.padSz;
  19905. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19906. if (ssl->options.startedETMRead)
  19907. args->idx += MacSize(ssl);
  19908. #endif
  19909. }
  19910. /* QSH extensions */
  19911. #ifdef HAVE_QSH
  19912. if (ssl->peerQSHKeyPresent) {
  19913. word16 name;
  19914. int qshSz;
  19915. /* extension name */
  19916. ato16(input + args->idx, &name);
  19917. args->idx += OPAQUE16_LEN;
  19918. if (name == TLSX_QUANTUM_SAFE_HYBRID) {
  19919. /* if qshSz is larger than 0 it is the length of
  19920. buffer used */
  19921. if ((qshSz = TLSX_QSHCipher_Parse(ssl, input + args->idx,
  19922. size, 0)) < 0) {
  19923. ERROR_OUT(qshSz, exit_dske);
  19924. }
  19925. args->idx += qshSz;
  19926. }
  19927. else {
  19928. /* unknown extension sent server ignored handshake */
  19929. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19930. }
  19931. }
  19932. #endif
  19933. /* Advance state and proceed */
  19934. ssl->options.asyncState = TLS_ASYNC_END;
  19935. } /* case TLS_ASYNC_FINALIZE */
  19936. FALL_THROUGH;
  19937. case TLS_ASYNC_END:
  19938. {
  19939. /* return index */
  19940. *inOutIdx = args->idx;
  19941. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  19942. break;
  19943. }
  19944. default:
  19945. ret = INPUT_CASE_ERROR;
  19946. } /* switch(ssl->options.asyncState) */
  19947. exit_dske:
  19948. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  19949. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  19950. #ifdef WOLFSSL_ASYNC_CRYPT
  19951. /* Handle async operation */
  19952. if (ret == WC_PENDING_E) {
  19953. /* Mark message as not received so it can process again */
  19954. ssl->msgsReceived.got_server_key_exchange = 0;
  19955. return ret;
  19956. }
  19957. #endif /* WOLFSSL_ASYNC_CRYPT */
  19958. /* Final cleanup */
  19959. FreeDskeArgs(ssl, args);
  19960. FreeKeyExchange(ssl);
  19961. return ret;
  19962. }
  19963. #ifdef HAVE_QSH
  19964. #ifdef HAVE_NTRU
  19965. /* Encrypt a byte array using ntru
  19966. key a struct containing the public key to use
  19967. bufIn array to be encrypted
  19968. inSz size of bufIn array
  19969. bufOut cipher text out
  19970. outSz will be set to the new size of cipher text
  19971. */
  19972. static int NtruSecretEncrypt(QSHKey* key, byte* bufIn, word32 inSz,
  19973. byte* bufOut, word16* outSz)
  19974. {
  19975. int ret;
  19976. DRBG_HANDLE drbg;
  19977. /* sanity checks on input arguments */
  19978. if (key == NULL || bufIn == NULL || bufOut == NULL || outSz == NULL)
  19979. return BAD_FUNC_ARG;
  19980. if (key->pub.buffer == NULL)
  19981. return BAD_FUNC_ARG;
  19982. switch (key->name) {
  19983. case WOLFSSL_NTRU_EESS439:
  19984. case WOLFSSL_NTRU_EESS593:
  19985. case WOLFSSL_NTRU_EESS743:
  19986. break;
  19987. default:
  19988. WOLFSSL_MSG("Unknown QSH encryption key!");
  19989. return -1;
  19990. }
  19991. /* set up ntru drbg */
  19992. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  19993. if (ret != DRBG_OK)
  19994. return NTRU_DRBG_ERROR;
  19995. /* encrypt the byte array */
  19996. ret = ntru_crypto_ntru_encrypt(drbg, key->pub.length, key->pub.buffer,
  19997. inSz, bufIn, outSz, bufOut);
  19998. ntru_crypto_drbg_uninstantiate(drbg);
  19999. if (ret != NTRU_OK)
  20000. return NTRU_ENCRYPT_ERROR;
  20001. return ret;
  20002. }
  20003. /* Decrypt a byte array using ntru
  20004. key a struct containing the private key to use
  20005. bufIn array to be decrypted
  20006. inSz size of bufIn array
  20007. bufOut plain text out
  20008. outSz will be set to the new size of plain text
  20009. */
  20010. static int NtruSecretDecrypt(QSHKey* key, byte* bufIn, word32 inSz,
  20011. byte* bufOut, word16* outSz)
  20012. {
  20013. int ret;
  20014. DRBG_HANDLE drbg;
  20015. /* sanity checks on input arguments */
  20016. if (key == NULL || bufIn == NULL || bufOut == NULL || outSz == NULL)
  20017. return BAD_FUNC_ARG;
  20018. if (key->pri.buffer == NULL)
  20019. return BAD_FUNC_ARG;
  20020. switch (key->name) {
  20021. case WOLFSSL_NTRU_EESS439:
  20022. case WOLFSSL_NTRU_EESS593:
  20023. case WOLFSSL_NTRU_EESS743:
  20024. break;
  20025. default:
  20026. WOLFSSL_MSG("Unknown QSH decryption key!");
  20027. return -1;
  20028. }
  20029. /* set up drbg */
  20030. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  20031. if (ret != DRBG_OK)
  20032. return NTRU_DRBG_ERROR;
  20033. /* decrypt cipher text */
  20034. ret = ntru_crypto_ntru_decrypt(key->pri.length, key->pri.buffer,
  20035. inSz, bufIn, outSz, bufOut);
  20036. ntru_crypto_drbg_uninstantiate(drbg);
  20037. if (ret != NTRU_OK)
  20038. return NTRU_ENCRYPT_ERROR;
  20039. return ret;
  20040. }
  20041. #endif /* HAVE_NTRU */
  20042. int QSH_Init(WOLFSSL* ssl)
  20043. {
  20044. /* check so not initializing twice when running DTLS */
  20045. if (ssl->QSH_secret != NULL)
  20046. return 0;
  20047. /* malloc memory for holding generated secret information */
  20048. if ((ssl->QSH_secret = (QSHSecret*)XMALLOC(sizeof(QSHSecret), ssl->heap,
  20049. DYNAMIC_TYPE_QSH)) == NULL)
  20050. return MEMORY_E;
  20051. ssl->QSH_secret->CliSi = (buffer*)XMALLOC(sizeof(buffer), ssl->heap,
  20052. DYNAMIC_TYPE_SECRET);
  20053. if (ssl->QSH_secret->CliSi == NULL)
  20054. return MEMORY_E;
  20055. ssl->QSH_secret->SerSi = (buffer*)XMALLOC(sizeof(buffer), ssl->heap,
  20056. DYNAMIC_TYPE_SECRET);
  20057. if (ssl->QSH_secret->SerSi == NULL)
  20058. return MEMORY_E;
  20059. /* initialize variables */
  20060. ssl->QSH_secret->list = NULL;
  20061. ssl->QSH_secret->CliSi->length = 0;
  20062. ssl->QSH_secret->CliSi->buffer = NULL;
  20063. ssl->QSH_secret->SerSi->length = 0;
  20064. ssl->QSH_secret->SerSi->buffer = NULL;
  20065. return 0;
  20066. }
  20067. static int QSH_Encrypt(QSHKey* key, byte* in, word32 szIn,
  20068. byte* out, word32* szOut)
  20069. {
  20070. int ret = 0;
  20071. word16 size = *szOut;
  20072. (void)in;
  20073. (void)szIn;
  20074. (void)out;
  20075. (void)szOut;
  20076. WOLFSSL_MSG("Encrypting QSH key material");
  20077. switch (key->name) {
  20078. #ifdef HAVE_NTRU
  20079. case WOLFSSL_NTRU_EESS439:
  20080. case WOLFSSL_NTRU_EESS593:
  20081. case WOLFSSL_NTRU_EESS743:
  20082. ret = NtruSecretEncrypt(key, in, szIn, out, &size);
  20083. break;
  20084. #endif
  20085. default:
  20086. WOLFSSL_MSG("Unknown QSH encryption key!");
  20087. return -1;
  20088. }
  20089. *szOut = size;
  20090. return ret;
  20091. }
  20092. /* Decrypt using Quantum Safe Handshake algorithms */
  20093. int QSH_Decrypt(QSHKey* key, byte* in, word32 szIn, byte* out, word16* szOut)
  20094. {
  20095. int ret = 0;
  20096. word16 size = *szOut;
  20097. (void)in;
  20098. (void)szIn;
  20099. (void)out;
  20100. (void)szOut;
  20101. WOLFSSL_MSG("Decrypting QSH key material");
  20102. switch (key->name) {
  20103. #ifdef HAVE_NTRU
  20104. case WOLFSSL_NTRU_EESS439:
  20105. case WOLFSSL_NTRU_EESS593:
  20106. case WOLFSSL_NTRU_EESS743:
  20107. ret = NtruSecretDecrypt(key, in, szIn, out, &size);
  20108. break;
  20109. #endif
  20110. default:
  20111. WOLFSSL_MSG("Unknown QSH decryption key!");
  20112. return -1;
  20113. }
  20114. *szOut = size;
  20115. return ret;
  20116. }
  20117. /* Get the max cipher text for corresponding encryption scheme
  20118. (encrypting 48 or max plain text whichever is smaller)
  20119. */
  20120. static word32 QSH_MaxSecret(QSHKey* key)
  20121. {
  20122. int ret = 0;
  20123. #ifdef HAVE_NTRU
  20124. byte isNtru = 0;
  20125. word16 inSz = 48;
  20126. word16 outSz;
  20127. DRBG_HANDLE drbg = 0;
  20128. byte bufIn[48];
  20129. #endif
  20130. if (key == NULL || key->pub.length == 0)
  20131. return 0;
  20132. switch(key->name) {
  20133. #ifdef HAVE_NTRU
  20134. case WOLFSSL_NTRU_EESS439:
  20135. isNtru = 1;
  20136. break;
  20137. case WOLFSSL_NTRU_EESS593:
  20138. isNtru = 1;
  20139. break;
  20140. case WOLFSSL_NTRU_EESS743:
  20141. isNtru = 1;
  20142. break;
  20143. #endif
  20144. default:
  20145. WOLFSSL_MSG("Unknown QSH encryption scheme size!");
  20146. return 0;
  20147. }
  20148. #ifdef HAVE_NTRU
  20149. if (isNtru) {
  20150. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  20151. if (ret != DRBG_OK)
  20152. return NTRU_DRBG_ERROR;
  20153. ret = ntru_crypto_ntru_encrypt(drbg, key->pub.length,
  20154. key->pub.buffer, inSz, bufIn, &outSz, NULL);
  20155. if (ret != NTRU_OK) {
  20156. return NTRU_ENCRYPT_ERROR;
  20157. }
  20158. ntru_crypto_drbg_uninstantiate(drbg);
  20159. ret = outSz;
  20160. }
  20161. #endif
  20162. return ret;
  20163. }
  20164. /* Generate the secret byte material for pms
  20165. returns length on success and -1 on fail
  20166. */
  20167. static int QSH_GenerateSerCliSecret(WOLFSSL* ssl, byte isServer)
  20168. {
  20169. int sz = 0;
  20170. int plainSz = 48; /* lesser of 48 and max plain text able to encrypt */
  20171. int offset = 0;
  20172. word32 tmpSz = 0;
  20173. buffer* buf;
  20174. QSHKey* current;
  20175. QSHScheme* schmPre = NULL;
  20176. QSHScheme* schm = NULL;
  20177. if (ssl == NULL)
  20178. return -1;
  20179. WOLFSSL_MSG("Generating QSH secret key material");
  20180. current = ssl->peerQSHKey;
  20181. /* get size of buffer needed */
  20182. while (current) {
  20183. if (current->pub.length != 0) {
  20184. sz += plainSz;
  20185. }
  20186. current = (QSHKey*)current->next;
  20187. }
  20188. /* allocate memory for buffer */
  20189. if (isServer) {
  20190. buf = ssl->QSH_secret->SerSi;
  20191. }
  20192. else {
  20193. buf = ssl->QSH_secret->CliSi;
  20194. }
  20195. buf->length = sz;
  20196. buf->buffer = (byte*)XMALLOC(sz, ssl->heap, DYNAMIC_TYPE_SECRET);
  20197. if (buf->buffer == NULL) {
  20198. WOLFSSL_ERROR(MEMORY_E);
  20199. }
  20200. /* create secret information */
  20201. sz = 0;
  20202. current = ssl->peerQSHKey;
  20203. while (current) {
  20204. schm = (QSHScheme*)XMALLOC(sizeof(QSHScheme), ssl->heap,
  20205. DYNAMIC_TYPE_QSH);
  20206. if (schm == NULL)
  20207. return MEMORY_E;
  20208. /* initialize variables */
  20209. schm->name = 0;
  20210. schm->PK = NULL;
  20211. schm->PKLen = 0;
  20212. schm->next = NULL;
  20213. if (ssl->QSH_secret->list == NULL) {
  20214. ssl->QSH_secret->list = schm;
  20215. }
  20216. else {
  20217. if (schmPre)
  20218. schmPre->next = schm;
  20219. }
  20220. tmpSz = QSH_MaxSecret(current);
  20221. if ((schm->PK = (byte*)XMALLOC(tmpSz, ssl->heap,
  20222. DYNAMIC_TYPE_SECRET)) == NULL)
  20223. return -1;
  20224. /* store info for writing extension */
  20225. schm->name = current->name;
  20226. /* no key to use for encryption */
  20227. if (tmpSz == 0) {
  20228. current = (QSHKey*)current->next;
  20229. continue;
  20230. }
  20231. if (wc_RNG_GenerateBlock(ssl->rng, buf->buffer + offset, plainSz)
  20232. != 0) {
  20233. return -1;
  20234. }
  20235. if (QSH_Encrypt(current, buf->buffer + offset, plainSz, schm->PK,
  20236. &tmpSz) != 0) {
  20237. return -1;
  20238. }
  20239. schm->PKLen = tmpSz;
  20240. sz += tmpSz;
  20241. offset += plainSz;
  20242. schmPre = schm;
  20243. current = (QSHKey*)current->next;
  20244. }
  20245. return sz;
  20246. }
  20247. static word32 QSH_KeyGetSize(WOLFSSL* ssl)
  20248. {
  20249. word32 sz = 0;
  20250. QSHKey* current;
  20251. if (ssl == NULL)
  20252. return -1;
  20253. current = ssl->peerQSHKey;
  20254. sz += OPAQUE16_LEN; /* type of extension ie 0x00 0x18 */
  20255. sz += OPAQUE24_LEN;
  20256. /* get size of buffer needed */
  20257. while (current) {
  20258. sz += OPAQUE16_LEN; /* scheme id */
  20259. sz += OPAQUE16_LEN; /* encrypted key len*/
  20260. sz += QSH_MaxSecret(current);
  20261. current = (QSHKey*)current->next;
  20262. }
  20263. return sz;
  20264. }
  20265. /* handle QSH key Exchange
  20266. return 0 on success
  20267. */
  20268. static word32 QSH_KeyExchangeWrite(WOLFSSL* ssl, byte isServer)
  20269. {
  20270. int ret = 0;
  20271. WOLFSSL_ENTER("QSH KeyExchange");
  20272. ret = QSH_GenerateSerCliSecret(ssl, isServer);
  20273. if (ret < 0)
  20274. return MEMORY_E;
  20275. return 0;
  20276. }
  20277. #endif /* HAVE_QSH */
  20278. typedef struct SckeArgs {
  20279. byte* output; /* not allocated */
  20280. byte* encSecret;
  20281. byte* input;
  20282. word32 encSz;
  20283. word32 length;
  20284. int sendSz;
  20285. int inputSz;
  20286. } SckeArgs;
  20287. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  20288. {
  20289. SckeArgs* args = (SckeArgs*)pArgs;
  20290. (void)ssl;
  20291. if (args->encSecret) {
  20292. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  20293. args->encSecret = NULL;
  20294. }
  20295. if (args->input) {
  20296. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20297. args->input = NULL;
  20298. }
  20299. }
  20300. /* handle generation client_key_exchange (16) */
  20301. int SendClientKeyExchange(WOLFSSL* ssl)
  20302. {
  20303. int ret = 0;
  20304. #ifdef WOLFSSL_ASYNC_CRYPT
  20305. SckeArgs* args = (SckeArgs*)ssl->async.args;
  20306. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  20307. (void)sizeof(args_test);
  20308. #else
  20309. SckeArgs args[1];
  20310. #endif
  20311. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  20312. WOLFSSL_ENTER("SendClientKeyExchange");
  20313. #ifdef OPENSSL_EXTRA
  20314. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  20315. ssl->cbmode = SSL_CB_MODE_WRITE;
  20316. if (ssl->CBIS != NULL)
  20317. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  20318. #endif
  20319. #ifdef WOLFSSL_ASYNC_CRYPT
  20320. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  20321. if (ret != WC_NOT_PENDING_E) {
  20322. /* Check for error */
  20323. if (ret < 0)
  20324. goto exit_scke;
  20325. }
  20326. else
  20327. #endif
  20328. {
  20329. /* Reset state */
  20330. ret = 0;
  20331. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  20332. XMEMSET(args, 0, sizeof(SckeArgs));
  20333. #ifdef WOLFSSL_ASYNC_CRYPT
  20334. ssl->async.freeArgs = FreeSckeArgs;
  20335. #endif
  20336. }
  20337. switch(ssl->options.asyncState)
  20338. {
  20339. case TLS_ASYNC_BEGIN:
  20340. {
  20341. switch (ssl->specs.kea) {
  20342. #ifndef NO_RSA
  20343. case rsa_kea:
  20344. if (ssl->peerRsaKey == NULL ||
  20345. ssl->peerRsaKeyPresent == 0) {
  20346. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20347. }
  20348. break;
  20349. #endif
  20350. #ifndef NO_DH
  20351. case diffie_hellman_kea:
  20352. if (ssl->buffers.serverDH_P.buffer == NULL ||
  20353. ssl->buffers.serverDH_G.buffer == NULL ||
  20354. ssl->buffers.serverDH_Pub.buffer == NULL) {
  20355. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20356. }
  20357. break;
  20358. #endif /* NO_DH */
  20359. #ifndef NO_PSK
  20360. case psk_kea:
  20361. /* sanity check that PSK client callback has been set */
  20362. if (ssl->options.client_psk_cb == NULL) {
  20363. WOLFSSL_MSG("No client PSK callback set");
  20364. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  20365. }
  20366. break;
  20367. #endif /* NO_PSK */
  20368. #if !defined(NO_DH) && !defined(NO_PSK)
  20369. case dhe_psk_kea:
  20370. if (ssl->buffers.serverDH_P.buffer == NULL ||
  20371. ssl->buffers.serverDH_G.buffer == NULL ||
  20372. ssl->buffers.serverDH_Pub.buffer == NULL) {
  20373. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20374. }
  20375. /* sanity check that PSK client callback has been set */
  20376. if (ssl->options.client_psk_cb == NULL) {
  20377. WOLFSSL_MSG("No client PSK callback set");
  20378. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  20379. }
  20380. break;
  20381. #endif /* !NO_DH && !NO_PSK */
  20382. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20383. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  20384. case ecdhe_psk_kea:
  20385. /* sanity check that PSK client callback has been set */
  20386. if (ssl->options.client_psk_cb == NULL) {
  20387. WOLFSSL_MSG("No client PSK callback set");
  20388. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  20389. }
  20390. #ifdef HAVE_CURVE25519
  20391. if (ssl->peerX25519KeyPresent) {
  20392. /* Check client ECC public key */
  20393. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  20394. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20395. }
  20396. #ifdef HAVE_PK_CALLBACKS
  20397. /* if callback then use it for shared secret */
  20398. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  20399. break;
  20400. }
  20401. #endif
  20402. /* create private key */
  20403. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  20404. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20405. if (ret != 0) {
  20406. goto exit_scke;
  20407. }
  20408. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  20409. ssl->peerX25519Key);
  20410. break;
  20411. }
  20412. #endif
  20413. #ifdef HAVE_CURVE448
  20414. if (ssl->peerX448KeyPresent) {
  20415. /* Check client ECC public key */
  20416. if (!ssl->peerX448Key) {
  20417. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20418. }
  20419. #ifdef HAVE_PK_CALLBACKS
  20420. /* if callback then use it for shared secret */
  20421. if (ssl->ctx->X448SharedSecretCb != NULL) {
  20422. break;
  20423. }
  20424. #endif
  20425. /* create private key */
  20426. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  20427. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20428. if (ret != 0) {
  20429. goto exit_scke;
  20430. }
  20431. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  20432. ssl->peerX448Key);
  20433. break;
  20434. }
  20435. #endif
  20436. /* Check client ECC public key */
  20437. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  20438. !ssl->peerEccKey->dp) {
  20439. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20440. }
  20441. #ifdef HAVE_PK_CALLBACKS
  20442. /* if callback then use it for shared secret */
  20443. if (ssl->ctx->EccSharedSecretCb != NULL) {
  20444. break;
  20445. }
  20446. #endif
  20447. /* create ephemeral private key */
  20448. ssl->hsType = DYNAMIC_TYPE_ECC;
  20449. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20450. if (ret != 0) {
  20451. goto exit_scke;
  20452. }
  20453. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  20454. break;
  20455. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  20456. #ifdef HAVE_NTRU
  20457. case ntru_kea:
  20458. if (ssl->peerNtruKeyPresent == 0) {
  20459. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20460. }
  20461. break;
  20462. #endif /* HAVE_NTRU */
  20463. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20464. defined(HAVE_CURVE448)
  20465. case ecc_diffie_hellman_kea:
  20466. {
  20467. #ifdef HAVE_ECC
  20468. ecc_key* peerKey;
  20469. #endif
  20470. #ifdef HAVE_PK_CALLBACKS
  20471. /* if callback then use it for shared secret */
  20472. #ifdef HAVE_CURVE25519
  20473. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  20474. if (ssl->ctx->X25519SharedSecretCb != NULL)
  20475. break;
  20476. }
  20477. else
  20478. #endif
  20479. #ifdef HAVE_CURVE448
  20480. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  20481. if (ssl->ctx->X448SharedSecretCb != NULL)
  20482. break;
  20483. }
  20484. else
  20485. #endif
  20486. if (ssl->ctx->EccSharedSecretCb != NULL) {
  20487. break;
  20488. }
  20489. #endif /* HAVE_PK_CALLBACKS */
  20490. #ifdef HAVE_CURVE25519
  20491. if (ssl->peerX25519KeyPresent) {
  20492. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  20493. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20494. }
  20495. /* create private key */
  20496. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  20497. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20498. if (ret != 0) {
  20499. goto exit_scke;
  20500. }
  20501. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  20502. ssl->peerX25519Key);
  20503. break;
  20504. }
  20505. #endif
  20506. #ifdef HAVE_CURVE448
  20507. if (ssl->peerX448KeyPresent) {
  20508. if (!ssl->peerX448Key) {
  20509. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20510. }
  20511. /* create private key */
  20512. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  20513. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20514. if (ret != 0) {
  20515. goto exit_scke;
  20516. }
  20517. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  20518. ssl->peerX448Key);
  20519. break;
  20520. }
  20521. #endif
  20522. #ifdef HAVE_ECC
  20523. if (ssl->specs.static_ecdh) {
  20524. /* Note: EccDsa is really fixed Ecc key here */
  20525. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
  20526. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20527. }
  20528. peerKey = ssl->peerEccDsaKey;
  20529. }
  20530. else {
  20531. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
  20532. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20533. }
  20534. peerKey = ssl->peerEccKey;
  20535. }
  20536. if (peerKey == NULL) {
  20537. ERROR_OUT(NO_PEER_KEY, exit_scke);
  20538. }
  20539. /* create ephemeral private key */
  20540. ssl->hsType = DYNAMIC_TYPE_ECC;
  20541. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20542. if (ret != 0) {
  20543. goto exit_scke;
  20544. }
  20545. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  20546. #endif
  20547. break;
  20548. }
  20549. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  20550. default:
  20551. ret = BAD_KEA_TYPE_E;
  20552. } /* switch(ssl->specs.kea) */
  20553. /* Check for error */
  20554. if (ret != 0) {
  20555. goto exit_scke;
  20556. }
  20557. /* Advance state and proceed */
  20558. ssl->options.asyncState = TLS_ASYNC_BUILD;
  20559. } /* case TLS_ASYNC_BEGIN */
  20560. FALL_THROUGH;
  20561. case TLS_ASYNC_BUILD:
  20562. {
  20563. args->encSz = MAX_ENCRYPT_SZ;
  20564. args->encSecret = (byte*)XMALLOC(args->encSz, ssl->heap,
  20565. DYNAMIC_TYPE_SECRET);
  20566. if (args->encSecret == NULL) {
  20567. ERROR_OUT(MEMORY_E, exit_scke);
  20568. }
  20569. if (ssl->arrays->preMasterSecret == NULL) {
  20570. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  20571. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  20572. ssl->heap, DYNAMIC_TYPE_SECRET);
  20573. if (ssl->arrays->preMasterSecret == NULL) {
  20574. ERROR_OUT(MEMORY_E, exit_scke);
  20575. }
  20576. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  20577. }
  20578. switch(ssl->specs.kea)
  20579. {
  20580. #ifndef NO_RSA
  20581. case rsa_kea:
  20582. {
  20583. /* build PreMasterSecret with RNG data */
  20584. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  20585. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  20586. if (tsip_useable(ssl)) {
  20587. ret = tsip_generatePremasterSecret(
  20588. &ssl->arrays->preMasterSecret[VERSION_SZ],
  20589. ENCRYPT_LEN - VERSION_SZ);
  20590. } else {
  20591. #endif
  20592. ret = wc_RNG_GenerateBlock(ssl->rng,
  20593. &ssl->arrays->preMasterSecret[VERSION_SZ],
  20594. SECRET_LEN - VERSION_SZ);
  20595. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  20596. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  20597. }
  20598. #endif
  20599. if (ret != 0) {
  20600. goto exit_scke;
  20601. }
  20602. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  20603. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  20604. ssl->arrays->preMasterSz = SECRET_LEN;
  20605. break;
  20606. }
  20607. #endif /* !NO_RSA */
  20608. #ifndef NO_DH
  20609. case diffie_hellman_kea:
  20610. {
  20611. ssl->buffers.sig.length = ENCRYPT_LEN;
  20612. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  20613. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20614. if (ssl->buffers.sig.buffer == NULL) {
  20615. ERROR_OUT(MEMORY_E, exit_scke);
  20616. }
  20617. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  20618. (void**)&ssl->buffers.serverDH_Key);
  20619. if (ret != 0) {
  20620. goto exit_scke;
  20621. }
  20622. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  20623. !defined(WOLFSSL_OLD_PRIME_CHECK)
  20624. if (ssl->options.dhDoKeyTest &&
  20625. !ssl->options.dhKeyTested)
  20626. {
  20627. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  20628. ssl->buffers.serverDH_P.buffer,
  20629. ssl->buffers.serverDH_P.length,
  20630. ssl->buffers.serverDH_G.buffer,
  20631. ssl->buffers.serverDH_G.length,
  20632. NULL, 0, 0, ssl->rng);
  20633. if (ret != 0) {
  20634. goto exit_scke;
  20635. }
  20636. ssl->options.dhKeyTested = 1;
  20637. }
  20638. else
  20639. #endif
  20640. {
  20641. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  20642. ssl->buffers.serverDH_P.buffer,
  20643. ssl->buffers.serverDH_P.length,
  20644. ssl->buffers.serverDH_G.buffer,
  20645. ssl->buffers.serverDH_G.length);
  20646. if (ret != 0) {
  20647. goto exit_scke;
  20648. }
  20649. }
  20650. /* for DH, encSecret is Yc, agree is pre-master */
  20651. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  20652. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  20653. args->encSecret, &args->encSz);
  20654. /* set the max agree result size */
  20655. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  20656. break;
  20657. }
  20658. #endif /* !NO_DH */
  20659. #ifndef NO_PSK
  20660. case psk_kea:
  20661. {
  20662. byte* pms = ssl->arrays->preMasterSecret;
  20663. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  20664. ssl->arrays->server_hint, ssl->arrays->client_identity,
  20665. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  20666. if (ssl->arrays->psk_keySz == 0 ||
  20667. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  20668. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  20669. }
  20670. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  20671. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  20672. if (args->encSz > MAX_PSK_ID_LEN) {
  20673. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  20674. }
  20675. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  20676. args->encSz);
  20677. /* make psk pre master secret */
  20678. /* length of key + length 0s + length of key + key */
  20679. c16toa((word16)ssl->arrays->psk_keySz, pms);
  20680. pms += OPAQUE16_LEN;
  20681. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  20682. pms += ssl->arrays->psk_keySz;
  20683. c16toa((word16)ssl->arrays->psk_keySz, pms);
  20684. pms += OPAQUE16_LEN;
  20685. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  20686. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
  20687. (2 * OPAQUE16_LEN);
  20688. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  20689. ssl->arrays->psk_keySz = 0; /* No further need */
  20690. break;
  20691. }
  20692. #endif /* !NO_PSK */
  20693. #if !defined(NO_DH) && !defined(NO_PSK)
  20694. case dhe_psk_kea:
  20695. {
  20696. word32 esSz = 0;
  20697. args->output = args->encSecret;
  20698. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  20699. ssl->arrays->server_hint, ssl->arrays->client_identity,
  20700. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  20701. if (ssl->arrays->psk_keySz == 0 ||
  20702. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  20703. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  20704. }
  20705. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  20706. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  20707. if (esSz > MAX_PSK_ID_LEN) {
  20708. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  20709. }
  20710. ssl->buffers.sig.length = ENCRYPT_LEN;
  20711. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  20712. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20713. if (ssl->buffers.sig.buffer == NULL) {
  20714. ERROR_OUT(MEMORY_E, exit_scke);
  20715. }
  20716. c16toa((word16)esSz, args->output);
  20717. args->output += OPAQUE16_LEN;
  20718. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  20719. args->output += esSz;
  20720. args->length = args->encSz - esSz - OPAQUE16_LEN;
  20721. args->encSz = esSz + OPAQUE16_LEN;
  20722. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  20723. (void**)&ssl->buffers.serverDH_Key);
  20724. if (ret != 0) {
  20725. goto exit_scke;
  20726. }
  20727. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  20728. !defined(WOLFSSL_OLD_PRIME_CHECK)
  20729. if (ssl->options.dhDoKeyTest &&
  20730. !ssl->options.dhKeyTested)
  20731. {
  20732. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  20733. ssl->buffers.serverDH_P.buffer,
  20734. ssl->buffers.serverDH_P.length,
  20735. ssl->buffers.serverDH_G.buffer,
  20736. ssl->buffers.serverDH_G.length,
  20737. NULL, 0, 0, ssl->rng);
  20738. if (ret != 0) {
  20739. goto exit_scke;
  20740. }
  20741. ssl->options.dhKeyTested = 1;
  20742. }
  20743. else
  20744. #endif
  20745. {
  20746. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  20747. ssl->buffers.serverDH_P.buffer,
  20748. ssl->buffers.serverDH_P.length,
  20749. ssl->buffers.serverDH_G.buffer,
  20750. ssl->buffers.serverDH_G.length);
  20751. if (ret != 0) {
  20752. goto exit_scke;
  20753. }
  20754. }
  20755. /* for DH, encSecret is Yc, agree is pre-master */
  20756. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  20757. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  20758. args->output + OPAQUE16_LEN, &args->length);
  20759. break;
  20760. }
  20761. #endif /* !NO_DH && !NO_PSK */
  20762. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20763. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  20764. case ecdhe_psk_kea:
  20765. {
  20766. word32 esSz = 0;
  20767. args->output = args->encSecret;
  20768. /* Send PSK client identity */
  20769. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  20770. ssl->arrays->server_hint, ssl->arrays->client_identity,
  20771. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  20772. if (ssl->arrays->psk_keySz == 0 ||
  20773. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  20774. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  20775. }
  20776. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  20777. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  20778. if (esSz > MAX_PSK_ID_LEN) {
  20779. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  20780. }
  20781. /* place size and identity in output buffer sz:identity */
  20782. c16toa((word16)esSz, args->output);
  20783. args->output += OPAQUE16_LEN;
  20784. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  20785. args->output += esSz;
  20786. args->encSz = esSz + OPAQUE16_LEN;
  20787. /* length is used for public key size */
  20788. args->length = MAX_ENCRYPT_SZ;
  20789. /* Create shared ECC key leaving room at the beginning
  20790. of buffer for size of shared key. */
  20791. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  20792. #ifdef HAVE_CURVE25519
  20793. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  20794. #ifdef HAVE_PK_CALLBACKS
  20795. /* if callback then use it for shared secret */
  20796. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  20797. break;
  20798. }
  20799. #endif
  20800. ret = wc_curve25519_export_public_ex(
  20801. (curve25519_key*)ssl->hsKey,
  20802. args->output + OPAQUE8_LEN, &args->length,
  20803. EC25519_LITTLE_ENDIAN);
  20804. if (ret != 0) {
  20805. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20806. }
  20807. break;
  20808. }
  20809. #endif
  20810. #ifdef HAVE_CURVE448
  20811. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  20812. #ifdef HAVE_PK_CALLBACKS
  20813. /* if callback then use it for shared secret */
  20814. if (ssl->ctx->X448SharedSecretCb != NULL) {
  20815. break;
  20816. }
  20817. #endif
  20818. ret = wc_curve448_export_public_ex(
  20819. (curve448_key*)ssl->hsKey,
  20820. args->output + OPAQUE8_LEN, &args->length,
  20821. EC448_LITTLE_ENDIAN);
  20822. if (ret != 0) {
  20823. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20824. }
  20825. break;
  20826. }
  20827. #endif
  20828. #ifdef HAVE_PK_CALLBACKS
  20829. /* if callback then use it for shared secret */
  20830. if (ssl->ctx->EccSharedSecretCb != NULL) {
  20831. break;
  20832. }
  20833. #endif
  20834. /* Place ECC key in output buffer, leaving room for size */
  20835. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  20836. args->output + OPAQUE8_LEN, &args->length);
  20837. if (ret != 0) {
  20838. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20839. }
  20840. break;
  20841. }
  20842. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  20843. #ifdef HAVE_NTRU
  20844. case ntru_kea:
  20845. {
  20846. ret = wc_RNG_GenerateBlock(ssl->rng,
  20847. ssl->arrays->preMasterSecret, SECRET_LEN);
  20848. if (ret != 0) {
  20849. goto exit_scke;
  20850. }
  20851. ssl->arrays->preMasterSz = SECRET_LEN;
  20852. args->encSz = MAX_ENCRYPT_SZ;
  20853. break;
  20854. }
  20855. #endif /* HAVE_NTRU */
  20856. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20857. defined(HAVE_CURVE448)
  20858. case ecc_diffie_hellman_kea:
  20859. {
  20860. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  20861. #ifdef HAVE_CURVE25519
  20862. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  20863. #ifdef HAVE_PK_CALLBACKS
  20864. /* if callback then use it for shared secret */
  20865. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  20866. break;
  20867. }
  20868. #endif
  20869. ret = wc_curve25519_export_public_ex(
  20870. (curve25519_key*)ssl->hsKey,
  20871. args->encSecret + OPAQUE8_LEN, &args->encSz,
  20872. EC25519_LITTLE_ENDIAN);
  20873. if (ret != 0) {
  20874. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20875. }
  20876. break;
  20877. }
  20878. #endif
  20879. #ifdef HAVE_CURVE448
  20880. if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
  20881. #ifdef HAVE_PK_CALLBACKS
  20882. /* if callback then use it for shared secret */
  20883. if (ssl->ctx->X448SharedSecretCb != NULL) {
  20884. break;
  20885. }
  20886. #endif
  20887. ret = wc_curve448_export_public_ex(
  20888. (curve448_key*)ssl->hsKey,
  20889. args->encSecret + OPAQUE8_LEN, &args->encSz,
  20890. EC448_LITTLE_ENDIAN);
  20891. if (ret != 0) {
  20892. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20893. }
  20894. break;
  20895. }
  20896. #endif
  20897. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  20898. #ifdef HAVE_PK_CALLBACKS
  20899. /* if callback then use it for shared secret */
  20900. if (ssl->ctx->EccSharedSecretCb != NULL) {
  20901. break;
  20902. }
  20903. #endif
  20904. /* Place ECC key in buffer, leaving room for size */
  20905. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  20906. args->encSecret + OPAQUE8_LEN, &args->encSz);
  20907. if (ret != 0) {
  20908. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20909. }
  20910. #endif /* HAVE_ECC */
  20911. break;
  20912. }
  20913. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  20914. default:
  20915. ret = BAD_KEA_TYPE_E;
  20916. } /* switch(ssl->specs.kea) */
  20917. /* Check for error */
  20918. if (ret != 0) {
  20919. goto exit_scke;
  20920. }
  20921. /* Advance state and proceed */
  20922. ssl->options.asyncState = TLS_ASYNC_DO;
  20923. } /* case TLS_ASYNC_BUILD */
  20924. FALL_THROUGH;
  20925. case TLS_ASYNC_DO:
  20926. {
  20927. switch(ssl->specs.kea)
  20928. {
  20929. #ifndef NO_RSA
  20930. case rsa_kea:
  20931. {
  20932. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  20933. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  20934. if (tsip_useable(ssl) &&
  20935. wc_RsaEncryptSize(ssl->peerRsaKey) == 256) {
  20936. ret = tsip_generateEncryptPreMasterSecret(ssl,
  20937. args->encSecret,
  20938. &args->encSz);
  20939. } else
  20940. #endif
  20941. ret = RsaEnc(ssl,
  20942. ssl->arrays->preMasterSecret, SECRET_LEN,
  20943. args->encSecret, &args->encSz,
  20944. ssl->peerRsaKey,
  20945. #if defined(HAVE_PK_CALLBACKS)
  20946. &ssl->buffers.peerRsaKey
  20947. #else
  20948. NULL
  20949. #endif
  20950. );
  20951. break;
  20952. }
  20953. #endif /* !NO_RSA */
  20954. #ifndef NO_DH
  20955. case diffie_hellman_kea:
  20956. {
  20957. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  20958. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  20959. ssl->buffers.serverDH_Pub.buffer,
  20960. ssl->buffers.serverDH_Pub.length,
  20961. ssl->arrays->preMasterSecret,
  20962. &ssl->arrays->preMasterSz);
  20963. break;
  20964. }
  20965. #endif /* !NO_DH */
  20966. #ifndef NO_PSK
  20967. case psk_kea:
  20968. {
  20969. break;
  20970. }
  20971. #endif /* !NO_PSK */
  20972. #if !defined(NO_DH) && !defined(NO_PSK)
  20973. case dhe_psk_kea:
  20974. {
  20975. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  20976. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  20977. ssl->buffers.serverDH_Pub.buffer,
  20978. ssl->buffers.serverDH_Pub.length,
  20979. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  20980. &ssl->arrays->preMasterSz);
  20981. break;
  20982. }
  20983. #endif /* !NO_DH && !NO_PSK */
  20984. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20985. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  20986. case ecdhe_psk_kea:
  20987. {
  20988. #ifdef HAVE_CURVE25519
  20989. if (ssl->peerX25519KeyPresent) {
  20990. ret = X25519SharedSecret(ssl,
  20991. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  20992. args->output + OPAQUE8_LEN, &args->length,
  20993. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  20994. &ssl->arrays->preMasterSz,
  20995. WOLFSSL_CLIENT_END
  20996. );
  20997. if (!ssl->specs.static_ecdh
  20998. #ifdef WOLFSSL_ASYNC_CRYPT
  20999. && ret != WC_PENDING_E
  21000. #endif
  21001. ) {
  21002. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  21003. (void**)&ssl->peerX25519Key);
  21004. ssl->peerX25519KeyPresent = 0;
  21005. }
  21006. break;
  21007. }
  21008. #endif
  21009. #ifdef HAVE_CURVE448
  21010. if (ssl->peerX448KeyPresent) {
  21011. ret = X448SharedSecret(ssl,
  21012. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  21013. args->output + OPAQUE8_LEN, &args->length,
  21014. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  21015. &ssl->arrays->preMasterSz,
  21016. WOLFSSL_CLIENT_END
  21017. );
  21018. if (!ssl->specs.static_ecdh
  21019. #ifdef WOLFSSL_ASYNC_CRYPT
  21020. && ret != WC_PENDING_E
  21021. #endif
  21022. ) {
  21023. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  21024. (void**)&ssl->peerX448Key);
  21025. ssl->peerX448KeyPresent = 0;
  21026. }
  21027. break;
  21028. }
  21029. #endif
  21030. ret = EccSharedSecret(ssl,
  21031. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  21032. args->output + OPAQUE8_LEN, &args->length,
  21033. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  21034. &ssl->arrays->preMasterSz,
  21035. WOLFSSL_CLIENT_END
  21036. );
  21037. #ifdef WOLFSSL_ASYNC_CRYPT
  21038. if (ret != WC_PENDING_E)
  21039. #endif
  21040. {
  21041. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  21042. (void**)&ssl->peerEccKey);
  21043. ssl->peerEccKeyPresent = 0;
  21044. }
  21045. break;
  21046. }
  21047. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  21048. #ifdef HAVE_NTRU
  21049. case ntru_kea:
  21050. {
  21051. word32 rc;
  21052. word16 tmpEncSz = (word16)args->encSz;
  21053. DRBG_HANDLE drbg;
  21054. rc = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  21055. if (rc != DRBG_OK) {
  21056. ERROR_OUT(NTRU_DRBG_ERROR, exit_scke);
  21057. }
  21058. rc = ntru_crypto_ntru_encrypt(drbg, ssl->peerNtruKeyLen,
  21059. ssl->peerNtruKey,
  21060. ssl->arrays->preMasterSz,
  21061. ssl->arrays->preMasterSecret,
  21062. &tmpEncSz,
  21063. args->encSecret);
  21064. args->encSz = tmpEncSz;
  21065. ntru_crypto_drbg_uninstantiate(drbg);
  21066. if (rc != NTRU_OK) {
  21067. ERROR_OUT(NTRU_ENCRYPT_ERROR, exit_scke);
  21068. }
  21069. ret = 0;
  21070. break;
  21071. }
  21072. #endif /* HAVE_NTRU */
  21073. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21074. defined(HAVE_CURVE448)
  21075. case ecc_diffie_hellman_kea:
  21076. {
  21077. #ifdef HAVE_ECC
  21078. ecc_key* peerKey;
  21079. #endif
  21080. #ifdef HAVE_CURVE25519
  21081. if (ssl->peerX25519KeyPresent) {
  21082. ret = X25519SharedSecret(ssl,
  21083. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  21084. args->encSecret + OPAQUE8_LEN, &args->encSz,
  21085. ssl->arrays->preMasterSecret,
  21086. &ssl->arrays->preMasterSz,
  21087. WOLFSSL_CLIENT_END
  21088. );
  21089. if (!ssl->specs.static_ecdh
  21090. #ifdef WOLFSSL_ASYNC_CRYPT
  21091. && ret != WC_PENDING_E
  21092. #endif
  21093. ) {
  21094. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  21095. (void**)&ssl->peerX25519Key);
  21096. ssl->peerX25519KeyPresent = 0;
  21097. }
  21098. break;
  21099. }
  21100. #endif
  21101. #ifdef HAVE_CURVE448
  21102. if (ssl->peerX448KeyPresent) {
  21103. ret = X448SharedSecret(ssl,
  21104. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  21105. args->encSecret + OPAQUE8_LEN, &args->encSz,
  21106. ssl->arrays->preMasterSecret,
  21107. &ssl->arrays->preMasterSz,
  21108. WOLFSSL_CLIENT_END
  21109. );
  21110. if (!ssl->specs.static_ecdh
  21111. #ifdef WOLFSSL_ASYNC_CRYPT
  21112. && ret != WC_PENDING_E
  21113. #endif
  21114. ) {
  21115. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  21116. (void**)&ssl->peerX448Key);
  21117. ssl->peerX448KeyPresent = 0;
  21118. }
  21119. break;
  21120. }
  21121. #endif
  21122. #ifdef HAVE_ECC
  21123. peerKey = (ssl->specs.static_ecdh) ?
  21124. ssl->peerEccDsaKey : ssl->peerEccKey;
  21125. ret = EccSharedSecret(ssl,
  21126. (ecc_key*)ssl->hsKey, peerKey,
  21127. args->encSecret + OPAQUE8_LEN, &args->encSz,
  21128. ssl->arrays->preMasterSecret,
  21129. &ssl->arrays->preMasterSz,
  21130. WOLFSSL_CLIENT_END
  21131. );
  21132. if (!ssl->specs.static_ecdh
  21133. #ifdef WOLFSSL_ASYNC_CRYPT
  21134. && ret != WC_PENDING_E
  21135. #endif
  21136. && !ssl->options.keepResources) {
  21137. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  21138. (void**)&ssl->peerEccKey);
  21139. ssl->peerEccKeyPresent = 0;
  21140. }
  21141. #endif
  21142. break;
  21143. }
  21144. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  21145. default:
  21146. ret = BAD_KEA_TYPE_E;
  21147. } /* switch(ssl->specs.kea) */
  21148. /* Check for error */
  21149. if (ret != 0) {
  21150. goto exit_scke;
  21151. }
  21152. /* Advance state and proceed */
  21153. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  21154. } /* case TLS_ASYNC_DO */
  21155. FALL_THROUGH;
  21156. case TLS_ASYNC_VERIFY:
  21157. {
  21158. switch(ssl->specs.kea)
  21159. {
  21160. #ifndef NO_RSA
  21161. case rsa_kea:
  21162. {
  21163. break;
  21164. }
  21165. #endif /* !NO_RSA */
  21166. #ifndef NO_DH
  21167. case diffie_hellman_kea:
  21168. {
  21169. break;
  21170. }
  21171. #endif /* !NO_DH */
  21172. #ifndef NO_PSK
  21173. case psk_kea:
  21174. {
  21175. break;
  21176. }
  21177. #endif /* !NO_PSK */
  21178. #if !defined(NO_DH) && !defined(NO_PSK)
  21179. case dhe_psk_kea:
  21180. {
  21181. byte* pms = ssl->arrays->preMasterSecret;
  21182. /* validate args */
  21183. if (args->output == NULL || args->length == 0) {
  21184. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  21185. }
  21186. c16toa((word16)args->length, args->output);
  21187. args->encSz += args->length + OPAQUE16_LEN;
  21188. c16toa((word16)ssl->arrays->preMasterSz, pms);
  21189. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  21190. pms += ssl->arrays->preMasterSz;
  21191. /* make psk pre master secret */
  21192. /* length of key + length 0s + length of key + key */
  21193. c16toa((word16)ssl->arrays->psk_keySz, pms);
  21194. pms += OPAQUE16_LEN;
  21195. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21196. ssl->arrays->preMasterSz +=
  21197. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  21198. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21199. ssl->arrays->psk_keySz = 0; /* No further need */
  21200. break;
  21201. }
  21202. #endif /* !NO_DH && !NO_PSK */
  21203. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21204. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  21205. case ecdhe_psk_kea:
  21206. {
  21207. byte* pms = ssl->arrays->preMasterSecret;
  21208. /* validate args */
  21209. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  21210. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  21211. }
  21212. /* place size of public key in output buffer */
  21213. *args->output = (byte)args->length;
  21214. args->encSz += args->length + OPAQUE8_LEN;
  21215. /* Create pre master secret is the concatenation of
  21216. eccSize + eccSharedKey + pskSize + pskKey */
  21217. c16toa((word16)ssl->arrays->preMasterSz, pms);
  21218. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  21219. pms += ssl->arrays->preMasterSz;
  21220. c16toa((word16)ssl->arrays->psk_keySz, pms);
  21221. pms += OPAQUE16_LEN;
  21222. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21223. ssl->arrays->preMasterSz +=
  21224. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  21225. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  21226. ssl->arrays->psk_keySz = 0; /* No further need */
  21227. break;
  21228. }
  21229. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  21230. #ifdef HAVE_NTRU
  21231. case ntru_kea:
  21232. {
  21233. break;
  21234. }
  21235. #endif /* HAVE_NTRU */
  21236. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21237. defined(HAVE_CURVE448)
  21238. case ecc_diffie_hellman_kea:
  21239. {
  21240. /* place size of public key in buffer */
  21241. *args->encSecret = (byte)args->encSz;
  21242. args->encSz += OPAQUE8_LEN;
  21243. break;
  21244. }
  21245. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  21246. default:
  21247. ret = BAD_KEA_TYPE_E;
  21248. } /* switch(ssl->specs.kea) */
  21249. /* Check for error */
  21250. if (ret != 0) {
  21251. goto exit_scke;
  21252. }
  21253. /* Advance state and proceed */
  21254. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  21255. } /* case TLS_ASYNC_VERIFY */
  21256. FALL_THROUGH;
  21257. case TLS_ASYNC_FINALIZE:
  21258. {
  21259. word32 tlsSz = 0;
  21260. word32 idx = 0;
  21261. #ifdef HAVE_QSH
  21262. word32 qshSz = 0;
  21263. if (ssl->peerQSHKeyPresent) {
  21264. qshSz = QSH_KeyGetSize(ssl);
  21265. }
  21266. #endif
  21267. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  21268. tlsSz = 2;
  21269. }
  21270. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  21271. ssl->specs.kea == dhe_psk_kea ||
  21272. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  21273. tlsSz = 0;
  21274. }
  21275. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  21276. args->sendSz = args->encSz + tlsSz + idx;
  21277. #ifdef WOLFSSL_DTLS
  21278. if (ssl->options.dtls) {
  21279. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  21280. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  21281. }
  21282. #endif
  21283. if (IsEncryptionOn(ssl, 1)) {
  21284. args->sendSz += MAX_MSG_EXTRA;
  21285. }
  21286. #ifdef HAVE_QSH
  21287. args->encSz += qshSz;
  21288. args->sendSz += qshSz;
  21289. #endif
  21290. /* check for available size */
  21291. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  21292. goto exit_scke;
  21293. }
  21294. /* get output buffer */
  21295. args->output = ssl->buffers.outputBuffer.buffer +
  21296. ssl->buffers.outputBuffer.length;
  21297. #ifdef HAVE_QSH
  21298. if (ssl->peerQSHKeyPresent) {
  21299. byte idxSave = idx;
  21300. idx = args->sendSz - qshSz;
  21301. if (QSH_KeyExchangeWrite(ssl, 0) != 0) {
  21302. ERROR_OUT(MEMORY_E, exit_scke);
  21303. }
  21304. /* extension type */
  21305. c16toa(TLSX_QUANTUM_SAFE_HYBRID, args->output + idx);
  21306. idx += OPAQUE16_LEN;
  21307. /* write to output and check amount written */
  21308. if (TLSX_QSHPK_Write(ssl->QSH_secret->list,
  21309. args->output + idx) > qshSz - OPAQUE16_LEN) {
  21310. ERROR_OUT(MEMORY_E, exit_scke);
  21311. }
  21312. idx = idxSave;
  21313. }
  21314. #endif
  21315. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  21316. #ifdef HAVE_QSH
  21317. if (ssl->peerQSHKeyPresent) {
  21318. args->encSz -= qshSz;
  21319. }
  21320. #endif
  21321. if (tlsSz) {
  21322. c16toa((word16)args->encSz, &args->output[idx]);
  21323. idx += OPAQUE16_LEN;
  21324. }
  21325. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  21326. idx += args->encSz;
  21327. if (IsEncryptionOn(ssl, 1)) {
  21328. int recordHeaderSz = RECORD_HEADER_SZ;
  21329. if (ssl->options.dtls)
  21330. recordHeaderSz += DTLS_RECORD_EXTRA;
  21331. args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
  21332. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  21333. DYNAMIC_TYPE_IN_BUFFER);
  21334. if (args->input == NULL) {
  21335. ERROR_OUT(MEMORY_E, exit_scke);
  21336. }
  21337. XMEMCPY(args->input, args->output + recordHeaderSz,
  21338. args->inputSz);
  21339. }
  21340. /* Advance state and proceed */
  21341. ssl->options.asyncState = TLS_ASYNC_END;
  21342. } /* case TLS_ASYNC_FINALIZE */
  21343. FALL_THROUGH;
  21344. case TLS_ASYNC_END:
  21345. {
  21346. if (IsEncryptionOn(ssl, 1)) {
  21347. #ifdef WOLFSSL_DTLS
  21348. if (IsDtlsNotSctpMode(ssl) &&
  21349. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
  21350. goto exit_scke;
  21351. }
  21352. #endif
  21353. ret = BuildMessage(ssl, args->output, args->sendSz,
  21354. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  21355. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21356. args->input = NULL; /* make sure its not double free'd on cleanup */
  21357. if (ret >= 0) {
  21358. args->sendSz = ret;
  21359. ret = 0;
  21360. }
  21361. }
  21362. else {
  21363. #ifdef WOLFSSL_DTLS
  21364. if (IsDtlsNotSctpMode(ssl)) {
  21365. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
  21366. goto exit_scke;
  21367. }
  21368. }
  21369. if (ssl->options.dtls)
  21370. DtlsSEQIncrement(ssl, CUR_ORDER);
  21371. #endif
  21372. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  21373. }
  21374. if (ret != 0) {
  21375. goto exit_scke;
  21376. }
  21377. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  21378. if (ssl->hsInfoOn)
  21379. AddPacketName(ssl, "ClientKeyExchange");
  21380. if (ssl->toInfoOn)
  21381. AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  21382. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  21383. #endif
  21384. ssl->buffers.outputBuffer.length += args->sendSz;
  21385. if (!ssl->options.groupMessages) {
  21386. ret = SendBuffered(ssl);
  21387. }
  21388. if (ret == 0 || ret == WANT_WRITE) {
  21389. int tmpRet = MakeMasterSecret(ssl);
  21390. if (tmpRet != 0) {
  21391. ret = tmpRet; /* save WANT_WRITE unless more serious */
  21392. }
  21393. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  21394. }
  21395. break;
  21396. }
  21397. default:
  21398. ret = INPUT_CASE_ERROR;
  21399. } /* switch(ssl->options.asyncState) */
  21400. exit_scke:
  21401. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  21402. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  21403. #ifdef WOLFSSL_ASYNC_CRYPT
  21404. /* Handle async operation */
  21405. if (ret == WC_PENDING_E)
  21406. return ret;
  21407. #endif
  21408. /* No further need for PMS */
  21409. if (ssl->arrays->preMasterSecret != NULL) {
  21410. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  21411. }
  21412. ssl->arrays->preMasterSz = 0;
  21413. /* Final cleanup */
  21414. FreeSckeArgs(ssl, args);
  21415. FreeKeyExchange(ssl);
  21416. return ret;
  21417. }
  21418. #endif /* !WOLFSSL_NO_TLS12 */
  21419. #ifndef NO_CERTS
  21420. #ifndef WOLFSSL_NO_TLS12
  21421. #ifndef WOLFSSL_NO_CLIENT_AUTH
  21422. typedef struct ScvArgs {
  21423. byte* output; /* not allocated */
  21424. #ifndef NO_RSA
  21425. byte* verifySig;
  21426. #endif
  21427. byte* verify; /* not allocated */
  21428. byte* input;
  21429. word32 idx;
  21430. word32 extraSz;
  21431. word32 sigSz;
  21432. int sendSz;
  21433. int inputSz;
  21434. word16 length;
  21435. byte sigAlgo;
  21436. } ScvArgs;
  21437. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  21438. {
  21439. ScvArgs* args = (ScvArgs*)pArgs;
  21440. (void)ssl;
  21441. #ifndef NO_RSA
  21442. if (args->verifySig) {
  21443. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21444. args->verifySig = NULL;
  21445. }
  21446. #endif
  21447. if (args->input) {
  21448. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21449. args->input = NULL;
  21450. }
  21451. }
  21452. /* handle generation of certificate_verify (15) */
  21453. int SendCertificateVerify(WOLFSSL* ssl)
  21454. {
  21455. int ret = 0;
  21456. #ifdef WOLFSSL_ASYNC_CRYPT
  21457. ScvArgs* args = (ScvArgs*)ssl->async.args;
  21458. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  21459. (void)sizeof(args_test);
  21460. #else
  21461. ScvArgs args[1];
  21462. #endif
  21463. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  21464. WOLFSSL_ENTER("SendCertificateVerify");
  21465. #ifdef WOLFSSL_ASYNC_CRYPT
  21466. /* BuildMessage does its own Pop */
  21467. if (ssl->error != WC_PENDING_E ||
  21468. ssl->options.asyncState != TLS_ASYNC_END)
  21469. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  21470. if (ret != WC_NOT_PENDING_E) {
  21471. /* Check for error */
  21472. if (ret < 0)
  21473. goto exit_scv;
  21474. }
  21475. else
  21476. #endif
  21477. {
  21478. /* Reset state */
  21479. ret = 0;
  21480. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  21481. XMEMSET(args, 0, sizeof(ScvArgs));
  21482. #ifdef WOLFSSL_ASYNC_CRYPT
  21483. ssl->async.freeArgs = FreeScvArgs;
  21484. #endif
  21485. }
  21486. switch(ssl->options.asyncState)
  21487. {
  21488. case TLS_ASYNC_BEGIN:
  21489. {
  21490. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  21491. return 0; /* sent blank cert, can't verify */
  21492. }
  21493. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  21494. if (IsEncryptionOn(ssl, 1)) {
  21495. args->sendSz += MAX_MSG_EXTRA;
  21496. }
  21497. /* check for available size */
  21498. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  21499. goto exit_scv;
  21500. }
  21501. /* get output buffer */
  21502. args->output = ssl->buffers.outputBuffer.buffer +
  21503. ssl->buffers.outputBuffer.length;
  21504. /* Advance state and proceed */
  21505. ssl->options.asyncState = TLS_ASYNC_BUILD;
  21506. } /* case TLS_ASYNC_BEGIN */
  21507. FALL_THROUGH;
  21508. case TLS_ASYNC_BUILD:
  21509. {
  21510. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  21511. if (ret != 0) {
  21512. goto exit_scv;
  21513. }
  21514. if (ssl->buffers.key == NULL) {
  21515. #ifdef HAVE_PK_CALLBACKS
  21516. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  21517. args->length = GetPrivateKeySigSize(ssl);
  21518. else
  21519. #endif
  21520. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  21521. }
  21522. else {
  21523. /* Decode private key. */
  21524. ret = DecodePrivateKey(ssl, &args->length);
  21525. if (ret != 0) {
  21526. goto exit_scv;
  21527. }
  21528. }
  21529. if (args->length == 0) {
  21530. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  21531. }
  21532. /* idx is used to track verify pointer offset to output */
  21533. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  21534. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  21535. args->extraSz = 0; /* tls 1.2 hash/sig */
  21536. /* build encoded signature buffer */
  21537. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  21538. ssl->buffers.sig.buffer = (byte*)XMALLOC(ssl->buffers.sig.length,
  21539. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21540. if (ssl->buffers.sig.buffer == NULL) {
  21541. ERROR_OUT(MEMORY_E, exit_scv);
  21542. }
  21543. #ifdef WOLFSSL_DTLS
  21544. if (ssl->options.dtls) {
  21545. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21546. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21547. }
  21548. #endif
  21549. #ifndef NO_OLD_TLS
  21550. #ifndef NO_SHA
  21551. /* old tls default */
  21552. SetDigest(ssl, sha_mac);
  21553. #endif
  21554. #else
  21555. #ifndef NO_SHA256
  21556. /* new tls default */
  21557. SetDigest(ssl, sha256_mac);
  21558. #endif
  21559. #endif /* !NO_OLD_TLS */
  21560. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  21561. #ifdef WC_RSA_PSS
  21562. if (IsAtLeastTLSv1_2(ssl) &&
  21563. (ssl->pssAlgo & (1 << ssl->suites->hashAlgo))) {
  21564. args->sigAlgo = rsa_pss_sa_algo;
  21565. }
  21566. else
  21567. #endif
  21568. args->sigAlgo = rsa_sa_algo;
  21569. }
  21570. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  21571. args->sigAlgo = ecc_dsa_sa_algo;
  21572. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  21573. args->sigAlgo = ed25519_sa_algo;
  21574. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  21575. args->sigAlgo = ed448_sa_algo;
  21576. if (IsAtLeastTLSv1_2(ssl)) {
  21577. EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo,
  21578. args->verify);
  21579. args->extraSz = HASH_SIG_SIZE;
  21580. SetDigest(ssl, ssl->suites->hashAlgo);
  21581. }
  21582. #ifndef NO_OLD_TLS
  21583. else {
  21584. /* if old TLS load MD5 and SHA hash as value to sign */
  21585. XMEMCPY(ssl->buffers.sig.buffer,
  21586. (byte*)ssl->hsHashes->certHashes.md5, FINISHED_SZ);
  21587. }
  21588. #endif
  21589. #ifndef NO_RSA
  21590. if (args->sigAlgo == rsa_sa_algo) {
  21591. ssl->buffers.sig.length = FINISHED_SZ;
  21592. args->sigSz = ENCRYPT_LEN;
  21593. if (IsAtLeastTLSv1_2(ssl)) {
  21594. ssl->buffers.sig.length = wc_EncodeSignature(
  21595. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  21596. ssl->buffers.digest.length,
  21597. TypeHash(ssl->suites->hashAlgo));
  21598. }
  21599. /* prepend hdr */
  21600. c16toa(args->length, args->verify + args->extraSz);
  21601. }
  21602. #ifdef WC_RSA_PSS
  21603. else if (args->sigAlgo == rsa_pss_sa_algo) {
  21604. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  21605. ssl->buffers.digest.length);
  21606. ssl->buffers.sig.length = ssl->buffers.digest.length;
  21607. args->sigSz = ENCRYPT_LEN;
  21608. /* prepend hdr */
  21609. c16toa(args->length, args->verify + args->extraSz);
  21610. }
  21611. #endif
  21612. #endif /* !NO_RSA */
  21613. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  21614. if (args->sigAlgo == ed25519_sa_algo) {
  21615. ret = Ed25519CheckPubKey(ssl);
  21616. if (ret != 0)
  21617. goto exit_scv;
  21618. }
  21619. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  21620. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  21621. if (args->sigAlgo == ed448_sa_algo) {
  21622. ret = Ed448CheckPubKey(ssl);
  21623. if (ret != 0)
  21624. goto exit_scv;
  21625. }
  21626. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  21627. /* Advance state and proceed */
  21628. ssl->options.asyncState = TLS_ASYNC_DO;
  21629. } /* case TLS_ASYNC_BUILD */
  21630. FALL_THROUGH;
  21631. case TLS_ASYNC_DO:
  21632. {
  21633. #ifdef HAVE_ECC
  21634. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  21635. ecc_key* key = (ecc_key*)ssl->hsKey;
  21636. ret = EccSign(ssl,
  21637. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  21638. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  21639. key,
  21640. #ifdef HAVE_PK_CALLBACKS
  21641. ssl->buffers.key
  21642. #else
  21643. NULL
  21644. #endif
  21645. );
  21646. }
  21647. #endif /* HAVE_ECC */
  21648. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  21649. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  21650. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  21651. ret = Ed25519Sign(ssl,
  21652. ssl->hsHashes->messages, ssl->hsHashes->length,
  21653. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  21654. key,
  21655. #ifdef HAVE_PK_CALLBACKS
  21656. ssl->buffers.key
  21657. #else
  21658. NULL
  21659. #endif
  21660. );
  21661. }
  21662. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  21663. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  21664. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  21665. ed448_key* key = (ed448_key*)ssl->hsKey;
  21666. ret = Ed448Sign(ssl,
  21667. ssl->hsHashes->messages, ssl->hsHashes->length,
  21668. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  21669. key,
  21670. #ifdef HAVE_PK_CALLBACKS
  21671. ssl->buffers.key
  21672. #else
  21673. NULL
  21674. #endif
  21675. );
  21676. }
  21677. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  21678. #ifndef NO_RSA
  21679. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  21680. RsaKey* key = (RsaKey*)ssl->hsKey;
  21681. /* restore verify pointer */
  21682. args->verify = &args->output[args->idx];
  21683. ret = RsaSign(ssl,
  21684. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  21685. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  21686. args->sigAlgo, ssl->suites->hashAlgo, key,
  21687. ssl->buffers.key
  21688. );
  21689. }
  21690. #endif /* !NO_RSA */
  21691. /* Check for error */
  21692. if (ret != 0) {
  21693. goto exit_scv;
  21694. }
  21695. /* Advance state and proceed */
  21696. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  21697. } /* case TLS_ASYNC_DO */
  21698. FALL_THROUGH;
  21699. case TLS_ASYNC_VERIFY:
  21700. {
  21701. /* restore verify pointer */
  21702. args->verify = &args->output[args->idx];
  21703. switch (ssl->hsType) {
  21704. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  21705. #ifdef HAVE_ECC
  21706. case DYNAMIC_TYPE_ECC:
  21707. #endif
  21708. #ifdef HAVE_ED25519
  21709. case DYNAMIC_TYPE_ED25519:
  21710. #endif
  21711. #ifdef HAVE_ED448
  21712. case DYNAMIC_TYPE_ED448:
  21713. #endif
  21714. args->length = (word16)ssl->buffers.sig.length;
  21715. /* prepend hdr */
  21716. c16toa(args->length, args->verify + args->extraSz);
  21717. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  21718. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  21719. break;
  21720. #endif
  21721. #ifndef NO_RSA
  21722. case DYNAMIC_TYPE_RSA:
  21723. {
  21724. RsaKey* key = (RsaKey*)ssl->hsKey;
  21725. if (args->verifySig == NULL) {
  21726. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  21727. DYNAMIC_TYPE_SIGNATURE);
  21728. if (args->verifySig == NULL) {
  21729. ERROR_OUT(MEMORY_E, exit_scv);
  21730. }
  21731. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  21732. VERIFY_HEADER, args->sigSz);
  21733. }
  21734. /* check for signature faults */
  21735. ret = VerifyRsaSign(ssl,
  21736. args->verifySig, args->sigSz,
  21737. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  21738. args->sigAlgo, ssl->suites->hashAlgo, key,
  21739. ssl->buffers.key
  21740. );
  21741. break;
  21742. }
  21743. #endif /* !NO_RSA */
  21744. default:
  21745. break;
  21746. }
  21747. /* Check for error */
  21748. if (ret != 0) {
  21749. goto exit_scv;
  21750. }
  21751. /* Advance state and proceed */
  21752. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  21753. } /* case TLS_ASYNC_VERIFY */
  21754. FALL_THROUGH;
  21755. case TLS_ASYNC_FINALIZE:
  21756. {
  21757. if (args->output == NULL) {
  21758. ERROR_OUT(BUFFER_ERROR, exit_scv);
  21759. }
  21760. AddHeaders(args->output, (word32)args->length + args->extraSz +
  21761. VERIFY_HEADER, certificate_verify, ssl);
  21762. args->sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ +
  21763. (word32)args->length + args->extraSz + VERIFY_HEADER;
  21764. #ifdef WOLFSSL_DTLS
  21765. if (ssl->options.dtls) {
  21766. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21767. }
  21768. #endif
  21769. if (IsEncryptionOn(ssl, 1)) {
  21770. int recordHeaderSz = RECORD_HEADER_SZ;
  21771. if (ssl->options.dtls)
  21772. recordHeaderSz += DTLS_RECORD_EXTRA;
  21773. args->inputSz = args->sendSz - recordHeaderSz;
  21774. /* build msg adds rec hdr */
  21775. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  21776. DYNAMIC_TYPE_IN_BUFFER);
  21777. if (args->input == NULL) {
  21778. ERROR_OUT(MEMORY_E, exit_scv);
  21779. }
  21780. XMEMCPY(args->input, args->output + recordHeaderSz,
  21781. args->inputSz);
  21782. }
  21783. /* Advance state and proceed */
  21784. ssl->options.asyncState = TLS_ASYNC_END;
  21785. } /* case TLS_ASYNC_FINALIZE */
  21786. FALL_THROUGH;
  21787. case TLS_ASYNC_END:
  21788. {
  21789. if (IsEncryptionOn(ssl, 1)) {
  21790. #ifdef WOLFSSL_DTLS
  21791. if (IsDtlsNotSctpMode(ssl) &&
  21792. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, certificate_verify)) != 0) {
  21793. goto exit_scv;
  21794. }
  21795. #endif
  21796. ret = BuildMessage(ssl, args->output,
  21797. MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA,
  21798. args->input, args->inputSz, handshake,
  21799. 1, 0, 1, CUR_ORDER);
  21800. #ifdef WOLFSSL_ASYNC_CRYPT
  21801. if (ret == WC_PENDING_E)
  21802. goto exit_scv;
  21803. #endif
  21804. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21805. args->input = NULL; /* make sure its not double free'd on cleanup */
  21806. if (ret >= 0) {
  21807. args->sendSz = ret;
  21808. ret = 0;
  21809. }
  21810. }
  21811. else {
  21812. #ifdef WOLFSSL_DTLS
  21813. if (IsDtlsNotSctpMode(ssl)) {
  21814. ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, certificate_verify);
  21815. }
  21816. if (ret == 0 && ssl->options.dtls)
  21817. DtlsSEQIncrement(ssl, CUR_ORDER);
  21818. #endif
  21819. if (ret == 0)
  21820. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  21821. }
  21822. if (ret != 0) {
  21823. goto exit_scv;
  21824. }
  21825. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  21826. if (ssl->hsInfoOn)
  21827. AddPacketName(ssl, "CertificateVerify");
  21828. if (ssl->toInfoOn)
  21829. AddPacketInfo(ssl, "CertificateVerify", handshake,
  21830. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  21831. #endif
  21832. ssl->buffers.outputBuffer.length += args->sendSz;
  21833. if (!ssl->options.groupMessages) {
  21834. ret = SendBuffered(ssl);
  21835. }
  21836. break;
  21837. }
  21838. default:
  21839. ret = INPUT_CASE_ERROR;
  21840. } /* switch(ssl->options.asyncState) */
  21841. exit_scv:
  21842. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  21843. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  21844. #ifdef WOLFSSL_ASYNC_CRYPT
  21845. /* Handle async operation */
  21846. if (ret == WC_PENDING_E) {
  21847. return ret;
  21848. }
  21849. #endif /* WOLFSSL_ASYNC_CRYPT */
  21850. /* Digest is not allocated, so do this to prevent free */
  21851. ssl->buffers.digest.buffer = NULL;
  21852. ssl->buffers.digest.length = 0;
  21853. /* Final cleanup */
  21854. FreeScvArgs(ssl, args);
  21855. FreeKeyExchange(ssl);
  21856. return ret;
  21857. }
  21858. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  21859. #endif /* WOLFSSL_NO_TLS12 */
  21860. #endif /* NO_CERTS */
  21861. #ifdef HAVE_SESSION_TICKET
  21862. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  21863. {
  21864. /* Free old dynamic ticket if we already had one */
  21865. if (ssl->session.isDynamic) {
  21866. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  21867. ssl->session.ticket = ssl->session.staticTicket;
  21868. ssl->session.isDynamic = 0;
  21869. }
  21870. if (length > sizeof(ssl->session.staticTicket)) {
  21871. byte* sessionTicket =
  21872. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  21873. if (sessionTicket == NULL)
  21874. return MEMORY_E;
  21875. ssl->session.ticket = sessionTicket;
  21876. ssl->session.isDynamic = 1;
  21877. }
  21878. ssl->session.ticketLen = (word16)length;
  21879. if (length > 0) {
  21880. XMEMCPY(ssl->session.ticket, ticket, length);
  21881. if (ssl->session_ticket_cb != NULL) {
  21882. ssl->session_ticket_cb(ssl,
  21883. ssl->session.ticket, ssl->session.ticketLen,
  21884. ssl->session_ticket_ctx);
  21885. }
  21886. /* Create a fake sessionID based on the ticket, this will
  21887. * supersede the existing session cache info. */
  21888. ssl->options.haveSessionId = 1;
  21889. #ifdef WOLFSSL_TLS13
  21890. if (ssl->options.tls1_3) {
  21891. XMEMCPY(ssl->session.sessionID,
  21892. ssl->session.ticket + length - ID_LEN, ID_LEN);
  21893. }
  21894. else
  21895. #endif
  21896. XMEMCPY(ssl->arrays->sessionID,
  21897. ssl->session.ticket + length - ID_LEN, ID_LEN);
  21898. }
  21899. return 0;
  21900. }
  21901. #ifndef WOLFSSL_NO_TLS12
  21902. /* handle processing of session_ticket (4) */
  21903. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  21904. word32 size)
  21905. {
  21906. word32 begin = *inOutIdx;
  21907. word32 lifetime;
  21908. word16 length;
  21909. int ret;
  21910. if (ssl->expect_session_ticket == 0) {
  21911. WOLFSSL_MSG("Unexpected session ticket");
  21912. return SESSION_TICKET_EXPECT_E;
  21913. }
  21914. if (OPAQUE32_LEN > size)
  21915. return BUFFER_ERROR;
  21916. ato32(input + *inOutIdx, &lifetime);
  21917. *inOutIdx += OPAQUE32_LEN;
  21918. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  21919. return BUFFER_ERROR;
  21920. ato16(input + *inOutIdx, &length);
  21921. *inOutIdx += OPAQUE16_LEN;
  21922. if ((*inOutIdx - begin) + length > size)
  21923. return BUFFER_ERROR;
  21924. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  21925. return ret;
  21926. *inOutIdx += length;
  21927. if (length > 0) {
  21928. ssl->timeout = lifetime;
  21929. #ifndef NO_SESSION_CACHE
  21930. AddSession(ssl);
  21931. #endif
  21932. }
  21933. if (IsEncryptionOn(ssl, 0)) {
  21934. *inOutIdx += ssl->keys.padSz;
  21935. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  21936. if (ssl->options.startedETMRead)
  21937. *inOutIdx += MacSize(ssl);
  21938. #endif
  21939. }
  21940. ssl->expect_session_ticket = 0;
  21941. return 0;
  21942. }
  21943. #endif /* !WOLFSSL_NO_TLS12 */
  21944. #endif /* HAVE_SESSION_TICKET */
  21945. #endif /* NO_WOLFSSL_CLIENT */
  21946. #ifndef NO_CERTS
  21947. #ifdef HAVE_PK_CALLBACKS
  21948. int GetPrivateKeySigSize(WOLFSSL* ssl)
  21949. {
  21950. int sigSz = 0;
  21951. if (ssl == NULL)
  21952. return 0;
  21953. switch (ssl->buffers.keyType) {
  21954. #ifndef NO_RSA
  21955. #ifdef WC_RSA_PSS
  21956. case rsa_pss_sa_algo:
  21957. #endif
  21958. case rsa_sa_algo:
  21959. sigSz = ssl->buffers.keySz;
  21960. ssl->hsType = DYNAMIC_TYPE_RSA;
  21961. break;
  21962. #endif
  21963. #ifdef HAVE_ECC
  21964. case ecc_dsa_sa_algo:
  21965. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  21966. ssl->hsType = DYNAMIC_TYPE_ECC;
  21967. break;
  21968. #endif
  21969. #ifdef HAVE_ED25519
  21970. case ed25519_sa_algo:
  21971. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  21972. ssl->hsType = DYNAMIC_TYPE_ED25519;
  21973. break;
  21974. #endif
  21975. #ifdef HAVE_ED448
  21976. case ed448_sa_algo:
  21977. sigSz = ED448_SIG_SIZE; /* fixed known value */
  21978. ssl->hsType = DYNAMIC_TYPE_ED448;
  21979. break;
  21980. #endif
  21981. default:
  21982. break;
  21983. }
  21984. return sigSz;
  21985. }
  21986. #endif /* HAVE_PK_CALLBACKS */
  21987. #endif /* NO_CERTS */
  21988. #ifdef HAVE_ECC
  21989. /* returns the WOLFSSL_* version of the curve from the OID sum */
  21990. word16 GetCurveByOID(int oidSum) {
  21991. switch(oidSum) {
  21992. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  21993. #ifndef NO_ECC_SECP
  21994. case ECC_SECP160R1_OID:
  21995. return WOLFSSL_ECC_SECP160R1;
  21996. #endif /* !NO_ECC_SECP */
  21997. #ifdef HAVE_ECC_SECPR2
  21998. case ECC_SECP160R2_OID:
  21999. return WOLFSSL_ECC_SECP160R2;
  22000. #endif /* HAVE_ECC_SECPR2 */
  22001. #ifdef HAVE_ECC_KOBLITZ
  22002. case ECC_SECP160K1_OID:
  22003. return WOLFSSL_ECC_SECP160K1;
  22004. #endif /* HAVE_ECC_KOBLITZ */
  22005. #endif
  22006. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  22007. #ifndef NO_ECC_SECP
  22008. case ECC_SECP192R1_OID:
  22009. return WOLFSSL_ECC_SECP192R1;
  22010. #endif /* !NO_ECC_SECP */
  22011. #ifdef HAVE_ECC_KOBLITZ
  22012. case ECC_SECP192K1_OID:
  22013. return WOLFSSL_ECC_SECP192K1;
  22014. #endif /* HAVE_ECC_KOBLITZ */
  22015. #endif
  22016. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  22017. #ifndef NO_ECC_SECP
  22018. case ECC_SECP224R1_OID:
  22019. return WOLFSSL_ECC_SECP224R1;
  22020. #endif /* !NO_ECC_SECP */
  22021. #ifdef HAVE_ECC_KOBLITZ
  22022. case ECC_SECP224K1_OID:
  22023. return WOLFSSL_ECC_SECP224K1;
  22024. #endif /* HAVE_ECC_KOBLITZ */
  22025. #endif
  22026. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  22027. #ifndef NO_ECC_SECP
  22028. case ECC_SECP256R1_OID:
  22029. return WOLFSSL_ECC_SECP256R1;
  22030. #endif /* !NO_ECC_SECP */
  22031. #ifdef HAVE_ECC_KOBLITZ
  22032. case ECC_SECP256K1_OID:
  22033. return WOLFSSL_ECC_SECP256K1;
  22034. #endif /* HAVE_ECC_KOBLITZ */
  22035. #ifdef HAVE_ECC_BRAINPOOL
  22036. case ECC_BRAINPOOLP256R1_OID:
  22037. return WOLFSSL_ECC_BRAINPOOLP256R1;
  22038. #endif /* HAVE_ECC_BRAINPOOL */
  22039. #endif
  22040. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  22041. #ifndef NO_ECC_SECP
  22042. case ECC_SECP384R1_OID:
  22043. return WOLFSSL_ECC_SECP384R1;
  22044. #endif /* !NO_ECC_SECP */
  22045. #ifdef HAVE_ECC_BRAINPOOL
  22046. case ECC_BRAINPOOLP384R1_OID:
  22047. return WOLFSSL_ECC_BRAINPOOLP384R1;
  22048. #endif /* HAVE_ECC_BRAINPOOL */
  22049. #endif
  22050. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  22051. #ifdef HAVE_ECC_BRAINPOOL
  22052. case ECC_BRAINPOOLP512R1_OID:
  22053. return WOLFSSL_ECC_BRAINPOOLP512R1;
  22054. #endif /* HAVE_ECC_BRAINPOOL */
  22055. #endif
  22056. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  22057. #ifndef NO_ECC_SECP
  22058. case ECC_SECP521R1_OID:
  22059. return WOLFSSL_ECC_SECP521R1;
  22060. #endif /* !NO_ECC_SECP */
  22061. #endif
  22062. default:
  22063. WOLFSSL_MSG("Curve OID not compiled in or implemented");
  22064. return 0;
  22065. }
  22066. }
  22067. #endif /* HAVE_ECC */
  22068. #ifndef NO_WOLFSSL_SERVER
  22069. #ifndef WOLFSSL_NO_TLS12
  22070. /* handle generation of server_hello (2) */
  22071. int SendServerHello(WOLFSSL* ssl)
  22072. {
  22073. int ret;
  22074. byte *output;
  22075. word16 length;
  22076. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22077. int sendSz;
  22078. byte sessIdSz = ID_LEN;
  22079. byte echoId = 0; /* ticket echo id flag */
  22080. byte cacheOff = 0; /* session cache off flag */
  22081. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  22082. WOLFSSL_ENTER("SendServerHello");
  22083. length = VERSION_SZ + RAN_LEN
  22084. + ID_LEN + ENUM_LEN
  22085. + SUITE_LEN
  22086. + ENUM_LEN;
  22087. #ifdef HAVE_TLS_EXTENSIONS
  22088. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  22089. if (ret != 0)
  22090. return ret;
  22091. #ifdef HAVE_SESSION_TICKET
  22092. if (ssl->options.useTicket) {
  22093. /* echo session id sz can be 0,32 or bogus len in between */
  22094. sessIdSz = ssl->arrays->sessionIDSz;
  22095. if (sessIdSz > ID_LEN) {
  22096. WOLFSSL_MSG("Bad bogus session id len");
  22097. return BUFFER_ERROR;
  22098. }
  22099. if (!IsAtLeastTLSv1_3(ssl->version))
  22100. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  22101. echoId = 1;
  22102. }
  22103. #endif /* HAVE_SESSION_TICKET */
  22104. #else
  22105. if (ssl->options.haveEMS) {
  22106. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  22107. }
  22108. #endif
  22109. /* is the session cache off at build or runtime */
  22110. #ifdef NO_SESSION_CACHE
  22111. cacheOff = 1;
  22112. #else
  22113. if (ssl->options.sessionCacheOff == 1) {
  22114. cacheOff = 1;
  22115. }
  22116. #endif
  22117. /* if no session cache don't send a session ID unless we're echoing
  22118. * an ID as part of session tickets */
  22119. if (echoId == 0 && cacheOff == 1) {
  22120. length -= ID_LEN; /* adjust ID_LEN assumption */
  22121. sessIdSz = 0;
  22122. }
  22123. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  22124. #ifdef WOLFSSL_DTLS
  22125. if (ssl->options.dtls) {
  22126. if (((ssl->keys.dtls_sequence_number_hi == ssl->keys.curSeq_hi &&
  22127. ssl->keys.dtls_sequence_number_lo < ssl->keys.curSeq_lo) ||
  22128. (ssl->keys.dtls_sequence_number_hi < ssl->keys.curSeq_hi))) {
  22129. /* Server Hello should use the same sequence number as the
  22130. * Client Hello if available. */
  22131. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  22132. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  22133. }
  22134. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22135. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22136. }
  22137. #endif /* WOLFSSL_DTLS */
  22138. if (IsEncryptionOn(ssl, 1))
  22139. sendSz += MAX_MSG_EXTRA;
  22140. /* check for available size */
  22141. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  22142. return ret;
  22143. /* get output buffer */
  22144. output = ssl->buffers.outputBuffer.buffer +
  22145. ssl->buffers.outputBuffer.length;
  22146. AddHeaders(output, length, server_hello, ssl);
  22147. /* now write to output */
  22148. /* first version */
  22149. output[idx++] = (byte)ssl->version.major;
  22150. output[idx++] = (byte)ssl->version.minor;
  22151. /* then random and session id */
  22152. if (!ssl->options.resuming) {
  22153. /* generate random part and session id */
  22154. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  22155. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  22156. if (ret != 0)
  22157. return ret;
  22158. #ifdef WOLFSSL_TLS13
  22159. if (TLSv1_3_Capable(ssl)) {
  22160. /* TLS v1.3 capable server downgraded. */
  22161. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  22162. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  22163. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  22164. }
  22165. else
  22166. #endif
  22167. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  22168. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  22169. #ifdef OPENSSL_EXTRA
  22170. (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0 &&
  22171. #endif
  22172. !IsAtLeastTLSv1_2(ssl)) {
  22173. /* TLS v1.2 capable server downgraded. */
  22174. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  22175. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  22176. output[idx + RAN_LEN - 1] = 0;
  22177. }
  22178. /* store info in SSL for later */
  22179. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  22180. idx += RAN_LEN;
  22181. output[idx++] = sessIdSz;
  22182. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  22183. ssl->arrays->sessionIDSz = sessIdSz;
  22184. }
  22185. else {
  22186. /* If resuming, use info from SSL */
  22187. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  22188. idx += RAN_LEN;
  22189. output[idx++] = sessIdSz;
  22190. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  22191. }
  22192. idx += sessIdSz;
  22193. #ifdef SHOW_SECRETS
  22194. {
  22195. int j;
  22196. printf("server random: ");
  22197. for (j = 0; j < RAN_LEN; j++)
  22198. printf("%02x", ssl->arrays->serverRandom[j]);
  22199. printf("\n");
  22200. }
  22201. #endif
  22202. /* then cipher suite */
  22203. output[idx++] = ssl->options.cipherSuite0;
  22204. output[idx++] = ssl->options.cipherSuite;
  22205. /* then compression */
  22206. if (ssl->options.usingCompression)
  22207. output[idx++] = ZLIB_COMPRESSION;
  22208. else
  22209. output[idx++] = NO_COMPRESSION;
  22210. /* last, extensions */
  22211. #ifdef HAVE_TLS_EXTENSIONS
  22212. {
  22213. word16 offset = 0;
  22214. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  22215. if (ret != 0)
  22216. return ret;
  22217. idx += offset;
  22218. }
  22219. #else
  22220. #ifdef HAVE_EXTENDED_MASTER
  22221. if (ssl->options.haveEMS) {
  22222. c16toa(HELLO_EXT_SZ, output + idx);
  22223. idx += HELLO_EXT_SZ_SZ;
  22224. c16toa(HELLO_EXT_EXTMS, output + idx);
  22225. idx += HELLO_EXT_TYPE_SZ;
  22226. c16toa(0, output + idx);
  22227. /*idx += HELLO_EXT_SZ_SZ;*/
  22228. /* idx is not used after this point. uncomment the line above
  22229. * if adding any more extensions in the future. */
  22230. }
  22231. #endif
  22232. #endif
  22233. if (IsEncryptionOn(ssl, 1)) {
  22234. byte* input;
  22235. int inputSz = idx; /* build msg adds rec hdr */
  22236. int recordHeaderSz = RECORD_HEADER_SZ;
  22237. if (ssl->options.dtls)
  22238. recordHeaderSz += DTLS_RECORD_EXTRA;
  22239. inputSz -= recordHeaderSz;
  22240. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22241. if (input == NULL)
  22242. return MEMORY_E;
  22243. XMEMCPY(input, output + recordHeaderSz, inputSz);
  22244. #ifdef WOLFSSL_DTLS
  22245. if (IsDtlsNotSctpMode(ssl) &&
  22246. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
  22247. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22248. return ret;
  22249. }
  22250. #endif
  22251. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  22252. handshake, 1, 0, 0, CUR_ORDER);
  22253. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22254. if (sendSz < 0)
  22255. return sendSz;
  22256. } else {
  22257. #ifdef WOLFSSL_DTLS
  22258. if (IsDtlsNotSctpMode(ssl)) {
  22259. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
  22260. return ret;
  22261. }
  22262. if (ssl->options.dtls)
  22263. DtlsSEQIncrement(ssl, CUR_ORDER);
  22264. #endif
  22265. ret = HashOutput(ssl, output, sendSz, 0);
  22266. if (ret != 0)
  22267. return ret;
  22268. }
  22269. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  22270. if (ssl->hsInfoOn)
  22271. AddPacketName(ssl, "ServerHello");
  22272. if (ssl->toInfoOn)
  22273. AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  22274. WRITE_PROTO, ssl->heap);
  22275. #endif
  22276. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  22277. ssl->buffers.outputBuffer.length += sendSz;
  22278. if (ssl->options.groupMessages)
  22279. ret = 0;
  22280. else
  22281. ret = SendBuffered(ssl);
  22282. WOLFSSL_LEAVE("SendServerHello", ret);
  22283. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  22284. return ret;
  22285. }
  22286. #if defined(HAVE_ECC)
  22287. static byte SetCurveId(ecc_key* key)
  22288. {
  22289. if (key == NULL || key->dp == NULL) {
  22290. WOLFSSL_MSG("SetCurveId: Invalid key!");
  22291. return 0;
  22292. }
  22293. return (byte)GetCurveByOID(key->dp->oidSum);
  22294. }
  22295. #endif /* HAVE_ECC */
  22296. typedef struct SskeArgs {
  22297. byte* output; /* not allocated */
  22298. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  22299. !defined(NO_RSA)
  22300. byte* sigDataBuf;
  22301. #endif
  22302. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  22303. byte* exportBuf;
  22304. #endif
  22305. #ifndef NO_RSA
  22306. byte* verifySig;
  22307. #endif
  22308. byte* input;
  22309. word32 idx;
  22310. word32 tmpSigSz;
  22311. word32 length;
  22312. word32 sigSz;
  22313. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  22314. !defined(NO_RSA)
  22315. word32 sigDataSz;
  22316. #endif
  22317. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  22318. word32 exportSz;
  22319. #endif
  22320. #ifdef HAVE_QSH
  22321. word32 qshSz;
  22322. #endif
  22323. int sendSz;
  22324. int inputSz;
  22325. } SskeArgs;
  22326. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  22327. {
  22328. SskeArgs* args = (SskeArgs*)pArgs;
  22329. (void)ssl;
  22330. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  22331. if (args->exportBuf) {
  22332. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  22333. args->exportBuf = NULL;
  22334. }
  22335. #endif
  22336. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  22337. (!defined(NO_DH) && !defined(NO_RSA))
  22338. if (args->sigDataBuf) {
  22339. XFREE(args->sigDataBuf, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22340. args->sigDataBuf = NULL;
  22341. }
  22342. #endif
  22343. #ifndef NO_RSA
  22344. if (args->verifySig) {
  22345. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22346. args->verifySig = NULL;
  22347. }
  22348. #endif
  22349. (void)args;
  22350. }
  22351. /* handle generation of server_key_exchange (12) */
  22352. int SendServerKeyExchange(WOLFSSL* ssl)
  22353. {
  22354. int ret;
  22355. #ifdef WOLFSSL_ASYNC_CRYPT
  22356. SskeArgs* args = (SskeArgs*)ssl->async.args;
  22357. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  22358. (void)sizeof(args_test);
  22359. #else
  22360. SskeArgs args[1];
  22361. #endif
  22362. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  22363. WOLFSSL_ENTER("SendServerKeyExchange");
  22364. #ifdef WOLFSSL_ASYNC_CRYPT
  22365. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  22366. if (ret != WC_NOT_PENDING_E) {
  22367. /* Check for error */
  22368. if (ret < 0)
  22369. goto exit_sske;
  22370. }
  22371. else
  22372. #endif
  22373. {
  22374. /* Reset state */
  22375. ret = 0;
  22376. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  22377. XMEMSET(args, 0, sizeof(SskeArgs));
  22378. #ifdef WOLFSSL_ASYNC_CRYPT
  22379. ssl->async.freeArgs = FreeSskeArgs;
  22380. #endif
  22381. }
  22382. switch(ssl->options.asyncState)
  22383. {
  22384. case TLS_ASYNC_BEGIN:
  22385. {
  22386. #ifdef HAVE_QSH
  22387. if (ssl->peerQSHKeyPresent && ssl->options.haveQSH) {
  22388. args->qshSz = QSH_KeyGetSize(ssl);
  22389. }
  22390. #endif
  22391. /* Do some checks / debug msgs */
  22392. switch(ssl->specs.kea)
  22393. {
  22394. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22395. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22396. case ecdhe_psk_kea:
  22397. {
  22398. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  22399. break;
  22400. }
  22401. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  22402. #if defined(HAVE_ECC)
  22403. case ecc_diffie_hellman_kea:
  22404. {
  22405. if (ssl->specs.static_ecdh) {
  22406. WOLFSSL_MSG("Using Static ECDH, not sending "
  22407. "ServerKeyExchange");
  22408. ERROR_OUT(0, exit_sske);
  22409. }
  22410. WOLFSSL_MSG("Using ephemeral ECDH");
  22411. break;
  22412. }
  22413. #endif /* HAVE_ECC */
  22414. }
  22415. /* Preparing keys */
  22416. switch(ssl->specs.kea)
  22417. {
  22418. #ifndef NO_PSK
  22419. case psk_kea:
  22420. {
  22421. /* Nothing to do in this sub-state */
  22422. break;
  22423. }
  22424. #endif /* !NO_PSK */
  22425. #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA))
  22426. #if !defined(NO_PSK)
  22427. case dhe_psk_kea:
  22428. #endif
  22429. #if !defined(NO_RSA)
  22430. case diffie_hellman_kea:
  22431. #endif
  22432. {
  22433. /* Allocate DH key buffers and generate key */
  22434. if (ssl->buffers.serverDH_P.buffer == NULL ||
  22435. ssl->buffers.serverDH_G.buffer == NULL) {
  22436. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  22437. }
  22438. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  22439. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  22440. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  22441. ssl->buffers.serverDH_P.length + OPAQUE16_LEN,
  22442. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  22443. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  22444. ERROR_OUT(MEMORY_E, exit_sske);
  22445. }
  22446. ssl->buffers.serverDH_Pub.length =
  22447. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  22448. }
  22449. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  22450. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  22451. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  22452. ssl->buffers.serverDH_P.length + OPAQUE16_LEN,
  22453. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  22454. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  22455. ERROR_OUT(MEMORY_E, exit_sske);
  22456. }
  22457. ssl->buffers.serverDH_Priv.length =
  22458. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  22459. }
  22460. ssl->options.dhKeySz =
  22461. (word16)ssl->buffers.serverDH_P.length;
  22462. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  22463. (void**)&ssl->buffers.serverDH_Key);
  22464. if (ret != 0) {
  22465. goto exit_sske;
  22466. }
  22467. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  22468. !defined(HAVE_FIPS) && \
  22469. !defined(HAVE_SELFTEST)
  22470. if (ssl->options.dhDoKeyTest &&
  22471. !ssl->options.dhKeyTested)
  22472. {
  22473. ret = wc_DhSetCheckKey(
  22474. ssl->buffers.serverDH_Key,
  22475. ssl->buffers.serverDH_P.buffer,
  22476. ssl->buffers.serverDH_P.length,
  22477. ssl->buffers.serverDH_G.buffer,
  22478. ssl->buffers.serverDH_G.length,
  22479. NULL, 0, 0, ssl->rng);
  22480. if (ret != 0) {
  22481. goto exit_sske;
  22482. }
  22483. ssl->options.dhKeyTested = 1;
  22484. }
  22485. else
  22486. #endif
  22487. {
  22488. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  22489. ssl->buffers.serverDH_P.buffer,
  22490. ssl->buffers.serverDH_P.length,
  22491. ssl->buffers.serverDH_G.buffer,
  22492. ssl->buffers.serverDH_G.length);
  22493. if (ret != 0) {
  22494. goto exit_sske;
  22495. }
  22496. }
  22497. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  22498. ssl->buffers.serverDH_Priv.buffer,
  22499. (word32*)&ssl->buffers.serverDH_Priv.length,
  22500. ssl->buffers.serverDH_Pub.buffer,
  22501. (word32*)&ssl->buffers.serverDH_Pub.length);
  22502. break;
  22503. }
  22504. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  22505. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22506. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22507. case ecdhe_psk_kea:
  22508. /* Fall through to create temp ECC key */
  22509. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  22510. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22511. defined(HAVE_CURVE448)
  22512. case ecc_diffie_hellman_kea:
  22513. {
  22514. #ifdef HAVE_CURVE25519
  22515. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22516. /* need ephemeral key now, create it if missing */
  22517. if (ssl->eccTempKey == NULL) {
  22518. /* alloc/init on demand */
  22519. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  22520. (void**)&ssl->eccTempKey);
  22521. if (ret != 0) {
  22522. goto exit_sske;
  22523. }
  22524. }
  22525. if (ssl->eccTempKeyPresent == 0) {
  22526. ret = X25519MakeKey(ssl,
  22527. (curve25519_key*)ssl->eccTempKey, NULL);
  22528. if (ret == 0 || ret == WC_PENDING_E) {
  22529. ssl->eccTempKeyPresent =
  22530. DYNAMIC_TYPE_CURVE25519;
  22531. }
  22532. }
  22533. break;
  22534. }
  22535. #endif
  22536. #ifdef HAVE_CURVE448
  22537. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  22538. /* need ephemeral key now, create it if missing */
  22539. if (ssl->eccTempKey == NULL) {
  22540. /* alloc/init on demand */
  22541. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  22542. (void**)&ssl->eccTempKey);
  22543. if (ret != 0) {
  22544. goto exit_sske;
  22545. }
  22546. }
  22547. if (ssl->eccTempKeyPresent == 0) {
  22548. ret = X448MakeKey(ssl,
  22549. (curve448_key*)ssl->eccTempKey, NULL);
  22550. if (ret == 0 || ret == WC_PENDING_E) {
  22551. ssl->eccTempKeyPresent =
  22552. DYNAMIC_TYPE_CURVE448;
  22553. }
  22554. }
  22555. break;
  22556. }
  22557. #endif
  22558. #ifdef HAVE_ECC
  22559. /* need ephemeral key now, create it if missing */
  22560. if (ssl->eccTempKey == NULL) {
  22561. /* alloc/init on demand */
  22562. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  22563. (void**)&ssl->eccTempKey);
  22564. if (ret != 0) {
  22565. goto exit_sske;
  22566. }
  22567. }
  22568. if (ssl->eccTempKeyPresent == 0) {
  22569. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  22570. if (ret == 0 || ret == WC_PENDING_E) {
  22571. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  22572. }
  22573. }
  22574. #endif
  22575. break;
  22576. }
  22577. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  22578. default:
  22579. /* Skip ServerKeyExchange */
  22580. goto exit_sske;
  22581. } /* switch(ssl->specs.kea) */
  22582. /* Check for error */
  22583. if (ret != 0) {
  22584. goto exit_sske;
  22585. }
  22586. /* Advance state and proceed */
  22587. ssl->options.asyncState = TLS_ASYNC_BUILD;
  22588. } /* case TLS_ASYNC_BEGIN */
  22589. FALL_THROUGH;
  22590. case TLS_ASYNC_BUILD:
  22591. {
  22592. #if (!defined(NO_DH) && !defined(NO_RSA)) || (defined(HAVE_ECC) || \
  22593. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))
  22594. word32 preSigSz, preSigIdx;
  22595. #endif
  22596. switch(ssl->specs.kea)
  22597. {
  22598. #ifndef NO_PSK
  22599. case psk_kea:
  22600. {
  22601. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22602. if (ssl->arrays->server_hint[0] == 0) {
  22603. ERROR_OUT(0, exit_sske); /* don't send */
  22604. }
  22605. /* include size part */
  22606. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  22607. if (args->length > MAX_PSK_ID_LEN) {
  22608. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  22609. }
  22610. args->length += HINT_LEN_SZ;
  22611. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  22612. RECORD_HEADER_SZ;
  22613. #ifdef HAVE_QSH
  22614. args->length += args->qshSz;
  22615. args->sendSz += args->qshSz;
  22616. #endif
  22617. #ifdef WOLFSSL_DTLS
  22618. if (ssl->options.dtls) {
  22619. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22620. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22621. }
  22622. #endif
  22623. if (IsEncryptionOn(ssl, 1)) {
  22624. args->sendSz += MAX_MSG_EXTRA;
  22625. }
  22626. /* check for available size */
  22627. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  22628. goto exit_sske;
  22629. }
  22630. /* get output buffer */
  22631. args->output = ssl->buffers.outputBuffer.buffer +
  22632. ssl->buffers.outputBuffer.length;
  22633. AddHeaders(args->output, args->length,
  22634. server_key_exchange, ssl);
  22635. /* key data */
  22636. #ifdef HAVE_QSH
  22637. c16toa((word16)(args->length - args->qshSz -
  22638. HINT_LEN_SZ), args->output + args->idx);
  22639. #else
  22640. c16toa((word16)(args->length - HINT_LEN_SZ),
  22641. args->output + args->idx);
  22642. #endif
  22643. args->idx += HINT_LEN_SZ;
  22644. XMEMCPY(args->output + args->idx,
  22645. ssl->arrays->server_hint,
  22646. args->length - HINT_LEN_SZ);
  22647. break;
  22648. }
  22649. #endif /* !NO_PSK */
  22650. #if !defined(NO_DH) && !defined(NO_PSK)
  22651. case dhe_psk_kea:
  22652. {
  22653. word32 hintLen;
  22654. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22655. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  22656. ssl->buffers.serverDH_P.length +
  22657. ssl->buffers.serverDH_G.length +
  22658. ssl->buffers.serverDH_Pub.length;
  22659. /* include size part */
  22660. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  22661. if (hintLen > MAX_PSK_ID_LEN) {
  22662. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  22663. }
  22664. args->length += hintLen + HINT_LEN_SZ;
  22665. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  22666. RECORD_HEADER_SZ;
  22667. #ifdef HAVE_QSH
  22668. args->length += args->qshSz;
  22669. args->sendSz += args->qshSz;
  22670. #endif
  22671. #ifdef WOLFSSL_DTLS
  22672. if (ssl->options.dtls) {
  22673. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22674. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22675. }
  22676. #endif
  22677. if (IsEncryptionOn(ssl, 1)) {
  22678. args->sendSz += MAX_MSG_EXTRA;
  22679. }
  22680. /* check for available size */
  22681. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  22682. goto exit_sske;
  22683. }
  22684. /* get output buffer */
  22685. args->output = ssl->buffers.outputBuffer.buffer +
  22686. ssl->buffers.outputBuffer.length;
  22687. AddHeaders(args->output, args->length,
  22688. server_key_exchange, ssl);
  22689. /* key data */
  22690. c16toa((word16)hintLen, args->output + args->idx);
  22691. args->idx += HINT_LEN_SZ;
  22692. XMEMCPY(args->output + args->idx,
  22693. ssl->arrays->server_hint, hintLen);
  22694. args->idx += hintLen;
  22695. /* add p, g, pub */
  22696. c16toa((word16)ssl->buffers.serverDH_P.length,
  22697. args->output + args->idx);
  22698. args->idx += LENGTH_SZ;
  22699. XMEMCPY(args->output + args->idx,
  22700. ssl->buffers.serverDH_P.buffer,
  22701. ssl->buffers.serverDH_P.length);
  22702. args->idx += ssl->buffers.serverDH_P.length;
  22703. /* g */
  22704. c16toa((word16)ssl->buffers.serverDH_G.length,
  22705. args->output + args->idx);
  22706. args->idx += LENGTH_SZ;
  22707. XMEMCPY(args->output + args->idx,
  22708. ssl->buffers.serverDH_G.buffer,
  22709. ssl->buffers.serverDH_G.length);
  22710. args->idx += ssl->buffers.serverDH_G.length;
  22711. /* pub */
  22712. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  22713. args->output + args->idx);
  22714. args->idx += LENGTH_SZ;
  22715. XMEMCPY(args->output + args->idx,
  22716. ssl->buffers.serverDH_Pub.buffer,
  22717. ssl->buffers.serverDH_Pub.length);
  22718. /* No need to update idx, since sizes are already set */
  22719. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  22720. break;
  22721. }
  22722. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  22723. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22724. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22725. case ecdhe_psk_kea:
  22726. {
  22727. word32 hintLen;
  22728. /* curve type, named curve, length(1) */
  22729. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22730. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  22731. args->exportSz = MAX_EXPORT_ECC_SZ;
  22732. args->exportBuf = (byte*)XMALLOC(args->exportSz,
  22733. ssl->heap, DYNAMIC_TYPE_DER);
  22734. if (args->exportBuf == NULL) {
  22735. ERROR_OUT(MEMORY_E, exit_sske);
  22736. }
  22737. #ifdef HAVE_CURVE25519
  22738. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22739. if (wc_curve25519_export_public_ex(
  22740. (curve25519_key*)ssl->eccTempKey,
  22741. args->exportBuf, &args->exportSz,
  22742. EC25519_LITTLE_ENDIAN) != 0) {
  22743. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22744. }
  22745. }
  22746. else
  22747. #endif
  22748. #ifdef HAVE_CURVE448
  22749. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  22750. if (wc_curve448_export_public_ex(
  22751. (curve448_key*)ssl->eccTempKey,
  22752. args->exportBuf, &args->exportSz,
  22753. EC448_LITTLE_ENDIAN) != 0) {
  22754. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22755. }
  22756. }
  22757. else
  22758. #endif
  22759. {
  22760. if (wc_ecc_export_x963(ssl->eccTempKey,
  22761. args->exportBuf, &args->exportSz) != 0) {
  22762. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22763. }
  22764. }
  22765. args->length += args->exportSz;
  22766. /* include size part */
  22767. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  22768. if (hintLen > MAX_PSK_ID_LEN) {
  22769. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  22770. }
  22771. args->length += hintLen + HINT_LEN_SZ;
  22772. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  22773. #ifdef HAVE_QSH
  22774. args->length += args->qshSz;
  22775. args->sendSz += args->qshSz;
  22776. #endif
  22777. #ifdef WOLFSSL_DTLS
  22778. if (ssl->options.dtls) {
  22779. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22780. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22781. }
  22782. #endif
  22783. if (IsEncryptionOn(ssl, 1)) {
  22784. args->sendSz += MAX_MSG_EXTRA;
  22785. }
  22786. /* check for available size */
  22787. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  22788. goto exit_sske;
  22789. }
  22790. /* get output buffer */
  22791. args->output = ssl->buffers.outputBuffer.buffer +
  22792. ssl->buffers.outputBuffer.length;
  22793. /* key data */
  22794. c16toa((word16)hintLen, args->output + args->idx);
  22795. args->idx += HINT_LEN_SZ;
  22796. XMEMCPY(args->output + args->idx,
  22797. ssl->arrays->server_hint, hintLen);
  22798. args->idx += hintLen;
  22799. /* ECC key exchange data */
  22800. args->output[args->idx++] = named_curve;
  22801. args->output[args->idx++] = 0x00; /* leading zero */
  22802. #ifdef HAVE_CURVE25519
  22803. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  22804. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  22805. else
  22806. #endif
  22807. #ifdef HAVE_CURVE448
  22808. if (ssl->ecdhCurveOID == ECC_X448_OID)
  22809. args->output[args->idx++] = WOLFSSL_ECC_X448;
  22810. else
  22811. #endif
  22812. {
  22813. #ifdef HAVE_ECC
  22814. args->output[args->idx++] =
  22815. SetCurveId(ssl->eccTempKey);
  22816. #endif
  22817. }
  22818. args->output[args->idx++] = (byte)args->exportSz;
  22819. XMEMCPY(args->output + args->idx, args->exportBuf,
  22820. args->exportSz);
  22821. break;
  22822. }
  22823. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  22824. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22825. defined(HAVE_CURVE448)
  22826. case ecc_diffie_hellman_kea:
  22827. {
  22828. enum wc_HashType hashType;
  22829. /* curve type, named curve, length(1) */
  22830. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22831. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  22832. /* Export temp ECC key and add to length */
  22833. args->exportSz = MAX_EXPORT_ECC_SZ;
  22834. args->exportBuf = (byte*)XMALLOC(args->exportSz,
  22835. ssl->heap, DYNAMIC_TYPE_DER);
  22836. if (args->exportBuf == NULL) {
  22837. ERROR_OUT(MEMORY_E, exit_sske);
  22838. }
  22839. #ifdef HAVE_CURVE25519
  22840. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22841. if (wc_curve25519_export_public_ex(
  22842. (curve25519_key*)ssl->eccTempKey,
  22843. args->exportBuf, &args->exportSz,
  22844. EC25519_LITTLE_ENDIAN) != 0) {
  22845. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22846. }
  22847. }
  22848. else
  22849. #endif
  22850. #ifdef HAVE_CURVE448
  22851. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  22852. if (wc_curve448_export_public_ex(
  22853. (curve448_key*)ssl->eccTempKey,
  22854. args->exportBuf, &args->exportSz,
  22855. EC448_LITTLE_ENDIAN) != 0) {
  22856. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22857. }
  22858. }
  22859. else
  22860. #endif
  22861. {
  22862. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  22863. if (wc_ecc_export_x963(ssl->eccTempKey,
  22864. args->exportBuf, &args->exportSz) != 0) {
  22865. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22866. }
  22867. #endif
  22868. }
  22869. args->length += args->exportSz;
  22870. preSigSz = args->length;
  22871. preSigIdx = args->idx;
  22872. if (ssl->buffers.key == NULL) {
  22873. #ifdef HAVE_PK_CALLBACKS
  22874. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  22875. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  22876. if (args->tmpSigSz == 0) {
  22877. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  22878. }
  22879. }
  22880. else
  22881. #endif
  22882. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  22883. }
  22884. else {
  22885. switch(ssl->suites->sigAlgo) {
  22886. #ifndef NO_RSA
  22887. #ifdef WC_RSA_PSS
  22888. case rsa_pss_sa_algo:
  22889. #endif
  22890. case rsa_sa_algo:
  22891. {
  22892. word16 keySz;
  22893. ssl->buffers.keyType = rsa_sa_algo;
  22894. ret = DecodePrivateKey(ssl, &keySz);
  22895. if (ret != 0) {
  22896. goto exit_sske;
  22897. }
  22898. args->tmpSigSz = (word32)keySz;
  22899. break;
  22900. }
  22901. #endif /* !NO_RSA */
  22902. #ifdef HAVE_ECC
  22903. case ecc_dsa_sa_algo:
  22904. {
  22905. word16 keySz;
  22906. ssl->buffers.keyType = ecc_dsa_sa_algo;
  22907. ret = DecodePrivateKey(ssl, &keySz);
  22908. if (ret != 0) {
  22909. goto exit_sske;
  22910. }
  22911. /* worst case estimate */
  22912. args->tmpSigSz = keySz;
  22913. break;
  22914. }
  22915. #endif
  22916. #ifdef HAVE_ED25519
  22917. case ed25519_sa_algo:
  22918. {
  22919. word16 keySz;
  22920. ssl->buffers.keyType = ed25519_sa_algo;
  22921. ret = DecodePrivateKey(ssl, &keySz);
  22922. if (ret != 0) {
  22923. goto exit_sske;
  22924. }
  22925. /* worst case estimate */
  22926. args->tmpSigSz = ED25519_SIG_SIZE;
  22927. break;
  22928. }
  22929. #endif /* HAVE_ED25519 */
  22930. #ifdef HAVE_ED448
  22931. case ed448_sa_algo:
  22932. {
  22933. word16 keySz;
  22934. ssl->buffers.keyType = ed448_sa_algo;
  22935. ret = DecodePrivateKey(ssl, &keySz);
  22936. if (ret != 0) {
  22937. goto exit_sske;
  22938. }
  22939. /* worst case estimate */
  22940. args->tmpSigSz = ED448_SIG_SIZE;
  22941. break;
  22942. }
  22943. #endif /* HAVE_ED448 */
  22944. default:
  22945. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  22946. } /* switch(ssl->specs.sig_algo) */
  22947. }
  22948. /* sig length */
  22949. args->length += LENGTH_SZ;
  22950. args->length += args->tmpSigSz;
  22951. if (IsAtLeastTLSv1_2(ssl)) {
  22952. args->length += HASH_SIG_SIZE;
  22953. }
  22954. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  22955. #ifdef HAVE_QSH
  22956. args->length += args->qshSz;
  22957. args->sendSz += args->qshSz;
  22958. #endif
  22959. #ifdef WOLFSSL_DTLS
  22960. if (ssl->options.dtls) {
  22961. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22962. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22963. preSigIdx = args->idx;
  22964. }
  22965. #endif
  22966. if (IsEncryptionOn(ssl, 1)) {
  22967. args->sendSz += MAX_MSG_EXTRA;
  22968. }
  22969. /* check for available size */
  22970. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  22971. goto exit_sske;
  22972. }
  22973. /* get output buffer */
  22974. args->output = ssl->buffers.outputBuffer.buffer +
  22975. ssl->buffers.outputBuffer.length;
  22976. /* record and message headers will be added below, when we're sure
  22977. of the sig length */
  22978. /* key exchange data */
  22979. args->output[args->idx++] = named_curve;
  22980. args->output[args->idx++] = 0x00; /* leading zero */
  22981. #ifdef HAVE_CURVE25519
  22982. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  22983. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  22984. else
  22985. #endif
  22986. #ifdef HAVE_CURVE448
  22987. if (ssl->ecdhCurveOID == ECC_X448_OID)
  22988. args->output[args->idx++] = WOLFSSL_ECC_X448;
  22989. else
  22990. #endif
  22991. {
  22992. #ifdef HAVE_ECC
  22993. args->output[args->idx++] =
  22994. SetCurveId(ssl->eccTempKey);
  22995. #endif
  22996. }
  22997. args->output[args->idx++] = (byte)args->exportSz;
  22998. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  22999. args->idx += args->exportSz;
  23000. /* Determine hash type */
  23001. if (IsAtLeastTLSv1_2(ssl)) {
  23002. EncodeSigAlg(ssl->suites->hashAlgo,
  23003. ssl->suites->sigAlgo,
  23004. &args->output[args->idx]);
  23005. args->idx += 2;
  23006. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  23007. if (hashType == WC_HASH_TYPE_NONE) {
  23008. ERROR_OUT(ALGO_ID_E, exit_sske);
  23009. }
  23010. } else {
  23011. /* only using sha and md5 for rsa */
  23012. #ifndef NO_OLD_TLS
  23013. hashType = WC_HASH_TYPE_SHA;
  23014. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  23015. hashType = WC_HASH_TYPE_MD5_SHA;
  23016. }
  23017. #else
  23018. ERROR_OUT(ALGO_ID_E, exit_sske);
  23019. #endif
  23020. }
  23021. /* Signature length will be written later, when we're sure what it is */
  23022. #ifdef HAVE_FUZZER
  23023. if (ssl->fuzzerCb) {
  23024. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  23025. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  23026. }
  23027. #endif
  23028. /* Assemble buffer to hash for signature */
  23029. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  23030. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  23031. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23032. if (args->sigDataBuf == NULL) {
  23033. ERROR_OUT(MEMORY_E, exit_sske);
  23034. }
  23035. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  23036. RAN_LEN);
  23037. XMEMCPY(args->sigDataBuf+RAN_LEN,
  23038. ssl->arrays->serverRandom, RAN_LEN);
  23039. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  23040. args->output + preSigIdx, preSigSz);
  23041. if (ssl->suites->sigAlgo != ed25519_sa_algo &&
  23042. ssl->suites->sigAlgo != ed448_sa_algo) {
  23043. ssl->buffers.sig.length =
  23044. wc_HashGetDigestSize(hashType);
  23045. if ((int)ssl->buffers.sig.length < 0) {
  23046. ERROR_OUT(HASH_TYPE_E, exit_sske);
  23047. }
  23048. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  23049. ssl->buffers.sig.length,
  23050. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23051. if (ssl->buffers.sig.buffer == NULL) {
  23052. ERROR_OUT(MEMORY_E, exit_sske);
  23053. }
  23054. /* Perform hash */
  23055. ret = wc_Hash(hashType, args->sigDataBuf,
  23056. args->sigDataSz,
  23057. ssl->buffers.sig.buffer,
  23058. ssl->buffers.sig.length);
  23059. if (ret != 0) {
  23060. goto exit_sske;
  23061. }
  23062. }
  23063. args->sigSz = args->tmpSigSz;
  23064. /* Sign hash to create signature */
  23065. switch (ssl->suites->sigAlgo)
  23066. {
  23067. #ifndef NO_RSA
  23068. case rsa_sa_algo:
  23069. {
  23070. /* For TLS 1.2 re-encode signature */
  23071. if (IsAtLeastTLSv1_2(ssl)) {
  23072. byte* encodedSig = (byte*)XMALLOC(
  23073. MAX_ENCODED_SIG_SZ, ssl->heap,
  23074. DYNAMIC_TYPE_SIGNATURE);
  23075. if (encodedSig == NULL) {
  23076. ERROR_OUT(MEMORY_E, exit_sske);
  23077. }
  23078. ssl->buffers.sig.length =
  23079. wc_EncodeSignature(encodedSig,
  23080. ssl->buffers.sig.buffer,
  23081. ssl->buffers.sig.length,
  23082. TypeHash(ssl->suites->hashAlgo));
  23083. /* Replace sig buffer with new one */
  23084. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  23085. DYNAMIC_TYPE_SIGNATURE);
  23086. ssl->buffers.sig.buffer = encodedSig;
  23087. }
  23088. /* write sig size here */
  23089. c16toa((word16)args->sigSz,
  23090. args->output + args->idx);
  23091. args->idx += LENGTH_SZ;
  23092. break;
  23093. }
  23094. #ifdef WC_RSA_PSS
  23095. case rsa_pss_sa_algo:
  23096. /* write sig size here */
  23097. c16toa((word16)args->sigSz,
  23098. args->output + args->idx);
  23099. args->idx += LENGTH_SZ;
  23100. break;
  23101. #endif
  23102. #endif /* !NO_RSA */
  23103. case ecc_dsa_sa_algo:
  23104. {
  23105. break;
  23106. }
  23107. #ifdef HAVE_ED25519
  23108. case ed25519_sa_algo:
  23109. ret = Ed25519CheckPubKey(ssl);
  23110. if (ret != 0)
  23111. goto exit_sske;
  23112. break;
  23113. #endif /* HAVE_ED25519 */
  23114. #ifdef HAVE_ED448
  23115. case ed448_sa_algo:
  23116. ret = Ed448CheckPubKey(ssl);
  23117. if (ret != 0)
  23118. goto exit_sske;
  23119. break;
  23120. #endif /* HAVE_ED448 */
  23121. } /* switch(ssl->specs.sig_algo) */
  23122. break;
  23123. }
  23124. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23125. #if !defined(NO_DH) && !defined(NO_RSA)
  23126. case diffie_hellman_kea:
  23127. {
  23128. enum wc_HashType hashType;
  23129. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23130. args->length = LENGTH_SZ * 3; /* p, g, pub */
  23131. args->length += ssl->buffers.serverDH_P.length +
  23132. ssl->buffers.serverDH_G.length +
  23133. ssl->buffers.serverDH_Pub.length;
  23134. preSigIdx = args->idx;
  23135. preSigSz = args->length;
  23136. if (!ssl->options.usingAnon_cipher) {
  23137. word16 keySz;
  23138. /* sig length */
  23139. args->length += LENGTH_SZ;
  23140. if (ssl->buffers.key == NULL) {
  23141. #ifdef HAVE_PK_CALLBACKS
  23142. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  23143. keySz = (word32)GetPrivateKeySigSize(ssl);
  23144. else
  23145. #endif
  23146. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  23147. }
  23148. else
  23149. {
  23150. if (ssl->buffers.keyType == 0)
  23151. ssl->buffers.keyType = rsa_sa_algo;
  23152. ret = DecodePrivateKey(ssl, &keySz);
  23153. if (ret != 0) {
  23154. goto exit_sske;
  23155. }
  23156. }
  23157. if (keySz == 0) { /* test if keySz has error */
  23158. ERROR_OUT(keySz, exit_sske);
  23159. }
  23160. args->tmpSigSz = (word32)keySz;
  23161. args->length += args->tmpSigSz;
  23162. if (IsAtLeastTLSv1_2(ssl)) {
  23163. args->length += HASH_SIG_SIZE;
  23164. }
  23165. }
  23166. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  23167. RECORD_HEADER_SZ;
  23168. #ifdef HAVE_QSH
  23169. args->length += args->qshSz;
  23170. args->sendSz += args->qshSz;
  23171. #endif
  23172. #ifdef WOLFSSL_DTLS
  23173. if (ssl->options.dtls) {
  23174. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23175. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23176. preSigIdx = args->idx;
  23177. }
  23178. #endif
  23179. if (IsEncryptionOn(ssl, 1)) {
  23180. args->sendSz += MAX_MSG_EXTRA;
  23181. }
  23182. /* check for available size */
  23183. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  23184. goto exit_sske;
  23185. }
  23186. /* get output buffer */
  23187. args->output = ssl->buffers.outputBuffer.buffer +
  23188. ssl->buffers.outputBuffer.length;
  23189. AddHeaders(args->output, args->length,
  23190. server_key_exchange, ssl);
  23191. /* add p, g, pub */
  23192. c16toa((word16)ssl->buffers.serverDH_P.length,
  23193. args->output + args->idx);
  23194. args->idx += LENGTH_SZ;
  23195. XMEMCPY(args->output + args->idx,
  23196. ssl->buffers.serverDH_P.buffer,
  23197. ssl->buffers.serverDH_P.length);
  23198. args->idx += ssl->buffers.serverDH_P.length;
  23199. /* g */
  23200. c16toa((word16)ssl->buffers.serverDH_G.length,
  23201. args->output + args->idx);
  23202. args->idx += LENGTH_SZ;
  23203. XMEMCPY(args->output + args->idx,
  23204. ssl->buffers.serverDH_G.buffer,
  23205. ssl->buffers.serverDH_G.length);
  23206. args->idx += ssl->buffers.serverDH_G.length;
  23207. /* pub */
  23208. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  23209. args->output + args->idx);
  23210. args->idx += LENGTH_SZ;
  23211. XMEMCPY(args->output + args->idx,
  23212. ssl->buffers.serverDH_Pub.buffer,
  23213. ssl->buffers.serverDH_Pub.length);
  23214. args->idx += ssl->buffers.serverDH_Pub.length;
  23215. #ifdef HAVE_FUZZER
  23216. if (ssl->fuzzerCb) {
  23217. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  23218. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  23219. }
  23220. #endif
  23221. if (ssl->options.usingAnon_cipher) {
  23222. break;
  23223. }
  23224. /* Determine hash type */
  23225. if (IsAtLeastTLSv1_2(ssl)) {
  23226. EncodeSigAlg(ssl->suites->hashAlgo,
  23227. ssl->suites->sigAlgo,
  23228. &args->output[args->idx]);
  23229. args->idx += 2;
  23230. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  23231. if (hashType == WC_HASH_TYPE_NONE) {
  23232. ERROR_OUT(ALGO_ID_E, exit_sske);
  23233. }
  23234. } else {
  23235. /* only using sha and md5 for rsa */
  23236. #ifndef NO_OLD_TLS
  23237. hashType = WC_HASH_TYPE_SHA;
  23238. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  23239. hashType = WC_HASH_TYPE_MD5_SHA;
  23240. }
  23241. #else
  23242. ERROR_OUT(ALGO_ID_E, exit_sske);
  23243. #endif
  23244. }
  23245. /* signature size */
  23246. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  23247. args->idx += LENGTH_SZ;
  23248. /* Assemble buffer to hash for signature */
  23249. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  23250. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  23251. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23252. if (args->sigDataBuf == NULL) {
  23253. ERROR_OUT(MEMORY_E, exit_sske);
  23254. }
  23255. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  23256. RAN_LEN);
  23257. XMEMCPY(args->sigDataBuf+RAN_LEN,
  23258. ssl->arrays->serverRandom, RAN_LEN);
  23259. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  23260. args->output + preSigIdx, preSigSz);
  23261. if (ssl->suites->sigAlgo != ed25519_sa_algo &&
  23262. ssl->suites->sigAlgo != ed448_sa_algo) {
  23263. ssl->buffers.sig.length =
  23264. wc_HashGetDigestSize(hashType);
  23265. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  23266. ssl->buffers.sig.length, ssl->heap,
  23267. DYNAMIC_TYPE_SIGNATURE);
  23268. if (ssl->buffers.sig.buffer == NULL) {
  23269. ERROR_OUT(MEMORY_E, exit_sske);
  23270. }
  23271. /* Perform hash */
  23272. ret = wc_Hash(hashType, args->sigDataBuf,
  23273. args->sigDataSz,
  23274. ssl->buffers.sig.buffer,
  23275. ssl->buffers.sig.length);
  23276. if (ret != 0) {
  23277. goto exit_sske;
  23278. }
  23279. }
  23280. args->sigSz = args->tmpSigSz;
  23281. /* Sign hash to create signature */
  23282. switch (ssl->suites->sigAlgo)
  23283. {
  23284. #ifndef NO_RSA
  23285. case rsa_sa_algo:
  23286. {
  23287. /* For TLS 1.2 re-encode signature */
  23288. if (IsAtLeastTLSv1_2(ssl)) {
  23289. byte* encodedSig = (byte*)XMALLOC(
  23290. MAX_ENCODED_SIG_SZ, ssl->heap,
  23291. DYNAMIC_TYPE_SIGNATURE);
  23292. if (encodedSig == NULL) {
  23293. ERROR_OUT(MEMORY_E, exit_sske);
  23294. }
  23295. ssl->buffers.sig.length =
  23296. wc_EncodeSignature(encodedSig,
  23297. ssl->buffers.sig.buffer,
  23298. ssl->buffers.sig.length,
  23299. TypeHash(ssl->suites->hashAlgo));
  23300. /* Replace sig buffer with new one */
  23301. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  23302. DYNAMIC_TYPE_SIGNATURE);
  23303. ssl->buffers.sig.buffer = encodedSig;
  23304. }
  23305. break;
  23306. }
  23307. #endif /* NO_RSA */
  23308. } /* switch (ssl->suites->sigAlgo) */
  23309. break;
  23310. }
  23311. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  23312. } /* switch(ssl->specs.kea) */
  23313. /* Check for error */
  23314. if (ret != 0) {
  23315. goto exit_sske;
  23316. }
  23317. /* Advance state and proceed */
  23318. ssl->options.asyncState = TLS_ASYNC_DO;
  23319. } /* case TLS_ASYNC_BUILD */
  23320. FALL_THROUGH;
  23321. case TLS_ASYNC_DO:
  23322. {
  23323. switch(ssl->specs.kea)
  23324. {
  23325. #ifndef NO_PSK
  23326. case psk_kea:
  23327. {
  23328. break;
  23329. }
  23330. #endif /* !NO_PSK */
  23331. #if !defined(NO_DH) && !defined(NO_PSK)
  23332. case dhe_psk_kea:
  23333. {
  23334. break;
  23335. }
  23336. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  23337. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23338. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23339. case ecdhe_psk_kea:
  23340. {
  23341. break;
  23342. }
  23343. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  23344. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23345. defined(HAVE_CURVE448)
  23346. case ecc_diffie_hellman_kea:
  23347. {
  23348. /* Sign hash to create signature */
  23349. switch (ssl->suites->sigAlgo)
  23350. {
  23351. #ifndef NO_RSA
  23352. #ifdef WC_RSA_PSS
  23353. case rsa_pss_sa_algo:
  23354. #endif
  23355. case rsa_sa_algo:
  23356. {
  23357. RsaKey* key = (RsaKey*)ssl->hsKey;
  23358. ret = RsaSign(ssl,
  23359. ssl->buffers.sig.buffer,
  23360. ssl->buffers.sig.length,
  23361. args->output + args->idx,
  23362. &args->sigSz,
  23363. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  23364. key,
  23365. ssl->buffers.key
  23366. );
  23367. break;
  23368. }
  23369. #endif /* !NO_RSA */
  23370. #ifdef HAVE_ECC
  23371. case ecc_dsa_sa_algo:
  23372. {
  23373. ecc_key* key = (ecc_key*)ssl->hsKey;
  23374. ret = EccSign(ssl,
  23375. ssl->buffers.sig.buffer,
  23376. ssl->buffers.sig.length,
  23377. args->output + LENGTH_SZ + args->idx,
  23378. &args->sigSz,
  23379. key,
  23380. #ifdef HAVE_PK_CALLBACKS
  23381. ssl->buffers.key
  23382. #else
  23383. NULL
  23384. #endif
  23385. );
  23386. break;
  23387. }
  23388. #endif /* HAVE_ECC */
  23389. #ifdef HAVE_ED25519
  23390. case ed25519_sa_algo:
  23391. {
  23392. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  23393. ret = Ed25519Sign(ssl,
  23394. args->sigDataBuf, args->sigDataSz,
  23395. args->output + LENGTH_SZ + args->idx,
  23396. &args->sigSz,
  23397. key,
  23398. #ifdef HAVE_PK_CALLBACKS
  23399. ssl->buffers.key
  23400. #else
  23401. NULL
  23402. #endif
  23403. );
  23404. break;
  23405. }
  23406. #endif
  23407. #ifdef HAVE_ED448
  23408. case ed448_sa_algo:
  23409. {
  23410. ed448_key* key = (ed448_key*)ssl->hsKey;
  23411. ret = Ed448Sign(ssl,
  23412. args->sigDataBuf, args->sigDataSz,
  23413. args->output + LENGTH_SZ + args->idx,
  23414. &args->sigSz,
  23415. key,
  23416. #ifdef HAVE_PK_CALLBACKS
  23417. ssl->buffers.key
  23418. #else
  23419. NULL
  23420. #endif
  23421. );
  23422. break;
  23423. }
  23424. #endif
  23425. } /* switch(ssl->specs.sig_algo) */
  23426. break;
  23427. }
  23428. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23429. #if !defined(NO_DH) && !defined(NO_RSA)
  23430. case diffie_hellman_kea:
  23431. {
  23432. /* Sign hash to create signature */
  23433. switch (ssl->suites->sigAlgo)
  23434. {
  23435. #ifndef NO_RSA
  23436. #ifdef WC_RSA_PSS
  23437. case rsa_pss_sa_algo:
  23438. #endif
  23439. case rsa_sa_algo:
  23440. {
  23441. RsaKey* key = (RsaKey*)ssl->hsKey;
  23442. if (ssl->options.usingAnon_cipher) {
  23443. break;
  23444. }
  23445. ret = RsaSign(ssl,
  23446. ssl->buffers.sig.buffer,
  23447. ssl->buffers.sig.length,
  23448. args->output + args->idx,
  23449. &args->sigSz,
  23450. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  23451. key,
  23452. ssl->buffers.key
  23453. );
  23454. break;
  23455. }
  23456. #endif /* NO_RSA */
  23457. } /* switch (ssl->suites->sigAlgo) */
  23458. break;
  23459. }
  23460. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  23461. } /* switch(ssl->specs.kea) */
  23462. /* Check for error */
  23463. if (ret != 0) {
  23464. goto exit_sske;
  23465. }
  23466. /* Advance state and proceed */
  23467. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  23468. } /* case TLS_ASYNC_DO */
  23469. FALL_THROUGH;
  23470. case TLS_ASYNC_VERIFY:
  23471. {
  23472. switch(ssl->specs.kea)
  23473. {
  23474. #ifndef NO_PSK
  23475. case psk_kea:
  23476. {
  23477. /* Nothing to do in this sub-state */
  23478. break;
  23479. }
  23480. #endif /* !NO_PSK */
  23481. #if !defined(NO_DH) && !defined(NO_PSK)
  23482. case dhe_psk_kea:
  23483. {
  23484. /* Nothing to do in this sub-state */
  23485. break;
  23486. }
  23487. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  23488. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23489. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23490. case ecdhe_psk_kea:
  23491. {
  23492. /* Nothing to do in this sub-state */
  23493. break;
  23494. }
  23495. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  23496. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23497. defined(HAVE_CURVE448)
  23498. case ecc_diffie_hellman_kea:
  23499. {
  23500. switch(ssl->suites->sigAlgo)
  23501. {
  23502. #ifndef NO_RSA
  23503. #ifdef WC_RSA_PSS
  23504. case rsa_pss_sa_algo:
  23505. #endif
  23506. case rsa_sa_algo:
  23507. {
  23508. RsaKey* key = (RsaKey*)ssl->hsKey;
  23509. if (args->verifySig == NULL) {
  23510. if (args->sigSz == 0) {
  23511. ERROR_OUT(BAD_COND_E, exit_sske);
  23512. }
  23513. args->verifySig = (byte*)XMALLOC(
  23514. args->sigSz, ssl->heap,
  23515. DYNAMIC_TYPE_SIGNATURE);
  23516. if (!args->verifySig) {
  23517. ERROR_OUT(MEMORY_E, exit_sske);
  23518. }
  23519. XMEMCPY(args->verifySig,
  23520. args->output + args->idx, args->sigSz);
  23521. }
  23522. /* check for signature faults */
  23523. ret = VerifyRsaSign(ssl,
  23524. args->verifySig, args->sigSz,
  23525. ssl->buffers.sig.buffer,
  23526. ssl->buffers.sig.length,
  23527. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  23528. key, ssl->buffers.key
  23529. );
  23530. break;
  23531. }
  23532. #endif
  23533. case ecc_dsa_sa_algo:
  23534. #ifdef HAVE_ED25519
  23535. case ed25519_sa_algo:
  23536. #endif
  23537. #ifdef HAVE_ED448
  23538. case ed448_sa_algo:
  23539. #endif
  23540. {
  23541. /* Now that we know the real sig size, write it. */
  23542. c16toa((word16)args->sigSz,
  23543. args->output + args->idx);
  23544. /* And adjust length and sendSz from estimates */
  23545. args->length += args->sigSz - args->tmpSigSz;
  23546. args->sendSz += args->sigSz - args->tmpSigSz;
  23547. break;
  23548. }
  23549. default:
  23550. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  23551. } /* switch(ssl->specs.sig_algo) */
  23552. break;
  23553. }
  23554. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23555. #if !defined(NO_DH) && !defined(NO_RSA)
  23556. case diffie_hellman_kea:
  23557. {
  23558. switch (ssl->suites->sigAlgo)
  23559. {
  23560. #ifndef NO_RSA
  23561. #ifndef WC_RSA_PSS
  23562. case rsa_pss_sa_algo:
  23563. #endif
  23564. case rsa_sa_algo:
  23565. {
  23566. RsaKey* key = (RsaKey*)ssl->hsKey;
  23567. if (ssl->options.usingAnon_cipher) {
  23568. break;
  23569. }
  23570. if (args->verifySig == NULL) {
  23571. if (args->sigSz == 0) {
  23572. ERROR_OUT(BAD_COND_E, exit_sske);
  23573. }
  23574. args->verifySig = (byte*)XMALLOC(
  23575. args->sigSz, ssl->heap,
  23576. DYNAMIC_TYPE_SIGNATURE);
  23577. if (!args->verifySig) {
  23578. ERROR_OUT(MEMORY_E, exit_sske);
  23579. }
  23580. XMEMCPY(args->verifySig,
  23581. args->output + args->idx, args->sigSz);
  23582. }
  23583. /* check for signature faults */
  23584. ret = VerifyRsaSign(ssl,
  23585. args->verifySig, args->sigSz,
  23586. ssl->buffers.sig.buffer,
  23587. ssl->buffers.sig.length,
  23588. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  23589. key, ssl->buffers.key
  23590. );
  23591. break;
  23592. }
  23593. #endif
  23594. } /* switch (ssl->suites->sigAlgo) */
  23595. break;
  23596. }
  23597. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  23598. } /* switch(ssl->specs.kea) */
  23599. /* Check for error */
  23600. if (ret != 0) {
  23601. goto exit_sske;
  23602. }
  23603. /* Advance state and proceed */
  23604. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  23605. } /* case TLS_ASYNC_VERIFY */
  23606. FALL_THROUGH;
  23607. case TLS_ASYNC_FINALIZE:
  23608. {
  23609. #ifdef HAVE_QSH
  23610. if (ssl->peerQSHKeyPresent) {
  23611. if (args->qshSz > 0) {
  23612. args->idx = args->sendSz - args->qshSz;
  23613. if (QSH_KeyExchangeWrite(ssl, 1) != 0) {
  23614. ERROR_OUT(MEMORY_E, exit_sske);
  23615. }
  23616. /* extension type */
  23617. c16toa(TLSX_QUANTUM_SAFE_HYBRID,
  23618. args->output + args->idx);
  23619. args->idx += OPAQUE16_LEN;
  23620. /* write to output and check amount written */
  23621. if (TLSX_QSHPK_Write(ssl->QSH_secret->list,
  23622. args->output + args->idx) >
  23623. args->qshSz - OPAQUE16_LEN) {
  23624. ERROR_OUT(MEMORY_E, exit_sske);
  23625. }
  23626. }
  23627. }
  23628. #endif
  23629. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23630. defined(HAVE_CURVE448)
  23631. if (ssl->specs.kea == ecdhe_psk_kea ||
  23632. ssl->specs.kea == ecc_diffie_hellman_kea) {
  23633. /* Check output to make sure it was set */
  23634. if (args->output) {
  23635. AddHeaders(args->output, args->length,
  23636. server_key_exchange, ssl);
  23637. }
  23638. else {
  23639. ERROR_OUT(BUFFER_ERROR, exit_sske);
  23640. }
  23641. }
  23642. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23643. if (IsEncryptionOn(ssl, 1)) {
  23644. args->inputSz = args->length + HANDSHAKE_HEADER_SZ;
  23645. if (ssl->options.dtls)
  23646. args->inputSz += DTLS_HANDSHAKE_EXTRA;
  23647. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  23648. DYNAMIC_TYPE_IN_BUFFER);
  23649. if (args->input == NULL) {
  23650. ERROR_OUT(MEMORY_E, exit_sske);
  23651. }
  23652. if (args->output == NULL) {
  23653. ERROR_OUT(BUFFER_ERROR, exit_sske);
  23654. }
  23655. if (!ssl->options.dtls)
  23656. XMEMCPY(args->input, args->output + RECORD_HEADER_SZ,
  23657. args->inputSz);
  23658. else
  23659. XMEMCPY(args->input, args->output + DTLS_RECORD_HEADER_SZ,
  23660. args->inputSz);
  23661. #ifdef WOLFSSL_DTLS
  23662. if (IsDtlsNotSctpMode(ssl) &&
  23663. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, server_key_exchange))
  23664. != 0) {
  23665. goto exit_sske;
  23666. }
  23667. #endif
  23668. ret = BuildMessage(ssl, args->output, args->sendSz,
  23669. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  23670. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23671. args->input = NULL;
  23672. /* make sure its not double free'd on cleanup */
  23673. if (ret >= 0) {
  23674. args->sendSz = ret;
  23675. ret = 0;
  23676. }
  23677. }
  23678. else {
  23679. #ifdef WOLFSSL_DTLS
  23680. if (IsDtlsNotSctpMode(ssl)) {
  23681. if ((ret = DtlsMsgPoolSave(ssl,
  23682. args->output, args->sendSz, server_key_exchange)) != 0) {
  23683. goto exit_sske;
  23684. }
  23685. }
  23686. if (ssl->options.dtls)
  23687. DtlsSEQIncrement(ssl, CUR_ORDER);
  23688. #endif
  23689. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  23690. if (ret != 0) {
  23691. goto exit_sske;
  23692. }
  23693. }
  23694. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  23695. if (ssl->hsInfoOn) {
  23696. AddPacketName(ssl, "ServerKeyExchange");
  23697. }
  23698. if (ssl->toInfoOn) {
  23699. AddPacketInfo(ssl, "ServerKeyExchange", handshake,
  23700. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  23701. }
  23702. #endif
  23703. /* Advance state and proceed */
  23704. ssl->options.asyncState = TLS_ASYNC_END;
  23705. } /* case TLS_ASYNC_FINALIZE */
  23706. FALL_THROUGH;
  23707. case TLS_ASYNC_END:
  23708. {
  23709. ssl->buffers.outputBuffer.length += args->sendSz;
  23710. if (!ssl->options.groupMessages) {
  23711. ret = SendBuffered(ssl);
  23712. }
  23713. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  23714. break;
  23715. }
  23716. default:
  23717. ret = INPUT_CASE_ERROR;
  23718. } /* switch(ssl->options.asyncState) */
  23719. exit_sske:
  23720. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  23721. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  23722. #ifdef WOLFSSL_ASYNC_CRYPT
  23723. /* Handle async operation */
  23724. if (ret == WC_PENDING_E)
  23725. return ret;
  23726. #endif /* WOLFSSL_ASYNC_CRYPT */
  23727. /* Final cleanup */
  23728. if (args->input != NULL) {
  23729. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23730. args->input = NULL;
  23731. }
  23732. FreeSskeArgs(ssl, args);
  23733. FreeKeyExchange(ssl);
  23734. return ret;
  23735. }
  23736. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  23737. defined(OPENSSL_ALL)
  23738. /* search suites for specific one, idx on success, negative on error */
  23739. #ifndef WOLFSSL_TLS13
  23740. static
  23741. #endif
  23742. int FindSuite(Suites* suites, byte first, byte second)
  23743. {
  23744. int i;
  23745. if (suites == NULL || suites->suiteSz == 0) {
  23746. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  23747. return SUITES_ERROR;
  23748. }
  23749. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  23750. if (suites->suites[i] == first &&
  23751. suites->suites[i+1] == second )
  23752. return i;
  23753. }
  23754. return MATCH_SUITE_ERROR;
  23755. }
  23756. #endif
  23757. #endif /* !WOLFSSL_NO_TLS12 */
  23758. /* Make sure server cert/key are valid for this suite, true on success */
  23759. static int VerifyServerSuite(WOLFSSL* ssl, word16 idx)
  23760. {
  23761. int haveRSA = !ssl->options.haveStaticECC;
  23762. int havePSK = 0;
  23763. byte first;
  23764. byte second;
  23765. WOLFSSL_ENTER("VerifyServerSuite");
  23766. if (ssl->suites == NULL) {
  23767. WOLFSSL_MSG("Suites pointer error");
  23768. return 0;
  23769. }
  23770. first = ssl->suites->suites[idx];
  23771. second = ssl->suites->suites[idx+1];
  23772. #ifndef NO_PSK
  23773. havePSK = ssl->options.havePSK;
  23774. #endif
  23775. if (ssl->options.haveNTRU)
  23776. haveRSA = 0;
  23777. if (CipherRequires(first, second, REQUIRES_RSA)) {
  23778. WOLFSSL_MSG("Requires RSA");
  23779. if (haveRSA == 0) {
  23780. WOLFSSL_MSG("Don't have RSA");
  23781. return 0;
  23782. }
  23783. }
  23784. if (CipherRequires(first, second, REQUIRES_DHE)) {
  23785. WOLFSSL_MSG("Requires DHE");
  23786. if (ssl->options.haveDH == 0) {
  23787. WOLFSSL_MSG("Don't have DHE");
  23788. return 0;
  23789. }
  23790. }
  23791. if (CipherRequires(first, second, REQUIRES_ECC)) {
  23792. WOLFSSL_MSG("Requires ECC");
  23793. if (ssl->options.haveECC == 0) {
  23794. WOLFSSL_MSG("Don't have ECC");
  23795. return 0;
  23796. }
  23797. }
  23798. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  23799. WOLFSSL_MSG("Requires static ECC");
  23800. if (ssl->options.haveStaticECC == 0) {
  23801. WOLFSSL_MSG("Don't have static ECC");
  23802. return 0;
  23803. }
  23804. }
  23805. if (CipherRequires(first, second, REQUIRES_PSK)) {
  23806. WOLFSSL_MSG("Requires PSK");
  23807. if (havePSK == 0) {
  23808. WOLFSSL_MSG("Don't have PSK");
  23809. return 0;
  23810. }
  23811. }
  23812. if (CipherRequires(first, second, REQUIRES_NTRU)) {
  23813. WOLFSSL_MSG("Requires NTRU");
  23814. if (ssl->options.haveNTRU == 0) {
  23815. WOLFSSL_MSG("Don't have NTRU");
  23816. return 0;
  23817. }
  23818. }
  23819. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  23820. WOLFSSL_MSG("Requires RSA Signature");
  23821. if (ssl->options.side == WOLFSSL_SERVER_END &&
  23822. ssl->options.haveECDSAsig == 1) {
  23823. WOLFSSL_MSG("Don't have RSA Signature");
  23824. return 0;
  23825. }
  23826. }
  23827. #if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
  23828. if (CipherRequires(first, second, REQUIRES_AEAD)) {
  23829. WOLFSSL_MSG("Requires AEAD");
  23830. if (ssl->version.major == SSLv3_MAJOR &&
  23831. ssl->version.minor < TLSv1_2_MINOR) {
  23832. WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
  23833. return 0;
  23834. }
  23835. }
  23836. #endif
  23837. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23838. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  23839. if (!TLSX_ValidateSupportedCurves(ssl, first, second)) {
  23840. WOLFSSL_MSG("Don't have matching curves");
  23841. return 0;
  23842. }
  23843. #endif
  23844. /* ECCDHE is always supported if ECC on */
  23845. #ifdef HAVE_QSH
  23846. /* need to negotiate a classic suite in addition to TLS_QSH */
  23847. if (first == QSH_BYTE && second == TLS_QSH) {
  23848. if (TLSX_SupportExtensions(ssl)) {
  23849. ssl->options.haveQSH = 1; /* matched TLS_QSH */
  23850. }
  23851. else {
  23852. WOLFSSL_MSG("Version of SSL connection does not support "
  23853. "TLS_QSH");
  23854. }
  23855. return 0;
  23856. }
  23857. #endif
  23858. #ifdef WOLFSSL_TLS13
  23859. if (IsAtLeastTLSv1_3(ssl->version) &&
  23860. ssl->options.side == WOLFSSL_SERVER_END) {
  23861. #ifdef HAVE_SUPPORTED_CURVES
  23862. /* Try to establish a key share. */
  23863. int ret = TLSX_KeyShare_Establish(ssl);
  23864. if (ret == KEY_SHARE_ERROR)
  23865. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  23866. else if (ret != 0)
  23867. return 0;
  23868. #endif
  23869. }
  23870. else if (first == TLS13_BYTE || (first == ECC_BYTE &&
  23871. (second == TLS_SHA256_SHA256 || second == TLS_SHA384_SHA384))) {
  23872. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  23873. * version. */
  23874. return 0;
  23875. }
  23876. #endif
  23877. return 1;
  23878. }
  23879. #ifndef NO_WOLFSSL_SERVER
  23880. static int CompareSuites(WOLFSSL* ssl, Suites* peerSuites, word16 i,
  23881. word16 j)
  23882. {
  23883. if (ssl->suites->suites[i] == peerSuites->suites[j] &&
  23884. ssl->suites->suites[i+1] == peerSuites->suites[j+1] ) {
  23885. if (VerifyServerSuite(ssl, i)) {
  23886. int result;
  23887. WOLFSSL_MSG("Verified suite validity");
  23888. ssl->options.cipherSuite0 = ssl->suites->suites[i];
  23889. ssl->options.cipherSuite = ssl->suites->suites[i+1];
  23890. result = SetCipherSpecs(ssl);
  23891. if (result == 0) {
  23892. result = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  23893. peerSuites->hashSigAlgoSz);
  23894. }
  23895. return result;
  23896. }
  23897. else {
  23898. WOLFSSL_MSG("Could not verify suite validity, continue");
  23899. }
  23900. }
  23901. return MATCH_SUITE_ERROR;
  23902. }
  23903. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  23904. {
  23905. int ret;
  23906. word16 i, j;
  23907. WOLFSSL_ENTER("MatchSuite");
  23908. /* & 0x1 equivalent % 2 */
  23909. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  23910. return BUFFER_ERROR;
  23911. if (ssl->suites == NULL)
  23912. return SUITES_ERROR;
  23913. if (!ssl->options.useClientOrder) {
  23914. /* Server order */
  23915. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  23916. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  23917. ret = CompareSuites(ssl, peerSuites, i, j);
  23918. if (ret != MATCH_SUITE_ERROR)
  23919. return ret;
  23920. }
  23921. }
  23922. }
  23923. else {
  23924. /* Client order */
  23925. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  23926. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  23927. ret = CompareSuites(ssl, peerSuites, i, j);
  23928. if (ret != MATCH_SUITE_ERROR)
  23929. return ret;
  23930. }
  23931. }
  23932. }
  23933. return MATCH_SUITE_ERROR;
  23934. }
  23935. #endif
  23936. #ifdef OLD_HELLO_ALLOWED
  23937. /* process old style client hello, deprecate? */
  23938. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  23939. word32 inSz, word16 sz)
  23940. {
  23941. word32 idx = *inOutIdx;
  23942. word16 sessionSz;
  23943. word16 randomSz;
  23944. word16 i, j;
  23945. ProtocolVersion pv;
  23946. Suites clSuites;
  23947. int ret = -1;
  23948. (void)inSz;
  23949. WOLFSSL_MSG("Got old format client hello");
  23950. #ifdef WOLFSSL_CALLBACKS
  23951. if (ssl->hsInfoOn)
  23952. AddPacketName(ssl, "ClientHello");
  23953. if (ssl->toInfoOn)
  23954. AddLateName("ClientHello", &ssl->timeoutInfo);
  23955. #endif
  23956. /* manually hash input since different format */
  23957. #ifndef NO_OLD_TLS
  23958. #ifndef NO_MD5
  23959. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  23960. #endif
  23961. #ifndef NO_SHA
  23962. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  23963. #endif
  23964. #endif
  23965. #ifndef NO_SHA256
  23966. if (IsAtLeastTLSv1_2(ssl)) {
  23967. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  23968. input + idx, sz);
  23969. if (shaRet != 0)
  23970. return shaRet;
  23971. }
  23972. #endif
  23973. /* does this value mean client_hello? */
  23974. idx++;
  23975. /* version */
  23976. pv.major = input[idx++];
  23977. pv.minor = input[idx++];
  23978. ssl->chVersion = pv; /* store */
  23979. if (ssl->version.minor > pv.minor) {
  23980. byte haveRSA = 0;
  23981. byte havePSK = 0;
  23982. int keySz = 0;
  23983. if (!ssl->options.downgrade) {
  23984. WOLFSSL_MSG("Client trying to connect with lesser version");
  23985. return VERSION_ERROR;
  23986. }
  23987. if (pv.minor < ssl->options.minDowngrade) {
  23988. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  23989. return VERSION_ERROR;
  23990. }
  23991. if (pv.minor == SSLv3_MINOR) {
  23992. /* turn off tls */
  23993. WOLFSSL_MSG("\tdowngrading to SSLv3");
  23994. ssl->options.tls = 0;
  23995. ssl->options.tls1_1 = 0;
  23996. ssl->version.minor = SSLv3_MINOR;
  23997. }
  23998. else if (pv.minor == TLSv1_MINOR) {
  23999. WOLFSSL_MSG("\tdowngrading to TLSv1");
  24000. /* turn off tls 1.1+ */
  24001. ssl->options.tls1_1 = 0;
  24002. ssl->version.minor = TLSv1_MINOR;
  24003. }
  24004. else if (pv.minor == TLSv1_1_MINOR) {
  24005. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  24006. ssl->version.minor = TLSv1_1_MINOR;
  24007. }
  24008. else if (pv.minor == TLSv1_2_MINOR) {
  24009. WOLFSSL_MSG(" downgrading to TLSv1.2");
  24010. ssl->version.minor = TLSv1_2_MINOR;
  24011. }
  24012. #ifndef NO_RSA
  24013. haveRSA = 1;
  24014. #endif
  24015. #ifndef NO_PSK
  24016. havePSK = ssl->options.havePSK;
  24017. #endif
  24018. #ifndef NO_CERTS
  24019. keySz = ssl->buffers.keySz;
  24020. #endif
  24021. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  24022. ssl->options.haveDH, ssl->options.haveNTRU,
  24023. ssl->options.haveECDSAsig, ssl->options.haveECC,
  24024. ssl->options.haveStaticECC, ssl->options.haveAnon,
  24025. ssl->options.side);
  24026. }
  24027. /* suite size */
  24028. ato16(&input[idx], &clSuites.suiteSz);
  24029. idx += OPAQUE16_LEN;
  24030. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  24031. return BUFFER_ERROR;
  24032. /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
  24033. if (clSuites.suiteSz % 3 != 0)
  24034. return BUFFER_ERROR;
  24035. clSuites.hashSigAlgoSz = 0;
  24036. /* session size */
  24037. ato16(&input[idx], &sessionSz);
  24038. idx += OPAQUE16_LEN;
  24039. if (sessionSz > ID_LEN)
  24040. return BUFFER_ERROR;
  24041. /* random size */
  24042. ato16(&input[idx], &randomSz);
  24043. idx += OPAQUE16_LEN;
  24044. if (randomSz > RAN_LEN)
  24045. return BUFFER_ERROR;
  24046. /* suites */
  24047. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  24048. byte first = input[idx++];
  24049. if (!first) { /* implicit: skip sslv2 type */
  24050. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  24051. j += SUITE_LEN;
  24052. }
  24053. idx += SUITE_LEN;
  24054. }
  24055. clSuites.suiteSz = j;
  24056. /* session id */
  24057. if (sessionSz) {
  24058. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  24059. ssl->arrays->sessionIDSz = (byte)sessionSz;
  24060. idx += sessionSz;
  24061. ssl->options.resuming = 1;
  24062. }
  24063. /* random */
  24064. if (randomSz < RAN_LEN)
  24065. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  24066. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  24067. randomSz);
  24068. idx += randomSz;
  24069. if (ssl->options.usingCompression)
  24070. ssl->options.usingCompression = 0; /* turn off */
  24071. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  24072. ssl->cbmode = SSL_CB_MODE_WRITE;
  24073. *inOutIdx = idx;
  24074. ssl->options.haveSessionId = 1;
  24075. /* DoClientHello uses same resume code */
  24076. if (ssl->options.resuming) { /* let's try */
  24077. WOLFSSL_SESSION* session = GetSession(ssl,
  24078. ssl->arrays->masterSecret, 1);
  24079. #ifdef HAVE_SESSION_TICKET
  24080. if (ssl->options.useTicket == 1) {
  24081. session = &ssl->session;
  24082. }
  24083. #endif
  24084. if (!session) {
  24085. WOLFSSL_MSG("Session lookup for resume failed");
  24086. ssl->options.resuming = 0;
  24087. } else {
  24088. #ifdef HAVE_EXT_CACHE
  24089. wolfSSL_SESSION_free(session);
  24090. #endif
  24091. if (MatchSuite(ssl, &clSuites) < 0) {
  24092. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  24093. return UNSUPPORTED_SUITE;
  24094. }
  24095. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  24096. RAN_LEN);
  24097. if (ret != 0)
  24098. return ret;
  24099. #ifdef NO_OLD_TLS
  24100. ret = DeriveTlsKeys(ssl);
  24101. #else
  24102. #ifndef NO_TLS
  24103. if (ssl->options.tls)
  24104. ret = DeriveTlsKeys(ssl);
  24105. #endif
  24106. if (!ssl->options.tls)
  24107. ret = DeriveKeys(ssl);
  24108. #endif
  24109. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  24110. return ret;
  24111. }
  24112. }
  24113. ret = MatchSuite(ssl, &clSuites);
  24114. if (ret != 0)return ret;
  24115. return SanityCheckMsgReceived(ssl, client_hello);
  24116. }
  24117. #endif /* OLD_HELLO_ALLOWED */
  24118. #ifndef WOLFSSL_NO_TLS12
  24119. int HandleTlsResumption(WOLFSSL* ssl, int bogusID, Suites* clSuites)
  24120. {
  24121. int ret = 0;
  24122. WOLFSSL_SESSION* session;
  24123. (void)bogusID;
  24124. session = GetSession(ssl, ssl->arrays->masterSecret, 1);
  24125. #ifdef HAVE_SESSION_TICKET
  24126. if (ssl->options.useTicket == 1) {
  24127. session = &ssl->session;
  24128. } else if (bogusID == 1 && ssl->options.rejectTicket == 0) {
  24129. WOLFSSL_MSG("Bogus session ID without session ticket");
  24130. return BUFFER_ERROR;
  24131. }
  24132. #endif
  24133. if (!session) {
  24134. WOLFSSL_MSG("Session lookup for resume failed");
  24135. ssl->options.resuming = 0;
  24136. }
  24137. else if (session->haveEMS != ssl->options.haveEMS) {
  24138. /* RFC 7627, 5.3, server-side */
  24139. /* if old sess didn't have EMS, but new does, full handshake */
  24140. if (!session->haveEMS && ssl->options.haveEMS) {
  24141. WOLFSSL_MSG("Attempting to resume a session that didn't "
  24142. "use EMS with a new session with EMS. Do full "
  24143. "handshake.");
  24144. ssl->options.resuming = 0;
  24145. }
  24146. /* if old sess used EMS, but new doesn't, MUST abort */
  24147. else if (session->haveEMS && !ssl->options.haveEMS) {
  24148. WOLFSSL_MSG("Trying to resume a session with EMS without "
  24149. "using EMS");
  24150. #ifdef WOLFSSL_EXTRA_ALERTS
  24151. SendAlert(ssl, alert_fatal, handshake_failure);
  24152. #endif
  24153. #ifdef HAVE_EXT_CACHE
  24154. wolfSSL_SESSION_free(session);
  24155. #endif
  24156. return EXT_MASTER_SECRET_NEEDED_E;
  24157. }
  24158. #ifdef HAVE_EXT_CACHE
  24159. wolfSSL_SESSION_free(session);
  24160. #endif
  24161. }
  24162. else {
  24163. #ifndef NO_RESUME_SUITE_CHECK
  24164. int j;
  24165. /* Check client suites include the one in session */
  24166. for (j = 0; j < clSuites->suiteSz; j += 2) {
  24167. if (clSuites->suites[j] == session->cipherSuite0 &&
  24168. clSuites->suites[j+1] == session->cipherSuite) {
  24169. break;
  24170. }
  24171. }
  24172. if (j == clSuites->suiteSz) {
  24173. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  24174. #ifdef WOLFSSL_EXTRA_ALERTS
  24175. SendAlert(ssl, alert_fatal, illegal_parameter);
  24176. #endif
  24177. return UNSUPPORTED_SUITE;
  24178. }
  24179. #endif
  24180. #ifdef HAVE_EXT_CACHE
  24181. wolfSSL_SESSION_free(session);
  24182. #endif
  24183. if (MatchSuite(ssl, clSuites) < 0) {
  24184. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  24185. return UNSUPPORTED_SUITE;
  24186. }
  24187. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  24188. RAN_LEN);
  24189. if (ret != 0)
  24190. return ret;
  24191. #ifdef NO_OLD_TLS
  24192. ret = DeriveTlsKeys(ssl);
  24193. #else
  24194. #ifndef NO_TLS
  24195. if (ssl->options.tls)
  24196. ret = DeriveTlsKeys(ssl);
  24197. #endif
  24198. if (!ssl->options.tls)
  24199. ret = DeriveKeys(ssl);
  24200. #endif
  24201. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  24202. }
  24203. return ret;
  24204. }
  24205. /* handle processing of client_hello (1) */
  24206. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  24207. word32 helloSz)
  24208. {
  24209. byte b;
  24210. byte bogusID = 0; /* flag for a bogus session id */
  24211. ProtocolVersion pv;
  24212. Suites clSuites;
  24213. word32 i = *inOutIdx;
  24214. word32 begin = i;
  24215. int ret = 0;
  24216. #ifdef WOLFSSL_DTLS
  24217. Hmac cookieHmac;
  24218. byte peerCookie[MAX_COOKIE_LEN];
  24219. byte peerCookieSz = 0;
  24220. byte cookieType;
  24221. byte cookieSz = 0;
  24222. XMEMSET(&cookieHmac, 0, sizeof(Hmac));
  24223. #endif /* WOLFSSL_DTLS */
  24224. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  24225. WOLFSSL_ENTER("DoClientHello");
  24226. #ifdef WOLFSSL_CALLBACKS
  24227. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  24228. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  24229. #endif
  24230. /* protocol version, random and session id length check */
  24231. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  24232. return BUFFER_ERROR;
  24233. /* protocol version */
  24234. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  24235. ssl->chVersion = pv; /* store */
  24236. #ifdef WOLFSSL_DTLS
  24237. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  24238. #if defined(NO_SHA) && defined(NO_SHA256)
  24239. #error "DTLS needs either SHA or SHA-256"
  24240. #endif /* NO_SHA && NO_SHA256 */
  24241. #if !defined(NO_SHA) && defined(NO_SHA256)
  24242. cookieType = WC_SHA;
  24243. cookieSz = WC_SHA_DIGEST_SIZE;
  24244. #endif /* NO_SHA */
  24245. #ifndef NO_SHA256
  24246. cookieType = WC_SHA256;
  24247. cookieSz = WC_SHA256_DIGEST_SIZE;
  24248. #endif /* NO_SHA256 */
  24249. ret = wc_HmacSetKey(&cookieHmac, cookieType,
  24250. ssl->buffers.dtlsCookieSecret.buffer,
  24251. ssl->buffers.dtlsCookieSecret.length);
  24252. if (ret != 0) goto out;
  24253. ret = wc_HmacUpdate(&cookieHmac,
  24254. (const byte*)ssl->buffers.dtlsCtx.peer.sa,
  24255. ssl->buffers.dtlsCtx.peer.sz);
  24256. if (ret != 0) goto out;
  24257. ret = wc_HmacUpdate(&cookieHmac, input + i, OPAQUE16_LEN);
  24258. if (ret != 0) goto out;
  24259. }
  24260. #endif /* WOLFSSL_DTLS */
  24261. i += OPAQUE16_LEN;
  24262. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  24263. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  24264. pv.minor = TLSv1_2_MINOR;
  24265. if ((!ssl->options.dtls && ssl->version.minor > pv.minor) ||
  24266. (ssl->options.dtls && ssl->version.minor != DTLS_MINOR
  24267. && ssl->version.minor != DTLSv1_2_MINOR && pv.minor != DTLS_MINOR
  24268. && pv.minor != DTLSv1_2_MINOR)) {
  24269. word16 haveRSA = 0;
  24270. word16 havePSK = 0;
  24271. int keySz = 0;
  24272. if (!ssl->options.downgrade) {
  24273. WOLFSSL_MSG("Client trying to connect with lesser version");
  24274. ret = VERSION_ERROR;
  24275. goto out;
  24276. }
  24277. if (pv.minor < ssl->options.minDowngrade) {
  24278. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  24279. ret = VERSION_ERROR;
  24280. goto out;
  24281. }
  24282. if (pv.minor == SSLv3_MINOR) {
  24283. /* turn off tls */
  24284. WOLFSSL_MSG("\tdowngrading to SSLv3");
  24285. ssl->options.tls = 0;
  24286. ssl->options.tls1_1 = 0;
  24287. ssl->version.minor = SSLv3_MINOR;
  24288. }
  24289. else if (pv.minor == TLSv1_MINOR) {
  24290. /* turn off tls 1.1+ */
  24291. WOLFSSL_MSG("\tdowngrading to TLSv1");
  24292. ssl->options.tls1_1 = 0;
  24293. ssl->version.minor = TLSv1_MINOR;
  24294. }
  24295. else if (pv.minor == TLSv1_1_MINOR) {
  24296. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  24297. ssl->version.minor = TLSv1_1_MINOR;
  24298. }
  24299. else if (pv.minor == TLSv1_2_MINOR) {
  24300. WOLFSSL_MSG(" downgrading to TLSv1.2");
  24301. ssl->version.minor = TLSv1_2_MINOR;
  24302. }
  24303. #ifndef NO_RSA
  24304. haveRSA = 1;
  24305. #endif
  24306. #ifndef NO_PSK
  24307. havePSK = ssl->options.havePSK;
  24308. #endif
  24309. #ifndef NO_CERTS
  24310. keySz = ssl->buffers.keySz;
  24311. #endif
  24312. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  24313. ssl->options.haveDH, ssl->options.haveNTRU,
  24314. ssl->options.haveECDSAsig, ssl->options.haveECC,
  24315. ssl->options.haveStaticECC, ssl->options.haveAnon,
  24316. ssl->options.side);
  24317. }
  24318. #ifdef OPENSSL_EXTRA
  24319. /* check if option is set to not allow the current version
  24320. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  24321. if (!ssl->options.dtls && ssl->options.downgrade &&
  24322. ssl->options.mask > 0) {
  24323. int reset = 0;
  24324. if (ssl->version.minor == TLSv1_2_MINOR &&
  24325. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  24326. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  24327. ssl->version.minor = TLSv1_1_MINOR;
  24328. reset = 1;
  24329. }
  24330. if (ssl->version.minor == TLSv1_1_MINOR &&
  24331. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  24332. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  24333. ssl->options.tls1_1 = 0;
  24334. ssl->version.minor = TLSv1_MINOR;
  24335. reset = 1;
  24336. }
  24337. if (ssl->version.minor == TLSv1_MINOR &&
  24338. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  24339. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  24340. ssl->options.tls = 0;
  24341. ssl->options.tls1_1 = 0;
  24342. ssl->version.minor = SSLv3_MINOR;
  24343. reset = 1;
  24344. }
  24345. if (ssl->version.minor == SSLv3_MINOR &&
  24346. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  24347. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  24348. ret = VERSION_ERROR;
  24349. goto out;
  24350. }
  24351. if (ssl->version.minor < ssl->options.minDowngrade) {
  24352. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  24353. ret = VERSION_ERROR;
  24354. goto out;
  24355. }
  24356. if (reset) {
  24357. word16 haveRSA = 0;
  24358. word16 havePSK = 0;
  24359. int keySz = 0;
  24360. #ifndef NO_RSA
  24361. haveRSA = 1;
  24362. #endif
  24363. #ifndef NO_PSK
  24364. havePSK = ssl->options.havePSK;
  24365. #endif
  24366. #ifndef NO_CERTS
  24367. keySz = ssl->buffers.keySz;
  24368. #endif
  24369. /* reset cipher suites to account for TLS version change */
  24370. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  24371. ssl->options.haveDH, ssl->options.haveNTRU,
  24372. ssl->options.haveECDSAsig, ssl->options.haveECC,
  24373. ssl->options.haveStaticECC, ssl->options.haveAnon,
  24374. ssl->options.side);
  24375. }
  24376. }
  24377. #endif
  24378. /* random */
  24379. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  24380. #ifdef WOLFSSL_DTLS
  24381. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  24382. ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN);
  24383. if (ret != 0) goto out;
  24384. }
  24385. #endif /* WOLFSSL_DTLS */
  24386. i += RAN_LEN;
  24387. #ifdef SHOW_SECRETS
  24388. {
  24389. int j;
  24390. printf("client random: ");
  24391. for (j = 0; j < RAN_LEN; j++)
  24392. printf("%02x", ssl->arrays->clientRandom[j]);
  24393. printf("\n");
  24394. }
  24395. #endif
  24396. /* session id */
  24397. b = input[i++];
  24398. #ifdef HAVE_SESSION_TICKET
  24399. if (b > 0 && b < ID_LEN) {
  24400. bogusID = 1;
  24401. WOLFSSL_MSG("Client sent bogus session id, let's allow for echo");
  24402. }
  24403. #endif
  24404. if (b == ID_LEN || bogusID) {
  24405. if ((i - begin) + b > helloSz) {
  24406. ret = BUFFER_ERROR;
  24407. goto out;
  24408. }
  24409. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  24410. #ifdef WOLFSSL_DTLS
  24411. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) &&
  24412. !ssl->options.resuming) {
  24413. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  24414. if (ret != 0) goto out;
  24415. }
  24416. #endif /* WOLFSSL_DTLS */
  24417. ssl->arrays->sessionIDSz = b;
  24418. i += b;
  24419. ssl->options.resuming = 1; /* client wants to resume */
  24420. WOLFSSL_MSG("Client wants to resume session");
  24421. }
  24422. else if (b) {
  24423. WOLFSSL_MSG("Invalid session ID size");
  24424. ret = BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
  24425. goto out;
  24426. }
  24427. #ifdef WOLFSSL_DTLS
  24428. /* cookie */
  24429. if (ssl->options.dtls) {
  24430. if ((i - begin) + OPAQUE8_LEN > helloSz) {
  24431. ret = BUFFER_ERROR;
  24432. goto out;
  24433. }
  24434. peerCookieSz = input[i++];
  24435. if (peerCookieSz) {
  24436. if (peerCookieSz > MAX_COOKIE_LEN) {
  24437. ret = BUFFER_ERROR;
  24438. goto out;
  24439. }
  24440. if ((i - begin) + peerCookieSz > helloSz) {
  24441. ret = BUFFER_ERROR;
  24442. goto out;
  24443. }
  24444. XMEMCPY(peerCookie, input + i, peerCookieSz);
  24445. i += peerCookieSz;
  24446. }
  24447. }
  24448. #endif
  24449. /* suites */
  24450. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  24451. ret = BUFFER_ERROR;
  24452. goto out;
  24453. }
  24454. ato16(&input[i], &clSuites.suiteSz);
  24455. i += OPAQUE16_LEN;
  24456. /* Cipher suite lists are always multiples of two in length. */
  24457. if (clSuites.suiteSz % 2 != 0) {
  24458. ret = BUFFER_ERROR;
  24459. goto out;
  24460. }
  24461. /* suites and compression length check */
  24462. if ((i - begin) + clSuites.suiteSz + OPAQUE8_LEN > helloSz) {
  24463. ret = BUFFER_ERROR;
  24464. goto out;
  24465. }
  24466. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ) {
  24467. ret = BUFFER_ERROR;
  24468. goto out;
  24469. }
  24470. XMEMCPY(clSuites.suites, input + i, clSuites.suiteSz);
  24471. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  24472. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  24473. if (FindSuite(&clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  24474. TLSX* extension;
  24475. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  24476. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  24477. if (ret != WOLFSSL_SUCCESS)
  24478. goto out;
  24479. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  24480. if (extension) {
  24481. ssl->secure_renegotiation =
  24482. (SecureRenegotiation*)extension->data;
  24483. ssl->secure_renegotiation->enabled = 1;
  24484. }
  24485. }
  24486. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  24487. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  24488. /* check for TLS_FALLBACK_SCSV suite */
  24489. if (FindSuite(&clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  24490. WOLFSSL_MSG("Found Fallback SCSV");
  24491. if (ssl->ctx->method->version.minor > pv.minor) {
  24492. WOLFSSL_MSG("Client trying to connect with lesser version");
  24493. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  24494. ret = VERSION_ERROR;
  24495. goto out;
  24496. }
  24497. }
  24498. #endif
  24499. #ifdef WOLFSSL_DTLS
  24500. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  24501. ret = wc_HmacUpdate(&cookieHmac,
  24502. input + i - OPAQUE16_LEN,
  24503. clSuites.suiteSz + OPAQUE16_LEN);
  24504. if (ret != 0) goto out;
  24505. }
  24506. #endif /* WOLFSSL_DTLS */
  24507. i += clSuites.suiteSz;
  24508. clSuites.hashSigAlgoSz = 0;
  24509. /* compression length */
  24510. b = input[i++];
  24511. if ((i - begin) + b > helloSz) {
  24512. ret = BUFFER_ERROR;
  24513. goto out;
  24514. }
  24515. if (b == 0) {
  24516. WOLFSSL_MSG("No compression types in list");
  24517. #ifdef WOLFSSL_EXTRA_ALERTS
  24518. SendAlert(ssl, alert_fatal, decode_error);
  24519. #endif
  24520. ret = COMPRESSION_ERROR;
  24521. goto out;
  24522. }
  24523. #ifdef WOLFSSL_DTLS
  24524. if (IsDtlsNotSctpMode(ssl)) {
  24525. if (!IsSCR(ssl) && !ssl->options.resuming) {
  24526. byte newCookie[MAX_COOKIE_LEN];
  24527. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  24528. if (ret != 0) goto out;
  24529. ret = wc_HmacFinal(&cookieHmac, newCookie);
  24530. if (ret != 0) goto out;
  24531. /* If a cookie callback is set, call it to overwrite the cookie.
  24532. * This should be deprecated. The code now calculates the cookie
  24533. * using an HMAC as expected. */
  24534. if (ssl->ctx->CBIOCookie != NULL &&
  24535. ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz,
  24536. ssl->IOCB_CookieCtx) != cookieSz) {
  24537. ret = COOKIE_ERROR;
  24538. goto out;
  24539. }
  24540. /* Check the cookie, see if we progress the state machine. */
  24541. if (peerCookieSz != cookieSz ||
  24542. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  24543. /* Send newCookie to client in a HelloVerifyRequest message
  24544. * and let the state machine alone. */
  24545. ssl->msgsReceived.got_client_hello = 0;
  24546. ssl->keys.dtls_handshake_number = 0;
  24547. ssl->keys.dtls_expected_peer_handshake_number = 0;
  24548. *inOutIdx += helloSz;
  24549. ret = SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  24550. goto out;
  24551. }
  24552. }
  24553. /* This was skipped in the DTLS case so we could handle the hello
  24554. * verify request. */
  24555. ret = HashInput(ssl, input + *inOutIdx, helloSz);
  24556. if (ret != 0) goto out;
  24557. }
  24558. #endif /* WOLFSSL_DTLS */
  24559. {
  24560. /* compression match types */
  24561. int matchNo = 0;
  24562. int matchZlib = 0;
  24563. while (b--) {
  24564. byte comp = input[i++];
  24565. if (comp == NO_COMPRESSION) {
  24566. matchNo = 1;
  24567. }
  24568. if (comp == ZLIB_COMPRESSION) {
  24569. matchZlib = 1;
  24570. }
  24571. }
  24572. if (ssl->options.usingCompression == 0 && matchNo) {
  24573. WOLFSSL_MSG("Matched No Compression");
  24574. } else if (ssl->options.usingCompression && matchZlib) {
  24575. WOLFSSL_MSG("Matched zlib Compression");
  24576. } else if (ssl->options.usingCompression && matchNo) {
  24577. WOLFSSL_MSG("Could only match no compression, turning off");
  24578. ssl->options.usingCompression = 0; /* turn off */
  24579. } else {
  24580. WOLFSSL_MSG("Could not match compression");
  24581. #ifdef WOLFSSL_EXTRA_ALERTS
  24582. SendAlert(ssl, alert_fatal, illegal_parameter);
  24583. #endif
  24584. ret = COMPRESSION_ERROR;
  24585. goto out;
  24586. }
  24587. }
  24588. *inOutIdx = i;
  24589. /* tls extensions */
  24590. if ((i - begin) < helloSz) {
  24591. #ifdef HAVE_TLS_EXTENSIONS
  24592. #ifdef HAVE_QSH
  24593. QSH_Init(ssl);
  24594. #endif
  24595. if (TLSX_SupportExtensions(ssl))
  24596. #else
  24597. if (IsAtLeastTLSv1_2(ssl))
  24598. #endif
  24599. {
  24600. /* Process the hello extension. Skip unsupported. */
  24601. word16 totalExtSz;
  24602. #ifdef HAVE_TLS_EXTENSIONS
  24603. /* auto populate extensions supported unless user defined */
  24604. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  24605. goto out;
  24606. #endif
  24607. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  24608. ret = BUFFER_ERROR;
  24609. goto out;
  24610. }
  24611. ato16(&input[i], &totalExtSz);
  24612. i += OPAQUE16_LEN;
  24613. if ((i - begin) + totalExtSz > helloSz) {
  24614. ret = BUFFER_ERROR;
  24615. goto out;
  24616. }
  24617. #ifdef HAVE_TLS_EXTENSIONS
  24618. /* tls extensions */
  24619. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  24620. client_hello, &clSuites)))
  24621. goto out;
  24622. #ifdef WOLFSSL_TLS13
  24623. if (TLSX_Find(ssl->extensions,
  24624. TLSX_SUPPORTED_VERSIONS) != NULL) {
  24625. WOLFSSL_MSG(
  24626. "Client attempting to connect with higher version");
  24627. ret = VERSION_ERROR;
  24628. goto out;
  24629. }
  24630. #endif
  24631. #ifdef HAVE_SNI
  24632. if((ret=SNI_Callback(ssl)))
  24633. goto out;
  24634. ssl->options.side = WOLFSSL_SERVER_END;
  24635. #endif
  24636. i += totalExtSz;
  24637. #else
  24638. while (totalExtSz) {
  24639. word16 extId, extSz;
  24640. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
  24641. ret = BUFFER_ERROR;
  24642. goto out;
  24643. }
  24644. ato16(&input[i], &extId);
  24645. i += OPAQUE16_LEN;
  24646. ato16(&input[i], &extSz);
  24647. i += OPAQUE16_LEN;
  24648. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
  24649. ret = BUFFER_ERROR;
  24650. goto out;
  24651. }
  24652. if (extId == HELLO_EXT_SIG_ALGO) {
  24653. word16 hashSigAlgoSz;
  24654. ato16(&input[i], &hashSigAlgoSz);
  24655. i += OPAQUE16_LEN;
  24656. if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
  24657. ret = BUFFER_ERROR;
  24658. goto out;
  24659. }
  24660. if (hashSigAlgoSz % 2 != 0) {
  24661. ret = BUFFER_ERROR;
  24662. goto out;
  24663. }
  24664. clSuites.hashSigAlgoSz = hashSigAlgoSz;
  24665. if (clSuites.hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  24666. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  24667. "truncating");
  24668. clSuites.hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  24669. }
  24670. XMEMCPY(clSuites.hashSigAlgo, &input[i],
  24671. clSuites.hashSigAlgoSz);
  24672. i += hashSigAlgoSz;
  24673. }
  24674. #ifdef HAVE_EXTENDED_MASTER
  24675. else if (extId == HELLO_EXT_EXTMS)
  24676. ssl->options.haveEMS = 1;
  24677. #endif
  24678. else
  24679. i += extSz;
  24680. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  24681. }
  24682. #endif
  24683. *inOutIdx = i;
  24684. }
  24685. else
  24686. *inOutIdx = begin + helloSz; /* skip extensions */
  24687. }
  24688. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  24689. ssl->options.haveSessionId = 1;
  24690. /* ProcessOld uses same resume code */
  24691. if (ssl->options.resuming) {
  24692. ret = HandleTlsResumption(ssl, bogusID, &clSuites);
  24693. if (ret != 0)
  24694. goto out;
  24695. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  24696. WOLFSSL_LEAVE("DoClientHello", ret);
  24697. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  24698. goto out;
  24699. }
  24700. }
  24701. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
  24702. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  24703. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  24704. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  24705. * present and no matches in the server's list. */
  24706. ret = TLSX_SupportedFFDHE_Set(ssl);
  24707. if (ret != 0)
  24708. goto out;
  24709. }
  24710. #endif
  24711. #endif
  24712. ret = MatchSuite(ssl, &clSuites);
  24713. #ifdef WOLFSSL_EXTRA_ALERTS
  24714. if (ret == BUFFER_ERROR)
  24715. SendAlert(ssl, alert_fatal, decode_error);
  24716. else if (ret < 0)
  24717. SendAlert(ssl, alert_fatal, handshake_failure);
  24718. #endif
  24719. #ifdef WOLFSSL_DTLS
  24720. if (ret == 0 && ssl->options.dtls)
  24721. DtlsMsgPoolReset(ssl);
  24722. #endif
  24723. WOLFSSL_LEAVE("DoClientHello", ret);
  24724. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  24725. out:
  24726. #ifdef WOLFSSL_DTLS
  24727. wc_HmacFree(&cookieHmac);
  24728. #endif
  24729. return ret;
  24730. }
  24731. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  24732. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  24733. typedef struct DcvArgs {
  24734. byte* output; /* not allocated */
  24735. word32 sendSz;
  24736. word16 sz;
  24737. word32 sigSz;
  24738. word32 idx;
  24739. word32 begin;
  24740. byte hashAlgo;
  24741. byte sigAlgo;
  24742. } DcvArgs;
  24743. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  24744. {
  24745. DcvArgs* args = (DcvArgs*)pArgs;
  24746. (void)ssl;
  24747. (void)args;
  24748. }
  24749. /* handle processing of certificate_verify (15) */
  24750. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  24751. word32* inOutIdx, word32 size)
  24752. {
  24753. int ret = 0;
  24754. #ifdef WOLFSSL_ASYNC_CRYPT
  24755. DcvArgs* args = (DcvArgs*)ssl->async.args;
  24756. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  24757. (void)sizeof(args_test);
  24758. #else
  24759. DcvArgs args[1];
  24760. #endif
  24761. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  24762. WOLFSSL_ENTER("DoCertificateVerify");
  24763. #ifdef WOLFSSL_ASYNC_CRYPT
  24764. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  24765. if (ret != WC_NOT_PENDING_E) {
  24766. /* Check for error */
  24767. if (ret < 0)
  24768. goto exit_dcv;
  24769. }
  24770. else
  24771. #endif
  24772. {
  24773. /* Reset state */
  24774. ret = 0;
  24775. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  24776. XMEMSET(args, 0, sizeof(DcvArgs));
  24777. args->hashAlgo = sha_mac;
  24778. args->sigAlgo = anonymous_sa_algo;
  24779. args->idx = *inOutIdx;
  24780. args->begin = *inOutIdx;
  24781. #ifdef WOLFSSL_ASYNC_CRYPT
  24782. ssl->async.freeArgs = FreeDcvArgs;
  24783. #endif
  24784. }
  24785. switch(ssl->options.asyncState)
  24786. {
  24787. case TLS_ASYNC_BEGIN:
  24788. {
  24789. #ifdef WOLFSSL_CALLBACKS
  24790. if (ssl->hsInfoOn)
  24791. AddPacketName(ssl, "CertificateVerify");
  24792. if (ssl->toInfoOn)
  24793. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  24794. #endif
  24795. /* Advance state and proceed */
  24796. ssl->options.asyncState = TLS_ASYNC_BUILD;
  24797. } /* case TLS_ASYNC_BEGIN */
  24798. FALL_THROUGH;
  24799. case TLS_ASYNC_BUILD:
  24800. {
  24801. if (IsAtLeastTLSv1_2(ssl)) {
  24802. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  24803. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  24804. }
  24805. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  24806. &args->sigAlgo);
  24807. args->idx += 2;
  24808. }
  24809. #ifndef NO_RSA
  24810. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  24811. args->sigAlgo = rsa_sa_algo;
  24812. #endif
  24813. #ifdef HAVE_ECC
  24814. else if (ssl->peerEccDsaKeyPresent)
  24815. args->sigAlgo = ecc_dsa_sa_algo;
  24816. #endif
  24817. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  24818. else if (ssl->peerEd25519KeyPresent)
  24819. args->sigAlgo = ed25519_sa_algo;
  24820. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  24821. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  24822. else if (ssl->peerEd448KeyPresent)
  24823. args->sigAlgo = ed448_sa_algo;
  24824. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  24825. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24826. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  24827. }
  24828. ato16(input + args->idx, &args->sz);
  24829. args->idx += OPAQUE16_LEN;
  24830. if ((args->idx - args->begin) + args->sz > size ||
  24831. args->sz > ENCRYPT_LEN) {
  24832. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  24833. }
  24834. #ifdef HAVE_ECC
  24835. if (ssl->peerEccDsaKeyPresent) {
  24836. WOLFSSL_MSG("Doing ECC peer cert verify");
  24837. /* make sure a default is defined */
  24838. #if !defined(NO_SHA)
  24839. SetDigest(ssl, sha_mac);
  24840. #elif !defined(NO_SHA256)
  24841. SetDigest(ssl, sha256_mac);
  24842. #elif defined(WOLFSSL_SHA384)
  24843. SetDigest(ssl, sha384_mac);
  24844. #elif defined(WOLFSSL_SHA512)
  24845. SetDigest(ssl, sha512_mac);
  24846. #else
  24847. #error No digest enabled for ECC sig verify
  24848. #endif
  24849. if (IsAtLeastTLSv1_2(ssl)) {
  24850. if (args->sigAlgo != ecc_dsa_sa_algo) {
  24851. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  24852. }
  24853. SetDigest(ssl, args->hashAlgo);
  24854. }
  24855. }
  24856. #endif /* HAVE_ECC */
  24857. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  24858. if (ssl->peerEd25519KeyPresent) {
  24859. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  24860. if (IsAtLeastTLSv1_2(ssl) &&
  24861. args->sigAlgo != ed25519_sa_algo) {
  24862. WOLFSSL_MSG(
  24863. "Oops, peer sent ED25519 key but not in verify");
  24864. }
  24865. }
  24866. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  24867. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  24868. if (ssl->peerEd448KeyPresent) {
  24869. WOLFSSL_MSG("Doing ED448 peer cert verify");
  24870. if (IsAtLeastTLSv1_2(ssl) &&
  24871. args->sigAlgo != ed448_sa_algo) {
  24872. WOLFSSL_MSG(
  24873. "Oops, peer sent ED448 key but not in verify");
  24874. }
  24875. }
  24876. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  24877. /* Advance state and proceed */
  24878. ssl->options.asyncState = TLS_ASYNC_DO;
  24879. } /* case TLS_ASYNC_BUILD */
  24880. FALL_THROUGH;
  24881. case TLS_ASYNC_DO:
  24882. {
  24883. #ifndef NO_RSA
  24884. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  24885. WOLFSSL_MSG("Doing RSA peer cert verify");
  24886. ret = RsaVerify(ssl,
  24887. input + args->idx,
  24888. args->sz,
  24889. &args->output,
  24890. args->sigAlgo, args->hashAlgo,
  24891. ssl->peerRsaKey,
  24892. #ifdef HAVE_PK_CALLBACKS
  24893. &ssl->buffers.peerRsaKey
  24894. #else
  24895. NULL
  24896. #endif
  24897. );
  24898. if (ret >= 0) {
  24899. if (args->sigAlgo == rsa_sa_algo)
  24900. args->sendSz = ret;
  24901. else {
  24902. args->sigSz = ret;
  24903. args->sendSz = ssl->buffers.digest.length;
  24904. }
  24905. ret = 0;
  24906. }
  24907. }
  24908. #endif /* !NO_RSA */
  24909. #ifdef HAVE_ECC
  24910. if (ssl->peerEccDsaKeyPresent) {
  24911. WOLFSSL_MSG("Doing ECC peer cert verify");
  24912. ret = EccVerify(ssl,
  24913. input + args->idx, args->sz,
  24914. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  24915. ssl->peerEccDsaKey,
  24916. #ifdef HAVE_PK_CALLBACKS
  24917. &ssl->buffers.peerEccDsaKey
  24918. #else
  24919. NULL
  24920. #endif
  24921. );
  24922. }
  24923. #endif /* HAVE_ECC */
  24924. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  24925. if (ssl->peerEd25519KeyPresent) {
  24926. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  24927. ret = Ed25519Verify(ssl,
  24928. input + args->idx, args->sz,
  24929. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  24930. ssl->peerEd25519Key,
  24931. #ifdef HAVE_PK_CALLBACKS
  24932. &ssl->buffers.peerEd25519Key
  24933. #else
  24934. NULL
  24935. #endif
  24936. );
  24937. }
  24938. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  24939. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  24940. if (ssl->peerEd448KeyPresent) {
  24941. WOLFSSL_MSG("Doing Ed448 peer cert verify");
  24942. ret = Ed448Verify(ssl,
  24943. input + args->idx, args->sz,
  24944. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  24945. ssl->peerEd448Key,
  24946. #ifdef HAVE_PK_CALLBACKS
  24947. &ssl->buffers.peerEd448Key
  24948. #else
  24949. NULL
  24950. #endif
  24951. );
  24952. }
  24953. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  24954. #ifdef WOLFSSL_ASYNC_CRYPT
  24955. /* handle async pending */
  24956. if (ret == WC_PENDING_E)
  24957. goto exit_dcv;
  24958. #endif
  24959. /* Check for error */
  24960. if (ret != 0) {
  24961. ret = SIG_VERIFY_E;
  24962. goto exit_dcv;
  24963. }
  24964. /* Advance state and proceed */
  24965. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  24966. } /* case TLS_ASYNC_DO */
  24967. FALL_THROUGH;
  24968. case TLS_ASYNC_VERIFY:
  24969. {
  24970. #ifndef NO_RSA
  24971. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  24972. if (IsAtLeastTLSv1_2(ssl)) {
  24973. #ifdef WC_RSA_PSS
  24974. if (args->sigAlgo == rsa_pss_sa_algo) {
  24975. SetDigest(ssl, args->hashAlgo);
  24976. #ifdef HAVE_SELFTEST
  24977. ret = wc_RsaPSS_CheckPadding(
  24978. ssl->buffers.digest.buffer,
  24979. ssl->buffers.digest.length,
  24980. args->output, args->sigSz,
  24981. HashAlgoToType(args->hashAlgo));
  24982. #else
  24983. ret = wc_RsaPSS_CheckPadding_ex(
  24984. ssl->buffers.digest.buffer,
  24985. ssl->buffers.digest.length,
  24986. args->output, args->sigSz,
  24987. HashAlgoToType(args->hashAlgo), -1,
  24988. mp_count_bits(&ssl->peerRsaKey->n));
  24989. #endif
  24990. if (ret != 0) {
  24991. ret = SIG_VERIFY_E;
  24992. goto exit_dcv;
  24993. }
  24994. }
  24995. else
  24996. #endif
  24997. {
  24998. #ifdef WOLFSSL_SMALL_STACK
  24999. byte* encodedSig;
  25000. #else
  25001. byte encodedSig[MAX_ENCODED_SIG_SZ];
  25002. #endif
  25003. #ifdef WOLFSSL_SMALL_STACK
  25004. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  25005. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25006. if (encodedSig == NULL) {
  25007. ERROR_OUT(MEMORY_E, exit_dcv);
  25008. }
  25009. #endif
  25010. if (args->sigAlgo != rsa_sa_algo) {
  25011. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  25012. "in verify");
  25013. }
  25014. SetDigest(ssl, args->hashAlgo);
  25015. args->sigSz = wc_EncodeSignature(encodedSig,
  25016. ssl->buffers.digest.buffer,
  25017. ssl->buffers.digest.length,
  25018. TypeHash(args->hashAlgo));
  25019. if (args->sendSz != args->sigSz || !args->output ||
  25020. XMEMCMP(args->output, encodedSig,
  25021. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  25022. ret = VERIFY_CERT_ERROR;
  25023. }
  25024. #ifdef WOLFSSL_SMALL_STACK
  25025. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25026. #endif
  25027. }
  25028. }
  25029. else {
  25030. if (args->sendSz != FINISHED_SZ || !args->output ||
  25031. XMEMCMP(args->output,
  25032. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  25033. ret = VERIFY_CERT_ERROR;
  25034. }
  25035. }
  25036. }
  25037. #endif /* !NO_RSA */
  25038. /* Advance state and proceed */
  25039. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  25040. } /* case TLS_ASYNC_VERIFY */
  25041. FALL_THROUGH;
  25042. case TLS_ASYNC_FINALIZE:
  25043. {
  25044. if (IsEncryptionOn(ssl, 0)) {
  25045. args->idx += ssl->keys.padSz;
  25046. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  25047. if (ssl->options.startedETMRead)
  25048. args->idx += MacSize(ssl);
  25049. #endif
  25050. }
  25051. ssl->options.havePeerVerify = 1;
  25052. /* Set final index */
  25053. args->idx += args->sz;
  25054. *inOutIdx = args->idx;
  25055. /* Advance state and proceed */
  25056. ssl->options.asyncState = TLS_ASYNC_END;
  25057. } /* case TLS_ASYNC_FINALIZE */
  25058. case TLS_ASYNC_END:
  25059. {
  25060. break;
  25061. }
  25062. default:
  25063. ret = INPUT_CASE_ERROR;
  25064. } /* switch(ssl->options.asyncState) */
  25065. exit_dcv:
  25066. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  25067. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  25068. #ifdef WOLFSSL_ASYNC_CRYPT
  25069. /* Handle async operation */
  25070. if (ret == WC_PENDING_E) {
  25071. /* Mark message as not received so it can process again */
  25072. ssl->msgsReceived.got_certificate_verify = 0;
  25073. return ret;
  25074. }
  25075. #endif /* WOLFSSL_ASYNC_CRYPT */
  25076. #ifdef WOLFSSL_EXTRA_ALERTS
  25077. if (ret == BUFFER_ERROR)
  25078. SendAlert(ssl, alert_fatal, decode_error);
  25079. else if (ret == SIG_VERIFY_E)
  25080. SendAlert(ssl, alert_fatal, decrypt_error);
  25081. else if (ret != 0)
  25082. SendAlert(ssl, alert_fatal, bad_certificate);
  25083. #endif
  25084. /* Digest is not allocated, so do this to prevent free */
  25085. ssl->buffers.digest.buffer = NULL;
  25086. ssl->buffers.digest.length = 0;
  25087. /* Final cleanup */
  25088. FreeDcvArgs(ssl, args);
  25089. FreeKeyExchange(ssl);
  25090. return ret;
  25091. }
  25092. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  25093. /* handle generation of server_hello_done (14) */
  25094. int SendServerHelloDone(WOLFSSL* ssl)
  25095. {
  25096. byte* output;
  25097. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  25098. int ret;
  25099. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  25100. WOLFSSL_ENTER("SendServerHelloDone");
  25101. #ifdef WOLFSSL_DTLS
  25102. if (ssl->options.dtls)
  25103. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25104. #endif
  25105. if (IsEncryptionOn(ssl, 1))
  25106. sendSz += MAX_MSG_EXTRA;
  25107. /* check for available size */
  25108. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  25109. return ret;
  25110. /* get output buffer */
  25111. output = ssl->buffers.outputBuffer.buffer +
  25112. ssl->buffers.outputBuffer.length;
  25113. AddHeaders(output, 0, server_hello_done, ssl);
  25114. if (IsEncryptionOn(ssl, 1)) {
  25115. byte* input;
  25116. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  25117. int recordHeaderSz = RECORD_HEADER_SZ;
  25118. if (ssl->options.dtls) {
  25119. recordHeaderSz += DTLS_RECORD_EXTRA;
  25120. inputSz += DTLS_HANDSHAKE_EXTRA;
  25121. }
  25122. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25123. if (input == NULL)
  25124. return MEMORY_E;
  25125. XMEMCPY(input, output + recordHeaderSz, inputSz);
  25126. #ifdef WOLFSSL_DTLS
  25127. if (IsDtlsNotSctpMode(ssl) &&
  25128. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
  25129. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25130. return ret;
  25131. }
  25132. #endif
  25133. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  25134. handshake, 1, 0, 0, CUR_ORDER);
  25135. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25136. if (sendSz < 0)
  25137. return sendSz;
  25138. } else {
  25139. #ifdef WOLFSSL_DTLS
  25140. if (IsDtlsNotSctpMode(ssl)) {
  25141. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
  25142. return ret;
  25143. }
  25144. if (ssl->options.dtls)
  25145. DtlsSEQIncrement(ssl, CUR_ORDER);
  25146. #endif
  25147. ret = HashOutput(ssl, output, sendSz, 0);
  25148. if (ret != 0)
  25149. return ret;
  25150. }
  25151. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  25152. if (ssl->hsInfoOn)
  25153. AddPacketName(ssl, "ServerHelloDone");
  25154. if (ssl->toInfoOn)
  25155. AddPacketInfo(ssl, "ServerHelloDone", handshake, output, sendSz,
  25156. WRITE_PROTO, ssl->heap);
  25157. #endif
  25158. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  25159. ssl->buffers.outputBuffer.length += sendSz;
  25160. ret = SendBuffered(ssl);
  25161. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  25162. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  25163. return ret;
  25164. }
  25165. #endif /* !WOLFSSL_NO_TLS12 */
  25166. #ifdef HAVE_SESSION_TICKET
  25167. #define WOLFSSL_TICKET_FIXED_SZ (WOLFSSL_TICKET_NAME_SZ + \
  25168. WOLFSSL_TICKET_IV_SZ + WOLFSSL_TICKET_MAC_SZ + LENGTH_SZ)
  25169. #define WOLFSSL_TICKET_ENC_SZ (SESSION_TICKET_LEN - WOLFSSL_TICKET_FIXED_SZ)
  25170. /* our ticket format */
  25171. typedef struct InternalTicket {
  25172. ProtocolVersion pv; /* version when ticket created */
  25173. byte suite[SUITE_LEN]; /* cipher suite when created */
  25174. byte msecret[SECRET_LEN]; /* master secret */
  25175. word32 timestamp; /* born on */
  25176. word16 haveEMS; /* have extended master secret */
  25177. #ifdef WOLFSSL_TLS13
  25178. word32 ageAdd; /* Obfuscation of age */
  25179. word16 namedGroup; /* Named group used */
  25180. TicketNonce ticketNonce; /* Ticket nonce */
  25181. #ifdef WOLFSSL_EARLY_DATA
  25182. word32 maxEarlyDataSz; /* Max size of early data */
  25183. #endif
  25184. #endif
  25185. } InternalTicket;
  25186. /* RFC 5077 defines this for session tickets */
  25187. /* fit within SESSION_TICKET_LEN */
  25188. typedef struct ExternalTicket {
  25189. byte key_name[WOLFSSL_TICKET_NAME_SZ]; /* key context name */
  25190. byte iv[WOLFSSL_TICKET_IV_SZ]; /* this ticket's iv */
  25191. byte enc_len[LENGTH_SZ]; /* encrypted length */
  25192. byte enc_ticket[WOLFSSL_TICKET_ENC_SZ]; /* encrypted internal ticket */
  25193. byte mac[WOLFSSL_TICKET_MAC_SZ]; /* total mac */
  25194. /* !! if add to structure, add to TICKET_FIXED_SZ !! */
  25195. } ExternalTicket;
  25196. /* create a new session ticket, 0 on success */
  25197. int CreateTicket(WOLFSSL* ssl)
  25198. {
  25199. InternalTicket it;
  25200. ExternalTicket* et = (ExternalTicket*)ssl->session.ticket;
  25201. int encLen;
  25202. int ret;
  25203. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  25204. XMEMSET(&it, 0, sizeof(it));
  25205. /* build internal */
  25206. it.pv.major = ssl->version.major;
  25207. it.pv.minor = ssl->version.minor;
  25208. it.suite[0] = ssl->options.cipherSuite0;
  25209. it.suite[1] = ssl->options.cipherSuite;
  25210. #ifdef WOLFSSL_EARLY_DATA
  25211. it.maxEarlyDataSz = ssl->options.maxEarlyDataSz;
  25212. #endif
  25213. if (!ssl->options.tls1_3) {
  25214. XMEMCPY(it.msecret, ssl->arrays->masterSecret, SECRET_LEN);
  25215. c32toa(LowResTimer(), (byte*)&it.timestamp);
  25216. it.haveEMS = ssl->options.haveEMS;
  25217. }
  25218. else {
  25219. #ifdef WOLFSSL_TLS13
  25220. /* Client adds to ticket age to obfuscate. */
  25221. ret = wc_RNG_GenerateBlock(ssl->rng, (byte*)&it.ageAdd,
  25222. sizeof(it.ageAdd));
  25223. if (ret != 0)
  25224. return BAD_TICKET_ENCRYPT;
  25225. ssl->session.ticketAdd = it.ageAdd;
  25226. it.namedGroup = ssl->session.namedGroup;
  25227. it.timestamp = TimeNowInMilliseconds();
  25228. /* Resumption master secret. */
  25229. XMEMCPY(it.msecret, ssl->session.masterSecret, SECRET_LEN);
  25230. XMEMCPY(&it.ticketNonce, &ssl->session.ticketNonce,
  25231. sizeof(TicketNonce));
  25232. #endif
  25233. }
  25234. /* encrypt */
  25235. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  25236. if (ssl->ctx->ticketEncCb == NULL) {
  25237. ret = WOLFSSL_TICKET_RET_FATAL;
  25238. }
  25239. else {
  25240. /* build external */
  25241. XMEMCPY(et->enc_ticket, &it, sizeof(InternalTicket));
  25242. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac, 1,
  25243. et->enc_ticket, sizeof(InternalTicket),
  25244. &encLen, ssl->ctx->ticketEncCtx);
  25245. if (ret != WOLFSSL_TICKET_RET_OK) {
  25246. ForceZero(et->enc_ticket, sizeof(it));
  25247. }
  25248. }
  25249. if (ret == WOLFSSL_TICKET_RET_OK) {
  25250. if (encLen < (int)sizeof(InternalTicket) ||
  25251. encLen > WOLFSSL_TICKET_ENC_SZ) {
  25252. ForceZero(&it, sizeof(it));
  25253. ForceZero(et->enc_ticket, sizeof(it));
  25254. WOLFSSL_MSG("Bad user ticket encrypt size");
  25255. return BAD_TICKET_KEY_CB_SZ;
  25256. }
  25257. /* sanity checks on encrypt callback */
  25258. /* internal ticket can't be the same if encrypted */
  25259. if (XMEMCMP(et->enc_ticket, &it, sizeof(InternalTicket)) == 0) {
  25260. ForceZero(&it, sizeof(it));
  25261. ForceZero(et->enc_ticket, sizeof(it));
  25262. WOLFSSL_MSG("User ticket encrypt didn't encrypt");
  25263. return BAD_TICKET_ENCRYPT;
  25264. }
  25265. ForceZero(&it, sizeof(it));
  25266. XMEMSET(zeros, 0, sizeof(zeros));
  25267. /* name */
  25268. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  25269. WOLFSSL_MSG("User ticket encrypt didn't set name");
  25270. return BAD_TICKET_ENCRYPT;
  25271. }
  25272. /* iv */
  25273. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  25274. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  25275. return BAD_TICKET_ENCRYPT;
  25276. }
  25277. /* mac */
  25278. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  25279. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  25280. return BAD_TICKET_ENCRYPT;
  25281. }
  25282. /* set size */
  25283. c16toa((word16)encLen, et->enc_len);
  25284. ssl->session.ticketLen = (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  25285. if (encLen < WOLFSSL_TICKET_ENC_SZ) {
  25286. /* move mac up since whole enc buffer not used */
  25287. XMEMMOVE(et->enc_ticket +encLen, et->mac,WOLFSSL_TICKET_MAC_SZ);
  25288. }
  25289. }
  25290. return ret;
  25291. }
  25292. /* Parse ticket sent by client, returns callback return value */
  25293. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  25294. {
  25295. ExternalTicket* et;
  25296. InternalTicket it;
  25297. int ret;
  25298. int outLen;
  25299. word16 inLen;
  25300. WOLFSSL_START(WC_FUNC_TICKET_DO);
  25301. WOLFSSL_ENTER("DoClientTicket");
  25302. if (len > SESSION_TICKET_LEN ||
  25303. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  25304. return BAD_TICKET_MSG_SZ;
  25305. }
  25306. et = (ExternalTicket*)input;
  25307. /* decrypt */
  25308. ato16(et->enc_len, &inLen);
  25309. if (inLen > (word16)(len - WOLFSSL_TICKET_FIXED_SZ)) {
  25310. return BAD_TICKET_MSG_SZ;
  25311. }
  25312. outLen = inLen; /* may be reduced by user padding */
  25313. if (ssl->ctx->ticketEncCb == NULL) {
  25314. ret = WOLFSSL_TICKET_RET_FATAL;
  25315. }
  25316. else {
  25317. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv,
  25318. et->enc_ticket + inLen, 0,
  25319. et->enc_ticket, inLen, &outLen,
  25320. ssl->ctx->ticketEncCtx);
  25321. }
  25322. if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) return ret;
  25323. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  25324. WOLFSSL_MSG("Bad user ticket decrypt len");
  25325. return BAD_TICKET_KEY_CB_SZ;
  25326. }
  25327. /* copy the decrypted ticket to avoid alignment issues */
  25328. XMEMCPY(&it, et->enc_ticket, sizeof(InternalTicket));
  25329. ForceZero(et->enc_ticket, sizeof(it));
  25330. /* get master secret */
  25331. if (ret == WOLFSSL_TICKET_RET_OK || ret == WOLFSSL_TICKET_RET_CREATE) {
  25332. if (ssl->version.minor < it.pv.minor) {
  25333. ForceZero(&it, sizeof(it));
  25334. WOLFSSL_MSG("Ticket has greater version");
  25335. return VERSION_ERROR;
  25336. }
  25337. else if (ssl->version.minor > it.pv.minor) {
  25338. if (IsAtLeastTLSv1_3(it.pv) != IsAtLeastTLSv1_3(ssl->version)) {
  25339. ForceZero(&it, sizeof(it));
  25340. WOLFSSL_MSG("Tickets cannot be shared between "
  25341. "TLS 1.3 and TLS 1.2 and lower");
  25342. return VERSION_ERROR;
  25343. }
  25344. if (!ssl->options.downgrade) {
  25345. ForceZero(&it, sizeof(it));
  25346. WOLFSSL_MSG("Ticket has lesser version");
  25347. return VERSION_ERROR;
  25348. }
  25349. WOLFSSL_MSG("Downgrading protocol due to ticket");
  25350. if (it.pv.minor < ssl->options.minDowngrade) {
  25351. ForceZero(&it, sizeof(it));
  25352. return VERSION_ERROR;
  25353. }
  25354. ssl->version.minor = it.pv.minor;
  25355. }
  25356. if (!IsAtLeastTLSv1_3(ssl->version)) {
  25357. XMEMCPY(ssl->arrays->masterSecret, it.msecret, SECRET_LEN);
  25358. /* Copy the haveExtendedMasterSecret property from the ticket to
  25359. * the saved session, so the property may be checked later. */
  25360. ssl->session.haveEMS = it.haveEMS;
  25361. #ifndef NO_RESUME_SUITE_CHECK
  25362. ssl->session.cipherSuite0 = it.suite[0];
  25363. ssl->session.cipherSuite = it.suite[1];
  25364. #endif
  25365. }
  25366. else {
  25367. #ifdef WOLFSSL_TLS13
  25368. /* Restore information to renegotiate. */
  25369. ssl->session.ticketSeen = it.timestamp;
  25370. ssl->session.ticketAdd = it.ageAdd;
  25371. ssl->session.cipherSuite0 = it.suite[0];
  25372. ssl->session.cipherSuite = it.suite[1];
  25373. #ifdef WOLFSSL_EARLY_DATA
  25374. ssl->session.maxEarlyDataSz = it.maxEarlyDataSz;
  25375. #endif
  25376. /* Resumption master secret. */
  25377. XMEMCPY(ssl->session.masterSecret, it.msecret, SECRET_LEN);
  25378. XMEMCPY(&ssl->session.ticketNonce, &it.ticketNonce,
  25379. sizeof(TicketNonce));
  25380. ssl->session.namedGroup = it.namedGroup;
  25381. #endif
  25382. }
  25383. }
  25384. ForceZero(&it, sizeof(it));
  25385. WOLFSSL_LEAVE("DoClientTicket", ret);
  25386. WOLFSSL_END(WC_FUNC_TICKET_DO);
  25387. return ret;
  25388. }
  25389. /* send Session Ticket */
  25390. int SendTicket(WOLFSSL* ssl)
  25391. {
  25392. byte* output;
  25393. int ret;
  25394. int sendSz;
  25395. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  25396. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  25397. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  25398. WOLFSSL_ENTER("SendTicket");
  25399. if (ssl->options.createTicket) {
  25400. ret = CreateTicket(ssl);
  25401. if (ret != 0) return ret;
  25402. }
  25403. length += ssl->session.ticketLen;
  25404. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  25405. if (!ssl->options.dtls) {
  25406. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  25407. sendSz += MAX_MSG_EXTRA;
  25408. }
  25409. else {
  25410. #ifdef WOLFSSL_DTLS
  25411. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25412. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25413. #endif
  25414. }
  25415. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  25416. sendSz += cipherExtraData(ssl);
  25417. /* check for available size */
  25418. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  25419. return ret;
  25420. /* get output buffer */
  25421. output = ssl->buffers.outputBuffer.buffer +
  25422. ssl->buffers.outputBuffer.length;
  25423. AddHeaders(output, length, session_ticket, ssl);
  25424. /* hint */
  25425. c32toa(ssl->ctx->ticketHint, output + idx);
  25426. idx += SESSION_HINT_SZ;
  25427. /* length */
  25428. c16toa(ssl->session.ticketLen, output + idx);
  25429. idx += LENGTH_SZ;
  25430. /* ticket */
  25431. XMEMCPY(output + idx, ssl->session.ticket, ssl->session.ticketLen);
  25432. idx += ssl->session.ticketLen;
  25433. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  25434. byte* input;
  25435. int inputSz = idx; /* build msg adds rec hdr */
  25436. int recordHeaderSz = RECORD_HEADER_SZ;
  25437. if (ssl->options.dtls)
  25438. recordHeaderSz += DTLS_RECORD_EXTRA;
  25439. inputSz -= recordHeaderSz;
  25440. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25441. if (input == NULL)
  25442. return MEMORY_E;
  25443. XMEMCPY(input, output + recordHeaderSz, inputSz);
  25444. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  25445. handshake, 1, 0, 0, CUR_ORDER);
  25446. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25447. if (sendSz < 0)
  25448. return sendSz;
  25449. }
  25450. else {
  25451. #ifdef WOLFSSL_DTLS
  25452. if (ssl->options.dtls) {
  25453. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
  25454. return ret;
  25455. DtlsSEQIncrement(ssl, CUR_ORDER);
  25456. }
  25457. #endif
  25458. ret = HashOutput(ssl, output, sendSz, 0);
  25459. if (ret != 0)
  25460. return ret;
  25461. }
  25462. ssl->buffers.outputBuffer.length += sendSz;
  25463. if (!ssl->options.groupMessages)
  25464. ret = SendBuffered(ssl);
  25465. WOLFSSL_LEAVE("SendTicket", ret);
  25466. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  25467. return ret;
  25468. }
  25469. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  25470. /* Initialize the context for session ticket encryption.
  25471. *
  25472. * @param [in] ctx SSL context.
  25473. * @param [in] keyCtx Context for session ticket encryption.
  25474. * @return 0 on success.
  25475. * @return BAD_MUTEX_E when initializing mutex fails.
  25476. */
  25477. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
  25478. {
  25479. int ret = 0;
  25480. XMEMSET(keyCtx, 0, sizeof(*keyCtx));
  25481. keyCtx->ctx = ctx;
  25482. #ifndef SINGLE_THREADED
  25483. ret = wc_InitMutex(&keyCtx->mutex);
  25484. #endif
  25485. return ret;
  25486. }
  25487. /* Setup the session ticket encryption context for this.
  25488. *
  25489. * Initialize RNG, generate name, generate primeary key and set primary key
  25490. * expirary.
  25491. *
  25492. * @param [in] keyCtx Context for session ticket encryption.
  25493. * @param [in] heap Dynamic memory allocation hint.
  25494. * @param [in] devId Device identifier.
  25495. * @return 0 on success.
  25496. * @return Other value when random number generator fails.
  25497. */
  25498. static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
  25499. {
  25500. int ret;
  25501. #ifndef SINGLE_THREADED
  25502. ret = 0;
  25503. /* Check that key wasn't set up while waiting. */
  25504. if (keyCtx->expirary[0] == 0)
  25505. #endif
  25506. {
  25507. ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
  25508. if (ret == 0) {
  25509. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
  25510. sizeof(keyCtx->name));
  25511. }
  25512. if (ret == 0) {
  25513. /* Mask of the bottom bit - used for index of key. */
  25514. keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
  25515. /* Generate initial primary key. */
  25516. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
  25517. WOLFSSL_TICKET_KEY_SZ);
  25518. }
  25519. if (ret == 0) {
  25520. keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
  25521. }
  25522. }
  25523. return ret;
  25524. }
  25525. /* Free the context for session ticket encryption.
  25526. *
  25527. * Zeroize keys and name.
  25528. *
  25529. * @param [in] keyCtx Context for session ticket encryption.
  25530. */
  25531. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
  25532. {
  25533. /* Zeroize sensitive data. */
  25534. ForceZero(keyCtx->name, sizeof(keyCtx->name));
  25535. ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
  25536. ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
  25537. #ifndef SINGLE_THREADED
  25538. wc_FreeMutex(&keyCtx->mutex);
  25539. #endif
  25540. wc_FreeRng(&keyCtx->rng);
  25541. }
  25542. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  25543. !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
  25544. !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
  25545. /* Ticket encryption/decryption implementation.
  25546. *
  25547. * @param [in] key Key for encryption/decryption.
  25548. * @param [in] keyLen Length of key in bytes.
  25549. * @param [in] iv IV/Nonce for encryption/decryption.
  25550. * @param [in] aad Additional authentication data.
  25551. * @param [in] aadSz Length of additional authentication data.
  25552. * @param [in] in Data to encrypt/decrypt.
  25553. * @param [in] inLen Length of encrypted data.
  25554. * @param [out] out Resulting data from encrypt/decrypt.
  25555. * @param [out] outLen Size of resulting data.
  25556. * @param [in] tag Authentication tag for encrypted data.
  25557. * @param [in] heap Dynamic memory allocation data hint.
  25558. * @param [in] enc 1 when encrypting, 0 when decrypting.
  25559. * @return 0 on success.
  25560. * @return Other value when encryption/decryption fails.
  25561. */
  25562. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  25563. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  25564. void* heap, int enc)
  25565. {
  25566. int ret;
  25567. (void)keyLen;
  25568. (void)heap;
  25569. if (enc) {
  25570. ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
  25571. tag);
  25572. }
  25573. else {
  25574. ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
  25575. out);
  25576. }
  25577. *outLen = inLen;
  25578. return ret;
  25579. }
  25580. #elif defined(HAVE_AESGCM)
  25581. /* Ticket encryption/decryption implementation.
  25582. *
  25583. * @param [in] key Key for encryption/decryption.
  25584. * @param [in] keyLen Length of key in bytes.
  25585. * @param [in] iv IV/Nonce for encryption/decryption.
  25586. * @param [in] aad Additional authentication data.
  25587. * @param [in] aadSz Length of additional authentication data.
  25588. * @param [in] in Data to encrypt/decrypt.
  25589. * @param [in] inLen Length of encrypted data.
  25590. * @param [out] out Resulting data from encrypt/decrypt.
  25591. * @param [out] outLen Size of resulting data.
  25592. * @param [in] tag Authentication tag for encrypted data.
  25593. * @param [in] heap Dynamic memory allocation data hint.
  25594. * @param [in] enc 1 when encrypting, 0 when decrypting.
  25595. * @return 0 on success.
  25596. * @return MEMORY_E when dynamic memory allocation fails.
  25597. * @return Other value when encryption/decryption fails.
  25598. */
  25599. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  25600. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  25601. void* heap, int enc)
  25602. {
  25603. int ret;
  25604. #ifdef WOLFSSL_SMALL_STACK
  25605. Aes* aes;
  25606. #else
  25607. Aes aes[1];
  25608. #endif
  25609. (void)heap;
  25610. #ifdef WOLFSSL_SMALL_STACK
  25611. aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
  25612. if (aes == NULL)
  25613. return MEMORY_E;
  25614. #endif
  25615. if (enc) {
  25616. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  25617. if (ret == 0) {
  25618. ret = wc_AesGcmSetKey(aes, key, keyLen);
  25619. }
  25620. if (ret == 0) {
  25621. ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  25622. tag, AES_BLOCK_SIZE, aad, aadSz);
  25623. }
  25624. wc_AesFree(aes);
  25625. }
  25626. else {
  25627. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  25628. if (ret == 0) {
  25629. ret = wc_AesGcmSetKey(aes, key, keyLen);
  25630. }
  25631. if (ret == 0) {
  25632. ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  25633. tag, AES_BLOCK_SIZE, aad, aadSz);
  25634. }
  25635. wc_AesFree(aes);
  25636. }
  25637. #ifdef WOLFSSL_SMALL_STACK
  25638. XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
  25639. #endif
  25640. *outLen = inLen;
  25641. return ret;
  25642. }
  25643. #else
  25644. #error "No encryption algorithm available for default ticket encryption."
  25645. #endif
  25646. /* Choose a key to use for encryption.
  25647. *
  25648. * Generate a new key if the current ones are expired.
  25649. * If the secondary key has not been used and the primary key has expired then
  25650. * generate a new primary key.
  25651. *
  25652. * @param [in] Ticket encryption callback context.
  25653. * @param [in] Session ticket lifetime.
  25654. * @param [out] Index of key to use for encryption.
  25655. * @return 0 on success.
  25656. * @return Other value when random number generation fails.
  25657. */
  25658. static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
  25659. int* keyIdx)
  25660. {
  25661. int ret = 0;
  25662. /* Get new current time as lock may have taken some time. */
  25663. word32 now = LowResTimer();
  25664. /* Check expirary of primary key for encrypt. */
  25665. if (keyCtx->expirary[0] >= now + ticketHint) {
  25666. *keyIdx = 0;
  25667. }
  25668. /* Check expirary of primary key for encrypt. */
  25669. else if (keyCtx->expirary[1] >= now + ticketHint) {
  25670. *keyIdx = 1;
  25671. }
  25672. /* No key available to use. */
  25673. else {
  25674. int genKey;
  25675. /* Generate which ever key is expired for decrypt - primary first. */
  25676. if (keyCtx->expirary[0] < now) {
  25677. genKey = 0;
  25678. }
  25679. else if (keyCtx->expirary[1] < now) {
  25680. genKey = 1;
  25681. }
  25682. /* Timeouts and expirary should not allow this to happen. */
  25683. else {
  25684. return BAD_STATE_E;
  25685. }
  25686. /* Generate the required key */
  25687. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
  25688. WOLFSSL_TICKET_KEY_SZ);
  25689. if (ret == 0) {
  25690. keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
  25691. *keyIdx = genKey;
  25692. }
  25693. }
  25694. return ret;
  25695. }
  25696. /* Default Session Ticket encryption/decryption callback.
  25697. *
  25698. * Use ChaCha20-Poly1305 or AES-GCM to encrypt/decrypt the ticket.
  25699. * Two keys are used:
  25700. * - When the first expires for encryption, then use the other.
  25701. * - Don't encrypt with key if the ticket lifetime will go beyond expirary.
  25702. * - Generate a new primary key when primary key expired for decrypt and
  25703. * no secondary key is activate for encryption.
  25704. * - Generate a new secondary key when expired and needed.
  25705. * - Calculate expirary starting from first encrypted ticket.
  25706. * - Key name has last bit set to indicate index of key.
  25707. * Keys expire for decryption after ticket key lifetime from the first encrypted
  25708. * ticket.
  25709. * Keys can only be use for encryption while the ticket hint does not exceed
  25710. * the key lifetime.
  25711. * Lifetime of a key must be greater than the lifetime of a ticket. This means
  25712. * that if one ticket is only valid for decryption, then the other will be
  25713. * valid for encryption.
  25714. * AAD = key_name | iv | ticket len (16-bits network order)
  25715. *
  25716. * @param [in] ssl SSL connection.
  25717. * @param [in,out] key_name Name of key from client.
  25718. * Encrypt: name of key returned.
  25719. * Decrypt: name from ticket message to check.
  25720. * @param [in] iv IV to use in encryption/decryption.
  25721. * @param [in] mac MAC for authentication of encrypted data.
  25722. * @param [in] enc 1 when encrypting ticket, 0 when decrypting.
  25723. * @param [in,out] ticket Encrypted/decrypted session ticket bytes.
  25724. * @param [in] inLen Length of incoming ticket.
  25725. * @param [out] outLen Length of outgoing ticket.
  25726. * @param [in] userCtx Context for encryption/decryption of ticket.
  25727. * @return WOLFSSL_TICKET_RET_OK when successful.
  25728. * @return WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
  25729. * be created for TLS 1.2 and below.
  25730. * @return WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
  25731. * decrypted ticket.
  25732. * @return WOLFSSL_TICKET_RET_FATAL when key name does not match.
  25733. */
  25734. static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
  25735. byte iv[WOLFSSL_TICKET_IV_SZ],
  25736. byte mac[WOLFSSL_TICKET_MAC_SZ],
  25737. int enc, byte* ticket, int inLen, int* outLen,
  25738. void* userCtx)
  25739. {
  25740. int ret;
  25741. TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
  25742. WOLFSSL_CTX* ctx = keyCtx->ctx;
  25743. word16 sLen = XHTONS(inLen);
  25744. byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
  25745. int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
  25746. byte* p = aad;
  25747. int keyIdx = 0;
  25748. /* Check we have setup the RNG, name and primary key. */
  25749. if (keyCtx->expirary[0] == 0) {
  25750. #ifndef SINGLE_THREADED
  25751. /* Lock around access to expirary and key - stop initial key being
  25752. * generated twice at the same time. */
  25753. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  25754. WOLFSSL_MSG("Couldn't lock key context mutex");
  25755. return WOLFSSL_TICKET_RET_REJECT;
  25756. }
  25757. #endif
  25758. /* Sets expirary of primary key in setup. */
  25759. ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
  25760. #ifndef SINGLE_THREADED
  25761. wc_UnLockMutex(&keyCtx->mutex);
  25762. #endif
  25763. if (ret != 0)
  25764. return ret;
  25765. }
  25766. if (enc) {
  25767. /* Return the name of the key - missing key index. */
  25768. XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  25769. /* Generate a new IV into buffer to be returned.
  25770. * Don't use the RNG in keyCtx as it's for generating private data. */
  25771. ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
  25772. if (ret != 0) {
  25773. return WOLFSSL_TICKET_RET_REJECT;
  25774. }
  25775. }
  25776. else {
  25777. /* Mask of last bit that is the key index. */
  25778. byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
  25779. /* For decryption, see if we know this key - check all but last byte. */
  25780. if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
  25781. return WOLFSSL_TICKET_RET_FATAL;
  25782. }
  25783. /* Ensure last byte without index bit matches too. */
  25784. if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
  25785. return WOLFSSL_TICKET_RET_FATAL;
  25786. }
  25787. }
  25788. /* Build AAD from: key name, iv, and length of ticket. */
  25789. XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  25790. p += WOLFSSL_TICKET_NAME_SZ;
  25791. XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
  25792. p += WOLFSSL_TICKET_IV_SZ;
  25793. XMEMCPY(p, &sLen, sizeof(sLen));
  25794. /* Encrypt ticket. */
  25795. if (enc) {
  25796. word32 now;
  25797. now = LowResTimer();
  25798. /* As long as encryption expirary isn't imminent - no lock. */
  25799. if (keyCtx->expirary[0] > now + ctx->ticketHint) {
  25800. keyIdx = 0;
  25801. }
  25802. else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
  25803. keyIdx = 1;
  25804. }
  25805. else {
  25806. #ifndef SINGLE_THREADED
  25807. /* Lock around access to expirary and key - stop key being generated
  25808. * twice at the same time. */
  25809. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  25810. WOLFSSL_MSG("Couldn't lock key context mutex");
  25811. return WOLFSSL_TICKET_RET_REJECT;
  25812. }
  25813. #endif
  25814. ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
  25815. #ifndef SINGLE_THREADED
  25816. wc_UnLockMutex(&keyCtx->mutex);
  25817. #endif
  25818. if (ret != 0) {
  25819. return WOLFSSL_TICKET_RET_REJECT;
  25820. }
  25821. }
  25822. /* Set the name of the key to the index chosen. */
  25823. key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  25824. /* Update AAD too. */
  25825. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  25826. /* Encrypt ticket data. */
  25827. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  25828. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  25829. 1);
  25830. if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
  25831. }
  25832. /* Decrypt ticket. */
  25833. else {
  25834. /* Get index of key from name. */
  25835. keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
  25836. /* Update AAD with index. */
  25837. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  25838. /* Check expirary */
  25839. if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
  25840. return WOLFSSL_TICKET_RET_REJECT;
  25841. }
  25842. /* Decrypt ticket data. */
  25843. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  25844. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  25845. 0);
  25846. if (ret != 0) {
  25847. return WOLFSSL_TICKET_RET_REJECT;
  25848. }
  25849. }
  25850. #ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
  25851. if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
  25852. return WOLFSSL_TICKET_RET_CREATE;
  25853. #endif
  25854. return WOLFSSL_TICKET_RET_OK;
  25855. }
  25856. #endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
  25857. #endif /* HAVE_SESSION_TICKET */
  25858. #ifndef WOLFSSL_NO_TLS12
  25859. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  25860. defined(HAVE_SERVER_RENEGOTIATION_INFO) && \
  25861. !defined(WOLFSSL_NO_SERVER)
  25862. /* handle generation of server's hello_request (0) */
  25863. int SendHelloRequest(WOLFSSL* ssl)
  25864. {
  25865. byte* output;
  25866. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  25867. int ret;
  25868. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  25869. WOLFSSL_ENTER("SendHelloRequest");
  25870. if (IsEncryptionOn(ssl, 1))
  25871. sendSz += MAX_MSG_EXTRA;
  25872. if (ssl->options.dtls)
  25873. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25874. /* check for available size */
  25875. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  25876. return ret;
  25877. /* get output buffer */
  25878. output = ssl->buffers.outputBuffer.buffer +
  25879. ssl->buffers.outputBuffer.length;
  25880. AddHeaders(output, 0, hello_request, ssl);
  25881. if (IsEncryptionOn(ssl, 1)) {
  25882. byte* input;
  25883. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  25884. int recordHeaderSz = RECORD_HEADER_SZ;
  25885. if (ssl->options.dtls) {
  25886. recordHeaderSz += DTLS_RECORD_EXTRA;
  25887. inputSz += DTLS_HANDSHAKE_EXTRA;
  25888. }
  25889. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25890. if (input == NULL)
  25891. return MEMORY_E;
  25892. XMEMCPY(input, output + recordHeaderSz, inputSz);
  25893. #ifdef WOLFSSL_DTLS
  25894. if (IsDtlsNotSctpMode(ssl) &&
  25895. (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
  25896. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25897. return ret;
  25898. }
  25899. #endif
  25900. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  25901. handshake, 0, 0, 0, CUR_ORDER);
  25902. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25903. if (sendSz < 0)
  25904. return sendSz;
  25905. }
  25906. ssl->buffers.outputBuffer.length += sendSz;
  25907. ret = SendBuffered(ssl);
  25908. WOLFSSL_LEAVE("SendHelloRequest", ret);
  25909. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  25910. return ret;
  25911. }
  25912. #endif /* HAVE_SECURE_RENEGOTIATION && HAVE_SERVER_RENEGOTIATION_INFO */
  25913. #ifdef WOLFSSL_DTLS
  25914. /* handle generation of DTLS hello_verify_request (3) */
  25915. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  25916. const byte* cookie, byte cookieSz)
  25917. {
  25918. byte* output;
  25919. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  25920. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  25921. int sendSz = length + idx;
  25922. int ret;
  25923. /* are we in scr */
  25924. if (IsEncryptionOn(ssl, 1)) {
  25925. sendSz += MAX_MSG_EXTRA;
  25926. }
  25927. /* check for available size */
  25928. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  25929. return ret;
  25930. /* get output buffer */
  25931. output = ssl->buffers.outputBuffer.buffer +
  25932. ssl->buffers.outputBuffer.length;
  25933. /* Hello Verify Request should use the same sequence number as the
  25934. * Client Hello. */
  25935. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  25936. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  25937. AddHeaders(output, length, hello_verify_request, ssl);
  25938. #ifdef OPENSSL_EXTRA
  25939. output[idx++] = DTLS_MAJOR;
  25940. output[idx++] = DTLS_MINOR;
  25941. #else
  25942. output[idx++] = ssl->version.major;
  25943. output[idx++] = ssl->version.minor;
  25944. #endif
  25945. output[idx++] = cookieSz;
  25946. if (cookie == NULL || cookieSz == 0)
  25947. return COOKIE_ERROR;
  25948. XMEMCPY(output + idx, cookie, cookieSz);
  25949. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  25950. if (ssl->hsInfoOn)
  25951. AddPacketName(ssl, "HelloVerifyRequest");
  25952. if (ssl->toInfoOn)
  25953. AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  25954. sendSz, WRITE_PROTO, ssl->heap);
  25955. #endif
  25956. /* are we in scr */
  25957. if (IsEncryptionOn(ssl, 1)) {
  25958. byte* input;
  25959. int inputSz = DTLS_HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
  25960. int recordHeaderSz = DTLS_RECORD_HEADER_SZ;
  25961. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25962. if (input == NULL)
  25963. return MEMORY_E;
  25964. XMEMCPY(input, output + recordHeaderSz, inputSz);
  25965. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  25966. handshake, 0, 0, 0, CUR_ORDER);
  25967. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25968. if (sendSz < 0)
  25969. return sendSz;
  25970. }
  25971. ssl->buffers.outputBuffer.length += sendSz;
  25972. DtlsSEQIncrement(ssl, CUR_ORDER);
  25973. return SendBuffered(ssl);
  25974. }
  25975. #endif /* WOLFSSL_DTLS */
  25976. typedef struct DckeArgs {
  25977. byte* output; /* not allocated */
  25978. word32 length;
  25979. word32 idx;
  25980. word32 begin;
  25981. word32 sigSz;
  25982. #ifndef NO_RSA
  25983. int lastErr;
  25984. #endif
  25985. } DckeArgs;
  25986. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  25987. {
  25988. DckeArgs* args = (DckeArgs*)pArgs;
  25989. (void)ssl;
  25990. (void)args;
  25991. }
  25992. /* handle processing client_key_exchange (16) */
  25993. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  25994. word32 size)
  25995. {
  25996. int ret;
  25997. #ifdef WOLFSSL_ASYNC_CRYPT
  25998. DckeArgs* args = (DckeArgs*)ssl->async.args;
  25999. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  26000. (void)sizeof(args_test);
  26001. #else
  26002. DckeArgs args[1];
  26003. #endif
  26004. (void)size;
  26005. (void)input;
  26006. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  26007. WOLFSSL_ENTER("DoClientKeyExchange");
  26008. #ifdef WOLFSSL_ASYNC_CRYPT
  26009. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  26010. if (ret != WC_NOT_PENDING_E) {
  26011. /* Check for error */
  26012. if (ret < 0)
  26013. goto exit_dcke;
  26014. }
  26015. else
  26016. #endif /* WOLFSSL_ASYNC_CRYPT */
  26017. {
  26018. /* Reset state */
  26019. ret = 0;
  26020. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  26021. XMEMSET(args, 0, sizeof(DckeArgs));
  26022. args->idx = *inOutIdx;
  26023. args->begin = *inOutIdx;
  26024. #ifdef WOLFSSL_ASYNC_CRYPT
  26025. ssl->async.freeArgs = FreeDckeArgs;
  26026. #endif
  26027. }
  26028. /* Do Client Key Exchange State Machine */
  26029. switch(ssl->options.asyncState)
  26030. {
  26031. case TLS_ASYNC_BEGIN:
  26032. {
  26033. /* Sanity checks */
  26034. if (ssl->options.side != WOLFSSL_SERVER_END) {
  26035. WOLFSSL_MSG("Client received client keyexchange, attack?");
  26036. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  26037. ERROR_OUT(WOLFSSL_FATAL_ERROR, exit_dcke);
  26038. }
  26039. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  26040. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  26041. SendAlert(ssl, alert_fatal, unexpected_message);
  26042. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  26043. }
  26044. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  26045. if (ssl->options.verifyPeer && ssl->options.failNoCert) {
  26046. if (!ssl->options.havePeerCert) {
  26047. WOLFSSL_MSG("client didn't present peer cert");
  26048. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  26049. }
  26050. }
  26051. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  26052. if (!ssl->options.havePeerCert &&
  26053. !ssl->options.usingPSK_cipher) {
  26054. WOLFSSL_MSG("client didn't present peer cert");
  26055. return NO_PEER_CERT;
  26056. }
  26057. }
  26058. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  26059. #if defined(WOLFSSL_CALLBACKS)
  26060. if (ssl->hsInfoOn) {
  26061. AddPacketName(ssl, "ClientKeyExchange");
  26062. }
  26063. if (ssl->toInfoOn) {
  26064. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  26065. }
  26066. #endif
  26067. if (ssl->arrays->preMasterSecret == NULL) {
  26068. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  26069. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  26070. ssl->heap, DYNAMIC_TYPE_SECRET);
  26071. if (ssl->arrays->preMasterSecret == NULL) {
  26072. ERROR_OUT(MEMORY_E, exit_dcke);
  26073. }
  26074. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  26075. }
  26076. switch (ssl->specs.kea) {
  26077. #ifndef NO_RSA
  26078. case rsa_kea:
  26079. {
  26080. break;
  26081. } /* rsa_kea */
  26082. #endif /* !NO_RSA */
  26083. #ifndef NO_PSK
  26084. case psk_kea:
  26085. {
  26086. /* sanity check that PSK server callback has been set */
  26087. if (ssl->options.server_psk_cb == NULL) {
  26088. WOLFSSL_MSG("No server PSK callback set");
  26089. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  26090. }
  26091. break;
  26092. }
  26093. #endif /* !NO_PSK */
  26094. #ifdef HAVE_NTRU
  26095. case ntru_kea:
  26096. {
  26097. /* make sure private key exists */
  26098. if (ssl->buffers.key == NULL ||
  26099. ssl->buffers.key->buffer == NULL) {
  26100. ERROR_OUT(NO_PRIVATE_KEY, exit_dcke);
  26101. }
  26102. break;
  26103. }
  26104. #endif /* HAVE_NTRU */
  26105. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26106. defined(HAVE_CURVE448)
  26107. case ecc_diffie_hellman_kea:
  26108. {
  26109. break;
  26110. }
  26111. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26112. #ifndef NO_DH
  26113. case diffie_hellman_kea:
  26114. {
  26115. break;
  26116. }
  26117. #endif /* !NO_DH */
  26118. #if !defined(NO_DH) && !defined(NO_PSK)
  26119. case dhe_psk_kea:
  26120. {
  26121. /* sanity check that PSK server callback has been set */
  26122. if (ssl->options.server_psk_cb == NULL) {
  26123. WOLFSSL_MSG("No server PSK callback set");
  26124. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  26125. }
  26126. break;
  26127. }
  26128. #endif /* !NO_DH && !NO_PSK */
  26129. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26130. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26131. case ecdhe_psk_kea:
  26132. {
  26133. /* sanity check that PSK server callback has been set */
  26134. if (ssl->options.server_psk_cb == NULL) {
  26135. WOLFSSL_MSG("No server PSK callback set");
  26136. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  26137. }
  26138. break;
  26139. }
  26140. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  26141. default:
  26142. WOLFSSL_MSG("Bad kea type");
  26143. ret = BAD_KEA_TYPE_E;
  26144. } /* switch (ssl->specs.kea) */
  26145. /* Check for error */
  26146. if (ret != 0) {
  26147. goto exit_dcke;
  26148. }
  26149. /* Advance state and proceed */
  26150. ssl->options.asyncState = TLS_ASYNC_BUILD;
  26151. } /* TLS_ASYNC_BEGIN */
  26152. FALL_THROUGH;
  26153. case TLS_ASYNC_BUILD:
  26154. {
  26155. switch (ssl->specs.kea) {
  26156. #ifndef NO_RSA
  26157. case rsa_kea:
  26158. {
  26159. word16 keySz;
  26160. ssl->buffers.keyType = rsa_sa_algo;
  26161. ret = DecodePrivateKey(ssl, &keySz);
  26162. if (ret != 0) {
  26163. goto exit_dcke;
  26164. }
  26165. args->length = (word32)keySz;
  26166. ssl->arrays->preMasterSz = SECRET_LEN;
  26167. if (ssl->options.tls) {
  26168. word16 check;
  26169. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26170. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26171. }
  26172. ato16(input + args->idx, &check);
  26173. args->idx += OPAQUE16_LEN;
  26174. if ((word32)check != args->length) {
  26175. WOLFSSL_MSG("RSA explicit size doesn't match");
  26176. #ifdef WOLFSSL_EXTRA_ALERTS
  26177. SendAlert(ssl, alert_fatal, bad_record_mac);
  26178. #endif
  26179. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  26180. }
  26181. }
  26182. if ((args->idx - args->begin) + args->length > size) {
  26183. WOLFSSL_MSG("RSA message too big");
  26184. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26185. }
  26186. /* pre-load PreMasterSecret with RNG data */
  26187. ret = wc_RNG_GenerateBlock(ssl->rng,
  26188. &ssl->arrays->preMasterSecret[VERSION_SZ],
  26189. SECRET_LEN - VERSION_SZ);
  26190. if (ret != 0) {
  26191. goto exit_dcke;
  26192. }
  26193. args->output = NULL;
  26194. break;
  26195. } /* rsa_kea */
  26196. #endif /* !NO_RSA */
  26197. #ifndef NO_PSK
  26198. case psk_kea:
  26199. {
  26200. byte* pms = ssl->arrays->preMasterSecret;
  26201. word16 ci_sz;
  26202. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26203. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26204. }
  26205. ato16(input + args->idx, &ci_sz);
  26206. args->idx += OPAQUE16_LEN;
  26207. if (ci_sz > MAX_PSK_ID_LEN) {
  26208. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  26209. }
  26210. if ((args->idx - args->begin) + ci_sz > size) {
  26211. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26212. }
  26213. XMEMCPY(ssl->arrays->client_identity,
  26214. input + args->idx, ci_sz);
  26215. args->idx += ci_sz;
  26216. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  26217. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  26218. ssl->arrays->client_identity, ssl->arrays->psk_key,
  26219. MAX_PSK_KEY_LEN);
  26220. if (ssl->arrays->psk_keySz == 0 ||
  26221. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  26222. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  26223. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  26224. SendAlert(ssl, alert_fatal,
  26225. unknown_psk_identity);
  26226. #endif
  26227. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  26228. }
  26229. /* make psk pre master secret */
  26230. /* length of key + length 0s + length of key + key */
  26231. c16toa((word16) ssl->arrays->psk_keySz, pms);
  26232. pms += OPAQUE16_LEN;
  26233. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  26234. pms += ssl->arrays->psk_keySz;
  26235. c16toa((word16) ssl->arrays->psk_keySz, pms);
  26236. pms += OPAQUE16_LEN;
  26237. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  26238. ssl->arrays->preMasterSz =
  26239. (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
  26240. break;
  26241. }
  26242. #endif /* !NO_PSK */
  26243. #ifdef HAVE_NTRU
  26244. case ntru_kea:
  26245. {
  26246. word16 cipherLen;
  26247. word16 plainLen = ENCRYPT_LEN;
  26248. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26249. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26250. }
  26251. ato16(input + args->idx, &cipherLen);
  26252. args->idx += OPAQUE16_LEN;
  26253. if (cipherLen > MAX_NTRU_ENCRYPT_SZ) {
  26254. ERROR_OUT(NTRU_KEY_ERROR, exit_dcke);
  26255. }
  26256. if ((args->idx - args->begin) + cipherLen > size) {
  26257. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26258. }
  26259. if (NTRU_OK != ntru_crypto_ntru_decrypt(
  26260. (word16) ssl->buffers.key->length,
  26261. ssl->buffers.key->buffer, cipherLen,
  26262. input + args->idx, &plainLen,
  26263. ssl->arrays->preMasterSecret)) {
  26264. ERROR_OUT(NTRU_DECRYPT_ERROR, exit_dcke);
  26265. }
  26266. if (plainLen != SECRET_LEN) {
  26267. ERROR_OUT(NTRU_DECRYPT_ERROR, exit_dcke);
  26268. }
  26269. args->idx += cipherLen;
  26270. ssl->arrays->preMasterSz = plainLen;
  26271. break;
  26272. }
  26273. #endif /* HAVE_NTRU */
  26274. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26275. defined(HAVE_CURVE448)
  26276. case ecc_diffie_hellman_kea:
  26277. {
  26278. #ifdef HAVE_ECC
  26279. ecc_key* private_key = ssl->eccTempKey;
  26280. /* handle static private key */
  26281. if (ssl->specs.static_ecdh &&
  26282. ssl->ecdhCurveOID != ECC_X25519_OID &&
  26283. ssl->ecdhCurveOID != ECC_X448_OID) {
  26284. word16 keySz;
  26285. ssl->buffers.keyType = ecc_dsa_sa_algo;
  26286. ret = DecodePrivateKey(ssl, &keySz);
  26287. if (ret != 0) {
  26288. goto exit_dcke;
  26289. }
  26290. private_key = (ecc_key*)ssl->hsKey;
  26291. }
  26292. #endif
  26293. /* import peer ECC key */
  26294. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  26295. #ifdef WOLFSSL_EXTRA_ALERTS
  26296. SendAlert(ssl, alert_fatal, decode_error);
  26297. #endif
  26298. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26299. }
  26300. args->length = input[args->idx++];
  26301. if ((args->idx - args->begin) + args->length > size) {
  26302. #ifdef WOLFSSL_EXTRA_ALERTS
  26303. SendAlert(ssl, alert_fatal, decode_error);
  26304. #endif
  26305. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26306. }
  26307. #ifdef HAVE_CURVE25519
  26308. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26309. #ifdef HAVE_PK_CALLBACKS
  26310. /* if callback then use it for shared secret */
  26311. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  26312. break;
  26313. }
  26314. #endif
  26315. if (ssl->peerX25519Key == NULL) {
  26316. /* alloc/init on demand */
  26317. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26318. (void**)&ssl->peerX25519Key);
  26319. if (ret != 0) {
  26320. goto exit_dcke;
  26321. }
  26322. } else if (ssl->peerX25519KeyPresent) {
  26323. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26324. ssl->peerX25519Key);
  26325. ssl->peerX25519KeyPresent = 0;
  26326. if (ret != 0) {
  26327. goto exit_dcke;
  26328. }
  26329. }
  26330. if ((ret = wc_curve25519_check_public(
  26331. input + args->idx, args->length,
  26332. EC25519_LITTLE_ENDIAN)) != 0) {
  26333. #ifdef WOLFSSL_EXTRA_ALERTS
  26334. if (ret == BUFFER_E)
  26335. SendAlert(ssl, alert_fatal, decode_error);
  26336. else if (ret == ECC_OUT_OF_RANGE_E)
  26337. SendAlert(ssl, alert_fatal, bad_record_mac);
  26338. else {
  26339. SendAlert(ssl, alert_fatal,
  26340. illegal_parameter);
  26341. }
  26342. #endif
  26343. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26344. }
  26345. if (wc_curve25519_import_public_ex(
  26346. input + args->idx, args->length,
  26347. ssl->peerX25519Key,
  26348. EC25519_LITTLE_ENDIAN)) {
  26349. #ifdef WOLFSSL_EXTRA_ALERTS
  26350. SendAlert(ssl, alert_fatal, illegal_parameter);
  26351. #endif
  26352. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26353. }
  26354. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  26355. ssl->peerX25519KeyPresent = 1;
  26356. break;
  26357. }
  26358. #endif
  26359. #ifdef HAVE_CURVE448
  26360. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  26361. #ifdef HAVE_PK_CALLBACKS
  26362. /* if callback then use it for shared secret */
  26363. if (ssl->ctx->X448SharedSecretCb != NULL) {
  26364. break;
  26365. }
  26366. #endif
  26367. if (ssl->peerX448Key == NULL) {
  26368. /* alloc/init on demand */
  26369. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  26370. (void**)&ssl->peerX448Key);
  26371. if (ret != 0) {
  26372. goto exit_dcke;
  26373. }
  26374. } else if (ssl->peerX448KeyPresent) {
  26375. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  26376. ssl->peerX448Key);
  26377. ssl->peerX448KeyPresent = 0;
  26378. if (ret != 0) {
  26379. goto exit_dcke;
  26380. }
  26381. }
  26382. if ((ret = wc_curve448_check_public(
  26383. input + args->idx, args->length,
  26384. EC448_LITTLE_ENDIAN)) != 0) {
  26385. #ifdef WOLFSSL_EXTRA_ALERTS
  26386. if (ret == BUFFER_E)
  26387. SendAlert(ssl, alert_fatal, decode_error);
  26388. else if (ret == ECC_OUT_OF_RANGE_E)
  26389. SendAlert(ssl, alert_fatal, bad_record_mac);
  26390. else {
  26391. SendAlert(ssl, alert_fatal,
  26392. illegal_parameter);
  26393. }
  26394. #endif
  26395. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26396. }
  26397. if (wc_curve448_import_public_ex(
  26398. input + args->idx, args->length,
  26399. ssl->peerX448Key,
  26400. EC448_LITTLE_ENDIAN)) {
  26401. #ifdef WOLFSSL_EXTRA_ALERTS
  26402. SendAlert(ssl, alert_fatal, illegal_parameter);
  26403. #endif
  26404. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26405. }
  26406. ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
  26407. ssl->peerX448KeyPresent = 1;
  26408. break;
  26409. }
  26410. #endif
  26411. #ifdef HAVE_ECC
  26412. #ifdef HAVE_PK_CALLBACKS
  26413. /* if callback then use it for shared secret */
  26414. if (ssl->ctx->EccSharedSecretCb != NULL) {
  26415. break;
  26416. }
  26417. #endif
  26418. if (!ssl->specs.static_ecdh &&
  26419. ssl->eccTempKeyPresent == 0) {
  26420. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  26421. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  26422. }
  26423. if (ssl->peerEccKey == NULL) {
  26424. /* alloc/init on demand */
  26425. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  26426. (void**)&ssl->peerEccKey);
  26427. if (ret != 0) {
  26428. goto exit_dcke;
  26429. }
  26430. } else if (ssl->peerEccKeyPresent) {
  26431. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  26432. ssl->peerEccKey);
  26433. ssl->peerEccKeyPresent = 0;
  26434. if (ret != 0) {
  26435. goto exit_dcke;
  26436. }
  26437. }
  26438. if (wc_ecc_import_x963_ex(input + args->idx,
  26439. args->length, ssl->peerEccKey,
  26440. private_key->dp->id)) {
  26441. #ifdef WOLFSSL_EXTRA_ALERTS
  26442. SendAlert(ssl, alert_fatal, illegal_parameter);
  26443. #endif
  26444. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26445. }
  26446. ssl->arrays->preMasterSz = private_key->dp->size;
  26447. ssl->peerEccKeyPresent = 1;
  26448. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  26449. /* client_hello may have sent FFEDH2048, which sets namedGroup,
  26450. but that is not being used, so clear it */
  26451. /* resolves issue with server side wolfSSL_get_curve_name */
  26452. ssl->namedGroup = 0;
  26453. #endif
  26454. #endif /* HAVE_ECC */
  26455. break;
  26456. }
  26457. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26458. #ifndef NO_DH
  26459. case diffie_hellman_kea:
  26460. {
  26461. word16 clientPubSz;
  26462. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26463. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26464. }
  26465. ato16(input + args->idx, &clientPubSz);
  26466. args->idx += OPAQUE16_LEN;
  26467. if ((args->idx - args->begin) + clientPubSz > size) {
  26468. #ifdef WOLFSSL_EXTRA_ALERTS
  26469. SendAlert(ssl, alert_fatal, decode_error);
  26470. #endif
  26471. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26472. }
  26473. args->sigSz = clientPubSz;
  26474. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  26475. (void**)&ssl->buffers.serverDH_Key);
  26476. if (ret != 0) {
  26477. goto exit_dcke;
  26478. }
  26479. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  26480. ssl->buffers.serverDH_P.buffer,
  26481. ssl->buffers.serverDH_P.length,
  26482. ssl->buffers.serverDH_G.buffer,
  26483. ssl->buffers.serverDH_G.length);
  26484. /* set the max agree result size */
  26485. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  26486. break;
  26487. }
  26488. #endif /* !NO_DH */
  26489. #if !defined(NO_DH) && !defined(NO_PSK)
  26490. case dhe_psk_kea:
  26491. {
  26492. word16 clientSz;
  26493. /* Read in the PSK hint */
  26494. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26495. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26496. }
  26497. ato16(input + args->idx, &clientSz);
  26498. args->idx += OPAQUE16_LEN;
  26499. if (clientSz > MAX_PSK_ID_LEN) {
  26500. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  26501. }
  26502. if ((args->idx - args->begin) + clientSz > size) {
  26503. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26504. }
  26505. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  26506. clientSz);
  26507. args->idx += clientSz;
  26508. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  26509. /* Read in the DHE business */
  26510. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26511. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26512. }
  26513. ato16(input + args->idx, &clientSz);
  26514. args->idx += OPAQUE16_LEN;
  26515. if ((args->idx - args->begin) + clientSz > size) {
  26516. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26517. }
  26518. args->sigSz = clientSz;
  26519. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  26520. (void**)&ssl->buffers.serverDH_Key);
  26521. if (ret != 0) {
  26522. goto exit_dcke;
  26523. }
  26524. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  26525. ssl->buffers.serverDH_P.buffer,
  26526. ssl->buffers.serverDH_P.length,
  26527. ssl->buffers.serverDH_G.buffer,
  26528. ssl->buffers.serverDH_G.length);
  26529. break;
  26530. }
  26531. #endif /* !NO_DH && !NO_PSK */
  26532. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26533. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26534. case ecdhe_psk_kea:
  26535. {
  26536. word16 clientSz;
  26537. /* Read in the PSK hint */
  26538. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26539. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26540. }
  26541. ato16(input + args->idx, &clientSz);
  26542. args->idx += OPAQUE16_LEN;
  26543. if (clientSz > MAX_PSK_ID_LEN) {
  26544. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  26545. }
  26546. if ((args->idx - args->begin) + clientSz > size) {
  26547. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26548. }
  26549. XMEMCPY(ssl->arrays->client_identity,
  26550. input + args->idx, clientSz);
  26551. args->idx += clientSz;
  26552. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  26553. /* import peer ECC key */
  26554. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  26555. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26556. }
  26557. args->length = input[args->idx++];
  26558. if ((args->idx - args->begin) + args->length > size) {
  26559. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  26560. }
  26561. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  26562. #ifdef HAVE_CURVE25519
  26563. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26564. #ifdef HAVE_PK_CALLBACKS
  26565. /* if callback then use it for shared secret */
  26566. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  26567. break;
  26568. }
  26569. #endif
  26570. if (ssl->eccTempKeyPresent == 0) {
  26571. WOLFSSL_MSG(
  26572. "X25519 ephemeral key not made correctly");
  26573. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  26574. }
  26575. if (ssl->peerX25519Key == NULL) {
  26576. /* alloc/init on demand */
  26577. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26578. (void**)&ssl->peerX25519Key);
  26579. if (ret != 0) {
  26580. goto exit_dcke;
  26581. }
  26582. } else if (ssl->peerX25519KeyPresent) {
  26583. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26584. ssl->peerX25519Key);
  26585. ssl->peerX25519KeyPresent = 0;
  26586. if (ret != 0) {
  26587. goto exit_dcke;
  26588. }
  26589. }
  26590. if ((ret = wc_curve25519_check_public(
  26591. input + args->idx, args->length,
  26592. EC25519_LITTLE_ENDIAN)) != 0) {
  26593. #ifdef WOLFSSL_EXTRA_ALERTS
  26594. if (ret == BUFFER_E)
  26595. SendAlert(ssl, alert_fatal, decode_error);
  26596. else if (ret == ECC_OUT_OF_RANGE_E)
  26597. SendAlert(ssl, alert_fatal, bad_record_mac);
  26598. else {
  26599. SendAlert(ssl, alert_fatal,
  26600. illegal_parameter);
  26601. }
  26602. #endif
  26603. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26604. }
  26605. if (wc_curve25519_import_public_ex(
  26606. input + args->idx, args->length,
  26607. ssl->peerX25519Key,
  26608. EC25519_LITTLE_ENDIAN)) {
  26609. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26610. }
  26611. ssl->peerX25519KeyPresent = 1;
  26612. break;
  26613. }
  26614. #endif
  26615. #ifdef HAVE_CURVE448
  26616. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  26617. #ifdef HAVE_PK_CALLBACKS
  26618. /* if callback then use it for shared secret */
  26619. if (ssl->ctx->X448SharedSecretCb != NULL) {
  26620. break;
  26621. }
  26622. #endif
  26623. if (ssl->eccTempKeyPresent == 0) {
  26624. WOLFSSL_MSG(
  26625. "X448 ephemeral key not made correctly");
  26626. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  26627. }
  26628. if (ssl->peerX448Key == NULL) {
  26629. /* alloc/init on demand */
  26630. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  26631. (void**)&ssl->peerX448Key);
  26632. if (ret != 0) {
  26633. goto exit_dcke;
  26634. }
  26635. } else if (ssl->peerX448KeyPresent) {
  26636. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  26637. ssl->peerX448Key);
  26638. ssl->peerX448KeyPresent = 0;
  26639. if (ret != 0) {
  26640. goto exit_dcke;
  26641. }
  26642. }
  26643. if ((ret = wc_curve448_check_public(
  26644. input + args->idx, args->length,
  26645. EC448_LITTLE_ENDIAN)) != 0) {
  26646. #ifdef WOLFSSL_EXTRA_ALERTS
  26647. if (ret == BUFFER_E)
  26648. SendAlert(ssl, alert_fatal, decode_error);
  26649. else if (ret == ECC_OUT_OF_RANGE_E)
  26650. SendAlert(ssl, alert_fatal, bad_record_mac);
  26651. else {
  26652. SendAlert(ssl, alert_fatal,
  26653. illegal_parameter);
  26654. }
  26655. #endif
  26656. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26657. }
  26658. if (wc_curve448_import_public_ex(
  26659. input + args->idx, args->length,
  26660. ssl->peerX448Key,
  26661. EC448_LITTLE_ENDIAN)) {
  26662. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26663. }
  26664. ssl->peerX448KeyPresent = 1;
  26665. break;
  26666. }
  26667. #endif
  26668. #ifdef HAVE_PK_CALLBACKS
  26669. /* if callback then use it for shared secret */
  26670. if (ssl->ctx->EccSharedSecretCb != NULL) {
  26671. break;
  26672. }
  26673. #endif
  26674. if (ssl->eccTempKeyPresent == 0) {
  26675. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  26676. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  26677. }
  26678. if (ssl->peerEccKey == NULL) {
  26679. /* alloc/init on demand */
  26680. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  26681. (void**)&ssl->peerEccKey);
  26682. if (ret != 0) {
  26683. goto exit_dcke;
  26684. }
  26685. }
  26686. else if (ssl->peerEccKeyPresent) {
  26687. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  26688. ssl->peerEccKey);
  26689. ssl->peerEccKeyPresent = 0;
  26690. if (ret != 0) {
  26691. goto exit_dcke;
  26692. }
  26693. }
  26694. if (wc_ecc_import_x963_ex(input + args->idx,
  26695. args->length, ssl->peerEccKey,
  26696. ssl->eccTempKey->dp->id)) {
  26697. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  26698. }
  26699. ssl->peerEccKeyPresent = 1;
  26700. break;
  26701. }
  26702. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  26703. default:
  26704. ret = BAD_KEA_TYPE_E;
  26705. } /* switch (ssl->specs.kea) */
  26706. /* Check for error */
  26707. if (ret != 0) {
  26708. goto exit_dcke;
  26709. }
  26710. /* Advance state and proceed */
  26711. ssl->options.asyncState = TLS_ASYNC_DO;
  26712. } /* TLS_ASYNC_BUILD */
  26713. FALL_THROUGH;
  26714. case TLS_ASYNC_DO:
  26715. {
  26716. switch (ssl->specs.kea) {
  26717. #ifndef NO_RSA
  26718. case rsa_kea:
  26719. {
  26720. RsaKey* key = (RsaKey*)ssl->hsKey;
  26721. ret = RsaDec(ssl,
  26722. input + args->idx,
  26723. args->length,
  26724. &args->output,
  26725. &args->sigSz,
  26726. key,
  26727. #ifdef HAVE_PK_CALLBACKS
  26728. ssl->buffers.key
  26729. #else
  26730. NULL
  26731. #endif
  26732. );
  26733. /* Errors that can occur here that should be
  26734. * indistinguishable:
  26735. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  26736. */
  26737. #ifdef WOLFSSL_ASYNC_CRYPT
  26738. if (ret == WC_PENDING_E)
  26739. goto exit_dcke;
  26740. #endif
  26741. if (ret == BAD_FUNC_ARG)
  26742. goto exit_dcke;
  26743. args->lastErr = ret - (SECRET_LEN - args->sigSz);
  26744. ret = 0;
  26745. break;
  26746. } /* rsa_kea */
  26747. #endif /* !NO_RSA */
  26748. #ifndef NO_PSK
  26749. case psk_kea:
  26750. {
  26751. break;
  26752. }
  26753. #endif /* !NO_PSK */
  26754. #ifdef HAVE_NTRU
  26755. case ntru_kea:
  26756. {
  26757. break;
  26758. }
  26759. #endif /* HAVE_NTRU */
  26760. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26761. defined(HAVE_CURVE448)
  26762. case ecc_diffie_hellman_kea:
  26763. {
  26764. void* private_key = ssl->eccTempKey;
  26765. (void)private_key;
  26766. #ifdef HAVE_CURVE25519
  26767. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26768. ret = X25519SharedSecret(ssl,
  26769. (curve25519_key*)private_key,
  26770. ssl->peerX25519Key,
  26771. input + args->idx, &args->length,
  26772. ssl->arrays->preMasterSecret,
  26773. &ssl->arrays->preMasterSz,
  26774. WOLFSSL_SERVER_END
  26775. );
  26776. break;
  26777. }
  26778. #endif
  26779. #ifdef HAVE_CURVE448
  26780. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  26781. ret = X448SharedSecret(ssl,
  26782. (curve448_key*)private_key,
  26783. ssl->peerX448Key,
  26784. input + args->idx, &args->length,
  26785. ssl->arrays->preMasterSecret,
  26786. &ssl->arrays->preMasterSz,
  26787. WOLFSSL_SERVER_END
  26788. );
  26789. break;
  26790. }
  26791. #endif
  26792. #ifdef HAVE_ECC
  26793. if (ssl->specs.static_ecdh) {
  26794. private_key = ssl->hsKey;
  26795. }
  26796. /* Generate shared secret */
  26797. ret = EccSharedSecret(ssl,
  26798. (ecc_key*)private_key, ssl->peerEccKey,
  26799. input + args->idx, &args->length,
  26800. ssl->arrays->preMasterSecret,
  26801. &ssl->arrays->preMasterSz,
  26802. WOLFSSL_SERVER_END
  26803. );
  26804. #ifdef WOLFSSL_ASYNC_CRYPT
  26805. if (ret != WC_PENDING_E)
  26806. #endif
  26807. {
  26808. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  26809. (void**)&ssl->peerEccKey);
  26810. ssl->peerEccKeyPresent = 0;
  26811. }
  26812. #endif
  26813. break;
  26814. }
  26815. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26816. #ifndef NO_DH
  26817. case diffie_hellman_kea:
  26818. {
  26819. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  26820. ssl->buffers.serverDH_Priv.buffer,
  26821. ssl->buffers.serverDH_Priv.length,
  26822. input + args->idx,
  26823. (word16)args->sigSz,
  26824. ssl->arrays->preMasterSecret,
  26825. &ssl->arrays->preMasterSz);
  26826. break;
  26827. }
  26828. #endif /* !NO_DH */
  26829. #if !defined(NO_DH) && !defined(NO_PSK)
  26830. case dhe_psk_kea:
  26831. {
  26832. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  26833. ssl->buffers.serverDH_Priv.buffer,
  26834. ssl->buffers.serverDH_Priv.length,
  26835. input + args->idx,
  26836. (word16)args->sigSz,
  26837. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  26838. &ssl->arrays->preMasterSz);
  26839. break;
  26840. }
  26841. #endif /* !NO_DH && !NO_PSK */
  26842. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26843. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26844. case ecdhe_psk_kea:
  26845. {
  26846. #ifdef HAVE_CURVE25519
  26847. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26848. ret = X25519SharedSecret(ssl,
  26849. (curve25519_key*)ssl->eccTempKey,
  26850. ssl->peerX25519Key,
  26851. input + args->idx, &args->length,
  26852. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  26853. &args->sigSz,
  26854. WOLFSSL_SERVER_END
  26855. );
  26856. #ifdef WOLFSSL_ASYNC_CRYPT
  26857. if (ret != WC_PENDING_E)
  26858. #endif
  26859. {
  26860. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26861. (void**)&ssl->peerX25519Key);
  26862. ssl->peerX25519KeyPresent = 0;
  26863. }
  26864. break;
  26865. }
  26866. #endif
  26867. #ifdef HAVE_CURVE448
  26868. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  26869. ret = X448SharedSecret(ssl,
  26870. (curve448_key*)ssl->eccTempKey,
  26871. ssl->peerX448Key,
  26872. input + args->idx, &args->length,
  26873. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  26874. &args->sigSz,
  26875. WOLFSSL_SERVER_END
  26876. );
  26877. #ifdef WOLFSSL_ASYNC_CRYPT
  26878. if (ret != WC_PENDING_E)
  26879. #endif
  26880. {
  26881. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  26882. (void**)&ssl->peerX448Key);
  26883. ssl->peerX448KeyPresent = 0;
  26884. }
  26885. break;
  26886. }
  26887. #endif
  26888. /* Generate shared secret */
  26889. ret = EccSharedSecret(ssl,
  26890. ssl->eccTempKey, ssl->peerEccKey,
  26891. input + args->idx, &args->length,
  26892. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  26893. &args->sigSz,
  26894. WOLFSSL_SERVER_END
  26895. );
  26896. if (!ssl->specs.static_ecdh
  26897. #ifdef WOLFSSL_ASYNC_CRYPT
  26898. && ret != WC_PENDING_E
  26899. #endif
  26900. ) {
  26901. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  26902. (void**)&ssl->peerEccKey);
  26903. ssl->peerEccKeyPresent = 0;
  26904. }
  26905. break;
  26906. }
  26907. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  26908. default:
  26909. ret = BAD_KEA_TYPE_E;
  26910. } /* switch (ssl->specs.kea) */
  26911. /* Check for error */
  26912. if (ret != 0) {
  26913. goto exit_dcke;
  26914. }
  26915. /* Advance state and proceed */
  26916. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  26917. } /* TLS_ASYNC_DO */
  26918. FALL_THROUGH;
  26919. case TLS_ASYNC_VERIFY:
  26920. {
  26921. switch (ssl->specs.kea) {
  26922. #ifndef NO_RSA
  26923. case rsa_kea:
  26924. {
  26925. byte mask;
  26926. int i;
  26927. /* Add the signature length to idx */
  26928. args->idx += args->length;
  26929. #ifdef DEBUG_WOLFSSL
  26930. /* check version (debug warning message only) */
  26931. if (args->output != NULL) {
  26932. if (args->output[0] != ssl->chVersion.major ||
  26933. args->output[1] != ssl->chVersion.minor) {
  26934. WOLFSSL_MSG("preMasterSecret version mismatch");
  26935. }
  26936. }
  26937. #endif
  26938. /* RFC5246 7.4.7.1:
  26939. * Treat incorrectly formatted message blocks and/or
  26940. * mismatched version numbers in a manner
  26941. * indistinguishable from correctly formatted RSA blocks
  26942. */
  26943. ret = args->lastErr;
  26944. args->lastErr = 0; /* reset */
  26945. /* On error 'ret' will be negative - top bit set */
  26946. mask = ((unsigned int)ret >>
  26947. ((sizeof(ret) * 8) - 1)) - 1;
  26948. /* build PreMasterSecret */
  26949. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  26950. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  26951. if (args->output != NULL) {
  26952. /* Use random secret on error */
  26953. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  26954. ssl->arrays->preMasterSecret[i] =
  26955. ctMaskSel(mask, args->output[i],
  26956. ssl->arrays->preMasterSecret[i]);
  26957. }
  26958. }
  26959. /* preMasterSecret has RNG and version set
  26960. * return proper length and ignore error
  26961. * error will be caught as decryption error
  26962. */
  26963. args->sigSz = SECRET_LEN;
  26964. ret = 0;
  26965. break;
  26966. } /* rsa_kea */
  26967. #endif /* !NO_RSA */
  26968. #ifndef NO_PSK
  26969. case psk_kea:
  26970. {
  26971. break;
  26972. }
  26973. #endif /* !NO_PSK */
  26974. #ifdef HAVE_NTRU
  26975. case ntru_kea:
  26976. {
  26977. break;
  26978. }
  26979. #endif /* HAVE_NTRU */
  26980. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26981. defined(HAVE_CURVE448)
  26982. case ecc_diffie_hellman_kea:
  26983. {
  26984. /* skip past the imported peer key */
  26985. args->idx += args->length;
  26986. break;
  26987. }
  26988. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26989. #ifndef NO_DH
  26990. case diffie_hellman_kea:
  26991. {
  26992. args->idx += (word16)args->sigSz;
  26993. break;
  26994. }
  26995. #endif /* !NO_DH */
  26996. #if !defined(NO_DH) && !defined(NO_PSK)
  26997. case dhe_psk_kea:
  26998. {
  26999. byte* pms = ssl->arrays->preMasterSecret;
  27000. word16 clientSz = (word16)args->sigSz;
  27001. args->idx += clientSz;
  27002. c16toa((word16)ssl->arrays->preMasterSz, pms);
  27003. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  27004. pms += ssl->arrays->preMasterSz;
  27005. /* Use the PSK hint to look up the PSK and add it to the
  27006. * preMasterSecret here. */
  27007. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  27008. ssl->arrays->client_identity, ssl->arrays->psk_key,
  27009. MAX_PSK_KEY_LEN);
  27010. if (ssl->arrays->psk_keySz == 0 ||
  27011. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  27012. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  27013. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  27014. SendAlert(ssl, alert_fatal,
  27015. unknown_psk_identity);
  27016. #endif
  27017. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  27018. }
  27019. c16toa((word16) ssl->arrays->psk_keySz, pms);
  27020. pms += OPAQUE16_LEN;
  27021. XMEMCPY(pms, ssl->arrays->psk_key,
  27022. ssl->arrays->psk_keySz);
  27023. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
  27024. OPAQUE16_LEN;
  27025. break;
  27026. }
  27027. #endif /* !NO_DH && !NO_PSK */
  27028. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27029. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27030. case ecdhe_psk_kea:
  27031. {
  27032. byte* pms = ssl->arrays->preMasterSecret;
  27033. word16 clientSz = (word16)args->sigSz;
  27034. /* skip past the imported peer key */
  27035. args->idx += args->length;
  27036. /* Add preMasterSecret */
  27037. c16toa(clientSz, pms);
  27038. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  27039. pms += ssl->arrays->preMasterSz;
  27040. /* Use the PSK hint to look up the PSK and add it to the
  27041. * preMasterSecret here. */
  27042. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  27043. ssl->arrays->client_identity, ssl->arrays->psk_key,
  27044. MAX_PSK_KEY_LEN);
  27045. if (ssl->arrays->psk_keySz == 0 ||
  27046. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  27047. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  27048. }
  27049. c16toa((word16) ssl->arrays->psk_keySz, pms);
  27050. pms += OPAQUE16_LEN;
  27051. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  27052. ssl->arrays->preMasterSz +=
  27053. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  27054. break;
  27055. }
  27056. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27057. default:
  27058. ret = BAD_KEA_TYPE_E;
  27059. } /* switch (ssl->specs.kea) */
  27060. /* Check for error */
  27061. if (ret != 0) {
  27062. goto exit_dcke;
  27063. }
  27064. /* Advance state and proceed */
  27065. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  27066. } /* TLS_ASYNC_VERIFY */
  27067. FALL_THROUGH;
  27068. case TLS_ASYNC_FINALIZE:
  27069. {
  27070. if (IsEncryptionOn(ssl, 0)) {
  27071. args->idx += ssl->keys.padSz;
  27072. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  27073. if (ssl->options.startedETMRead)
  27074. args->idx += MacSize(ssl);
  27075. #endif
  27076. }
  27077. #ifdef HAVE_QSH
  27078. word16 name;
  27079. if (ssl->options.haveQSH) {
  27080. /* extension name */
  27081. ato16(input + args->idx, &name);
  27082. args->idx += OPAQUE16_LEN;
  27083. if (name == TLSX_QUANTUM_SAFE_HYBRID) {
  27084. int qshSz;
  27085. /* if qshSz is larger than 0 it is the
  27086. length of buffer used */
  27087. if ((qshSz = TLSX_QSHCipher_Parse(ssl,
  27088. input + args->idx,
  27089. size - args->idx + args->begin, 1)) < 0) {
  27090. ERROR_OUT(qshSz, exit_dcke);
  27091. }
  27092. args->idx += qshSz;
  27093. }
  27094. else {
  27095. /* unknown extension sent client ignored handshake */
  27096. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  27097. }
  27098. }
  27099. #endif /* HAVE_QSH */
  27100. ret = MakeMasterSecret(ssl);
  27101. /* Check for error */
  27102. if (ret != 0) {
  27103. goto exit_dcke;
  27104. }
  27105. /* Advance state and proceed */
  27106. ssl->options.asyncState = TLS_ASYNC_END;
  27107. } /* TLS_ASYNC_FINALIZE */
  27108. FALL_THROUGH;
  27109. case TLS_ASYNC_END:
  27110. {
  27111. /* Set final index */
  27112. *inOutIdx = args->idx;
  27113. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  27114. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  27115. if (ssl->options.verifyPeer) {
  27116. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  27117. }
  27118. #endif
  27119. break;
  27120. } /* TLS_ASYNC_END */
  27121. default:
  27122. ret = INPUT_CASE_ERROR;
  27123. } /* switch(ssl->options.asyncState) */
  27124. exit_dcke:
  27125. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  27126. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  27127. #ifdef WOLFSSL_ASYNC_CRYPT
  27128. /* Handle async operation */
  27129. if (ret == WC_PENDING_E) {
  27130. /* Mark message as not received so it can process again */
  27131. ssl->msgsReceived.got_client_key_exchange = 0;
  27132. return ret;
  27133. }
  27134. #endif /* WOLFSSL_ASYNC_CRYPT */
  27135. /* Cleanup PMS */
  27136. if (ssl->arrays->preMasterSecret != NULL) {
  27137. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  27138. }
  27139. ssl->arrays->preMasterSz = 0;
  27140. /* Final cleanup */
  27141. FreeDckeArgs(ssl, args);
  27142. FreeKeyExchange(ssl);
  27143. return ret;
  27144. }
  27145. #endif /* !WOLFSSL_NO_TLS12 */
  27146. #ifdef HAVE_SNI
  27147. int SNI_Callback(WOLFSSL* ssl)
  27148. {
  27149. int ad = 0;
  27150. int sniRet = 0;
  27151. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  27152. * when SNI is received. Call it now if exists */
  27153. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  27154. WOLFSSL_MSG("Calling custom sni callback");
  27155. sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg);
  27156. if (sniRet == alert_fatal) {
  27157. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  27158. SendAlert(ssl, alert_fatal, ad);
  27159. return FATAL_ERROR;
  27160. }
  27161. else if (sniRet == alert_warning) {
  27162. WOLFSSL_MSG("Error in custom sni callback. Warning alert");
  27163. SendAlert(ssl, alert_warning, ad);
  27164. }
  27165. }
  27166. return 0;
  27167. }
  27168. #endif /* HAVE_SNI */
  27169. #endif /* NO_WOLFSSL_SERVER */
  27170. #ifdef WOLFSSL_ASYNC_CRYPT
  27171. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  27172. {
  27173. int ret = 0;
  27174. WC_ASYNC_DEV* asyncDev;
  27175. WOLF_EVENT* event;
  27176. if (ssl == NULL) {
  27177. return BAD_FUNC_ARG;
  27178. }
  27179. /* check for pending async */
  27180. asyncDev = ssl->async.dev;
  27181. if (asyncDev) {
  27182. /* grab event pointer */
  27183. event = &asyncDev->event;
  27184. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  27185. if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) {
  27186. /* advance key share state if doesn't need called again */
  27187. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  27188. (*state)++;
  27189. }
  27190. /* clear event */
  27191. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  27192. /* clear async dev */
  27193. ssl->async.dev = NULL;
  27194. }
  27195. }
  27196. else {
  27197. ret = WC_NOT_PENDING_E;
  27198. }
  27199. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  27200. return ret;
  27201. }
  27202. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  27203. {
  27204. int ret;
  27205. WOLF_EVENT* event;
  27206. if (ssl == NULL || asyncDev == NULL) {
  27207. return BAD_FUNC_ARG;
  27208. }
  27209. /* grab event pointer */
  27210. event = &asyncDev->event;
  27211. /* init event */
  27212. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  27213. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  27214. return ret;
  27215. }
  27216. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  27217. {
  27218. int ret;
  27219. WOLF_EVENT* event;
  27220. if (ssl == NULL || asyncDev == NULL) {
  27221. return BAD_FUNC_ARG;
  27222. }
  27223. /* grab event pointer */
  27224. event = &asyncDev->event;
  27225. /* store reference to active async operation */
  27226. ssl->async.dev = asyncDev;
  27227. /* place event into queue */
  27228. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  27229. /* success means return WC_PENDING_E */
  27230. if (ret == 0) {
  27231. ret = WC_PENDING_E;
  27232. }
  27233. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  27234. return ret;
  27235. }
  27236. #endif /* WOLFSSL_ASYNC_CRYPT */
  27237. /* return the max record size */
  27238. int wolfSSL_GetMaxRecordSize(WOLFSSL* ssl, int maxFragment)
  27239. {
  27240. (void) ssl; /* Avoid compiler warnings */
  27241. if (maxFragment > MAX_RECORD_SIZE) {
  27242. maxFragment = MAX_RECORD_SIZE;
  27243. }
  27244. #ifdef HAVE_MAX_FRAGMENT
  27245. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  27246. maxFragment = ssl->max_fragment;
  27247. }
  27248. #endif /* HAVE_MAX_FRAGMENT */
  27249. #ifdef WOLFSSL_DTLS
  27250. if (IsDtlsNotSctpMode(ssl)) {
  27251. if (maxFragment > MAX_UDP_SIZE) {
  27252. maxFragment = MAX_UDP_SIZE;
  27253. }
  27254. #if defined(WOLFSSL_DTLS_MTU)
  27255. if (maxFragment >
  27256. ssl->dtlsMtuSz - RECORD_HEADER_SZ - DTLS_RECORD_EXTRA) {
  27257. maxFragment = ssl->dtlsMtuSz - RECORD_HEADER_SZ - DTLS_RECORD_EXTRA;
  27258. }
  27259. #endif
  27260. }
  27261. #endif
  27262. return maxFragment;
  27263. }
  27264. #undef ERROR_OUT
  27265. #endif /* WOLFCRYPT_ONLY */