internal.c 901 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234
  1. /* internal.c
  2. *
  3. * Copyright (C) 2006-2019 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. */
  36. #ifndef WOLFCRYPT_ONLY
  37. #include <wolfssl/internal.h>
  38. #include <wolfssl/error-ssl.h>
  39. #include <wolfssl/wolfcrypt/asn.h>
  40. #include <wolfssl/wolfcrypt/dh.h>
  41. #ifdef NO_INLINE
  42. #include <wolfssl/wolfcrypt/misc.h>
  43. #else
  44. #define WOLFSSL_MISC_INCLUDED
  45. #include <wolfcrypt/src/misc.c>
  46. #endif
  47. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
  48. #include <wolfssl/wolfcrypt/srp.h>
  49. #endif
  50. #ifdef HAVE_LIBZ
  51. #include "zlib.h"
  52. #endif
  53. #ifdef HAVE_NTRU
  54. #include "libntruencrypt/ntru_crypto.h"
  55. #endif
  56. #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
  57. defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
  58. #if defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  59. #if MQX_USE_IO_OLD
  60. #include <fio.h>
  61. #else
  62. #include <nio.h>
  63. #endif
  64. #else
  65. #include <stdio.h>
  66. #endif
  67. #endif
  68. #ifdef __sun
  69. #include <sys/filio.h>
  70. #endif
  71. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  72. #ifdef _MSC_VER
  73. /* disable for while(0) cases at the .c level for now */
  74. #pragma warning(disable:4127)
  75. #endif
  76. #if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
  77. #error \
  78. WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
  79. #endif
  80. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
  81. #error Cannot use both secure-renegotiation and renegotiation-indication
  82. #endif
  83. #ifndef WOLFSSL_NO_TLS12
  84. #ifndef NO_WOLFSSL_CLIENT
  85. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32*,
  86. word32);
  87. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input, word32*,
  88. word32);
  89. #ifndef NO_CERTS
  90. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*,
  91. word32);
  92. #endif
  93. #ifdef HAVE_SESSION_TICKET
  94. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32*,
  95. word32);
  96. #endif
  97. #endif
  98. #ifndef NO_WOLFSSL_SERVER
  99. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32*, word32);
  100. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519)) && \
  101. !defined(WOLFSSL_NO_CLIENT_AUTH)
  102. static int DoCertificateVerify(WOLFSSL* ssl, byte*, word32*, word32);
  103. #endif
  104. #ifdef WOLFSSL_DTLS
  105. static int SendHelloVerifyRequest(WOLFSSL*, const byte*, byte);
  106. #endif /* WOLFSSL_DTLS */
  107. #endif
  108. #endif /* !WOLFSSL_NO_TLS12 */
  109. #ifdef WOLFSSL_DTLS
  110. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl);
  111. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl);
  112. #endif
  113. enum processReply {
  114. doProcessInit = 0,
  115. #ifndef NO_WOLFSSL_SERVER
  116. runProcessOldClientHello,
  117. #endif
  118. getRecordLayerHeader,
  119. getData,
  120. verifyEncryptedMessage,
  121. decryptMessage,
  122. verifyMessage,
  123. runProcessingOneMessage
  124. };
  125. #ifndef WOLFSSL_NO_TLS12
  126. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  127. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  128. static const byte tls13Downgrade[7] = {
  129. 0x44, 0x4f, 0x47, 0x4e, 0x47, 0x52, 0x44
  130. };
  131. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  132. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  133. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  134. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  135. int padSz, int content, int verify);
  136. #endif
  137. #endif /* !WOLFSSL_NO_TLS12 */
  138. #ifdef HAVE_QSH
  139. int QSH_Init(WOLFSSL* ssl);
  140. #endif
  141. int IsTLS(const WOLFSSL* ssl)
  142. {
  143. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  144. return 1;
  145. return 0;
  146. }
  147. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  148. {
  149. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  150. return 1;
  151. #ifdef WOLFSSL_DTLS
  152. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  153. return 1;
  154. #endif
  155. return 0;
  156. }
  157. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  158. {
  159. return (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  160. }
  161. static WC_INLINE int IsEncryptionOn(WOLFSSL* ssl, int isSend)
  162. {
  163. (void)isSend;
  164. #ifdef WOLFSSL_DTLS
  165. /* For DTLS, epoch 0 is always not encrypted. */
  166. if (ssl->options.dtls && !isSend && ssl->keys.curEpoch == 0)
  167. return 0;
  168. #endif /* WOLFSSL_DTLS */
  169. #ifdef WOLFSSL_TLS13
  170. if (isSend)
  171. return ssl->encrypt.setup;
  172. else
  173. return ssl->decrypt.setup;
  174. #else
  175. return ssl->keys.encryptionOn;
  176. #endif
  177. }
  178. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  179. /* If SCTP is not enabled returns the state of the dtls option.
  180. * If SCTP is enabled returns dtls && !sctp. */
  181. static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl)
  182. {
  183. int result = ssl->options.dtls;
  184. if (result) {
  185. #ifdef WOLFSSL_SCTP
  186. result = !ssl->options.dtlsSctp;
  187. #endif
  188. }
  189. return result;
  190. }
  191. #endif /* DTLS || !WOLFSSL_NO_TLS12 */
  192. #ifdef HAVE_QSH
  193. /* free all structs that where used with QSH */
  194. static int QSH_FreeAll(WOLFSSL* ssl)
  195. {
  196. QSHKey* key = ssl->QSH_Key;
  197. QSHKey* preKey = NULL;
  198. QSHSecret* secret = ssl->QSH_secret;
  199. QSHScheme* list = NULL;
  200. QSHScheme* preList = NULL;
  201. /* free elements in struct */
  202. while (key) {
  203. preKey = key;
  204. if (key->pri.buffer) {
  205. ForceZero(key->pri.buffer, key->pri.length);
  206. XFREE(key->pri.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  207. }
  208. if (key->pub.buffer)
  209. XFREE(key->pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  210. key = (QSHKey*)key->next;
  211. /* free struct */
  212. XFREE(preKey, ssl->heap, DYNAMIC_TYPE_QSH);
  213. }
  214. key = NULL;
  215. /* free all of peers QSH keys */
  216. key = ssl->peerQSHKey;
  217. while (key) {
  218. preKey = key;
  219. if (key->pri.buffer) {
  220. ForceZero(key->pri.buffer, key->pri.length);
  221. XFREE(key->pri.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  222. }
  223. if (key->pub.buffer)
  224. XFREE(key->pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  225. key = (QSHKey*)key->next;
  226. /* free struct */
  227. XFREE(preKey, ssl->heap, DYNAMIC_TYPE_QSH);
  228. }
  229. key = NULL;
  230. /* free secret information */
  231. if (secret) {
  232. /* free up the QSHScheme list in QSHSecret */
  233. if (secret->list)
  234. list = secret->list;
  235. while (list) {
  236. preList = list;
  237. if (list->PK)
  238. XFREE(list->PK, ssl->heap, DYNAMIC_TYPE_SECRET);
  239. list = (QSHScheme*)list->next;
  240. XFREE(preList, ssl->heap, DYNAMIC_TYPE_QSH);
  241. }
  242. /* free secret buffers */
  243. if (secret->SerSi) {
  244. if (secret->SerSi->buffer) {
  245. /* clear extra secret material that supplemented Master Secret*/
  246. ForceZero(secret->SerSi->buffer, secret->SerSi->length);
  247. XFREE(secret->SerSi->buffer, ssl->heap, DYNAMIC_TYPE_SECRET);
  248. }
  249. XFREE(secret->SerSi, ssl->heap, DYNAMIC_TYPE_SECRET);
  250. }
  251. if (secret->CliSi) {
  252. if (secret->CliSi->buffer) {
  253. /* clear extra secret material that supplemented Master Secret*/
  254. ForceZero(secret->CliSi->buffer, secret->CliSi->length);
  255. XFREE(secret->CliSi->buffer, ssl->heap, DYNAMIC_TYPE_SECRET);
  256. }
  257. XFREE(secret->CliSi, ssl->heap, DYNAMIC_TYPE_SECRET);
  258. }
  259. }
  260. XFREE(secret, ssl->heap, DYNAMIC_TYPE_QSH);
  261. secret = NULL;
  262. return 0;
  263. }
  264. #endif
  265. #ifdef HAVE_NTRU
  266. static WC_RNG* rng;
  267. static wolfSSL_Mutex* rngMutex;
  268. static word32 GetEntropy(unsigned char* out, word32 num_bytes)
  269. {
  270. int ret = 0;
  271. if (rng == NULL) {
  272. if ((rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), 0,
  273. DYNAMIC_TYPE_RNG)) == NULL)
  274. return DRBG_OUT_OF_MEMORY;
  275. wc_InitRng(rng);
  276. }
  277. if (rngMutex == NULL) {
  278. if ((rngMutex = (wolfSSL_Mutex*)XMALLOC(sizeof(wolfSSL_Mutex), 0,
  279. DYNAMIC_TYPE_MUTEX)) == NULL)
  280. return DRBG_OUT_OF_MEMORY;
  281. wc_InitMutex(rngMutex);
  282. }
  283. ret |= wc_LockMutex(rngMutex);
  284. ret |= wc_RNG_GenerateBlock(rng, out, num_bytes);
  285. ret |= wc_UnLockMutex(rngMutex);
  286. if (ret != 0)
  287. return DRBG_ENTROPY_FAIL;
  288. return DRBG_OK;
  289. }
  290. #endif /* HAVE_NTRU */
  291. #ifdef HAVE_LIBZ
  292. /* alloc user allocs to work with zlib */
  293. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  294. {
  295. (void)opaque;
  296. return XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  297. }
  298. static void myFree(void* opaque, void* memory)
  299. {
  300. (void)opaque;
  301. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  302. }
  303. /* init zlib comp/decomp streams, 0 on success */
  304. static int InitStreams(WOLFSSL* ssl)
  305. {
  306. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  307. ssl->c_stream.zfree = (free_func)myFree;
  308. ssl->c_stream.opaque = (voidpf)ssl->heap;
  309. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  310. return ZLIB_INIT_ERROR;
  311. ssl->didStreamInit = 1;
  312. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  313. ssl->d_stream.zfree = (free_func)myFree;
  314. ssl->d_stream.opaque = (voidpf)ssl->heap;
  315. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  316. return 0;
  317. }
  318. static void FreeStreams(WOLFSSL* ssl)
  319. {
  320. if (ssl->didStreamInit) {
  321. deflateEnd(&ssl->c_stream);
  322. inflateEnd(&ssl->d_stream);
  323. }
  324. }
  325. /* compress in to out, return out size or error */
  326. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  327. {
  328. int err;
  329. int currTotal = (int)ssl->c_stream.total_out;
  330. ssl->c_stream.next_in = in;
  331. ssl->c_stream.avail_in = inSz;
  332. ssl->c_stream.next_out = out;
  333. ssl->c_stream.avail_out = outSz;
  334. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  335. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  336. return (int)ssl->c_stream.total_out - currTotal;
  337. }
  338. /* decompress in to out, return out size or error */
  339. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  340. {
  341. int err;
  342. int currTotal = (int)ssl->d_stream.total_out;
  343. ssl->d_stream.next_in = in;
  344. ssl->d_stream.avail_in = inSz;
  345. ssl->d_stream.next_out = out;
  346. ssl->d_stream.avail_out = outSz;
  347. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  348. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  349. return (int)ssl->d_stream.total_out - currTotal;
  350. }
  351. #endif /* HAVE_LIBZ */
  352. #ifdef WOLFSSL_SESSION_EXPORT
  353. #ifdef WOLFSSL_DTLS
  354. /* serializes the cipher specs struct for exporting */
  355. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  356. {
  357. word32 idx = 0;
  358. CipherSpecs* specs;
  359. WOLFSSL_ENTER("ExportCipherSpecState");
  360. if (exp == NULL || ssl == NULL) {
  361. return BAD_FUNC_ARG;
  362. }
  363. specs= &(ssl->specs);
  364. if (DTLS_EXPORT_SPC_SZ > len) {
  365. return BUFFER_E;
  366. }
  367. XMEMSET(exp, 0, DTLS_EXPORT_SPC_SZ);
  368. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  369. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  370. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  371. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  372. exp[idx++] = specs->bulk_cipher_algorithm;
  373. exp[idx++] = specs->cipher_type;
  374. exp[idx++] = specs->mac_algorithm;
  375. exp[idx++] = specs->kea;
  376. exp[idx++] = specs->sig_algo;
  377. exp[idx++] = specs->hash_size;
  378. exp[idx++] = specs->pad_size;
  379. exp[idx++] = specs->static_ecdh;
  380. if (idx != DTLS_EXPORT_SPC_SZ) {
  381. WOLFSSL_MSG("DTLS_EXPORT_SPC_SZ needs updated and export version");
  382. return DTLS_EXPORT_VER_E;
  383. }
  384. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  385. (void)ver;
  386. return idx;
  387. }
  388. /* serializes the key struct for exporting */
  389. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  390. byte small)
  391. {
  392. word32 idx = 0;
  393. byte sz;
  394. Keys* keys;
  395. WOLFSSL_ENTER("ExportKeyState");
  396. if (exp == NULL || ssl == NULL) {
  397. return BAD_FUNC_ARG;
  398. }
  399. keys = &(ssl->keys);
  400. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  401. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  402. return BUFFER_E;
  403. }
  404. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  405. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  406. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  407. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  408. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  409. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  410. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  411. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  412. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  413. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  414. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  415. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  416. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  417. c16toa(keys->dtls_peer_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  418. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  419. idx += OPAQUE16_LEN;
  420. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  421. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  422. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  423. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  424. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  425. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  426. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  427. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  428. exp[idx++] = keys->encryptionOn;
  429. exp[idx++] = keys->decryptedCur;
  430. /* from here on the buffer needs checked because is variable length that
  431. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  432. {
  433. word32 i;
  434. if ((OPAQUE16_LEN * 2) + idx +
  435. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  436. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  437. return BUFFER_E;
  438. }
  439. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  440. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  441. c32toa(keys->peerSeq[0].window[i], exp + idx);
  442. idx += OPAQUE32_LEN;
  443. }
  444. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  445. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  446. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  447. idx += OPAQUE32_LEN;
  448. }
  449. }
  450. if (idx >= len) {
  451. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  452. return BUFFER_E;
  453. }
  454. #ifdef HAVE_TRUNCATED_HMAC
  455. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  456. exp[idx++] = ssl->truncated_hmac;
  457. #else
  458. sz = ssl->specs.hash_size;
  459. exp[idx++] = 0; /* no truncated hmac */
  460. #endif
  461. sz = (small)? 0: sz;
  462. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  463. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  464. return BUFFER_E;
  465. }
  466. exp[idx++] = sz;
  467. if (sz > 0) {
  468. #ifndef WOLFSSL_AEAD_ONLY
  469. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  470. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  471. #else
  472. XMEMSET(exp + idx, 0, sz); idx += sz;
  473. XMEMSET(exp + idx, 0, sz); idx += sz;
  474. #endif
  475. }
  476. sz = (small)? 0: ssl->specs.key_size;
  477. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  478. WOLFSSL_MSG("Buffer not large enough for write key");
  479. return BUFFER_E;
  480. }
  481. exp[idx++] = sz;
  482. if (sz > 0) {
  483. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  484. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  485. }
  486. sz = (small)? 0: ssl->specs.iv_size;
  487. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  488. WOLFSSL_MSG("Buffer not large enough for IVs");
  489. return BUFFER_E;
  490. }
  491. exp[idx++] = sz;
  492. if (sz > 0) {
  493. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  494. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  495. }
  496. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  497. idx += AEAD_MAX_EXP_SZ;
  498. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  499. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  500. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  501. return BUFFER_E;
  502. }
  503. exp[idx++] = sz;
  504. if (sz > 0) {
  505. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  506. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  507. }
  508. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  509. if (idx > DTLS_EXPORT_KEY_SZ) {
  510. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  511. return DTLS_EXPORT_VER_E;
  512. }
  513. WOLFSSL_LEAVE("ExportKeyState", idx);
  514. (void)ver;
  515. return idx;
  516. }
  517. static int ImportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  518. {
  519. word32 idx = 0;
  520. CipherSpecs* specs;
  521. WOLFSSL_ENTER("ImportCipherSpecState");
  522. if (exp == NULL || ssl == NULL) {
  523. return BAD_FUNC_ARG;
  524. }
  525. specs= &(ssl->specs);
  526. if (DTLS_EXPORT_SPC_SZ > len) {
  527. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  528. return BUFFER_E;
  529. }
  530. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  531. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  532. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  533. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  534. specs->bulk_cipher_algorithm = exp[idx++];
  535. specs->cipher_type = exp[idx++];
  536. specs->mac_algorithm = exp[idx++];
  537. specs->kea = exp[idx++];
  538. specs->sig_algo = exp[idx++];
  539. specs->hash_size = exp[idx++];
  540. specs->pad_size = exp[idx++];
  541. specs->static_ecdh = exp[idx++];
  542. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  543. (void)ver;
  544. return idx;
  545. }
  546. static int ImportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  547. {
  548. word32 idx = 0;
  549. byte sz;
  550. Keys* keys;
  551. WOLFSSL_ENTER("ImportKeyState");
  552. if (exp == NULL || ssl == NULL) {
  553. return BAD_FUNC_ARG;
  554. }
  555. keys = &(ssl->keys);
  556. /* check minimum length -- includes byte used for size indicators */
  557. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  558. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  559. return BUFFER_E;
  560. }
  561. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  562. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  563. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  564. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  565. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  566. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  567. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  568. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  569. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  570. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  571. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  572. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  573. ato16(exp + idx, &keys->dtls_peer_handshake_number); idx += OPAQUE16_LEN;
  574. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  575. idx += OPAQUE16_LEN;
  576. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  577. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  578. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi); idx += OPAQUE16_LEN;
  579. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo); idx += OPAQUE32_LEN;
  580. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  581. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  582. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  583. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  584. keys->encryptionOn = exp[idx++];
  585. keys->decryptedCur = exp[idx++];
  586. {
  587. word16 i, wordCount, wordAdj = 0;
  588. /* do window */
  589. ato16(exp + idx, &wordCount);
  590. idx += OPAQUE16_LEN;
  591. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  592. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  593. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  594. }
  595. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  596. for (i = 0; i < wordCount; i++) {
  597. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  598. idx += OPAQUE32_LEN;
  599. }
  600. idx += wordAdj;
  601. /* do prevWindow */
  602. ato16(exp + idx, &wordCount);
  603. idx += OPAQUE16_LEN;
  604. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  605. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  606. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  607. }
  608. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  609. for (i = 0; i < wordCount; i++) {
  610. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  611. idx += OPAQUE32_LEN;
  612. }
  613. idx += wordAdj;
  614. }
  615. #ifdef HAVE_TRUNCATED_HMAC
  616. ssl->truncated_hmac = exp[idx++];
  617. #else
  618. idx++; /* no truncated hmac */
  619. #endif
  620. sz = exp[idx++];
  621. #ifndef WOLFSSL_AEAD_ONLY
  622. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  623. WOLFSSL_MSG("Buffer not large enough for MAC import");
  624. return BUFFER_E;
  625. }
  626. if (sz > 0) {
  627. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  628. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  629. }
  630. #else
  631. if (sz + idx > len) {
  632. return BUFFER_E;
  633. }
  634. idx += sz; idx += sz;
  635. #endif
  636. sz = exp[idx++];
  637. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  638. WOLFSSL_MSG("Buffer not large enough for key import");
  639. return BUFFER_E;
  640. }
  641. if (sz > 0) {
  642. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  643. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  644. }
  645. sz = exp[idx++];
  646. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  647. WOLFSSL_MSG("Buffer not large enough for write IV import");
  648. return BUFFER_E;
  649. }
  650. if (sz > 0) {
  651. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  652. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  653. }
  654. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  655. idx += AEAD_MAX_EXP_SZ;
  656. sz = exp[idx++];
  657. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  658. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  659. return BUFFER_E;
  660. }
  661. if (sz > 0) {
  662. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  663. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  664. }
  665. WOLFSSL_LEAVE("ImportKeyState", idx);
  666. (void)ver;
  667. return idx;
  668. }
  669. /* copy over necessary information from Options struct to buffer
  670. * On success returns size of buffer used on failure returns a negative value */
  671. static int dtls_export_new(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  672. {
  673. int idx = 0;
  674. word16 zero = 0;
  675. Options* options = &ssl->options;
  676. WOLFSSL_ENTER("dtls_export_new");
  677. if (exp == NULL || options == NULL || len < DTLS_EXPORT_OPT_SZ) {
  678. return BAD_FUNC_ARG;
  679. }
  680. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  681. /* these options are kept and sent to indicate verify status and strength
  682. * of handshake */
  683. exp[idx++] = options->sendVerify;
  684. exp[idx++] = options->verifyPeer;
  685. exp[idx++] = options->verifyNone;
  686. exp[idx++] = options->downgrade;
  687. #ifndef NO_DH
  688. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  689. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  690. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  691. #else
  692. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  693. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  694. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  695. #endif
  696. #ifndef NO_RSA
  697. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  698. #else
  699. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  700. #endif
  701. #ifdef HAVE_ECC
  702. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  703. #else
  704. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  705. #endif
  706. /* these options are kept to indicate state and behavior */
  707. #ifndef NO_PSK
  708. exp[idx++] = options->havePSK;
  709. #else
  710. exp[idx++] = 0;
  711. #endif
  712. exp[idx++] = options->sessionCacheOff;
  713. exp[idx++] = options->sessionCacheFlushOff;
  714. exp[idx++] = options->side;
  715. exp[idx++] = options->resuming;
  716. exp[idx++] = options->haveSessionId;
  717. exp[idx++] = options->tls;
  718. exp[idx++] = options->tls1_1;
  719. exp[idx++] = options->dtls;
  720. exp[idx++] = options->connReset;
  721. exp[idx++] = options->isClosed;
  722. exp[idx++] = options->closeNotify;
  723. exp[idx++] = options->sentNotify;
  724. exp[idx++] = options->usingCompression;
  725. exp[idx++] = options->haveRSA;
  726. exp[idx++] = options->haveECC;
  727. exp[idx++] = options->haveDH;
  728. exp[idx++] = options->haveNTRU;
  729. exp[idx++] = options->haveQSH;
  730. exp[idx++] = options->haveECDSAsig;
  731. exp[idx++] = options->haveStaticECC;
  732. exp[idx++] = options->havePeerVerify;
  733. exp[idx++] = options->usingPSK_cipher;
  734. exp[idx++] = options->usingAnon_cipher;
  735. exp[idx++] = options->sendAlertState;
  736. exp[idx++] = options->partialWrite;
  737. exp[idx++] = options->quietShutdown;
  738. exp[idx++] = options->groupMessages;
  739. #ifdef HAVE_POLY1305
  740. exp[idx++] = options->oldPoly;
  741. #else
  742. exp[idx++] = 0;
  743. #endif
  744. #ifdef HAVE_ANON
  745. exp[idx++] = options->haveAnon;
  746. #else
  747. exp[idx++] = 0;
  748. #endif
  749. #ifdef HAVE_SESSION_TICKET
  750. exp[idx++] = options->createTicket;
  751. exp[idx++] = options->useTicket;
  752. #ifdef WOLFSSL_TLS13
  753. if (ver > DTLS_EXPORT_VERSION_3) {
  754. exp[idx++] = options->noTicketTls13;
  755. }
  756. #else
  757. if (ver > DTLS_EXPORT_VERSION_3) {
  758. exp[idx++] = 0;
  759. }
  760. #endif
  761. #else
  762. exp[idx++] = 0;
  763. exp[idx++] = 0;
  764. if (ver > DTLS_EXPORT_VERSION_3) {
  765. exp[idx++] = 0;
  766. }
  767. #endif
  768. exp[idx++] = options->processReply;
  769. exp[idx++] = options->cipherSuite0;
  770. exp[idx++] = options->cipherSuite;
  771. exp[idx++] = options->serverState;
  772. exp[idx++] = options->clientState;
  773. exp[idx++] = options->handShakeState;
  774. exp[idx++] = options->handShakeDone;
  775. exp[idx++] = options->minDowngrade;
  776. exp[idx++] = options->connectState;
  777. exp[idx++] = options->acceptState;
  778. exp[idx++] = options->asyncState;
  779. /* version of connection */
  780. exp[idx++] = ssl->version.major;
  781. exp[idx++] = ssl->version.minor;
  782. (void)zero;
  783. /* check if changes were made and notify of need to update export version */
  784. switch (ver) {
  785. case DTLS_EXPORT_VERSION_3:
  786. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  787. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  788. return DTLS_EXPORT_VER_E;
  789. }
  790. break;
  791. case DTLS_EXPORT_VERSION:
  792. if (idx != DTLS_EXPORT_OPT_SZ) {
  793. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  794. return DTLS_EXPORT_VER_E;
  795. }
  796. break;
  797. default:
  798. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  799. return DTLS_EXPORT_VER_E;
  800. }
  801. WOLFSSL_LEAVE("dtls_export_new", idx);
  802. return idx;
  803. }
  804. /* copy items from Export struct to Options struct
  805. * On success returns size of buffer used on failure returns a negative value */
  806. static int dtls_export_load(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  807. {
  808. int idx = 0;
  809. Options* options = &ssl->options;
  810. switch (ver) {
  811. case DTLS_EXPORT_VERSION:
  812. if (len < DTLS_EXPORT_OPT_SZ) {
  813. WOLFSSL_MSG("Sanity check on buffer size failed");
  814. return BAD_FUNC_ARG;
  815. }
  816. break;
  817. case DTLS_EXPORT_VERSION_3:
  818. if (len < DTLS_EXPORT_OPT_SZ_3) {
  819. WOLFSSL_MSG("Sanity check on buffer size failed");
  820. return BAD_FUNC_ARG;
  821. }
  822. break;
  823. default:
  824. WOLFSSL_MSG("Export version not supported");
  825. return BAD_FUNC_ARG;
  826. }
  827. if (exp == NULL || options == NULL) {
  828. return BAD_FUNC_ARG;
  829. }
  830. /* these options are kept and sent to indicate verify status and strength
  831. * of handshake */
  832. options->sendVerify = exp[idx++];
  833. options->verifyPeer = exp[idx++];
  834. options->verifyNone = exp[idx++];
  835. options->downgrade = exp[idx++];
  836. #ifndef NO_DH
  837. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  838. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  839. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  840. #else
  841. idx += OPAQUE16_LEN;
  842. idx += OPAQUE16_LEN;
  843. idx += OPAQUE16_LEN;
  844. #endif
  845. #ifndef NO_RSA
  846. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  847. #else
  848. idx += OPAQUE16_LEN;
  849. #endif
  850. #ifdef HAVE_ECC
  851. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  852. #else
  853. idx += OPAQUE16_LEN;
  854. #endif
  855. /* these options are kept to indicate state and behavior */
  856. #ifndef NO_PSK
  857. options->havePSK = exp[idx++];
  858. #else
  859. idx++;
  860. #endif
  861. options->sessionCacheOff = exp[idx++];
  862. options->sessionCacheFlushOff = exp[idx++];
  863. options->side = exp[idx++];
  864. options->resuming = exp[idx++];
  865. options->haveSessionId = exp[idx++];
  866. options->tls = exp[idx++];
  867. options->tls1_1 = exp[idx++];
  868. options->dtls = exp[idx++];
  869. options->connReset = exp[idx++];
  870. options->isClosed = exp[idx++];
  871. options->closeNotify = exp[idx++];
  872. options->sentNotify = exp[idx++];
  873. options->usingCompression = exp[idx++];
  874. options->haveRSA = exp[idx++];
  875. options->haveECC = exp[idx++];
  876. options->haveDH = exp[idx++];
  877. options->haveNTRU = exp[idx++];
  878. options->haveQSH = exp[idx++];
  879. options->haveECDSAsig = exp[idx++];
  880. options->haveStaticECC = exp[idx++];
  881. options->havePeerVerify = exp[idx++];
  882. options->usingPSK_cipher = exp[idx++];
  883. options->usingAnon_cipher = exp[idx++];
  884. options->sendAlertState = exp[idx++];
  885. options->partialWrite = exp[idx++];
  886. options->quietShutdown = exp[idx++];
  887. options->groupMessages = exp[idx++];
  888. #ifdef HAVE_POLY1305
  889. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  890. #else
  891. idx++;
  892. #endif
  893. #ifdef HAVE_ANON
  894. options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */
  895. #else
  896. idx++;
  897. #endif
  898. #ifdef HAVE_SESSION_TICKET
  899. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  900. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  901. #ifdef WOLFSSL_TLS13
  902. if (ver > DTLS_EXPORT_VERSION_3) {
  903. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  904. }
  905. #else
  906. if (ver > DTLS_EXPORT_VERSION_3) {
  907. exp[idx++] = 0;
  908. }
  909. #endif
  910. #else
  911. idx++;
  912. idx++;
  913. if (ver > DTLS_EXPORT_VERSION_3) {
  914. idx++;
  915. }
  916. #endif
  917. options->processReply = exp[idx++];
  918. options->cipherSuite0 = exp[idx++];
  919. options->cipherSuite = exp[idx++];
  920. options->serverState = exp[idx++];
  921. options->clientState = exp[idx++];
  922. options->handShakeState = exp[idx++];
  923. options->handShakeDone = exp[idx++];
  924. options->minDowngrade = exp[idx++];
  925. options->connectState = exp[idx++];
  926. options->acceptState = exp[idx++];
  927. options->asyncState = exp[idx++];
  928. /* version of connection */
  929. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  930. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  931. return VERSION_ERROR;
  932. }
  933. return idx;
  934. }
  935. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  936. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  937. {
  938. int idx = 0;
  939. int ipSz = DTLS_EXPORT_IP; /* start as max size */
  940. int fam = 0;
  941. word16 port = 0;
  942. char ip[DTLS_EXPORT_IP];
  943. if (ver != DTLS_EXPORT_VERSION) {
  944. WOLFSSL_MSG("Export version not supported");
  945. return BAD_FUNC_ARG;
  946. }
  947. if (ssl == NULL || exp == NULL || len < sizeof(ip) + 3 * DTLS_EXPORT_LEN) {
  948. return BAD_FUNC_ARG;
  949. }
  950. if (ssl->ctx->CBGetPeer == NULL) {
  951. WOLFSSL_MSG("No get peer call back set");
  952. return BAD_FUNC_ARG;
  953. }
  954. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  955. WOLFSSL_MSG("Get peer callback error");
  956. return SOCKET_ERROR_E;
  957. }
  958. /* check that ipSz/fam is not negative or too large since user can set cb */
  959. if (ipSz < 0 || ipSz > DTLS_EXPORT_IP || fam < 0) {
  960. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  961. return SOCKET_ERROR_E;
  962. }
  963. c16toa((word16)fam, exp + idx); idx += DTLS_EXPORT_LEN;
  964. c16toa((word16)ipSz, exp + idx); idx += DTLS_EXPORT_LEN;
  965. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  966. c16toa(port, exp + idx); idx += DTLS_EXPORT_LEN;
  967. return idx;
  968. }
  969. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  970. static int ImportPeerInfo(WOLFSSL* ssl, byte* buf, word32 len, byte ver)
  971. {
  972. word16 idx = 0;
  973. word16 ipSz;
  974. word16 fam;
  975. word16 port;
  976. char ip[DTLS_EXPORT_IP];
  977. if (ver != DTLS_EXPORT_VERSION && ver != DTLS_EXPORT_VERSION_3) {
  978. WOLFSSL_MSG("Export version not supported");
  979. return BAD_FUNC_ARG;
  980. }
  981. if (len == 0) {
  982. WOLFSSL_MSG("No peer info sent");
  983. return 0;
  984. }
  985. if (ssl == NULL || buf == NULL || len < 3 * DTLS_EXPORT_LEN) {
  986. return BAD_FUNC_ARG;
  987. }
  988. /* import sin family */
  989. ato16(buf + idx, &fam); idx += DTLS_EXPORT_LEN;
  990. /* import ip address idx, and ipSz are unsigned but cast for enum */
  991. ato16(buf + idx, &ipSz); idx += DTLS_EXPORT_LEN;
  992. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + DTLS_EXPORT_LEN) > len) {
  993. return BUFFER_E;
  994. }
  995. XMEMSET(ip, 0, sizeof(ip));
  996. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  997. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  998. ato16(buf + idx, &port); idx += DTLS_EXPORT_LEN;
  999. /* sanity check for a function to call, then use it to import peer info */
  1000. if (ssl->ctx->CBSetPeer == NULL) {
  1001. WOLFSSL_MSG("No set peer function");
  1002. return BAD_FUNC_ARG;
  1003. }
  1004. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  1005. WOLFSSL_MSG("Error setting peer info");
  1006. return SOCKET_ERROR_E;
  1007. }
  1008. return idx;
  1009. }
  1010. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1011. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1012. * passed in.
  1013. * On success returns the size of serialized session state.*/
  1014. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1015. {
  1016. int ret;
  1017. word32 idx = 0;
  1018. word32 totalLen = 0;
  1019. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1020. if (buf == NULL || ssl == NULL) {
  1021. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1022. return BAD_FUNC_ARG;
  1023. }
  1024. totalLen += DTLS_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1025. /* each of the following have a 2 byte length before data */
  1026. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1027. if (totalLen > sz) {
  1028. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1029. return BUFFER_E;
  1030. }
  1031. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1032. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1033. ((byte)DTLS_EXPORT_VERSION & 0X0F);
  1034. idx += DTLS_EXPORT_LEN; /* leave room for total length */
  1035. /* export keys struct and dtls state -- variable length stored in ret */
  1036. idx += DTLS_EXPORT_LEN; /* leave room for length */
  1037. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1038. DTLS_EXPORT_VERSION, 1)) < 0) {
  1039. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1040. return ret;
  1041. }
  1042. c16toa((word16)ret, buf + idx - DTLS_EXPORT_LEN); idx += ret;
  1043. /* place total length of exported buffer minus 2 bytes protocol/version */
  1044. c16toa((word16)(idx - DTLS_EXPORT_LEN), buf + DTLS_EXPORT_LEN);
  1045. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1046. /* if compiled with debug options then print the version, protocol, size */
  1047. {
  1048. char debug[256];
  1049. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1050. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1051. , (int)DTLS_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1052. WOLFSSL_MSG(debug);
  1053. }
  1054. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1055. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1056. return idx;
  1057. }
  1058. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session
  1059. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1060. * passed in.
  1061. * On success returns the size of serialized session.*/
  1062. int wolfSSL_dtls_export_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1063. {
  1064. int ret;
  1065. word32 idx = 0;
  1066. word32 totalLen = 0;
  1067. WOLFSSL_ENTER("wolfSSL_dtls_export_internal");
  1068. if (buf == NULL || ssl == NULL) {
  1069. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", BAD_FUNC_ARG);
  1070. return BAD_FUNC_ARG;
  1071. }
  1072. totalLen += DTLS_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1073. /* each of the following have a 2 byte length before data */
  1074. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1075. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1076. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_SPC_SZ;
  1077. totalLen += DTLS_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1078. if (totalLen > sz) {
  1079. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", BUFFER_E);
  1080. return BUFFER_E;
  1081. }
  1082. buf[idx++] = (byte)DTLS_EXPORT_PRO;
  1083. buf[idx++] = ((byte)DTLS_EXPORT_PRO & 0xF0) |
  1084. ((byte)DTLS_EXPORT_VERSION & 0X0F);
  1085. idx += DTLS_EXPORT_LEN; /* leave spot for length */
  1086. c16toa((word16)DTLS_EXPORT_OPT_SZ, buf + idx); idx += DTLS_EXPORT_LEN;
  1087. if ((ret = dtls_export_new(ssl, buf + idx, sz - idx,
  1088. DTLS_EXPORT_VERSION)) < 0) {
  1089. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1090. return ret;
  1091. }
  1092. idx += ret;
  1093. /* export keys struct and dtls state -- variable length stored in ret */
  1094. idx += DTLS_EXPORT_LEN; /* leave room for length */
  1095. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1096. DTLS_EXPORT_VERSION, 0)) < 0) {
  1097. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1098. return ret;
  1099. }
  1100. c16toa((word16)ret, buf + idx - DTLS_EXPORT_LEN); idx += ret;
  1101. /* export of cipher specs struct */
  1102. c16toa((word16)DTLS_EXPORT_SPC_SZ, buf + idx); idx += DTLS_EXPORT_LEN;
  1103. if ((ret = ExportCipherSpecState(ssl, buf + idx, sz - idx,
  1104. DTLS_EXPORT_VERSION)) < 0) {
  1105. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1106. return ret;
  1107. }
  1108. idx += ret;
  1109. /* export of dtls peer information */
  1110. idx += DTLS_EXPORT_LEN;
  1111. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1112. ret = 0; /* not saving peer port/ip information */
  1113. #else
  1114. if ((ret = ExportPeerInfo(ssl, buf + idx, sz - idx,
  1115. DTLS_EXPORT_VERSION)) < 0) {
  1116. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1117. return ret;
  1118. }
  1119. #endif
  1120. c16toa(ret, buf + idx - DTLS_EXPORT_LEN);
  1121. idx += ret;
  1122. /* place total length of exported buffer minus 2 bytes protocol/version */
  1123. c16toa((word16)(idx - DTLS_EXPORT_LEN), buf + DTLS_EXPORT_LEN);
  1124. /* if compiled with debug options then print the version, protocol, size */
  1125. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1126. {
  1127. char debug[256];
  1128. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session\n"
  1129. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1130. , (int)DTLS_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1131. WOLFSSL_MSG(debug);
  1132. }
  1133. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1134. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", idx);
  1135. return idx;
  1136. }
  1137. /* On success return amount of buffer consumed */
  1138. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1139. {
  1140. word32 idx = 0;
  1141. word16 length = 0;
  1142. int version;
  1143. int ret;
  1144. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1145. /* check at least enough room for protocol and length */
  1146. if (sz < DTLS_EXPORT_LEN * 2 || ssl == NULL) {
  1147. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1148. return BAD_FUNC_ARG;
  1149. }
  1150. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1151. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1152. WOLFSSL_MSG("Incorrect protocol");
  1153. return BAD_FUNC_ARG;
  1154. }
  1155. version = buf[idx++] & 0x0F;
  1156. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1157. if (length > sz - DTLS_EXPORT_LEN) { /* subtract 2 for protocol */
  1158. WOLFSSL_MSG("Buffer size sanity check failed");
  1159. return BUFFER_E;
  1160. }
  1161. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1162. /* if compiled with debug options then print the version, protocol, size */
  1163. {
  1164. char debug[256];
  1165. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1166. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1167. , (int)version, buf[0], (buf[1] >> 4), length);
  1168. WOLFSSL_MSG(debug);
  1169. }
  1170. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1171. /* perform sanity checks and extract Options information used */
  1172. switch (version) {
  1173. case DTLS_EXPORT_VERSION:
  1174. break;
  1175. default:
  1176. WOLFSSL_MSG("Bad export state version");
  1177. return BAD_FUNC_ARG;
  1178. }
  1179. /* perform sanity checks and extract Keys struct */
  1180. if (DTLS_EXPORT_LEN + idx > sz) {
  1181. WOLFSSL_MSG("Import Key struct error");
  1182. return BUFFER_E;
  1183. }
  1184. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1185. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1186. WOLFSSL_MSG("Import Key struct error");
  1187. return BUFFER_E;
  1188. }
  1189. if ((ret = ImportKeyState(ssl, buf + idx, length, version)) < 0) {
  1190. WOLFSSL_MSG("Import Key struct error");
  1191. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1192. return ret;
  1193. }
  1194. idx += ret;
  1195. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1196. return ret;
  1197. }
  1198. /* On success return amount of buffer consumed */
  1199. int wolfSSL_dtls_import_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1200. {
  1201. word32 idx = 0;
  1202. word16 length = 0;
  1203. int version;
  1204. int ret;
  1205. int optSz;
  1206. WOLFSSL_ENTER("wolfSSL_dtls_import_internal");
  1207. /* check at least enough room for protocol and length */
  1208. if (sz < DTLS_EXPORT_LEN * 2 || ssl == NULL) {
  1209. return BAD_FUNC_ARG;
  1210. }
  1211. /* sanity check on protocol ID and size of buffer */
  1212. if (buf[idx++] != (byte)DTLS_EXPORT_PRO ||
  1213. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1214. /* don't increment on second idx to next get version */
  1215. /* check if importing state only */
  1216. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1217. }
  1218. version = buf[idx++] & 0x0F;
  1219. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1220. if (length > sz - DTLS_EXPORT_LEN) { /* subtract 2 for protocol */
  1221. return BUFFER_E;
  1222. }
  1223. /* if compiled with debug options then print the version, protocol, size */
  1224. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1225. {
  1226. char debug[256];
  1227. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1228. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1229. , (int)version, buf[0], (buf[1] >> 4), length);
  1230. WOLFSSL_MSG(debug);
  1231. }
  1232. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1233. /* perform sanity checks and extract Options information used */
  1234. switch (version) {
  1235. case DTLS_EXPORT_VERSION:
  1236. optSz = DTLS_EXPORT_OPT_SZ;
  1237. break;
  1238. case DTLS_EXPORT_VERSION_3:
  1239. WOLFSSL_MSG("Importing older version 3");
  1240. optSz = DTLS_EXPORT_OPT_SZ_3;
  1241. break;
  1242. default:
  1243. WOLFSSL_MSG("Bad export version");
  1244. return BAD_FUNC_ARG;
  1245. }
  1246. if (DTLS_EXPORT_LEN + optSz + idx > sz) {
  1247. WOLFSSL_MSG("Import Options struct error");
  1248. return BUFFER_E;
  1249. }
  1250. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1251. if (length != optSz) {
  1252. WOLFSSL_MSG("Import Options struct error");
  1253. return BUFFER_E;
  1254. }
  1255. if ((ret = dtls_export_load(ssl, buf + idx, length, version)) < 0) {
  1256. WOLFSSL_MSG("Import Options struct error");
  1257. return ret;
  1258. }
  1259. idx += length;
  1260. /* perform sanity checks and extract Keys struct */
  1261. if (DTLS_EXPORT_LEN + idx > sz) {
  1262. WOLFSSL_MSG("Import Key struct error");
  1263. return BUFFER_E;
  1264. }
  1265. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1266. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1267. WOLFSSL_MSG("Import Key struct error");
  1268. return BUFFER_E;
  1269. }
  1270. if ((ret = ImportKeyState(ssl, buf + idx, length, version)) < 0) {
  1271. WOLFSSL_MSG("Import Key struct error");
  1272. return ret;
  1273. }
  1274. idx += ret;
  1275. /* perform sanity checks and extract CipherSpecs struct */
  1276. if (DTLS_EXPORT_LEN + DTLS_EXPORT_SPC_SZ + idx > sz) {
  1277. WOLFSSL_MSG("Import CipherSpecs struct error");
  1278. return BUFFER_E;
  1279. }
  1280. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1281. if ( length != DTLS_EXPORT_SPC_SZ) {
  1282. WOLFSSL_MSG("Import CipherSpecs struct error");
  1283. return BUFFER_E;
  1284. }
  1285. if ((ret = ImportCipherSpecState(ssl, buf + idx, length, version)) < 0) {
  1286. WOLFSSL_MSG("Import CipherSpecs struct error");
  1287. return ret;
  1288. }
  1289. idx += ret;
  1290. /* perform sanity checks and extract DTLS peer info */
  1291. if (DTLS_EXPORT_LEN + idx > sz) {
  1292. WOLFSSL_MSG("Import DTLS peer info error");
  1293. return BUFFER_E;
  1294. }
  1295. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1296. if (idx + length > sz) {
  1297. WOLFSSL_MSG("Import DTLS peer info error");
  1298. return BUFFER_E;
  1299. }
  1300. if ((ret = ImportPeerInfo(ssl, buf + idx, length, version)) < 0) {
  1301. WOLFSSL_MSG("Import Peer Addr error");
  1302. return ret;
  1303. }
  1304. idx += ret;
  1305. SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  1306. /* set hmac function to use when verifying */
  1307. if (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1308. ssl->options.dtls == 1) {
  1309. ssl->hmac = TLS_hmac;
  1310. }
  1311. /* make sure is a valid suite used */
  1312. if (wolfSSL_get_cipher(ssl) == NULL) {
  1313. WOLFSSL_MSG("Can not match cipher suite imported");
  1314. return MATCH_SUITE_ERROR;
  1315. }
  1316. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1317. if (ssl->specs.cipher_type == stream &&
  1318. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1319. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1320. return SANITY_CIPHER_E;
  1321. }
  1322. return idx;
  1323. }
  1324. #endif /* WOLFSSL_DTLS */
  1325. #endif /* WOLFSSL_SESSION_EXPORT */
  1326. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1327. {
  1328. method->version = pv;
  1329. method->side = WOLFSSL_CLIENT_END;
  1330. method->downgrade = 0;
  1331. }
  1332. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  1333. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1334. {
  1335. if (ssl == NULL)
  1336. return BAD_FUNC_ARG;
  1337. /* set side */
  1338. ssl->options.side = side;
  1339. /* reset options that are side specific */
  1340. #ifdef HAVE_NTRU
  1341. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1342. ssl->options.haveNTRU = 1; /* always on client side */
  1343. /* server can turn on by loading key */
  1344. }
  1345. #endif
  1346. #ifdef HAVE_ECC
  1347. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1348. ssl->options.haveECDSAsig = 1; /* always on client side */
  1349. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1350. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1351. }
  1352. #elif defined(HAVE_ED25519)
  1353. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1354. ssl->options.haveECDSAsig = 1; /* always on client side */
  1355. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1356. }
  1357. #endif
  1358. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1359. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1360. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1361. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1362. ssl->options.haveEMS = 1;
  1363. }
  1364. #ifdef WOLFSSL_DTLS
  1365. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1366. ssl->options.haveEMS = 1;
  1367. #endif /* WOLFSSL_DTLS */
  1368. }
  1369. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1370. return InitSSL_Suites(ssl);
  1371. }
  1372. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1373. /* Initialize SSL context, return 0 on success */
  1374. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1375. {
  1376. int ret = 0;
  1377. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1378. ctx->method = method;
  1379. ctx->refCount = 1; /* so either CTX_free or SSL_free can release */
  1380. ctx->heap = ctx; /* defaults to self */
  1381. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1382. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE; /* current default: TLSv1_MINOR */
  1383. if (wc_InitMutex(&ctx->countMutex) < 0) {
  1384. WOLFSSL_MSG("Mutex error on CTX init");
  1385. ctx->err = CTX_INIT_MUTEX_E;
  1386. return BAD_MUTEX_E;
  1387. }
  1388. #ifndef NO_DH
  1389. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1390. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1391. #endif
  1392. #ifndef NO_RSA
  1393. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1394. #endif
  1395. #ifdef HAVE_ECC
  1396. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1397. ctx->eccTempKeySz = ECDHE_SIZE;
  1398. #endif
  1399. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  1400. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1401. #endif
  1402. #ifdef OPENSSL_EXTRA
  1403. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1404. #endif
  1405. #ifndef WOLFSSL_USER_IO
  1406. #ifdef MICRIUM
  1407. ctx->CBIORecv = MicriumReceive;
  1408. ctx->CBIOSend = MicriumSend;
  1409. #ifdef WOLFSSL_DTLS
  1410. if (method->version.major == DTLS_MAJOR) {
  1411. ctx->CBIORecv = MicriumReceiveFrom;
  1412. ctx->CBIOSend = MicriumSendTo;
  1413. }
  1414. #ifdef WOLFSSL_SESSION_EXPORT
  1415. #error Micrium port does not support DTLS session export yet
  1416. #endif
  1417. #endif
  1418. #elif defined WOLFSSL_UIP
  1419. ctx->CBIORecv = uIPReceive;
  1420. ctx->CBIOSend = uIPSend;
  1421. #ifdef WOLFSSL_DTLS
  1422. if (method->version.major == DTLS_MAJOR) {
  1423. ctx->CBIOSendTo = uIPSendTo;
  1424. ctx->CBIORecvFrom = uIPRecvFrom;
  1425. }
  1426. #endif
  1427. #else
  1428. ctx->CBIORecv = EmbedReceive;
  1429. ctx->CBIOSend = EmbedSend;
  1430. #ifdef WOLFSSL_DTLS
  1431. if (method->version.major == DTLS_MAJOR) {
  1432. ctx->CBIORecv = EmbedReceiveFrom;
  1433. ctx->CBIOSend = EmbedSendTo;
  1434. }
  1435. #ifdef WOLFSSL_SESSION_EXPORT
  1436. ctx->CBGetPeer = EmbedGetPeer;
  1437. ctx->CBSetPeer = EmbedSetPeer;
  1438. #endif
  1439. #endif
  1440. #endif /* MICRIUM */
  1441. #endif /* WOLFSSL_USER_IO */
  1442. #ifdef HAVE_NETX
  1443. ctx->CBIORecv = NetX_Receive;
  1444. ctx->CBIOSend = NetX_Send;
  1445. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1446. ctx->CBIORecv = Mynewt_Receive;
  1447. ctx->CBIOSend = Mynewt_Send;
  1448. #elif defined(WOLFSSL_GNRC)
  1449. ctx->CBIORecv = GNRC_ReceiveFrom;
  1450. ctx->CBIOSend = GNRC_SendTo;
  1451. #endif
  1452. #ifdef HAVE_NTRU
  1453. if (method->side == WOLFSSL_CLIENT_END)
  1454. ctx->haveNTRU = 1; /* always on client side */
  1455. /* server can turn on by loading key */
  1456. #endif
  1457. #ifdef HAVE_ECC
  1458. if (method->side == WOLFSSL_CLIENT_END) {
  1459. ctx->haveECDSAsig = 1; /* always on client side */
  1460. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1461. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  1462. }
  1463. #elif defined(HAVE_ED25519)
  1464. if (method->side == WOLFSSL_CLIENT_END) {
  1465. ctx->haveECDSAsig = 1; /* always on client side */
  1466. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1467. }
  1468. #endif
  1469. ctx->devId = INVALID_DEVID;
  1470. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_SCTP)
  1471. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  1472. #endif
  1473. #ifndef NO_CERTS
  1474. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  1475. if (ctx->cm == NULL) {
  1476. WOLFSSL_MSG("Bad Cert Manager New");
  1477. return BAD_CERT_MANAGER_ERROR;
  1478. }
  1479. #ifdef OPENSSL_EXTRA
  1480. /* setup WOLFSSL_X509_STORE */
  1481. ctx->x509_store.cm = ctx->cm;
  1482. #endif
  1483. #endif
  1484. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1485. if (method->side == WOLFSSL_CLIENT_END) {
  1486. if ((method->version.major == SSLv3_MAJOR) &&
  1487. (method->version.minor >= TLSv1_MINOR)) {
  1488. ctx->haveEMS = 1;
  1489. }
  1490. #ifdef WOLFSSL_DTLS
  1491. if (method->version.major == DTLS_MAJOR)
  1492. ctx->haveEMS = 1;
  1493. #endif /* WOLFSSL_DTLS */
  1494. }
  1495. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1496. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  1497. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  1498. #endif
  1499. #ifdef HAVE_WOLF_EVENT
  1500. ret = wolfEventQueue_Init(&ctx->event_queue);
  1501. #endif /* HAVE_WOLF_EVENT */
  1502. #ifdef WOLFSSL_EARLY_DATA
  1503. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  1504. #endif
  1505. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  1506. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1507. return ret;
  1508. }
  1509. /* In case contexts are held in array and don't want to free actual ctx */
  1510. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  1511. {
  1512. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1513. int i;
  1514. #endif
  1515. #ifdef HAVE_WOLF_EVENT
  1516. wolfEventQueue_Free(&ctx->event_queue);
  1517. #endif /* HAVE_WOLF_EVENT */
  1518. XFREE(ctx->method, ctx->heap, DYNAMIC_TYPE_METHOD);
  1519. ctx->method = NULL;
  1520. if (ctx->suites) {
  1521. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  1522. ctx->suites = NULL;
  1523. }
  1524. #ifndef NO_DH
  1525. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1526. ctx->serverDH_G.buffer = NULL;
  1527. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1528. ctx->serverDH_P.buffer = NULL;
  1529. #endif /* !NO_DH */
  1530. #ifdef SINGLE_THREADED
  1531. if (ctx->rng) {
  1532. wc_FreeRng(ctx->rng);
  1533. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  1534. ctx->rng = NULL;
  1535. }
  1536. #endif /* SINGLE_THREADED */
  1537. #ifndef NO_CERTS
  1538. FreeDer(&ctx->privateKey);
  1539. FreeDer(&ctx->certificate);
  1540. #ifdef KEEP_OUR_CERT
  1541. if (ctx->ourCert && ctx->ownOurCert) {
  1542. FreeX509(ctx->ourCert);
  1543. XFREE(ctx->ourCert, ctx->heap, DYNAMIC_TYPE_X509);
  1544. ctx->ourCert = NULL;
  1545. }
  1546. #endif /* KEEP_OUR_CERT */
  1547. FreeDer(&ctx->certChain);
  1548. wolfSSL_CertManagerFree(ctx->cm);
  1549. ctx->cm = NULL;
  1550. #ifdef OPENSSL_EXTRA
  1551. /* ctx->cm was free'd so cm of x509 store should now be NULL */
  1552. if (ctx->x509_store_pt != NULL) {
  1553. ctx->x509_store_pt->cm = NULL;
  1554. }
  1555. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  1556. while (ctx->ca_names != NULL) {
  1557. WOLFSSL_STACK *next = ctx->ca_names->next;
  1558. wolfSSL_X509_NAME_free(ctx->ca_names->data.name);
  1559. XFREE(ctx->ca_names, NULL, DYNAMIC_TYPE_OPENSSL);
  1560. ctx->ca_names = next;
  1561. }
  1562. #endif
  1563. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  1564. while (ctx->x509Chain != NULL) {
  1565. WOLFSSL_STACK *next = ctx->x509Chain->next;
  1566. wolfSSL_X509_free(ctx->x509Chain->data.x509);
  1567. XFREE(ctx->x509Chain, NULL, DYNAMIC_TYPE_OPENSSL);
  1568. ctx->x509Chain = next;
  1569. }
  1570. #endif
  1571. #endif /* !NO_CERTS */
  1572. #ifdef HAVE_TLS_EXTENSIONS
  1573. TLSX_FreeAll(ctx->extensions, ctx->heap);
  1574. #ifndef NO_WOLFSSL_SERVER
  1575. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  1576. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  1577. if (ctx->certOcspRequest) {
  1578. FreeOcspRequest(ctx->certOcspRequest);
  1579. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  1580. }
  1581. #endif
  1582. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1583. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  1584. if (ctx->chainOcspRequest[i]) {
  1585. FreeOcspRequest(ctx->chainOcspRequest[i]);
  1586. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  1587. ctx->chainOcspRequest[i] = NULL;
  1588. }
  1589. }
  1590. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  1591. #endif /* !NO_WOLFSSL_SERVER */
  1592. #endif /* HAVE_TLS_EXTENSIONS */
  1593. #ifdef OPENSSL_EXTRA
  1594. if(ctx->alpn_cli_protos) {
  1595. XFREE((void *)ctx->alpn_cli_protos, NULL, DYNAMIC_TYPE_OPENSSL);
  1596. ctx->alpn_cli_protos = NULL;
  1597. }
  1598. #endif
  1599. #ifdef WOLFSSL_STATIC_MEMORY
  1600. if (ctx->heap != NULL) {
  1601. #ifdef WOLFSSL_HEAP_TEST
  1602. /* avoid dereferencing a test value */
  1603. if (ctx->heap != (void*)WOLFSSL_HEAP_TEST)
  1604. #endif
  1605. {
  1606. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)(ctx->heap);
  1607. wc_FreeMutex(&((WOLFSSL_HEAP*)(hint->memory))->memory_mutex);
  1608. }
  1609. }
  1610. #endif /* WOLFSSL_STATIC_MEMORY */
  1611. }
  1612. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  1613. {
  1614. int doFree = 0;
  1615. if (wc_LockMutex(&ctx->countMutex) != 0) {
  1616. WOLFSSL_MSG("Couldn't lock count mutex");
  1617. /* check error state, if mutex error code then mutex init failed but
  1618. * CTX was still malloc'd */
  1619. if (ctx->err == CTX_INIT_MUTEX_E) {
  1620. SSL_CtxResourceFree(ctx);
  1621. XFREE(ctx, ctx->heap, DYNAMIC_TYPE_CTX);
  1622. }
  1623. return;
  1624. }
  1625. ctx->refCount--;
  1626. if (ctx->refCount == 0)
  1627. doFree = 1;
  1628. wc_UnLockMutex(&ctx->countMutex);
  1629. if (doFree) {
  1630. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  1631. SSL_CtxResourceFree(ctx);
  1632. wc_FreeMutex(&ctx->countMutex);
  1633. XFREE(ctx, ctx->heap, DYNAMIC_TYPE_CTX);
  1634. }
  1635. else {
  1636. (void)ctx;
  1637. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  1638. }
  1639. }
  1640. /* Set cipher pointers to null */
  1641. void InitCiphers(WOLFSSL* ssl)
  1642. {
  1643. #ifdef BUILD_ARC4
  1644. ssl->encrypt.arc4 = NULL;
  1645. ssl->decrypt.arc4 = NULL;
  1646. #endif
  1647. #ifdef BUILD_DES3
  1648. ssl->encrypt.des3 = NULL;
  1649. ssl->decrypt.des3 = NULL;
  1650. #endif
  1651. #ifdef BUILD_AES
  1652. ssl->encrypt.aes = NULL;
  1653. ssl->decrypt.aes = NULL;
  1654. #endif
  1655. #ifdef HAVE_CAMELLIA
  1656. ssl->encrypt.cam = NULL;
  1657. ssl->decrypt.cam = NULL;
  1658. #endif
  1659. #ifdef HAVE_HC128
  1660. ssl->encrypt.hc128 = NULL;
  1661. ssl->decrypt.hc128 = NULL;
  1662. #endif
  1663. #ifdef BUILD_RABBIT
  1664. ssl->encrypt.rabbit = NULL;
  1665. ssl->decrypt.rabbit = NULL;
  1666. #endif
  1667. #ifdef HAVE_CHACHA
  1668. ssl->encrypt.chacha = NULL;
  1669. ssl->decrypt.chacha = NULL;
  1670. #endif
  1671. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  1672. ssl->auth.poly1305 = NULL;
  1673. #endif
  1674. ssl->encrypt.setup = 0;
  1675. ssl->decrypt.setup = 0;
  1676. #ifdef HAVE_ONE_TIME_AUTH
  1677. ssl->auth.setup = 0;
  1678. #endif
  1679. #ifdef HAVE_IDEA
  1680. ssl->encrypt.idea = NULL;
  1681. ssl->decrypt.idea = NULL;
  1682. #endif
  1683. }
  1684. /* Free ciphers */
  1685. void FreeCiphers(WOLFSSL* ssl)
  1686. {
  1687. (void)ssl;
  1688. #ifdef BUILD_ARC4
  1689. wc_Arc4Free(ssl->encrypt.arc4);
  1690. wc_Arc4Free(ssl->decrypt.arc4);
  1691. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1692. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1693. #endif
  1694. #ifdef BUILD_DES3
  1695. wc_Des3Free(ssl->encrypt.des3);
  1696. wc_Des3Free(ssl->decrypt.des3);
  1697. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1698. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1699. #endif
  1700. #ifdef BUILD_AES
  1701. wc_AesFree(ssl->encrypt.aes);
  1702. wc_AesFree(ssl->decrypt.aes);
  1703. #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \
  1704. !defined(WOLFSSL_NO_TLS12)
  1705. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1706. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1707. #endif
  1708. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1709. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1710. #endif
  1711. #ifdef CIPHER_NONCE
  1712. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1713. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1714. #endif
  1715. #ifdef HAVE_CAMELLIA
  1716. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1717. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1718. #endif
  1719. #ifdef HAVE_HC128
  1720. XFREE(ssl->encrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1721. XFREE(ssl->decrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1722. #endif
  1723. #ifdef BUILD_RABBIT
  1724. XFREE(ssl->encrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1725. XFREE(ssl->decrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1726. #endif
  1727. #ifdef HAVE_CHACHA
  1728. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1729. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1730. #endif
  1731. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  1732. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1733. #endif
  1734. #ifdef HAVE_IDEA
  1735. XFREE(ssl->encrypt.idea, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1736. XFREE(ssl->decrypt.idea, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1737. #endif
  1738. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  1739. wc_HmacFree(ssl->encrypt.hmac);
  1740. wc_HmacFree(ssl->decrypt.hmac);
  1741. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1742. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1743. #endif
  1744. }
  1745. void InitCipherSpecs(CipherSpecs* cs)
  1746. {
  1747. XMEMSET(cs, 0, sizeof(CipherSpecs));
  1748. cs->bulk_cipher_algorithm = INVALID_BYTE;
  1749. cs->cipher_type = INVALID_BYTE;
  1750. cs->mac_algorithm = INVALID_BYTE;
  1751. cs->kea = INVALID_BYTE;
  1752. cs->sig_algo = INVALID_BYTE;
  1753. }
  1754. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  1755. static int GetMacDigestSize(byte macAlgo)
  1756. {
  1757. switch (macAlgo) {
  1758. #ifndef NO_SHA
  1759. case sha_mac:
  1760. return WC_SHA_DIGEST_SIZE;
  1761. #endif
  1762. #ifndef NO_SHA256
  1763. case sha256_mac:
  1764. return WC_SHA256_DIGEST_SIZE;
  1765. #endif
  1766. #ifdef WOLFSSL_SHA384
  1767. case sha384_mac:
  1768. return WC_SHA384_DIGEST_SIZE;
  1769. #endif
  1770. #ifdef WOLFSSL_SHA512
  1771. case sha512_mac:
  1772. return WC_SHA512_DIGEST_SIZE;
  1773. #endif
  1774. default:
  1775. break;
  1776. }
  1777. return NOT_COMPILED_IN;
  1778. }
  1779. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  1780. static WC_INLINE void AddSuiteHashSigAlgo(Suites* suites, byte macAlgo, byte sigAlgo,
  1781. int keySz, word16* inOutIdx)
  1782. {
  1783. int addSigAlgo = 1;
  1784. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  1785. if (sigAlgo == ecc_dsa_sa_algo) {
  1786. int digestSz = GetMacDigestSize(macAlgo);
  1787. /* do not add sig/algos with digest size larger than key size */
  1788. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  1789. addSigAlgo = 0;
  1790. }
  1791. }
  1792. #else
  1793. (void)keySz;
  1794. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  1795. if (addSigAlgo) {
  1796. #ifdef WC_RSA_PSS
  1797. if (sigAlgo == rsa_pss_sa_algo) {
  1798. /* RSA PSS is sig then mac */
  1799. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1800. *inOutIdx += 1;
  1801. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  1802. *inOutIdx += 1;
  1803. #ifdef WOLFSSL_TLS13
  1804. /* Add the certificate algorithm as well */
  1805. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1806. *inOutIdx += 1;
  1807. suites->hashSigAlgo[*inOutIdx] = PSS_RSAE_TO_PSS_PSS(macAlgo);
  1808. *inOutIdx += 1;
  1809. #endif
  1810. }
  1811. else
  1812. #endif
  1813. {
  1814. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  1815. *inOutIdx += 1;
  1816. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1817. *inOutIdx += 1;
  1818. }
  1819. }
  1820. }
  1821. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  1822. int haveAnon, int tls1_2, int keySz)
  1823. {
  1824. word16 idx = 0;
  1825. (void)tls1_2;
  1826. (void)keySz;
  1827. #if defined(HAVE_ECC) || defined(HAVE_ED25519)
  1828. if (haveECDSAsig) {
  1829. #ifdef HAVE_ECC
  1830. #ifdef WOLFSSL_SHA512
  1831. AddSuiteHashSigAlgo(suites, sha512_mac, ecc_dsa_sa_algo, keySz, &idx);
  1832. #endif
  1833. #ifdef WOLFSSL_SHA384
  1834. AddSuiteHashSigAlgo(suites, sha384_mac, ecc_dsa_sa_algo, keySz, &idx);
  1835. #endif
  1836. #ifndef NO_SHA256
  1837. AddSuiteHashSigAlgo(suites, sha256_mac, ecc_dsa_sa_algo, keySz, &idx);
  1838. #endif
  1839. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  1840. defined(WOLFSSL_ALLOW_TLS_SHA1))
  1841. AddSuiteHashSigAlgo(suites, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  1842. #endif
  1843. #endif
  1844. #ifdef HAVE_ED25519
  1845. AddSuiteHashSigAlgo(suites, ED25519_SA_MAJOR, ED25519_SA_MINOR, keySz, &idx);
  1846. #endif
  1847. }
  1848. #endif /* HAVE_ECC || HAVE_ED25519 */
  1849. if (haveRSAsig) {
  1850. #ifdef WC_RSA_PSS
  1851. if (tls1_2) {
  1852. #ifdef WOLFSSL_SHA512
  1853. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_pss_sa_algo, keySz, &idx);
  1854. #endif
  1855. #ifdef WOLFSSL_SHA384
  1856. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_pss_sa_algo, keySz, &idx);
  1857. #endif
  1858. #ifndef NO_SHA256
  1859. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_pss_sa_algo, keySz, &idx);
  1860. #endif
  1861. }
  1862. #endif
  1863. #ifdef WOLFSSL_SHA512
  1864. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_sa_algo, keySz, &idx);
  1865. #endif
  1866. #ifdef WOLFSSL_SHA384
  1867. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_sa_algo, keySz, &idx);
  1868. #endif
  1869. #ifndef NO_SHA256
  1870. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_sa_algo, keySz, &idx);
  1871. #endif
  1872. #ifdef WOLFSSL_SHA224
  1873. AddSuiteHashSigAlgo(suites, sha224_mac, rsa_sa_algo, keySz, &idx);
  1874. #endif
  1875. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  1876. defined(WOLFSSL_ALLOW_TLS_SHA1))
  1877. AddSuiteHashSigAlgo(suites, sha_mac, rsa_sa_algo, keySz, &idx);
  1878. #endif
  1879. }
  1880. #ifdef HAVE_ANON
  1881. if (haveAnon) {
  1882. AddSuiteHashSigAlgo(suites, sha_mac, anonymous_sa_algo, keySz, &idx);
  1883. }
  1884. #endif
  1885. (void)haveAnon;
  1886. (void)haveECDSAsig;
  1887. suites->hashSigAlgoSz = idx;
  1888. }
  1889. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  1890. word16 havePSK, word16 haveDH, word16 haveNTRU,
  1891. word16 haveECDSAsig, word16 haveECC,
  1892. word16 haveStaticECC, int side)
  1893. {
  1894. word16 idx = 0;
  1895. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  1896. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  1897. #ifdef WOLFSSL_TLS13
  1898. int tls1_3 = IsAtLeastTLSv1_3(pv);
  1899. #endif
  1900. int dtls = 0;
  1901. int haveRSAsig = 1;
  1902. (void)tls; /* shut up compiler */
  1903. (void)tls1_2;
  1904. (void)dtls;
  1905. (void)haveDH;
  1906. (void)havePSK;
  1907. (void)haveNTRU;
  1908. (void)haveStaticECC;
  1909. (void)haveECC;
  1910. (void)side;
  1911. (void)haveRSA; /* some builds won't read */
  1912. (void)haveRSAsig; /* non ecc builds won't read */
  1913. if (suites == NULL) {
  1914. WOLFSSL_MSG("InitSuites pointer error");
  1915. return;
  1916. }
  1917. if (suites->setSuites)
  1918. return; /* trust user settings, don't override */
  1919. #ifdef WOLFSSL_TLS13
  1920. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  1921. if (tls1_3) {
  1922. suites->suites[idx++] = TLS13_BYTE;
  1923. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  1924. }
  1925. #endif
  1926. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  1927. if (tls1_3) {
  1928. suites->suites[idx++] = TLS13_BYTE;
  1929. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  1930. }
  1931. #endif
  1932. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  1933. if (tls1_3) {
  1934. suites->suites[idx++] = TLS13_BYTE;
  1935. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  1936. }
  1937. #endif
  1938. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  1939. if (tls1_3) {
  1940. suites->suites[idx++] = TLS13_BYTE;
  1941. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  1942. }
  1943. #endif
  1944. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  1945. if (tls1_3) {
  1946. suites->suites[idx++] = TLS13_BYTE;
  1947. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  1948. }
  1949. #endif
  1950. #ifdef HAVE_NULL_CIPHER
  1951. #ifdef BUILD_TLS_SHA256_SHA256
  1952. if (tls1_3) {
  1953. suites->suites[idx++] = ECC_BYTE;
  1954. suites->suites[idx++] = TLS_SHA256_SHA256;
  1955. }
  1956. #endif
  1957. #ifdef BUILD_TLS_SHA384_SHA384
  1958. if (tls1_3) {
  1959. suites->suites[idx++] = ECC_BYTE;
  1960. suites->suites[idx++] = TLS_SHA384_SHA384;
  1961. }
  1962. #endif
  1963. #endif
  1964. #endif /* WOLFSSL_TLS13 */
  1965. #ifndef WOLFSSL_NO_TLS12
  1966. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  1967. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  1968. haveRSA = 0; /* can't do RSA with ECDSA key */
  1969. }
  1970. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  1971. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  1972. }
  1973. #endif /* !NO_WOLFSSL_SERVER */
  1974. #ifdef WOLFSSL_DTLS
  1975. if (pv.major == DTLS_MAJOR) {
  1976. dtls = 1;
  1977. tls = 1;
  1978. /* May be dead assignments dependant upon configuration */
  1979. (void) dtls;
  1980. (void) tls;
  1981. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  1982. }
  1983. #endif
  1984. #ifdef HAVE_RENEGOTIATION_INDICATION
  1985. if (side == WOLFSSL_CLIENT_END) {
  1986. suites->suites[idx++] = CIPHER_BYTE;
  1987. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  1988. }
  1989. #endif
  1990. #ifdef BUILD_TLS_QSH
  1991. if (tls) {
  1992. suites->suites[idx++] = QSH_BYTE;
  1993. suites->suites[idx++] = TLS_QSH;
  1994. }
  1995. #endif
  1996. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  1997. if (tls && haveNTRU && haveRSA) {
  1998. suites->suites[idx++] = CIPHER_BYTE;
  1999. suites->suites[idx++] = TLS_NTRU_RSA_WITH_AES_256_CBC_SHA;
  2000. }
  2001. #endif
  2002. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  2003. if (tls && haveNTRU && haveRSA) {
  2004. suites->suites[idx++] = CIPHER_BYTE;
  2005. suites->suites[idx++] = TLS_NTRU_RSA_WITH_AES_128_CBC_SHA;
  2006. }
  2007. #endif
  2008. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  2009. if (!dtls && tls && haveNTRU && haveRSA) {
  2010. suites->suites[idx++] = CIPHER_BYTE;
  2011. suites->suites[idx++] = TLS_NTRU_RSA_WITH_RC4_128_SHA;
  2012. }
  2013. #endif
  2014. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  2015. if (tls && haveNTRU && haveRSA) {
  2016. suites->suites[idx++] = CIPHER_BYTE;
  2017. suites->suites[idx++] = TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA;
  2018. }
  2019. #endif
  2020. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2021. if (tls1_2 && haveECC) {
  2022. suites->suites[idx++] = ECC_BYTE;
  2023. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2024. }
  2025. #endif
  2026. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2027. if (tls1_2 && haveECC) {
  2028. suites->suites[idx++] = ECC_BYTE;
  2029. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2030. }
  2031. #endif
  2032. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2033. if (tls1_2 && haveRSA) {
  2034. suites->suites[idx++] = ECC_BYTE;
  2035. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2036. }
  2037. #endif
  2038. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2039. if (tls1_2 && haveRSA) {
  2040. suites->suites[idx++] = ECC_BYTE;
  2041. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2042. }
  2043. #endif
  2044. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2045. if (tls1_2 && haveDH && haveRSA) {
  2046. suites->suites[idx++] = CIPHER_BYTE;
  2047. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2048. }
  2049. #endif
  2050. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2051. if (tls1_2 && haveDH && haveRSA) {
  2052. suites->suites[idx++] = CIPHER_BYTE;
  2053. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2054. }
  2055. #endif
  2056. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  2057. if (tls1_2 && haveRSA) {
  2058. suites->suites[idx++] = CIPHER_BYTE;
  2059. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  2060. }
  2061. #endif
  2062. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  2063. if (tls1_2 && haveRSA) {
  2064. suites->suites[idx++] = CIPHER_BYTE;
  2065. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  2066. }
  2067. #endif
  2068. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  2069. if (tls1_2 && haveECC && haveStaticECC) {
  2070. suites->suites[idx++] = ECC_BYTE;
  2071. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  2072. }
  2073. #endif
  2074. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  2075. if (tls1_2 && haveECC && haveStaticECC) {
  2076. suites->suites[idx++] = ECC_BYTE;
  2077. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  2078. }
  2079. #endif
  2080. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  2081. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2082. suites->suites[idx++] = ECC_BYTE;
  2083. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  2084. }
  2085. #endif
  2086. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  2087. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2088. suites->suites[idx++] = ECC_BYTE;
  2089. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  2090. }
  2091. #endif
  2092. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  2093. if (tls1_2 && haveDH && havePSK) {
  2094. suites->suites[idx++] = CIPHER_BYTE;
  2095. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  2096. }
  2097. #endif
  2098. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  2099. if (tls1_2 && haveDH) {
  2100. suites->suites[idx++] = CIPHER_BYTE;
  2101. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  2102. }
  2103. #endif
  2104. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  2105. if (tls1_2 && haveDH) {
  2106. suites->suites[idx++] = CIPHER_BYTE;
  2107. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  2108. }
  2109. #endif
  2110. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  2111. if (tls1_2 && haveDH && havePSK) {
  2112. suites->suites[idx++] = CIPHER_BYTE;
  2113. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  2114. }
  2115. #endif
  2116. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  2117. if (tls1_2 && havePSK) {
  2118. suites->suites[idx++] = CIPHER_BYTE;
  2119. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  2120. }
  2121. #endif
  2122. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  2123. if (tls1_2 && havePSK) {
  2124. suites->suites[idx++] = CIPHER_BYTE;
  2125. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  2126. }
  2127. #endif
  2128. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  2129. if (tls1_2 && haveECC) {
  2130. suites->suites[idx++] = CHACHA_BYTE;
  2131. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  2132. }
  2133. #endif
  2134. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2135. if (tls1_2 && haveRSA) {
  2136. suites->suites[idx++] = CHACHA_BYTE;
  2137. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2138. }
  2139. #endif
  2140. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2141. if (tls1_2 && haveRSA) {
  2142. suites->suites[idx++] = CHACHA_BYTE;
  2143. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2144. }
  2145. #endif
  2146. /* Place as higher priority for MYSQL */
  2147. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  2148. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2149. if (tls && haveDH && haveRSA) {
  2150. suites->suites[idx++] = CIPHER_BYTE;
  2151. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2152. }
  2153. #endif
  2154. #endif
  2155. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  2156. if (tls1_2 && haveRSA) {
  2157. suites->suites[idx++] = ECC_BYTE;
  2158. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  2159. }
  2160. #endif
  2161. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  2162. if (tls1_2 && haveECC) {
  2163. suites->suites[idx++] = ECC_BYTE;
  2164. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  2165. }
  2166. #endif
  2167. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  2168. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2169. suites->suites[idx++] = ECC_BYTE;
  2170. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  2171. }
  2172. #endif
  2173. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  2174. if (tls1_2 && haveECC && haveStaticECC) {
  2175. suites->suites[idx++] = ECC_BYTE;
  2176. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  2177. }
  2178. #endif
  2179. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  2180. if (tls1_2 && haveRSA) {
  2181. suites->suites[idx++] = ECC_BYTE;
  2182. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  2183. }
  2184. #endif
  2185. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2186. if (tls1_2 && haveECC) {
  2187. suites->suites[idx++] = ECC_BYTE;
  2188. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  2189. }
  2190. #endif
  2191. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  2192. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2193. suites->suites[idx++] = ECC_BYTE;
  2194. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  2195. }
  2196. #endif
  2197. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  2198. if (tls1_2 && haveECC && haveStaticECC) {
  2199. suites->suites[idx++] = ECC_BYTE;
  2200. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  2201. }
  2202. #endif
  2203. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  2204. if (tls && haveECC) {
  2205. suites->suites[idx++] = ECC_BYTE;
  2206. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  2207. }
  2208. #endif
  2209. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  2210. if (tls && haveECC && haveStaticECC) {
  2211. suites->suites[idx++] = ECC_BYTE;
  2212. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  2213. }
  2214. #endif
  2215. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  2216. if (tls && haveECC) {
  2217. suites->suites[idx++] = ECC_BYTE;
  2218. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  2219. }
  2220. #endif
  2221. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  2222. if (tls && haveECC && haveStaticECC) {
  2223. suites->suites[idx++] = ECC_BYTE;
  2224. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  2225. }
  2226. #endif
  2227. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  2228. if (!dtls && tls && haveECC) {
  2229. suites->suites[idx++] = ECC_BYTE;
  2230. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  2231. }
  2232. #endif
  2233. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  2234. if (!dtls && tls && haveECC && haveStaticECC) {
  2235. suites->suites[idx++] = ECC_BYTE;
  2236. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  2237. }
  2238. #endif
  2239. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  2240. if (tls && haveECC) {
  2241. suites->suites[idx++] = ECC_BYTE;
  2242. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2243. }
  2244. #endif
  2245. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  2246. if (tls && haveECC && haveStaticECC) {
  2247. suites->suites[idx++] = ECC_BYTE;
  2248. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2249. }
  2250. #endif
  2251. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  2252. if (tls && haveRSA) {
  2253. suites->suites[idx++] = ECC_BYTE;
  2254. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  2255. }
  2256. #endif
  2257. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  2258. if (tls && haveRSAsig && haveStaticECC) {
  2259. suites->suites[idx++] = ECC_BYTE;
  2260. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  2261. }
  2262. #endif
  2263. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  2264. if (tls && haveRSA) {
  2265. suites->suites[idx++] = ECC_BYTE;
  2266. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  2267. }
  2268. #endif
  2269. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  2270. if (tls && haveRSAsig && haveStaticECC) {
  2271. suites->suites[idx++] = ECC_BYTE;
  2272. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  2273. }
  2274. #endif
  2275. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  2276. if (!dtls && tls && haveRSA) {
  2277. suites->suites[idx++] = ECC_BYTE;
  2278. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  2279. }
  2280. #endif
  2281. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  2282. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  2283. suites->suites[idx++] = ECC_BYTE;
  2284. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  2285. }
  2286. #endif
  2287. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  2288. if (tls && haveRSA) {
  2289. suites->suites[idx++] = ECC_BYTE;
  2290. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2291. }
  2292. #endif
  2293. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  2294. if (tls && haveRSAsig && haveStaticECC) {
  2295. suites->suites[idx++] = ECC_BYTE;
  2296. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  2297. }
  2298. #endif
  2299. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  2300. if (tls1_2 && haveECC) {
  2301. suites->suites[idx++] = ECC_BYTE;
  2302. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  2303. }
  2304. #endif
  2305. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  2306. if (tls1_2 && haveECC) {
  2307. suites->suites[idx++] = ECC_BYTE;
  2308. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  2309. }
  2310. #endif
  2311. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  2312. if (tls1_2 && haveECC) {
  2313. suites->suites[idx++] = ECC_BYTE;
  2314. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  2315. }
  2316. #endif
  2317. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  2318. if (tls1_2 && haveRSA) {
  2319. suites->suites[idx++] = ECC_BYTE;
  2320. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  2321. }
  2322. #endif
  2323. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  2324. if (tls1_2 && haveRSA) {
  2325. suites->suites[idx++] = ECC_BYTE;
  2326. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  2327. }
  2328. #endif
  2329. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  2330. if (tls && haveDH && haveRSA) {
  2331. suites->suites[idx++] = CIPHER_BYTE;
  2332. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  2333. }
  2334. #endif
  2335. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  2336. if (tls && haveDH && haveRSA) {
  2337. suites->suites[idx++] = CIPHER_BYTE;
  2338. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  2339. }
  2340. #endif
  2341. /* Place as higher priority for MYSQL testing */
  2342. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  2343. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2344. if (tls && haveDH && haveRSA) {
  2345. suites->suites[idx++] = CIPHER_BYTE;
  2346. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2347. }
  2348. #endif
  2349. #endif
  2350. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  2351. if (tls && haveDH && haveRSA) {
  2352. suites->suites[idx++] = CIPHER_BYTE;
  2353. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  2354. }
  2355. #endif
  2356. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  2357. if (tls && haveDH && haveRSA) {
  2358. suites->suites[idx++] = CIPHER_BYTE;
  2359. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2360. }
  2361. #endif
  2362. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  2363. if (tls && haveRSA) {
  2364. suites->suites[idx++] = CIPHER_BYTE;
  2365. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  2366. }
  2367. #endif
  2368. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  2369. if (tls && haveRSA) {
  2370. suites->suites[idx++] = CIPHER_BYTE;
  2371. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  2372. }
  2373. #endif
  2374. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  2375. if (tls && haveRSA) {
  2376. suites->suites[idx++] = CIPHER_BYTE;
  2377. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  2378. }
  2379. #endif
  2380. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  2381. if (tls && haveRSA) {
  2382. suites->suites[idx++] = CIPHER_BYTE;
  2383. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  2384. }
  2385. #endif
  2386. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2387. if (tls1_2 && haveECC) {
  2388. suites->suites[idx++] = CHACHA_BYTE;
  2389. suites->suites[idx++] =
  2390. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2391. }
  2392. #endif
  2393. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2394. if (tls1_2 && haveRSA) {
  2395. suites->suites[idx++] = CHACHA_BYTE;
  2396. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2397. }
  2398. #endif
  2399. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2400. if (tls1_2 && haveRSA) {
  2401. suites->suites[idx++] = CHACHA_BYTE;
  2402. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2403. }
  2404. #endif
  2405. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  2406. if (tls && haveECC) {
  2407. suites->suites[idx++] = ECC_BYTE;
  2408. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  2409. }
  2410. #endif
  2411. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  2412. if (tls && haveRSA) {
  2413. suites->suites[idx++] = CIPHER_BYTE;
  2414. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  2415. }
  2416. #endif
  2417. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  2418. if (tls && haveRSA) {
  2419. suites->suites[idx++] = CIPHER_BYTE;
  2420. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  2421. }
  2422. #endif
  2423. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  2424. if (tls && haveRSA) {
  2425. suites->suites[idx++] = CIPHER_BYTE;
  2426. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  2427. }
  2428. #endif
  2429. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  2430. if (tls && havePSK) {
  2431. suites->suites[idx++] = CIPHER_BYTE;
  2432. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  2433. }
  2434. #endif
  2435. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  2436. if (tls && haveDH && havePSK) {
  2437. suites->suites[idx++] = CIPHER_BYTE;
  2438. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  2439. }
  2440. #endif
  2441. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  2442. if (tls && havePSK) {
  2443. suites->suites[idx++] = CIPHER_BYTE;
  2444. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  2445. }
  2446. #endif
  2447. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  2448. if (tls && haveDH && havePSK) {
  2449. suites->suites[idx++] = CIPHER_BYTE;
  2450. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  2451. }
  2452. #endif
  2453. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  2454. if (tls && havePSK) {
  2455. suites->suites[idx++] = CIPHER_BYTE;
  2456. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  2457. }
  2458. #endif
  2459. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  2460. if (tls && havePSK) {
  2461. suites->suites[idx++] = CIPHER_BYTE;
  2462. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  2463. }
  2464. #endif
  2465. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  2466. if (tls && haveDH && havePSK) {
  2467. suites->suites[idx++] = ECC_BYTE;
  2468. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  2469. }
  2470. #endif
  2471. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  2472. if (tls && haveDH && havePSK) {
  2473. suites->suites[idx++] = ECC_BYTE;
  2474. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  2475. }
  2476. #endif
  2477. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  2478. if (tls && havePSK) {
  2479. suites->suites[idx++] = CHACHA_BYTE;
  2480. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2481. }
  2482. #endif
  2483. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  2484. if (tls && havePSK) {
  2485. suites->suites[idx++] = CHACHA_BYTE;
  2486. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2487. }
  2488. #endif
  2489. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  2490. if (tls && havePSK) {
  2491. suites->suites[idx++] = CHACHA_BYTE;
  2492. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2493. }
  2494. #endif
  2495. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  2496. if (tls && havePSK) {
  2497. suites->suites[idx++] = ECC_BYTE;
  2498. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  2499. }
  2500. #endif
  2501. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  2502. if (tls && havePSK) {
  2503. suites->suites[idx++] = ECC_BYTE;
  2504. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  2505. }
  2506. #endif
  2507. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  2508. if (tls && havePSK) {
  2509. suites->suites[idx++] = ECC_BYTE;
  2510. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  2511. }
  2512. #endif
  2513. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  2514. if (tls && havePSK) {
  2515. suites->suites[idx++] = ECC_BYTE;
  2516. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  2517. }
  2518. #endif
  2519. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  2520. if (tls && havePSK) {
  2521. suites->suites[idx++] = ECC_BYTE;
  2522. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  2523. }
  2524. #endif
  2525. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  2526. if (tls && haveDH && havePSK) {
  2527. suites->suites[idx++] = CIPHER_BYTE;
  2528. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  2529. }
  2530. #endif
  2531. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  2532. if (tls && havePSK) {
  2533. suites->suites[idx++] = CIPHER_BYTE;
  2534. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  2535. }
  2536. #endif
  2537. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  2538. if (tls && havePSK) {
  2539. suites->suites[idx++] = ECC_BYTE;
  2540. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  2541. }
  2542. #endif
  2543. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  2544. if (tls && haveDH && havePSK) {
  2545. suites->suites[idx++] = CIPHER_BYTE;
  2546. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  2547. }
  2548. #endif
  2549. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  2550. if (tls && havePSK) {
  2551. suites->suites[idx++] = CIPHER_BYTE;
  2552. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  2553. }
  2554. #endif
  2555. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  2556. if (tls && havePSK) {
  2557. suites->suites[idx++] = CIPHER_BYTE;
  2558. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  2559. }
  2560. #endif
  2561. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  2562. if (!dtls && haveRSA) {
  2563. suites->suites[idx++] = CIPHER_BYTE;
  2564. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  2565. }
  2566. #endif
  2567. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  2568. if (!dtls && haveRSA) {
  2569. suites->suites[idx++] = CIPHER_BYTE;
  2570. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  2571. }
  2572. #endif
  2573. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  2574. if (haveRSA ) {
  2575. suites->suites[idx++] = CIPHER_BYTE;
  2576. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  2577. }
  2578. #endif
  2579. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  2580. if (!dtls && tls && haveRSA) {
  2581. suites->suites[idx++] = CIPHER_BYTE;
  2582. suites->suites[idx++] = TLS_RSA_WITH_HC_128_MD5;
  2583. }
  2584. #endif
  2585. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  2586. if (!dtls && tls && haveRSA) {
  2587. suites->suites[idx++] = CIPHER_BYTE;
  2588. suites->suites[idx++] = TLS_RSA_WITH_HC_128_SHA;
  2589. }
  2590. #endif
  2591. #ifdef BUILD_TLS_RSA_WITH_HC_128_B2B256
  2592. if (!dtls && tls && haveRSA) {
  2593. suites->suites[idx++] = CIPHER_BYTE;
  2594. suites->suites[idx++] = TLS_RSA_WITH_HC_128_B2B256;
  2595. }
  2596. #endif
  2597. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_B2B256
  2598. if (tls && haveRSA) {
  2599. suites->suites[idx++] = CIPHER_BYTE;
  2600. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_B2B256;
  2601. }
  2602. #endif
  2603. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_B2B256
  2604. if (tls && haveRSA) {
  2605. suites->suites[idx++] = CIPHER_BYTE;
  2606. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_B2B256;
  2607. }
  2608. #endif
  2609. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  2610. if (!dtls && tls && haveRSA) {
  2611. suites->suites[idx++] = CIPHER_BYTE;
  2612. suites->suites[idx++] = TLS_RSA_WITH_RABBIT_SHA;
  2613. }
  2614. #endif
  2615. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  2616. if (tls && haveRSA) {
  2617. suites->suites[idx++] = CIPHER_BYTE;
  2618. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  2619. }
  2620. #endif
  2621. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  2622. if (tls && haveDH && haveRSA) {
  2623. suites->suites[idx++] = CIPHER_BYTE;
  2624. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  2625. }
  2626. #endif
  2627. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  2628. if (tls && haveRSA) {
  2629. suites->suites[idx++] = CIPHER_BYTE;
  2630. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  2631. }
  2632. #endif
  2633. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  2634. if (tls && haveDH && haveRSA) {
  2635. suites->suites[idx++] = CIPHER_BYTE;
  2636. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  2637. }
  2638. #endif
  2639. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  2640. if (tls && haveRSA) {
  2641. suites->suites[idx++] = CIPHER_BYTE;
  2642. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  2643. }
  2644. #endif
  2645. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  2646. if (tls && haveDH && haveRSA) {
  2647. suites->suites[idx++] = CIPHER_BYTE;
  2648. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  2649. }
  2650. #endif
  2651. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  2652. if (tls && haveRSA) {
  2653. suites->suites[idx++] = CIPHER_BYTE;
  2654. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  2655. }
  2656. #endif
  2657. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  2658. if (tls && haveDH && haveRSA) {
  2659. suites->suites[idx++] = CIPHER_BYTE;
  2660. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  2661. }
  2662. #endif
  2663. #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA
  2664. if (haveRSA) {
  2665. suites->suites[idx++] = CIPHER_BYTE;
  2666. suites->suites[idx++] = SSL_RSA_WITH_IDEA_CBC_SHA;
  2667. }
  2668. #endif
  2669. #endif /* !WOLFSSL_NO_TLS12 */
  2670. suites->suiteSz = idx;
  2671. InitSuitesHashSigAlgo(suites, haveECDSAsig | haveECC, haveRSAsig | haveRSA,
  2672. 0, tls1_2, keySz);
  2673. }
  2674. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  2675. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  2676. /* Decode the signature algorithm.
  2677. *
  2678. * input The encoded signature algorithm.
  2679. * hashalgo The hash algorithm.
  2680. * hsType The signature type.
  2681. */
  2682. static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  2683. {
  2684. switch (input[0]) {
  2685. case NEW_SA_MAJOR:
  2686. #ifdef HAVE_ED25519
  2687. /* ED25519: 0x0807 */
  2688. if (input[1] == ED25519_SA_MINOR) {
  2689. *hsType = ed25519_sa_algo;
  2690. /* Hash performed as part of sign/verify operation. */
  2691. *hashAlgo = sha512_mac;
  2692. }
  2693. else
  2694. #endif
  2695. #ifdef WC_RSA_PSS
  2696. /* PSS PSS signatures: 0x080[9-b] */
  2697. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  2698. *hsType = rsa_pss_pss_algo;
  2699. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  2700. }
  2701. else
  2702. #endif
  2703. /* ED448: 0x0808 */
  2704. {
  2705. *hsType = input[0];
  2706. *hashAlgo = input[1];
  2707. }
  2708. break;
  2709. default:
  2710. *hashAlgo = input[0];
  2711. *hsType = input[1];
  2712. break;
  2713. }
  2714. }
  2715. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  2716. #ifndef WOLFSSL_NO_TLS12
  2717. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  2718. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  2719. (!defined(NO_RSA) && defined(WC_RSA_PSS))
  2720. static enum wc_HashType HashAlgoToType(int hashAlgo)
  2721. {
  2722. switch (hashAlgo) {
  2723. #ifdef WOLFSSL_SHA512
  2724. case sha512_mac:
  2725. return WC_HASH_TYPE_SHA512;
  2726. #endif
  2727. #ifdef WOLFSSL_SHA384
  2728. case sha384_mac:
  2729. return WC_HASH_TYPE_SHA384;
  2730. #endif
  2731. #ifndef NO_SHA256
  2732. case sha256_mac:
  2733. return WC_HASH_TYPE_SHA256;
  2734. #endif
  2735. #ifdef WOLFSSL_SHA224
  2736. case sha224_mac:
  2737. return WC_HASH_TYPE_SHA224;
  2738. #endif
  2739. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2740. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2741. case sha_mac:
  2742. return WC_HASH_TYPE_SHA;
  2743. #endif
  2744. default:
  2745. WOLFSSL_MSG("Bad hash sig algo");
  2746. break;
  2747. }
  2748. return WC_HASH_TYPE_NONE;
  2749. }
  2750. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  2751. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  2752. #endif /* !WOLFSSL_NO_TLS12 */
  2753. #ifndef NO_CERTS
  2754. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag)
  2755. {
  2756. (void)dynamicFlag;
  2757. if (name != NULL) {
  2758. name->name = name->staticName;
  2759. name->dynamicName = 0;
  2760. name->sz = 0;
  2761. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  2762. XMEMSET(&name->fullName, 0, sizeof(DecodedName));
  2763. XMEMSET(&name->cnEntry, 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  2764. XMEMSET(&name->extra, 0, sizeof(name->extra));
  2765. name->cnEntry.value = &(name->cnEntry.data); /* point to internal data*/
  2766. name->cnEntry.nid = ASN_COMMON_NAME;
  2767. name->x509 = NULL;
  2768. #endif /* OPENSSL_EXTRA */
  2769. }
  2770. }
  2771. void FreeX509Name(WOLFSSL_X509_NAME* name, void* heap)
  2772. {
  2773. if (name != NULL) {
  2774. if (name->dynamicName) {
  2775. XFREE(name->name, heap, DYNAMIC_TYPE_SUBJECT_CN);
  2776. name->name = NULL;
  2777. }
  2778. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  2779. {
  2780. int i;
  2781. if (name->fullName.fullName != NULL) {
  2782. XFREE(name->fullName.fullName, heap, DYNAMIC_TYPE_X509);
  2783. name->fullName.fullName = NULL;
  2784. }
  2785. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  2786. /* free ASN1 string data */
  2787. if (name->extra[i].set && name->extra[i].data.data != NULL) {
  2788. XFREE(name->extra[i].data.data, heap, DYNAMIC_TYPE_OPENSSL);
  2789. }
  2790. }
  2791. wolfSSL_ASN1_OBJECT_free(&name->cnEntry.object);
  2792. }
  2793. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  2794. }
  2795. (void)heap;
  2796. }
  2797. /* Initialize wolfSSL X509 type */
  2798. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  2799. {
  2800. if (x509 == NULL) {
  2801. WOLFSSL_MSG("Null parameter passed in!");
  2802. return;
  2803. }
  2804. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  2805. x509->heap = heap;
  2806. InitX509Name(&x509->issuer, 0);
  2807. InitX509Name(&x509->subject, 0);
  2808. x509->dynamicMemory = (byte)dynamicFlag;
  2809. }
  2810. /* Free wolfSSL X509 type */
  2811. void FreeX509(WOLFSSL_X509* x509)
  2812. {
  2813. if (x509 == NULL)
  2814. return;
  2815. FreeX509Name(&x509->issuer, x509->heap);
  2816. FreeX509Name(&x509->subject, x509->heap);
  2817. if (x509->pubKey.buffer) {
  2818. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2819. x509->pubKey.buffer = NULL;
  2820. }
  2821. FreeDer(&x509->derCert);
  2822. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  2823. x509->sig.buffer = NULL;
  2824. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  2825. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  2826. x509->authKeyId = NULL;
  2827. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  2828. x509->subjKeyId = NULL;
  2829. if (x509->authInfo != NULL) {
  2830. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  2831. x509->authInfo = NULL;
  2832. }
  2833. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  2834. if (x509->authInfoCaIssuer != NULL) {
  2835. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  2836. }
  2837. if (x509->notBeforeTime != NULL) {
  2838. XFREE(x509->notBeforeTime, x509->heap, DYNAMIC_TYPE_OPENSSL);
  2839. }
  2840. if (x509->notAfterTime != NULL) {
  2841. XFREE(x509->notAfterTime, x509->heap, DYNAMIC_TYPE_OPENSSL);
  2842. }
  2843. if (x509->ext_sk != NULL) {
  2844. wolfSSL_sk_X509_EXTENSION_free(x509->ext_sk);
  2845. }
  2846. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  2847. if (x509->serialNumber != NULL) {
  2848. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  2849. }
  2850. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  2851. if (x509->extKeyUsageSrc != NULL) {
  2852. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  2853. x509->extKeyUsageSrc= NULL;
  2854. }
  2855. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  2856. if (x509->altNames) {
  2857. FreeAltNames(x509->altNames, x509->heap);
  2858. x509->altNames = NULL;
  2859. }
  2860. }
  2861. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  2862. #if !defined(WOLFSSL_NO_TLS12)
  2863. /* Encode the signature algorithm into buffer.
  2864. *
  2865. * hashalgo The hash algorithm.
  2866. * hsType The signature type.
  2867. * output The buffer to encode into.
  2868. */
  2869. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  2870. {
  2871. switch (hsType) {
  2872. #ifdef HAVE_ECC
  2873. case ecc_dsa_sa_algo:
  2874. output[0] = hashAlgo;
  2875. output[1] = ecc_dsa_sa_algo;
  2876. break;
  2877. #endif
  2878. #ifdef HAVE_ED25519
  2879. case ed25519_sa_algo:
  2880. output[0] = ED25519_SA_MAJOR;
  2881. output[1] = ED25519_SA_MINOR;
  2882. (void)hashAlgo;
  2883. break;
  2884. #endif
  2885. #ifndef NO_RSA
  2886. case rsa_sa_algo:
  2887. output[0] = hashAlgo;
  2888. output[1] = rsa_sa_algo;
  2889. break;
  2890. #ifdef WC_RSA_PSS
  2891. /* PSS signatures: 0x080[4-6] */
  2892. case rsa_pss_sa_algo:
  2893. output[0] = rsa_pss_sa_algo;
  2894. output[1] = hashAlgo;
  2895. break;
  2896. #endif
  2897. #endif
  2898. /* ED448: 0x0808 */
  2899. }
  2900. (void)hashAlgo;
  2901. (void)output;
  2902. }
  2903. #endif
  2904. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  2905. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  2906. {
  2907. switch (hashAlgo) {
  2908. #ifndef NO_SHA
  2909. case sha_mac:
  2910. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  2911. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  2912. break;
  2913. #endif /* !NO_SHA */
  2914. #ifndef NO_SHA256
  2915. case sha256_mac:
  2916. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  2917. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  2918. break;
  2919. #endif /* !NO_SHA256 */
  2920. #ifdef WOLFSSL_SHA384
  2921. case sha384_mac:
  2922. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  2923. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  2924. break;
  2925. #endif /* WOLFSSL_SHA384 */
  2926. #ifdef WOLFSSL_SHA512
  2927. case sha512_mac:
  2928. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  2929. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  2930. break;
  2931. #endif /* WOLFSSL_SHA512 */
  2932. } /* switch */
  2933. }
  2934. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  2935. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  2936. #endif /* !NO_CERTS */
  2937. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  2938. static word32 MacSize(WOLFSSL* ssl)
  2939. {
  2940. #ifdef HAVE_TRUNCATED_HMAC
  2941. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  2942. : ssl->specs.hash_size;
  2943. #else
  2944. word32 digestSz = ssl->specs.hash_size;
  2945. #endif
  2946. return digestSz;
  2947. }
  2948. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  2949. #ifndef NO_RSA
  2950. #ifndef WOLFSSL_NO_TLS12
  2951. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  2952. static int TypeHash(int hashAlgo)
  2953. {
  2954. switch (hashAlgo) {
  2955. #ifdef WOLFSSL_SHA512
  2956. case sha512_mac:
  2957. return SHA512h;
  2958. #endif
  2959. #ifdef WOLFSSL_SHA384
  2960. case sha384_mac:
  2961. return SHA384h;
  2962. #endif
  2963. #ifndef NO_SHA256
  2964. case sha256_mac:
  2965. return SHA256h;
  2966. #endif
  2967. #ifdef WOLFSSL_SHA224
  2968. case sha224_mac:
  2969. return SHA224h;
  2970. #endif
  2971. #ifndef NO_SHA
  2972. case sha_mac:
  2973. return SHAh;
  2974. #endif
  2975. }
  2976. return 0;
  2977. }
  2978. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  2979. #endif /* !WOLFSSL_NO_TLS12 */
  2980. #if defined(WC_RSA_PSS)
  2981. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  2982. {
  2983. switch (hashAlgo) {
  2984. #ifdef WOLFSSL_SHA512
  2985. case sha512_mac:
  2986. *hashType = WC_HASH_TYPE_SHA512;
  2987. if (mgf != NULL)
  2988. *mgf = WC_MGF1SHA512;
  2989. break;
  2990. #endif
  2991. #ifdef WOLFSSL_SHA384
  2992. case sha384_mac:
  2993. *hashType = WC_HASH_TYPE_SHA384;
  2994. if (mgf != NULL)
  2995. *mgf = WC_MGF1SHA384;
  2996. break;
  2997. #endif
  2998. #ifndef NO_SHA256
  2999. case sha256_mac:
  3000. *hashType = WC_HASH_TYPE_SHA256;
  3001. if (mgf != NULL)
  3002. *mgf = WC_MGF1SHA256;
  3003. break;
  3004. #endif
  3005. default:
  3006. return BAD_FUNC_ARG;
  3007. }
  3008. return 0;
  3009. }
  3010. #endif
  3011. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3012. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3013. DerBuffer* keyBufInfo)
  3014. {
  3015. int ret;
  3016. #ifdef HAVE_PK_CALLBACKS
  3017. const byte* keyBuf = NULL;
  3018. word32 keySz = 0;
  3019. if (keyBufInfo) {
  3020. keyBuf = keyBufInfo->buffer;
  3021. keySz = keyBufInfo->length;
  3022. }
  3023. #endif
  3024. (void)ssl;
  3025. (void)keyBufInfo;
  3026. (void)sigAlgo;
  3027. (void)hashAlgo;
  3028. WOLFSSL_ENTER("RsaSign");
  3029. #ifdef WOLFSSL_ASYNC_CRYPT
  3030. /* initialize event */
  3031. if (key) {
  3032. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3033. if (ret != 0)
  3034. return ret;
  3035. }
  3036. #endif
  3037. #if defined(WC_RSA_PSS)
  3038. if (sigAlgo == rsa_pss_sa_algo) {
  3039. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3040. int mgf = 0;
  3041. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3042. if (ret != 0)
  3043. return ret;
  3044. #if defined(HAVE_PK_CALLBACKS)
  3045. if (ssl->ctx->RsaPssSignCb) {
  3046. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3047. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  3048. TypeHash(hashAlgo), mgf,
  3049. keyBuf, keySz, ctx);
  3050. }
  3051. else
  3052. #endif
  3053. {
  3054. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  3055. ssl->rng);
  3056. }
  3057. }
  3058. else
  3059. #endif
  3060. #if defined(HAVE_PK_CALLBACKS)
  3061. if (ssl->ctx->RsaSignCb) {
  3062. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3063. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3064. ctx);
  3065. }
  3066. else
  3067. #endif /*HAVE_PK_CALLBACKS */
  3068. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  3069. /* Handle async pending response */
  3070. #ifdef WOLFSSL_ASYNC_CRYPT
  3071. if (key && ret == WC_PENDING_E) {
  3072. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3073. }
  3074. #endif /* WOLFSSL_ASYNC_CRYPT */
  3075. /* For positive response return in outSz */
  3076. if (ret > 0) {
  3077. *outSz = ret;
  3078. ret = 0;
  3079. }
  3080. WOLFSSL_LEAVE("RsaSign", ret);
  3081. return ret;
  3082. }
  3083. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  3084. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  3085. {
  3086. int ret;
  3087. #ifdef HAVE_PK_CALLBACKS
  3088. const byte* keyBuf = NULL;
  3089. word32 keySz = 0;
  3090. if (keyBufInfo) {
  3091. keyBuf = keyBufInfo->buffer;
  3092. keySz = keyBufInfo->length;
  3093. }
  3094. #endif
  3095. (void)ssl;
  3096. (void)keyBufInfo;
  3097. (void)sigAlgo;
  3098. (void)hashAlgo;
  3099. WOLFSSL_ENTER("RsaVerify");
  3100. #ifdef WOLFSSL_ASYNC_CRYPT
  3101. /* initialize event */
  3102. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3103. if (ret != 0)
  3104. return ret;
  3105. #endif
  3106. #if defined(WC_RSA_PSS)
  3107. if (sigAlgo == rsa_pss_sa_algo) {
  3108. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3109. int mgf = 0;
  3110. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3111. if (ret != 0)
  3112. return ret;
  3113. #ifdef HAVE_PK_CALLBACKS
  3114. if (ssl->ctx->RsaPssVerifyCb) {
  3115. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  3116. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  3117. TypeHash(hashAlgo), mgf,
  3118. keyBuf, keySz, ctx);
  3119. }
  3120. else
  3121. #endif /*HAVE_PK_CALLBACKS */
  3122. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  3123. }
  3124. else
  3125. #endif
  3126. #ifdef HAVE_PK_CALLBACKS
  3127. if (ssl->ctx->RsaVerifyCb) {
  3128. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  3129. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3130. }
  3131. else
  3132. #endif /*HAVE_PK_CALLBACKS */
  3133. {
  3134. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  3135. }
  3136. /* Handle async pending response */
  3137. #ifdef WOLFSSL_ASYNC_CRYPT
  3138. if (ret == WC_PENDING_E) {
  3139. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3140. }
  3141. #endif /* WOLFSSL_ASYNC_CRYPT */
  3142. WOLFSSL_LEAVE("RsaVerify", ret);
  3143. return ret;
  3144. }
  3145. /* Verify RSA signature, 0 on success */
  3146. /* This function is used to check the sign result */
  3147. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  3148. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3149. DerBuffer* keyBufInfo)
  3150. {
  3151. byte* out = NULL; /* inline result */
  3152. int ret;
  3153. #ifdef HAVE_PK_CALLBACKS
  3154. const byte* keyBuf = NULL;
  3155. word32 keySz = 0;
  3156. if (keyBufInfo) {
  3157. keyBuf = keyBufInfo->buffer;
  3158. keySz = keyBufInfo->length;
  3159. }
  3160. #endif
  3161. (void)ssl;
  3162. (void)keyBufInfo;
  3163. (void)sigAlgo;
  3164. (void)hashAlgo;
  3165. WOLFSSL_ENTER("VerifyRsaSign");
  3166. if (verifySig == NULL || plain == NULL) {
  3167. return BAD_FUNC_ARG;
  3168. }
  3169. if (sigSz > ENCRYPT_LEN) {
  3170. WOLFSSL_MSG("Signature buffer too big");
  3171. return BUFFER_E;
  3172. }
  3173. #ifdef WOLFSSL_ASYNC_CRYPT
  3174. /* initialize event */
  3175. if (key) {
  3176. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3177. if (ret != 0)
  3178. return ret;
  3179. }
  3180. #endif
  3181. #if defined(WC_RSA_PSS)
  3182. if (sigAlgo == rsa_pss_sa_algo) {
  3183. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3184. int mgf = 0;
  3185. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3186. if (ret != 0)
  3187. return ret;
  3188. #ifdef HAVE_PK_CALLBACKS
  3189. if (ssl->ctx->RsaPssSignCheckCb) {
  3190. /* The key buffer includes private/public portion,
  3191. but only public is used */
  3192. /* If HSM hardware is checking the signature result you can
  3193. optionally skip the sign check and return 0 */
  3194. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3195. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3196. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  3197. TypeHash(hashAlgo), mgf,
  3198. keyBuf, keySz, ctx);
  3199. }
  3200. else
  3201. #endif /* HAVE_PK_CALLBACKS */
  3202. {
  3203. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  3204. key);
  3205. }
  3206. if (ret > 0) {
  3207. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret, hashType);
  3208. if (ret != 0)
  3209. ret = VERIFY_CERT_ERROR;
  3210. }
  3211. }
  3212. else
  3213. #endif /* WC_RSA_PSS */
  3214. {
  3215. #ifdef HAVE_PK_CALLBACKS
  3216. if (ssl->ctx->RsaSignCheckCb) {
  3217. /* The key buffer includes private/public portion,
  3218. but only public is used */
  3219. /* If HSM hardware is checking the signature result you can
  3220. optionally skip the sign check and return 0 */
  3221. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3222. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3223. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  3224. keyBuf, keySz, ctx);
  3225. }
  3226. else
  3227. #endif /* HAVE_PK_CALLBACKS */
  3228. {
  3229. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  3230. }
  3231. if (ret > 0) {
  3232. if (ret != (int)plainSz || !out ||
  3233. XMEMCMP(plain, out, plainSz) != 0) {
  3234. WOLFSSL_MSG("RSA Signature verification failed");
  3235. ret = RSA_SIGN_FAULT;
  3236. } else {
  3237. ret = 0; /* RSA reset */
  3238. }
  3239. }
  3240. }
  3241. /* Handle async pending response */
  3242. #ifdef WOLFSSL_ASYNC_CRYPT
  3243. if (key && ret == WC_PENDING_E) {
  3244. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3245. }
  3246. #endif /* WOLFSSL_ASYNC_CRYPT */
  3247. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  3248. return ret;
  3249. }
  3250. #ifndef WOLFSSL_NO_TLS12
  3251. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  3252. RsaKey* key, DerBuffer* keyBufInfo)
  3253. {
  3254. int ret;
  3255. #ifdef HAVE_PK_CALLBACKS
  3256. const byte* keyBuf = NULL;
  3257. word32 keySz = 0;
  3258. if (keyBufInfo) {
  3259. keyBuf = keyBufInfo->buffer;
  3260. keySz = keyBufInfo->length;
  3261. }
  3262. #endif
  3263. (void)ssl;
  3264. (void)keyBufInfo;
  3265. WOLFSSL_ENTER("RsaDec");
  3266. #ifdef WOLFSSL_ASYNC_CRYPT
  3267. /* initialize event */
  3268. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3269. if (ret != 0)
  3270. return ret;
  3271. #endif
  3272. #ifdef HAVE_PK_CALLBACKS
  3273. if (ssl->ctx->RsaDecCb) {
  3274. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  3275. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3276. }
  3277. else
  3278. #endif /* HAVE_PK_CALLBACKS */
  3279. {
  3280. #ifdef WC_RSA_BLINDING
  3281. ret = wc_RsaSetRNG(key, ssl->rng);
  3282. if (ret != 0)
  3283. return ret;
  3284. #endif
  3285. ret = wc_RsaPrivateDecryptInline(in, inSz, out, key);
  3286. }
  3287. /* Handle async pending response */
  3288. #ifdef WOLFSSL_ASYNC_CRYPT
  3289. if (ret == WC_PENDING_E) {
  3290. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3291. }
  3292. #endif /* WOLFSSL_ASYNC_CRYPT */
  3293. /* For positive response return in outSz */
  3294. if (ret > 0) {
  3295. *outSz = ret;
  3296. ret = 0;
  3297. }
  3298. WOLFSSL_LEAVE("RsaDec", ret);
  3299. return ret;
  3300. }
  3301. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  3302. RsaKey* key, buffer* keyBufInfo)
  3303. {
  3304. int ret;
  3305. #ifdef HAVE_PK_CALLBACKS
  3306. const byte* keyBuf = NULL;
  3307. word32 keySz = 0;
  3308. if (keyBufInfo) {
  3309. keyBuf = keyBufInfo->buffer;
  3310. keySz = keyBufInfo->length;
  3311. }
  3312. #endif
  3313. (void)ssl;
  3314. (void)keyBufInfo;
  3315. WOLFSSL_ENTER("RsaEnc");
  3316. #ifdef WOLFSSL_ASYNC_CRYPT
  3317. /* initialize event */
  3318. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3319. if (ret != 0)
  3320. return ret;
  3321. #endif
  3322. #ifdef HAVE_PK_CALLBACKS
  3323. if (ssl->ctx->RsaEncCb) {
  3324. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  3325. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  3326. }
  3327. else
  3328. #endif /* HAVE_PK_CALLBACKS */
  3329. {
  3330. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  3331. }
  3332. /* Handle async pending response */
  3333. #ifdef WOLFSSL_ASYNC_CRYPT
  3334. if (ret == WC_PENDING_E) {
  3335. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3336. }
  3337. #endif /* WOLFSSL_ASYNC_CRYPT */
  3338. /* For positive response return in outSz */
  3339. if (ret > 0) {
  3340. *outSz = ret;
  3341. ret = 0;
  3342. }
  3343. WOLFSSL_LEAVE("RsaEnc", ret);
  3344. return ret;
  3345. }
  3346. #endif /* !WOLFSSL_NO_TLS12 */
  3347. #endif /* NO_RSA */
  3348. #ifdef HAVE_ECC
  3349. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3350. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  3351. {
  3352. int ret;
  3353. #ifdef HAVE_PK_CALLBACKS
  3354. const byte* keyBuf = NULL;
  3355. word32 keySz = 0;
  3356. if (keyBufInfo) {
  3357. keyBuf = keyBufInfo->buffer;
  3358. keySz = keyBufInfo->length;
  3359. }
  3360. #endif
  3361. (void)ssl;
  3362. (void)keyBufInfo;
  3363. WOLFSSL_ENTER("EccSign");
  3364. #ifdef WOLFSSL_ASYNC_CRYPT
  3365. /* initialize event */
  3366. if (key) {
  3367. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3368. if (ret != 0)
  3369. return ret;
  3370. }
  3371. #endif
  3372. #if defined(HAVE_PK_CALLBACKS)
  3373. if (ssl->ctx->EccSignCb) {
  3374. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  3375. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  3376. keySz, ctx);
  3377. }
  3378. else
  3379. #endif /* HAVE_PK_CALLBACKS */
  3380. {
  3381. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  3382. }
  3383. /* Handle async pending response */
  3384. #ifdef WOLFSSL_ASYNC_CRYPT
  3385. if (key && ret == WC_PENDING_E) {
  3386. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3387. }
  3388. #endif /* WOLFSSL_ASYNC_CRYPT */
  3389. WOLFSSL_LEAVE("EccSign", ret);
  3390. return ret;
  3391. }
  3392. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  3393. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  3394. {
  3395. int ret;
  3396. #ifdef HAVE_PK_CALLBACKS
  3397. const byte* keyBuf = NULL;
  3398. word32 keySz = 0;
  3399. if (keyBufInfo) {
  3400. keyBuf = keyBufInfo->buffer;
  3401. keySz = keyBufInfo->length;
  3402. }
  3403. #endif
  3404. (void)ssl;
  3405. (void)keyBufInfo;
  3406. WOLFSSL_ENTER("EccVerify");
  3407. #ifdef WOLFSSL_ASYNC_CRYPT
  3408. /* initialize event */
  3409. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3410. if (ret != 0)
  3411. return ret;
  3412. #endif
  3413. #ifdef HAVE_PK_CALLBACKS
  3414. if (ssl->ctx->EccVerifyCb) {
  3415. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  3416. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3417. &ssl->eccVerifyRes, ctx);
  3418. }
  3419. else
  3420. #endif /* HAVE_PK_CALLBACKS */
  3421. {
  3422. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  3423. }
  3424. /* Handle async pending response */
  3425. #ifdef WOLFSSL_ASYNC_CRYPT
  3426. if (ret == WC_PENDING_E) {
  3427. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3428. }
  3429. else
  3430. #endif /* WOLFSSL_ASYNC_CRYPT */
  3431. {
  3432. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  3433. }
  3434. WOLFSSL_LEAVE("EccVerify", ret);
  3435. return ret;
  3436. }
  3437. #ifdef HAVE_PK_CALLBACKS
  3438. /* Gets ECC key for shared secret callback testing
  3439. * Client side: returns peer key
  3440. * Server side: returns private key
  3441. */
  3442. static int EccGetKey(WOLFSSL* ssl, ecc_key** otherKey)
  3443. {
  3444. int ret = NO_PEER_KEY;
  3445. ecc_key* tmpKey = NULL;
  3446. if (ssl == NULL || otherKey == NULL) {
  3447. return BAD_FUNC_ARG;
  3448. }
  3449. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  3450. if (ssl->specs.static_ecdh) {
  3451. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent ||
  3452. !ssl->peerEccDsaKey->dp) {
  3453. return NO_PEER_KEY;
  3454. }
  3455. tmpKey = (struct ecc_key*)ssl->peerEccDsaKey;
  3456. }
  3457. else {
  3458. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  3459. !ssl->peerEccKey->dp) {
  3460. return NO_PEER_KEY;
  3461. }
  3462. tmpKey = (struct ecc_key*)ssl->peerEccKey;
  3463. }
  3464. }
  3465. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  3466. if (ssl->specs.static_ecdh) {
  3467. if (ssl->hsKey == NULL) {
  3468. return NO_PRIVATE_KEY;
  3469. }
  3470. tmpKey = (struct ecc_key*)ssl->hsKey;
  3471. }
  3472. else {
  3473. if (!ssl->eccTempKeyPresent) {
  3474. return NO_PRIVATE_KEY;
  3475. }
  3476. tmpKey = (struct ecc_key*)ssl->eccTempKey;
  3477. }
  3478. }
  3479. if (tmpKey) {
  3480. *otherKey = tmpKey;
  3481. ret = 0;
  3482. }
  3483. return ret;
  3484. }
  3485. #endif /* HAVE_PK_CALLBACKS */
  3486. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  3487. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  3488. int side)
  3489. {
  3490. int ret;
  3491. #ifdef HAVE_PK_CALLBACKS
  3492. ecc_key* otherKey = NULL;
  3493. #endif
  3494. #ifdef WOLFSSL_ASYNC_CRYPT
  3495. WC_ASYNC_DEV* asyncDev = &priv_key->asyncDev;
  3496. #endif
  3497. (void)ssl;
  3498. (void)pubKeyDer;
  3499. (void)pubKeySz;
  3500. (void)side;
  3501. WOLFSSL_ENTER("EccSharedSecret");
  3502. #ifdef HAVE_PK_CALLBACKS
  3503. if (ssl->ctx->EccSharedSecretCb) {
  3504. ret = EccGetKey(ssl, &otherKey);
  3505. if (ret != 0)
  3506. return ret;
  3507. #ifdef WOLFSSL_ASYNC_CRYPT
  3508. asyncDev = &otherKey->asyncDev;
  3509. #endif
  3510. }
  3511. #endif
  3512. #ifdef WOLFSSL_ASYNC_CRYPT
  3513. /* initialize event */
  3514. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3515. if (ret != 0)
  3516. return ret;
  3517. #endif
  3518. #ifdef HAVE_PK_CALLBACKS
  3519. if (ssl->ctx->EccSharedSecretCb) {
  3520. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  3521. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  3522. pubKeySz, out, outlen, side, ctx);
  3523. }
  3524. else
  3525. #endif
  3526. {
  3527. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  3528. }
  3529. /* Handle async pending response */
  3530. #ifdef WOLFSSL_ASYNC_CRYPT
  3531. if (ret == WC_PENDING_E) {
  3532. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  3533. }
  3534. #endif /* WOLFSSL_ASYNC_CRYPT */
  3535. WOLFSSL_LEAVE("EccSharedSecret", ret);
  3536. return ret;
  3537. }
  3538. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  3539. {
  3540. int ret = 0;
  3541. int keySz = 0;
  3542. int ecc_curve = ECC_CURVE_DEF;
  3543. WOLFSSL_ENTER("EccMakeKey");
  3544. #ifdef WOLFSSL_ASYNC_CRYPT
  3545. /* initialize event */
  3546. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  3547. if (ret != 0)
  3548. return ret;
  3549. #endif
  3550. /* get key size */
  3551. if (peer == NULL) {
  3552. keySz = ssl->eccTempKeySz;
  3553. }
  3554. else {
  3555. keySz = peer->dp->size;
  3556. }
  3557. /* get curve type */
  3558. if (ssl->ecdhCurveOID > 0) {
  3559. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  3560. }
  3561. #ifdef HAVE_PK_CALLBACKS
  3562. if (ssl->ctx->EccKeyGenCb) {
  3563. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  3564. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  3565. }
  3566. else
  3567. #endif
  3568. {
  3569. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  3570. }
  3571. /* make sure the curve is set for TLS */
  3572. if (ret == 0 && key->dp) {
  3573. ssl->ecdhCurveOID = key->dp->oidSum;
  3574. }
  3575. /* Handle async pending response */
  3576. #ifdef WOLFSSL_ASYNC_CRYPT
  3577. if (ret == WC_PENDING_E) {
  3578. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3579. }
  3580. #endif /* WOLFSSL_ASYNC_CRYPT */
  3581. WOLFSSL_LEAVE("EccMakeKey", ret);
  3582. return ret;
  3583. }
  3584. #endif /* HAVE_ECC */
  3585. #ifdef HAVE_ED25519
  3586. /* Check whether the key contains a public key.
  3587. * If not then pull it out of the leaf certificate.
  3588. *
  3589. * ssl SSL/TLS object.
  3590. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  3591. * 0 on success.
  3592. */
  3593. int Ed25519CheckPubKey(WOLFSSL* ssl)
  3594. {
  3595. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  3596. int ret = 0;
  3597. /* Public key required for signing. */
  3598. if (!key->pubKeySet) {
  3599. DerBuffer* leaf = ssl->buffers.certificate;
  3600. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert),
  3601. ssl->heap, DYNAMIC_TYPE_DCERT);
  3602. if (cert == NULL)
  3603. ret = MEMORY_E;
  3604. if (ret == 0) {
  3605. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  3606. ret = DecodeToKey(cert, 0);
  3607. }
  3608. if (ret == 0) {
  3609. ret = wc_ed25519_import_public(cert->publicKey, cert->pubKeySize,
  3610. key);
  3611. }
  3612. if (cert != NULL) {
  3613. FreeDecodedCert(cert);
  3614. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  3615. }
  3616. }
  3617. return ret;
  3618. }
  3619. /* Sign the data using EdDSA and key using Ed25519.
  3620. *
  3621. * ssl SSL object.
  3622. * in Data or message to sign.
  3623. * inSz Length of the data.
  3624. * out Buffer to hold signature.
  3625. * outSz On entry, size of the buffer. On exit, the size of the signature.
  3626. * key The private Ed25519 key data.
  3627. * keySz The length of the private key data in bytes.
  3628. * ctx The callback context.
  3629. * returns 0 on success, otherwise the value is an error.
  3630. */
  3631. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3632. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  3633. {
  3634. int ret;
  3635. #ifdef HAVE_PK_CALLBACKS
  3636. const byte* keyBuf = NULL;
  3637. word32 keySz = 0;
  3638. if (keyBufInfo) {
  3639. keyBuf = keyBufInfo->buffer;
  3640. keySz = keyBufInfo->length;
  3641. }
  3642. #endif
  3643. (void)ssl;
  3644. (void)keyBufInfo;
  3645. WOLFSSL_ENTER("Ed25519Sign");
  3646. #ifdef WOLFSSL_ASYNC_CRYPT
  3647. /* initialize event */
  3648. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3649. if (ret != 0)
  3650. return ret;
  3651. #endif
  3652. #if defined(HAVE_PK_CALLBACKS)
  3653. if (ssl->ctx->Ed25519SignCb) {
  3654. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  3655. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  3656. keySz, ctx);
  3657. }
  3658. else
  3659. #endif /* HAVE_PK_CALLBACKS */
  3660. {
  3661. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  3662. }
  3663. /* Handle async pending response */
  3664. #ifdef WOLFSSL_ASYNC_CRYPT
  3665. if (ret == WC_PENDING_E) {
  3666. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3667. }
  3668. #endif /* WOLFSSL_ASYNC_CRYPT */
  3669. WOLFSSL_LEAVE("Ed25519Sign", ret);
  3670. return ret;
  3671. }
  3672. /* Verify the data using EdDSA and key using Ed25519.
  3673. *
  3674. * ssl SSL object.
  3675. * in Signature data.
  3676. * inSz Length of the signature data in bytes.
  3677. * msg Message to verify.
  3678. * outSz Length of message in bytes.
  3679. * key The public Ed25519 key data.
  3680. * keySz The length of the private key data in bytes.
  3681. * ctx The callback context.
  3682. * returns 0 on success, otherwise the value is an error.
  3683. */
  3684. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  3685. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  3686. {
  3687. int ret;
  3688. #ifdef HAVE_PK_CALLBACKS
  3689. const byte* keyBuf = NULL;
  3690. word32 keySz = 0;
  3691. if (keyBufInfo) {
  3692. keyBuf = keyBufInfo->buffer;
  3693. keySz = keyBufInfo->length;
  3694. }
  3695. #endif
  3696. (void)ssl;
  3697. (void)keyBufInfo;
  3698. WOLFSSL_ENTER("Ed25519Verify");
  3699. #ifdef WOLFSSL_ASYNC_CRYPT
  3700. /* initialize event */
  3701. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3702. if (ret != 0)
  3703. return ret;
  3704. #endif
  3705. #ifdef HAVE_PK_CALLBACKS
  3706. if (ssl->ctx->Ed25519VerifyCb) {
  3707. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  3708. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  3709. keySz, &ssl->eccVerifyRes, ctx);
  3710. }
  3711. else
  3712. #endif /* HAVE_PK_CALLBACKS */
  3713. {
  3714. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  3715. &ssl->eccVerifyRes, key);
  3716. }
  3717. /* Handle async pending response */
  3718. #ifdef WOLFSSL_ASYNC_CRYPT
  3719. if (ret == WC_PENDING_E) {
  3720. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3721. }
  3722. else
  3723. #endif /* WOLFSSL_ASYNC_CRYPT */
  3724. {
  3725. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  3726. }
  3727. WOLFSSL_LEAVE("Ed25519Verify", ret);
  3728. return ret;
  3729. }
  3730. #endif /* HAVE_ED25519 */
  3731. #ifndef WOLFSSL_NO_TLS12
  3732. #ifdef HAVE_CURVE25519
  3733. #ifdef HAVE_PK_CALLBACKS
  3734. /* Gets X25519 key for shared secret callback testing
  3735. * Client side: returns peer key
  3736. * Server side: returns private key
  3737. */
  3738. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  3739. {
  3740. int ret = NO_PEER_KEY;
  3741. struct curve25519_key* tmpKey = NULL;
  3742. if (ssl == NULL || otherKey == NULL) {
  3743. return BAD_FUNC_ARG;
  3744. }
  3745. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  3746. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  3747. !ssl->peerX25519Key->dp) {
  3748. return NO_PEER_KEY;
  3749. }
  3750. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  3751. }
  3752. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  3753. if (!ssl->eccTempKeyPresent) {
  3754. return NO_PRIVATE_KEY;
  3755. }
  3756. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  3757. }
  3758. if (tmpKey) {
  3759. *otherKey = (curve25519_key *)tmpKey;
  3760. ret = 0;
  3761. }
  3762. return ret;
  3763. }
  3764. #endif /* HAVE_PK_CALLBACKS */
  3765. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  3766. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  3767. byte* out, word32* outlen, int side)
  3768. {
  3769. int ret;
  3770. (void)ssl;
  3771. (void)pubKeyDer;
  3772. (void)pubKeySz;
  3773. (void)side;
  3774. WOLFSSL_ENTER("X25519SharedSecret");
  3775. #ifdef WOLFSSL_ASYNC_CRYPT
  3776. /* initialize event */
  3777. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3778. if (ret != 0)
  3779. return ret;
  3780. #endif
  3781. #ifdef HAVE_PK_CALLBACKS
  3782. if (ssl->ctx->X25519SharedSecretCb) {
  3783. curve25519_key* otherKey = NULL;
  3784. ret = X25519GetKey(ssl, &otherKey);
  3785. if (ret == 0) {
  3786. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  3787. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  3788. pubKeySz, out, outlen, side, ctx);
  3789. }
  3790. }
  3791. else
  3792. #endif
  3793. {
  3794. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  3795. EC25519_LITTLE_ENDIAN);
  3796. }
  3797. /* Handle async pending response */
  3798. #ifdef WOLFSSL_ASYNC_CRYPT
  3799. if (ret == WC_PENDING_E) {
  3800. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  3801. }
  3802. #endif /* WOLFSSL_ASYNC_CRYPT */
  3803. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  3804. return ret;
  3805. }
  3806. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  3807. curve25519_key* peer)
  3808. {
  3809. int ret = 0;
  3810. (void)peer;
  3811. WOLFSSL_ENTER("X25519MakeKey");
  3812. #ifdef WOLFSSL_ASYNC_CRYPT
  3813. /* initialize event */
  3814. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  3815. if (ret != 0)
  3816. return ret;
  3817. #endif
  3818. #ifdef HAVE_PK_CALLBACKS
  3819. if (ssl->ctx->X25519KeyGenCb) {
  3820. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  3821. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  3822. }
  3823. else
  3824. #endif
  3825. {
  3826. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  3827. }
  3828. if (ret == 0) {
  3829. ssl->ecdhCurveOID = ECC_X25519_OID;
  3830. }
  3831. /* Handle async pending response */
  3832. #ifdef WOLFSSL_ASYNC_CRYPT
  3833. if (ret == WC_PENDING_E) {
  3834. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3835. }
  3836. #endif /* WOLFSSL_ASYNC_CRYPT */
  3837. WOLFSSL_LEAVE("X25519MakeKey", ret);
  3838. return ret;
  3839. }
  3840. #endif /* HAVE_CURVE25519 */
  3841. #if !defined(NO_CERTS) || !defined(NO_PSK)
  3842. #if !defined(NO_DH)
  3843. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  3844. byte* priv, word32* privSz,
  3845. byte* pub, word32* pubSz)
  3846. {
  3847. int ret;
  3848. WOLFSSL_ENTER("DhGenKeyPair");
  3849. #ifdef WOLFSSL_ASYNC_CRYPT
  3850. /* initialize event */
  3851. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  3852. if (ret != 0)
  3853. return ret;
  3854. #endif
  3855. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  3856. /* Handle async pending response */
  3857. #ifdef WOLFSSL_ASYNC_CRYPT
  3858. if (ret == WC_PENDING_E) {
  3859. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  3860. }
  3861. #endif /* WOLFSSL_ASYNC_CRYPT */
  3862. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  3863. return ret;
  3864. }
  3865. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  3866. const byte* priv, word32 privSz,
  3867. const byte* otherPub, word32 otherPubSz,
  3868. byte* agree, word32* agreeSz)
  3869. {
  3870. int ret;
  3871. (void)ssl;
  3872. WOLFSSL_ENTER("DhAgree");
  3873. #ifdef WOLFSSL_ASYNC_CRYPT
  3874. /* initialize event */
  3875. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  3876. if (ret != 0)
  3877. return ret;
  3878. #endif
  3879. #ifdef HAVE_PK_CALLBACKS
  3880. if (ssl->ctx->DhAgreeCb) {
  3881. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  3882. WOLFSSL_MSG("Calling DhAgree Callback Function");
  3883. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  3884. otherPub, otherPubSz, agree, agreeSz, ctx);
  3885. }
  3886. else
  3887. #endif
  3888. {
  3889. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  3890. ret = wc_DhCheckPubValue(ssl->buffers.serverDH_P.buffer,
  3891. ssl->buffers.serverDH_P.length, otherPub, otherPubSz);
  3892. if (ret != 0) {
  3893. #ifdef OPENSSL_EXTRA
  3894. SendAlert(ssl, alert_fatal, illegal_parameter);
  3895. #endif
  3896. }
  3897. else
  3898. #endif
  3899. {
  3900. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  3901. otherPubSz);
  3902. }
  3903. }
  3904. /* Handle async pending response */
  3905. #ifdef WOLFSSL_ASYNC_CRYPT
  3906. if (ret == WC_PENDING_E) {
  3907. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  3908. }
  3909. #endif /* WOLFSSL_ASYNC_CRYPT */
  3910. WOLFSSL_LEAVE("DhAgree", ret);
  3911. return ret;
  3912. }
  3913. #endif /* !NO_DH */
  3914. #endif /* !NO_CERTS || !NO_PSK */
  3915. #endif /* !WOLFSSL_NO_TLS12 */
  3916. #ifdef HAVE_PK_CALLBACKS
  3917. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  3918. {
  3919. int pkcbset = 0;
  3920. (void)ctx;
  3921. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || !defined(NO_RSA)
  3922. if (0
  3923. #ifdef HAVE_ECC
  3924. || ctx->EccSignCb != NULL
  3925. #endif
  3926. #ifdef HAVE_ED25519
  3927. || ctx->Ed25519SignCb != NULL
  3928. #endif
  3929. #ifndef NO_RSA
  3930. || ctx->RsaSignCb != NULL
  3931. || ctx->RsaDecCb != NULL
  3932. #ifdef WC_RSA_PSS
  3933. || ctx->RsaPssSignCb != NULL
  3934. #endif
  3935. #endif
  3936. ) {
  3937. pkcbset = 1;
  3938. }
  3939. #endif
  3940. return pkcbset;
  3941. }
  3942. #endif /* HAVE_PK_CALLBACKS */
  3943. int InitSSL_Suites(WOLFSSL* ssl)
  3944. {
  3945. int keySz = 0;
  3946. byte havePSK = 0;
  3947. byte haveAnon = 0;
  3948. byte haveRSA = 0;
  3949. byte haveMcast = 0;
  3950. (void)haveAnon; /* Squash unused var warnings */
  3951. (void)haveMcast;
  3952. if (!ssl)
  3953. return BAD_FUNC_ARG;
  3954. #ifndef NO_RSA
  3955. haveRSA = 1;
  3956. #endif
  3957. #ifndef NO_PSK
  3958. havePSK = (byte)ssl->options.havePSK;
  3959. #endif /* NO_PSK */
  3960. #ifdef HAVE_ANON
  3961. haveAnon = (byte)ssl->options.haveAnon;
  3962. #endif /* HAVE_ANON*/
  3963. #ifdef WOLFSSL_MULTICAST
  3964. haveMcast = (byte)ssl->options.haveMcast;
  3965. #endif /* WOLFSSL_MULTICAST */
  3966. #ifdef WOLFSSL_EARLY_DATA
  3967. if (ssl->options.side == WOLFSSL_SERVER_END)
  3968. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  3969. #endif
  3970. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && defined(HAVE_ED25519) && \
  3971. !defined(NO_ED25519_CLIENT_AUTH)
  3972. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  3973. ssl->buffers.keyType == ed25519_sa_algo;
  3974. #endif
  3975. #ifndef NO_CERTS
  3976. keySz = ssl->buffers.keySz;
  3977. #endif
  3978. /* make sure server has DH parms, and add PSK if there, add NTRU too */
  3979. if (ssl->options.side == WOLFSSL_SERVER_END) {
  3980. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  3981. ssl->options.haveDH, ssl->options.haveNTRU,
  3982. ssl->options.haveECDSAsig, ssl->options.haveECC,
  3983. ssl->options.haveStaticECC, ssl->options.side);
  3984. }
  3985. else {
  3986. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  3987. TRUE, ssl->options.haveNTRU,
  3988. ssl->options.haveECDSAsig, ssl->options.haveECC,
  3989. ssl->options.haveStaticECC, ssl->options.side);
  3990. }
  3991. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  3992. /* make sure server has cert and key unless using PSK, Anon, or
  3993. * Multicast. This should be true even if just switching ssl ctx */
  3994. if (ssl->options.side == WOLFSSL_SERVER_END &&
  3995. !havePSK && !haveAnon && !haveMcast) {
  3996. /* server certificate must be loaded */
  3997. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  3998. WOLFSSL_MSG("Server missing certificate");
  3999. return NO_PRIVATE_KEY;
  4000. }
  4001. /* allow no private key if using PK callbacks and CB is set */
  4002. #ifdef HAVE_PK_CALLBACKS
  4003. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  4004. WOLFSSL_MSG("Using PK for server private key");
  4005. }
  4006. else
  4007. #endif
  4008. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  4009. WOLFSSL_MSG("Server missing private key");
  4010. return NO_PRIVATE_KEY;
  4011. }
  4012. }
  4013. #endif
  4014. return WOLFSSL_SUCCESS;
  4015. }
  4016. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  4017. It is used during initialization and to switch an ssl's CTX with
  4018. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  4019. unless writeDup is on.
  4020. ssl object to initialize
  4021. ctx parent factory
  4022. writeDup flag indicating this is a write dup only
  4023. WOLFSSL_SUCCESS return value on success */
  4024. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  4025. {
  4026. int ret = WOLFSSL_SUCCESS;
  4027. byte newSSL;
  4028. if (!ssl || !ctx)
  4029. return BAD_FUNC_ARG;
  4030. #ifndef SINGLE_THREADED
  4031. if (ssl->suites == NULL && !writeDup)
  4032. return BAD_FUNC_ARG;
  4033. #endif
  4034. newSSL = ssl->ctx == NULL; /* Assign after null check */
  4035. #ifndef NO_PSK
  4036. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  4037. return BAD_FUNC_ARG; /* needed for copy below */
  4038. }
  4039. #endif
  4040. /* decrement previous CTX reference count if exists.
  4041. * This should only happen if switching ctxs!*/
  4042. if (!newSSL) {
  4043. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  4044. wolfSSL_CTX_free(ssl->ctx);
  4045. }
  4046. /* increment CTX reference count */
  4047. if (wc_LockMutex(&ctx->countMutex) != 0) {
  4048. WOLFSSL_MSG("Couldn't lock CTX count mutex");
  4049. return BAD_MUTEX_E;
  4050. }
  4051. ctx->refCount++;
  4052. wc_UnLockMutex(&ctx->countMutex);
  4053. ssl->ctx = ctx; /* only for passing to calls, options could change */
  4054. ssl->version = ctx->method->version;
  4055. #ifdef HAVE_ECC
  4056. ssl->eccTempKeySz = ctx->eccTempKeySz;
  4057. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  4058. #endif
  4059. #if defined(HAVE_ECC) || defined(HAVE_ED25519)
  4060. ssl->pkCurveOID = ctx->pkCurveOID;
  4061. #endif
  4062. #ifdef OPENSSL_EXTRA
  4063. ssl->options.mask = ctx->mask;
  4064. ssl->CBIS = ctx->CBIS;
  4065. #endif
  4066. ssl->timeout = ctx->timeout;
  4067. ssl->verifyCallback = ctx->verifyCallback;
  4068. ssl->options.side = ctx->method->side;
  4069. ssl->options.downgrade = ctx->method->downgrade;
  4070. ssl->options.minDowngrade = ctx->minDowngrade;
  4071. ssl->options.haveDH = ctx->haveDH;
  4072. ssl->options.haveNTRU = ctx->haveNTRU;
  4073. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  4074. ssl->options.haveECC = ctx->haveECC;
  4075. ssl->options.haveStaticECC = ctx->haveStaticECC;
  4076. #ifndef NO_PSK
  4077. ssl->options.havePSK = ctx->havePSK;
  4078. ssl->options.client_psk_cb = ctx->client_psk_cb;
  4079. ssl->options.server_psk_cb = ctx->server_psk_cb;
  4080. #ifdef WOLFSSL_TLS13
  4081. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  4082. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  4083. #endif
  4084. #endif /* NO_PSK */
  4085. #ifdef WOLFSSL_EARLY_DATA
  4086. if (ssl->options.side == WOLFSSL_SERVER_END)
  4087. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  4088. #endif
  4089. #ifdef HAVE_ANON
  4090. ssl->options.haveAnon = ctx->haveAnon;
  4091. #endif
  4092. #ifndef NO_DH
  4093. ssl->options.minDhKeySz = ctx->minDhKeySz;
  4094. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  4095. #endif
  4096. #ifndef NO_RSA
  4097. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  4098. #endif
  4099. #ifdef HAVE_ECC
  4100. ssl->options.minEccKeySz = ctx->minEccKeySz;
  4101. #endif
  4102. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  4103. ssl->options.verifyDepth = ctx->verifyDepth;
  4104. #endif
  4105. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  4106. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  4107. #ifdef HAVE_EXT_CACHE
  4108. ssl->options.internalCacheOff = ctx->internalCacheOff;
  4109. #endif
  4110. ssl->options.verifyPeer = ctx->verifyPeer;
  4111. ssl->options.verifyNone = ctx->verifyNone;
  4112. ssl->options.failNoCert = ctx->failNoCert;
  4113. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  4114. ssl->options.sendVerify = ctx->sendVerify;
  4115. ssl->options.partialWrite = ctx->partialWrite;
  4116. ssl->options.quietShutdown = ctx->quietShutdown;
  4117. ssl->options.groupMessages = ctx->groupMessages;
  4118. #ifndef NO_DH
  4119. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  4120. !defined(HAVE_SELFTEST)
  4121. ssl->options.dhKeyTested = ctx->dhKeyTested;
  4122. #endif
  4123. ssl->buffers.serverDH_P = ctx->serverDH_P;
  4124. ssl->buffers.serverDH_G = ctx->serverDH_G;
  4125. #endif
  4126. #ifndef NO_CERTS
  4127. /* ctx still owns certificate, certChain, key, dh, and cm */
  4128. ssl->buffers.certificate = ctx->certificate;
  4129. ssl->buffers.certChain = ctx->certChain;
  4130. #ifdef WOLFSSL_TLS13
  4131. ssl->buffers.certChainCnt = ctx->certChainCnt;
  4132. #endif
  4133. ssl->buffers.key = ctx->privateKey;
  4134. ssl->buffers.keyType = ctx->privateKeyType;
  4135. ssl->buffers.keyId = ctx->privateKeyId;
  4136. ssl->buffers.keySz = ctx->privateKeySz;
  4137. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  4138. #endif
  4139. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && defined(HAVE_ED25519) && \
  4140. !defined(NO_ED25519_CLIENT_AUTH)
  4141. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  4142. ssl->buffers.keyType == ed25519_sa_algo;
  4143. #endif
  4144. #ifdef WOLFSSL_ASYNC_CRYPT
  4145. ssl->devId = ctx->devId;
  4146. #endif
  4147. if (writeDup == 0) {
  4148. #ifndef NO_PSK
  4149. if (ctx->server_hint[0]) { /* set in CTX */
  4150. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  4151. sizeof(ssl->arrays->server_hint));
  4152. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  4153. }
  4154. #endif /* NO_PSK */
  4155. if (ctx->suites) {
  4156. #ifndef SINGLE_THREADED
  4157. *ssl->suites = *ctx->suites;
  4158. #else
  4159. ssl->suites = ctx->suites;
  4160. #endif
  4161. }
  4162. else {
  4163. XMEMSET(ssl->suites, 0, sizeof(Suites));
  4164. }
  4165. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  4166. /* Defer initializing suites until accept or connect */
  4167. ret = InitSSL_Suites(ssl);
  4168. }
  4169. } /* writeDup check */
  4170. #ifdef WOLFSSL_SESSION_EXPORT
  4171. #ifdef WOLFSSL_DTLS
  4172. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  4173. #endif
  4174. #endif
  4175. ssl->CBIORecv = ctx->CBIORecv;
  4176. ssl->CBIOSend = ctx->CBIOSend;
  4177. #ifdef OPENSSL_EXTRA
  4178. ssl->readAhead = ctx->readAhead;
  4179. #endif
  4180. ssl->verifyDepth = ctx->verifyDepth;
  4181. return ret;
  4182. }
  4183. int InitHandshakeHashes(WOLFSSL* ssl)
  4184. {
  4185. int ret;
  4186. /* make sure existing handshake hashes are free'd */
  4187. if (ssl->hsHashes != NULL) {
  4188. FreeHandshakeHashes(ssl);
  4189. }
  4190. /* allocate handshake hashes */
  4191. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  4192. DYNAMIC_TYPE_HASHES);
  4193. if (ssl->hsHashes == NULL) {
  4194. WOLFSSL_MSG("HS_Hashes Memory error");
  4195. return MEMORY_E;
  4196. }
  4197. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  4198. #ifndef NO_OLD_TLS
  4199. #ifndef NO_MD5
  4200. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  4201. if (ret != 0)
  4202. return ret;
  4203. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4204. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  4205. #endif
  4206. #endif
  4207. #ifndef NO_SHA
  4208. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  4209. if (ret != 0)
  4210. return ret;
  4211. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4212. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  4213. #endif
  4214. #endif
  4215. #endif /* !NO_OLD_TLS */
  4216. #ifndef NO_SHA256
  4217. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  4218. if (ret != 0)
  4219. return ret;
  4220. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4221. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  4222. #endif
  4223. #endif
  4224. #ifdef WOLFSSL_SHA384
  4225. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  4226. if (ret != 0)
  4227. return ret;
  4228. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4229. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  4230. #endif
  4231. #endif
  4232. #ifdef WOLFSSL_SHA512
  4233. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  4234. if (ret != 0)
  4235. return ret;
  4236. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4237. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  4238. #endif
  4239. #endif
  4240. return ret;
  4241. }
  4242. void FreeHandshakeHashes(WOLFSSL* ssl)
  4243. {
  4244. if (ssl->hsHashes) {
  4245. #ifndef NO_OLD_TLS
  4246. #ifndef NO_MD5
  4247. wc_Md5Free(&ssl->hsHashes->hashMd5);
  4248. #endif
  4249. #ifndef NO_SHA
  4250. wc_ShaFree(&ssl->hsHashes->hashSha);
  4251. #endif
  4252. #endif /* !NO_OLD_TLS */
  4253. #ifndef NO_SHA256
  4254. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  4255. #endif
  4256. #ifdef WOLFSSL_SHA384
  4257. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  4258. #endif
  4259. #ifdef WOLFSSL_SHA512
  4260. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  4261. #endif
  4262. #if defined(HAVE_ED25519) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  4263. if (ssl->hsHashes->messages != NULL) {
  4264. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  4265. ssl->hsHashes->messages = NULL;
  4266. }
  4267. #endif
  4268. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  4269. ssl->hsHashes = NULL;
  4270. }
  4271. }
  4272. /* init everything to 0, NULL, default values before calling anything that may
  4273. fail so that destructor has a "good" state to cleanup
  4274. ssl object to initialize
  4275. ctx parent factory
  4276. writeDup flag indicating this is a write dup only
  4277. 0 on success */
  4278. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  4279. {
  4280. int ret;
  4281. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  4282. #if defined(WOLFSSL_STATIC_MEMORY)
  4283. if (ctx->heap != NULL) {
  4284. WOLFSSL_HEAP_HINT* ssl_hint;
  4285. WOLFSSL_HEAP_HINT* ctx_hint;
  4286. /* avoid dereferencing a test value */
  4287. #ifdef WOLFSSL_HEAP_TEST
  4288. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  4289. ssl->heap = ctx->heap;
  4290. }
  4291. else {
  4292. #endif
  4293. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  4294. ctx->heap, DYNAMIC_TYPE_SSL);
  4295. if (ssl->heap == NULL) {
  4296. return MEMORY_E;
  4297. }
  4298. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  4299. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  4300. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  4301. /* lock and check IO count / handshake count */
  4302. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  4303. WOLFSSL_MSG("Bad memory_mutex lock");
  4304. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  4305. ssl->heap = NULL; /* free and set to NULL for IO counter */
  4306. return BAD_MUTEX_E;
  4307. }
  4308. if (ctx_hint->memory->maxHa > 0 &&
  4309. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  4310. WOLFSSL_MSG("At max number of handshakes for static memory");
  4311. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4312. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  4313. ssl->heap = NULL; /* free and set to NULL for IO counter */
  4314. return MEMORY_E;
  4315. }
  4316. if (ctx_hint->memory->maxIO > 0 &&
  4317. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  4318. WOLFSSL_MSG("At max number of IO allowed for static memory");
  4319. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4320. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  4321. ssl->heap = NULL; /* free and set to NULL for IO counter */
  4322. return MEMORY_E;
  4323. }
  4324. ctx_hint->memory->curIO++;
  4325. ctx_hint->memory->curHa++;
  4326. ssl_hint->memory = ctx_hint->memory;
  4327. ssl_hint->haFlag = 1;
  4328. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4329. /* check if tracking stats */
  4330. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  4331. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  4332. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  4333. if (ssl_hint->stats == NULL) {
  4334. return MEMORY_E;
  4335. }
  4336. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  4337. }
  4338. /* check if using fixed IO buffers */
  4339. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  4340. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  4341. WOLFSSL_MSG("Bad memory_mutex lock");
  4342. return BAD_MUTEX_E;
  4343. }
  4344. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  4345. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4346. return MEMORY_E;
  4347. }
  4348. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  4349. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4350. return MEMORY_E;
  4351. }
  4352. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  4353. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  4354. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4355. return MEMORY_E;
  4356. }
  4357. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4358. }
  4359. #ifdef WOLFSSL_HEAP_TEST
  4360. }
  4361. #endif
  4362. }
  4363. else {
  4364. ssl->heap = ctx->heap;
  4365. }
  4366. #else
  4367. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  4368. #endif /* WOLFSSL_STATIC_MEMORY */
  4369. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  4370. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  4371. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  4372. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  4373. #ifdef KEEP_PEER_CERT
  4374. InitX509(&ssl->peerCert, 0, ssl->heap);
  4375. #endif
  4376. ssl->rfd = -1; /* set to invalid descriptor */
  4377. ssl->wfd = -1;
  4378. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  4379. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  4380. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  4381. #ifdef HAVE_NETX
  4382. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  4383. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  4384. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  4385. ssl->mnCtx = mynewt_ctx_new();
  4386. if(!ssl->mnCtx) {
  4387. return MEMORY_E;
  4388. }
  4389. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  4390. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  4391. #elif defined (WOLFSSL_GNRC)
  4392. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  4393. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  4394. #endif
  4395. /* initialize states */
  4396. ssl->options.serverState = NULL_STATE;
  4397. ssl->options.clientState = NULL_STATE;
  4398. ssl->options.connectState = CONNECT_BEGIN;
  4399. ssl->options.acceptState = ACCEPT_BEGIN;
  4400. ssl->options.handShakeState = NULL_STATE;
  4401. ssl->options.processReply = doProcessInit;
  4402. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  4403. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  4404. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  4405. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  4406. #ifndef NO_DH
  4407. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  4408. !defined(HAVE_SELFTEST)
  4409. ssl->options.dhDoKeyTest = 1;
  4410. #endif
  4411. #endif
  4412. #ifdef WOLFSSL_DTLS
  4413. #ifdef WOLFSSL_SCTP
  4414. ssl->options.dtlsSctp = ctx->dtlsSctp;
  4415. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  4416. ssl->dtls_expected_rx = ssl->dtlsMtuSz;
  4417. #else
  4418. ssl->dtls_expected_rx = MAX_MTU;
  4419. #endif
  4420. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  4421. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  4422. ssl->dtls_timeout = ssl->dtls_timeout_init;
  4423. ssl->buffers.dtlsCtx.rfd = -1;
  4424. ssl->buffers.dtlsCtx.wfd = -1;
  4425. #endif
  4426. #ifndef WOLFSSL_AEAD_ONLY
  4427. #ifndef NO_OLD_TLS
  4428. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  4429. #elif !defined(WOLFSSL_NO_TLS12)
  4430. ssl->hmac = TLS_hmac;
  4431. #endif
  4432. #endif
  4433. ssl->cipher.ssl = ssl;
  4434. #ifdef HAVE_EXTENDED_MASTER
  4435. ssl->options.haveEMS = ctx->haveEMS;
  4436. #endif
  4437. ssl->options.useClientOrder = ctx->useClientOrder;
  4438. #ifdef WOLFSSL_TLS13
  4439. #ifdef HAVE_SESSION_TICKET
  4440. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  4441. #endif
  4442. ssl->options.noPskDheKe = ctx->noPskDheKe;
  4443. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  4444. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  4445. #endif
  4446. if (ctx->numGroups > 0) {
  4447. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  4448. ssl->numGroups = ctx->numGroups;
  4449. }
  4450. #endif
  4451. #ifdef HAVE_TLS_EXTENSIONS
  4452. #ifdef HAVE_MAX_FRAGMENT
  4453. ssl->max_fragment = MAX_RECORD_SIZE;
  4454. #endif
  4455. #ifdef HAVE_ALPN
  4456. ssl->alpn_client_list = NULL;
  4457. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  4458. ssl->alpnSelect = ctx->alpnSelect;
  4459. ssl->alpnSelectArg = ctx->alpnSelectArg;
  4460. #endif
  4461. #endif
  4462. #ifdef HAVE_SUPPORTED_CURVES
  4463. ssl->options.userCurves = ctx->userCurves;
  4464. #endif
  4465. #endif /* HAVE_TLS_EXTENSIONS */
  4466. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  4467. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  4468. #endif
  4469. /* default alert state (none) */
  4470. ssl->alert_history.last_rx.code = -1;
  4471. ssl->alert_history.last_rx.level = -1;
  4472. ssl->alert_history.last_tx.code = -1;
  4473. ssl->alert_history.last_tx.level = -1;
  4474. #ifdef OPENSSL_EXTRA
  4475. /* copy over application session context ID */
  4476. ssl->sessionCtxSz = ctx->sessionCtxSz;
  4477. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  4478. ssl->cbioFlag = ctx->cbioFlag;
  4479. #endif
  4480. InitCiphers(ssl);
  4481. InitCipherSpecs(&ssl->specs);
  4482. /* all done with init, now can return errors, call other stuff */
  4483. if (!writeDup) {
  4484. /* arrays */
  4485. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  4486. DYNAMIC_TYPE_ARRAYS);
  4487. if (ssl->arrays == NULL) {
  4488. WOLFSSL_MSG("Arrays Memory error");
  4489. return MEMORY_E;
  4490. }
  4491. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  4492. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  4493. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  4494. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  4495. DYNAMIC_TYPE_SECRET);
  4496. if (ssl->arrays->preMasterSecret == NULL) {
  4497. return MEMORY_E;
  4498. }
  4499. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  4500. #endif
  4501. #ifdef OPENSSL_EXTRA
  4502. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  4503. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  4504. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  4505. WOLFSSL_MSG("ssl->param memory error");
  4506. return MEMORY_E;
  4507. }
  4508. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  4509. #endif
  4510. #ifdef SINGLE_THREADED
  4511. if (ctx->suites == NULL)
  4512. #endif
  4513. {
  4514. /* suites */
  4515. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  4516. DYNAMIC_TYPE_SUITES);
  4517. if (ssl->suites == NULL) {
  4518. WOLFSSL_MSG("Suites Memory error");
  4519. return MEMORY_E;
  4520. }
  4521. #ifdef SINGLE_THREADED
  4522. ssl->options.ownSuites = 1;
  4523. #endif
  4524. }
  4525. #ifdef SINGLE_THREADED
  4526. else {
  4527. ssl->options.ownSuites = 0;
  4528. }
  4529. #endif
  4530. }
  4531. /* Initialize SSL with the appropriate fields from it's ctx */
  4532. /* requires valid arrays and suites unless writeDup ing */
  4533. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS)
  4534. return ret;
  4535. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  4536. #ifdef SINGLE_THREADED
  4537. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  4538. #endif
  4539. if (ssl->rng == NULL) {
  4540. /* RNG */
  4541. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  4542. if (ssl->rng == NULL) {
  4543. WOLFSSL_MSG("RNG Memory error");
  4544. return MEMORY_E;
  4545. }
  4546. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  4547. ssl->options.weOwnRng = 1;
  4548. /* FIPS RNG API does not accept a heap hint */
  4549. #ifndef HAVE_FIPS
  4550. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  4551. WOLFSSL_MSG("RNG Init error");
  4552. return ret;
  4553. }
  4554. #else
  4555. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  4556. WOLFSSL_MSG("RNG Init error");
  4557. return ret;
  4558. }
  4559. #endif
  4560. }
  4561. #ifdef HAVE_WRITE_DUP
  4562. if (writeDup) {
  4563. /* all done */
  4564. return 0;
  4565. }
  4566. #endif
  4567. /* hsHashes */
  4568. ret = InitHandshakeHashes(ssl);
  4569. if (ret != 0)
  4570. return ret;
  4571. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  4572. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  4573. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  4574. if (ret != 0) {
  4575. WOLFSSL_MSG("DTLS Cookie Secret error");
  4576. return ret;
  4577. }
  4578. }
  4579. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  4580. #ifdef HAVE_SECRET_CALLBACK
  4581. ssl->sessionSecretCb = NULL;
  4582. ssl->sessionSecretCtx = NULL;
  4583. #endif
  4584. #ifdef HAVE_SESSION_TICKET
  4585. ssl->session.ticket = ssl->session.staticTicket;
  4586. #endif
  4587. #ifdef WOLFSSL_MULTICAST
  4588. if (ctx->haveMcast) {
  4589. int i;
  4590. ssl->options.haveMcast = 1;
  4591. ssl->options.mcastID = ctx->mcastID;
  4592. /* Force the state to look like handshake has completed. */
  4593. /* Keying material is supplied externally. */
  4594. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  4595. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  4596. ssl->options.connectState = SECOND_REPLY_DONE;
  4597. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  4598. ssl->options.handShakeState = HANDSHAKE_DONE;
  4599. ssl->options.handShakeDone = 1;
  4600. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  4601. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  4602. }
  4603. #endif
  4604. #ifdef HAVE_SECURE_RENEGOTIATION
  4605. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4606. int useSecureReneg = ssl->ctx->useSecureReneg;
  4607. /* use secure renegotiation by default (not recommend) */
  4608. #ifdef WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT
  4609. useSecureReneg = 1;
  4610. #endif
  4611. if (useSecureReneg) {
  4612. ret = wolfSSL_UseSecureRenegotiation(ssl);
  4613. if (ret != WOLFSSL_SUCCESS)
  4614. return ret;
  4615. }
  4616. }
  4617. #endif /* HAVE_SECURE_RENEGOTIATION */
  4618. return 0;
  4619. }
  4620. /* free use of temporary arrays */
  4621. void FreeArrays(WOLFSSL* ssl, int keep)
  4622. {
  4623. if (ssl->arrays) {
  4624. if (keep) {
  4625. /* keeps session id for user retrieval */
  4626. XMEMCPY(ssl->session.sessionID, ssl->arrays->sessionID, ID_LEN);
  4627. ssl->session.sessionIDSz = ssl->arrays->sessionIDSz;
  4628. }
  4629. if (ssl->arrays->preMasterSecret) {
  4630. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  4631. ssl->arrays->preMasterSecret = NULL;
  4632. }
  4633. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  4634. ssl->arrays->pendingMsg = NULL;
  4635. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  4636. }
  4637. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  4638. ssl->arrays = NULL;
  4639. }
  4640. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  4641. {
  4642. if (ssl && pKey && *pKey) {
  4643. switch (type) {
  4644. #ifndef NO_RSA
  4645. case DYNAMIC_TYPE_RSA:
  4646. wc_FreeRsaKey((RsaKey*)*pKey);
  4647. break;
  4648. #endif /* ! NO_RSA */
  4649. #ifdef HAVE_ECC
  4650. case DYNAMIC_TYPE_ECC:
  4651. wc_ecc_free((ecc_key*)*pKey);
  4652. break;
  4653. #endif /* HAVE_ECC */
  4654. #ifdef HAVE_ED25519
  4655. case DYNAMIC_TYPE_ED25519:
  4656. wc_ed25519_free((ed25519_key*)*pKey);
  4657. break;
  4658. #endif /* HAVE_CURVE25519 */
  4659. #ifdef HAVE_CURVE25519
  4660. case DYNAMIC_TYPE_CURVE25519:
  4661. wc_curve25519_free((curve25519_key*)*pKey);
  4662. break;
  4663. #endif /* HAVE_CURVE25519 */
  4664. #ifndef NO_DH
  4665. case DYNAMIC_TYPE_DH:
  4666. wc_FreeDhKey((DhKey*)*pKey);
  4667. break;
  4668. #endif /* !NO_DH */
  4669. default:
  4670. break;
  4671. }
  4672. XFREE(*pKey, ssl->heap, type);
  4673. /* Reset pointer */
  4674. *pKey = NULL;
  4675. }
  4676. }
  4677. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  4678. {
  4679. int ret = BAD_FUNC_ARG;
  4680. int sz = 0;
  4681. if (ssl == NULL || pKey == NULL) {
  4682. return BAD_FUNC_ARG;
  4683. }
  4684. /* Sanity check key destination */
  4685. if (*pKey != NULL) {
  4686. WOLFSSL_MSG("Key already present!");
  4687. return BAD_STATE_E;
  4688. }
  4689. /* Determine size */
  4690. switch (type) {
  4691. #ifndef NO_RSA
  4692. case DYNAMIC_TYPE_RSA:
  4693. sz = sizeof(RsaKey);
  4694. break;
  4695. #endif /* ! NO_RSA */
  4696. #ifdef HAVE_ECC
  4697. case DYNAMIC_TYPE_ECC:
  4698. sz = sizeof(ecc_key);
  4699. break;
  4700. #endif /* HAVE_ECC */
  4701. #ifdef HAVE_ED25519
  4702. case DYNAMIC_TYPE_ED25519:
  4703. sz = sizeof(ed25519_key);
  4704. break;
  4705. #endif /* HAVE_ED25519 */
  4706. #ifdef HAVE_CURVE25519
  4707. case DYNAMIC_TYPE_CURVE25519:
  4708. sz = sizeof(curve25519_key);
  4709. break;
  4710. #endif /* HAVE_CURVE25519 */
  4711. #ifndef NO_DH
  4712. case DYNAMIC_TYPE_DH:
  4713. sz = sizeof(DhKey);
  4714. break;
  4715. #endif /* !NO_DH */
  4716. default:
  4717. return BAD_FUNC_ARG;
  4718. }
  4719. if (sz == 0) {
  4720. return NOT_COMPILED_IN;
  4721. }
  4722. /* Allocate memory for key */
  4723. *pKey = XMALLOC(sz, ssl->heap, type);
  4724. if (*pKey == NULL) {
  4725. return MEMORY_E;
  4726. }
  4727. /* Initialize key */
  4728. switch (type) {
  4729. #ifndef NO_RSA
  4730. case DYNAMIC_TYPE_RSA:
  4731. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  4732. break;
  4733. #endif /* ! NO_RSA */
  4734. #ifdef HAVE_ECC
  4735. case DYNAMIC_TYPE_ECC:
  4736. ret = wc_ecc_init_ex((ecc_key*)*pKey, ssl->heap, ssl->devId);
  4737. break;
  4738. #endif /* HAVE_ECC */
  4739. #ifdef HAVE_ED25519
  4740. case DYNAMIC_TYPE_ED25519:
  4741. wc_ed25519_init((ed25519_key*)*pKey);
  4742. ret = 0;
  4743. break;
  4744. #endif /* HAVE_CURVE25519 */
  4745. #ifdef HAVE_CURVE25519
  4746. case DYNAMIC_TYPE_CURVE25519:
  4747. wc_curve25519_init((curve25519_key*)*pKey);
  4748. ret = 0;
  4749. break;
  4750. #endif /* HAVE_CURVE25519 */
  4751. #ifndef NO_DH
  4752. case DYNAMIC_TYPE_DH:
  4753. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  4754. break;
  4755. #endif /* !NO_DH */
  4756. default:
  4757. return BAD_FUNC_ARG;
  4758. }
  4759. /* On error free handshake key */
  4760. if (ret != 0) {
  4761. FreeKey(ssl, type, pKey);
  4762. }
  4763. return ret;
  4764. }
  4765. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  4766. defined(HAVE_CURVE25519)
  4767. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  4768. {
  4769. int ret = 0;
  4770. (void)ssl;
  4771. switch (type) {
  4772. #ifndef NO_RSA
  4773. case DYNAMIC_TYPE_RSA:
  4774. wc_FreeRsaKey((RsaKey*)pKey);
  4775. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  4776. break;
  4777. #endif /* ! NO_RSA */
  4778. #ifdef HAVE_ECC
  4779. case DYNAMIC_TYPE_ECC:
  4780. wc_ecc_free((ecc_key*)pKey);
  4781. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  4782. break;
  4783. #endif /* HAVE_ECC */
  4784. #ifdef HAVE_ED25519
  4785. case DYNAMIC_TYPE_ED25519:
  4786. wc_ed25519_free((ed25519_key*)pKey);
  4787. ret = wc_ed25519_init((ed25519_key*)pKey);
  4788. break;
  4789. #endif /* HAVE_CURVE25519 */
  4790. #ifdef HAVE_CURVE25519
  4791. case DYNAMIC_TYPE_CURVE25519:
  4792. wc_curve25519_free((curve25519_key*)pKey);
  4793. ret = wc_curve25519_init((curve25519_key*)pKey);
  4794. break;
  4795. #endif /* HAVE_CURVE25519 */
  4796. #ifndef NO_DH
  4797. case DYNAMIC_TYPE_DH:
  4798. wc_FreeDhKey((DhKey*)pKey);
  4799. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  4800. break;
  4801. #endif /* !NO_DH */
  4802. default:
  4803. return BAD_FUNC_ARG;
  4804. }
  4805. return ret;
  4806. }
  4807. #endif
  4808. void FreeKeyExchange(WOLFSSL* ssl)
  4809. {
  4810. /* Cleanup signature buffer */
  4811. if (ssl->buffers.sig.buffer) {
  4812. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  4813. ssl->buffers.sig.buffer = NULL;
  4814. ssl->buffers.sig.length = 0;
  4815. }
  4816. /* Cleanup digest buffer */
  4817. if (ssl->buffers.digest.buffer) {
  4818. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  4819. ssl->buffers.digest.buffer = NULL;
  4820. ssl->buffers.digest.length = 0;
  4821. }
  4822. /* Free handshake key */
  4823. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  4824. #ifndef NO_DH
  4825. /* Free temp DH key */
  4826. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  4827. #endif
  4828. /* Cleanup async */
  4829. #ifdef WOLFSSL_ASYNC_CRYPT
  4830. if (ssl->async.freeArgs) {
  4831. ssl->async.freeArgs(ssl, ssl->async.args);
  4832. ssl->async.freeArgs = NULL;
  4833. }
  4834. #endif
  4835. }
  4836. /* In case holding SSL object in array and don't want to free actual ssl */
  4837. void SSL_ResourceFree(WOLFSSL* ssl)
  4838. {
  4839. /* Note: any resources used during the handshake should be released in the
  4840. * function FreeHandshakeResources(). Be careful with the special cases
  4841. * like the RNG which may optionally be kept for the whole session. (For
  4842. * example with the RNG, it isn't used beyond the handshake except when
  4843. * using stream ciphers where it is retained. */
  4844. FreeCiphers(ssl);
  4845. FreeArrays(ssl, 0);
  4846. FreeKeyExchange(ssl);
  4847. if (ssl->options.weOwnRng) {
  4848. wc_FreeRng(ssl->rng);
  4849. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  4850. }
  4851. #ifdef SINGLE_THREADED
  4852. if (ssl->options.ownSuites)
  4853. #endif
  4854. {
  4855. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  4856. }
  4857. ssl->suites = NULL;
  4858. FreeHandshakeHashes(ssl);
  4859. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  4860. /* clear keys struct after session */
  4861. ForceZero(&ssl->keys, sizeof(Keys));
  4862. #ifdef WOLFSSL_TLS13
  4863. if (ssl->options.tls1_3) {
  4864. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  4865. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  4866. }
  4867. #endif
  4868. #ifndef NO_DH
  4869. if (ssl->buffers.serverDH_Priv.buffer) {
  4870. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  4871. ssl->buffers.serverDH_Priv.length);
  4872. }
  4873. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  4874. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4875. /* parameters (p,g) may be owned by ctx */
  4876. if (ssl->buffers.weOwnDH) {
  4877. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4878. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  4879. }
  4880. #endif /* !NO_DH */
  4881. #ifndef NO_CERTS
  4882. ssl->keepCert = 0; /* make sure certificate is free'd */
  4883. wolfSSL_UnloadCertsKeys(ssl);
  4884. #endif
  4885. #ifndef NO_RSA
  4886. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  4887. ssl->peerRsaKeyPresent = 0;
  4888. #endif
  4889. if (ssl->buffers.inputBuffer.dynamicFlag)
  4890. ShrinkInputBuffer(ssl, FORCED_FREE);
  4891. if (ssl->buffers.outputBuffer.dynamicFlag)
  4892. ShrinkOutputBuffer(ssl);
  4893. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  4894. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  4895. DYNAMIC_TYPE_COOKIE_PWD);
  4896. #endif
  4897. #ifdef WOLFSSL_DTLS
  4898. DtlsMsgPoolReset(ssl);
  4899. if (ssl->dtls_rx_msg_list != NULL) {
  4900. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  4901. ssl->dtls_rx_msg_list = NULL;
  4902. ssl->dtls_rx_msg_list_sz = 0;
  4903. }
  4904. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  4905. ssl->buffers.dtlsCtx.peer.sa = NULL;
  4906. #ifndef NO_WOLFSSL_SERVER
  4907. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  4908. DYNAMIC_TYPE_COOKIE_PWD);
  4909. #endif
  4910. #endif /* WOLFSSL_DTLS */
  4911. #ifdef OPENSSL_EXTRA
  4912. if (ssl->biord != ssl->biowr) /* only free write if different */
  4913. wolfSSL_BIO_free(ssl->biowr);
  4914. wolfSSL_BIO_free(ssl->biord); /* always free read bio */
  4915. #endif
  4916. #ifdef HAVE_LIBZ
  4917. FreeStreams(ssl);
  4918. #endif
  4919. #ifdef HAVE_ECC
  4920. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  4921. ssl->peerEccKeyPresent = 0;
  4922. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  4923. ssl->peerEccDsaKeyPresent = 0;
  4924. #endif
  4925. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  4926. {
  4927. int dtype;
  4928. #ifdef HAVE_ECC
  4929. dtype = DYNAMIC_TYPE_ECC;
  4930. #endif
  4931. #ifdef HAVE_CURVE25519
  4932. #ifdef HAVE_ECC
  4933. if (ssl->peerX25519KeyPresent ||
  4934. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  4935. #endif /* HAVE_ECC */
  4936. {
  4937. dtype = DYNAMIC_TYPE_CURVE25519;
  4938. }
  4939. #endif /* HAVE_CURVE25519 */
  4940. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  4941. ssl->eccTempKeyPresent = 0;
  4942. }
  4943. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  4944. #ifdef HAVE_CURVE25519
  4945. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  4946. ssl->peerX25519KeyPresent = 0;
  4947. #endif
  4948. #ifdef HAVE_ED25519
  4949. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  4950. ssl->peerEd25519KeyPresent = 0;
  4951. #ifdef HAVE_PK_CALLBACKS
  4952. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  4953. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  4954. DYNAMIC_TYPE_ED25519);
  4955. ssl->buffers.peerEd25519Key.buffer = NULL;
  4956. }
  4957. #endif
  4958. #endif
  4959. #ifdef HAVE_PK_CALLBACKS
  4960. #ifdef HAVE_ECC
  4961. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  4962. #endif /* HAVE_ECC */
  4963. #ifndef NO_RSA
  4964. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  4965. #endif /* NO_RSA */
  4966. #endif /* HAVE_PK_CALLBACKS */
  4967. #ifdef HAVE_TLS_EXTENSIONS
  4968. TLSX_FreeAll(ssl->extensions, ssl->heap);
  4969. #ifdef HAVE_ALPN
  4970. if (ssl->alpn_client_list != NULL) {
  4971. XFREE(ssl->alpn_client_list, ssl->heap, DYNAMIC_TYPE_ALPN);
  4972. ssl->alpn_client_list = NULL;
  4973. }
  4974. #endif
  4975. #endif /* HAVE_TLS_EXTENSIONS */
  4976. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  4977. if (ssl->mnCtx) {
  4978. mynewt_ctx_clear(ssl->mnCtx);
  4979. ssl->mnCtx = NULL;
  4980. }
  4981. #endif
  4982. #ifdef HAVE_NETX
  4983. if (ssl->nxCtx.nxPacket)
  4984. nx_packet_release(ssl->nxCtx.nxPacket);
  4985. #endif
  4986. #ifdef KEEP_PEER_CERT
  4987. FreeX509(&ssl->peerCert);
  4988. #endif
  4989. #ifdef HAVE_SESSION_TICKET
  4990. if (ssl->session.isDynamic) {
  4991. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  4992. ssl->session.ticket = ssl->session.staticTicket;
  4993. ssl->session.isDynamic = 0;
  4994. ssl->session.ticketLen = 0;
  4995. }
  4996. #endif
  4997. #ifdef HAVE_EXT_CACHE
  4998. wolfSSL_SESSION_free(ssl->extSession);
  4999. #endif
  5000. #ifdef HAVE_WRITE_DUP
  5001. if (ssl->dupWrite) {
  5002. FreeWriteDup(ssl);
  5003. }
  5004. #endif
  5005. #ifdef OPENSSL_EXTRA
  5006. if (ssl->param) {
  5007. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  5008. }
  5009. #endif
  5010. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5011. while (ssl->certReqCtx != NULL) {
  5012. CertReqCtx* curr = ssl->certReqCtx;
  5013. ssl->certReqCtx = curr->next;
  5014. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5015. }
  5016. #endif
  5017. #ifdef WOLFSSL_STATIC_MEMORY
  5018. /* check if using fixed io buffers and free them */
  5019. if (ssl->heap != NULL) {
  5020. #ifdef WOLFSSL_HEAP_TEST
  5021. /* avoid dereferencing a test value */
  5022. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  5023. #endif
  5024. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  5025. WOLFSSL_HEAP* ctx_heap;
  5026. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  5027. ctx_heap = ssl_hint->memory;
  5028. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  5029. WOLFSSL_MSG("Bad memory_mutex lock");
  5030. }
  5031. ctx_heap->curIO--;
  5032. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  5033. WOLFSSL_MSG("Error freeing fixed output buffer");
  5034. }
  5035. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  5036. WOLFSSL_MSG("Error freeing fixed output buffer");
  5037. }
  5038. if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/
  5039. ctx_heap->curHa--;
  5040. }
  5041. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  5042. /* check if tracking stats */
  5043. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  5044. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  5045. }
  5046. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  5047. #ifdef WOLFSSL_HEAP_TEST
  5048. }
  5049. #endif
  5050. }
  5051. #endif /* WOLFSSL_STATIC_MEMORY */
  5052. }
  5053. /* Free any handshake resources no longer needed */
  5054. void FreeHandshakeResources(WOLFSSL* ssl)
  5055. {
  5056. #ifdef HAVE_SECURE_RENEGOTIATION
  5057. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  5058. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  5059. #ifdef KEEP_PEER_CERT
  5060. /* free peer cert in preparation for new handshake */
  5061. FreeX509(&ssl->peerCert);
  5062. #endif
  5063. return;
  5064. }
  5065. #endif
  5066. /* input buffer */
  5067. if (ssl->buffers.inputBuffer.dynamicFlag)
  5068. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  5069. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5070. if (!ssl->options.tls1_3)
  5071. #endif
  5072. {
  5073. /* suites */
  5074. #ifdef SINGLE_THREADED
  5075. if (ssl->options.ownSuites)
  5076. #endif
  5077. {
  5078. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  5079. }
  5080. ssl->suites = NULL;
  5081. /* hsHashes */
  5082. FreeHandshakeHashes(ssl);
  5083. }
  5084. /* RNG */
  5085. if (ssl->options.tls1_1 == 0
  5086. #ifndef WOLFSSL_AEAD_ONLY
  5087. || ssl->specs.cipher_type == stream
  5088. #endif
  5089. #if defined(WOLFSSL_TLS13)
  5090. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5091. || ssl->options.tls1_3
  5092. #elif !defined(HAVE_SESSION_TICKET)
  5093. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  5094. #endif
  5095. #endif
  5096. ) {
  5097. if (ssl->options.weOwnRng) {
  5098. wc_FreeRng(ssl->rng);
  5099. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  5100. ssl->rng = NULL;
  5101. ssl->options.weOwnRng = 0;
  5102. }
  5103. }
  5104. #ifdef WOLFSSL_DTLS
  5105. /* DTLS_POOL */
  5106. if (ssl->options.dtls) {
  5107. DtlsMsgPoolReset(ssl);
  5108. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  5109. ssl->dtls_rx_msg_list = NULL;
  5110. ssl->dtls_rx_msg_list_sz = 0;
  5111. }
  5112. #endif
  5113. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  5114. defined(HAVE_SESSION_TICKET)
  5115. if (!ssl->options.tls1_3)
  5116. #endif
  5117. /* arrays */
  5118. if (ssl->options.saveArrays == 0)
  5119. FreeArrays(ssl, 1);
  5120. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5121. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  5122. #endif
  5123. {
  5124. #ifndef NO_RSA
  5125. /* peerRsaKey */
  5126. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  5127. ssl->peerRsaKeyPresent = 0;
  5128. #endif
  5129. #ifdef HAVE_ECC
  5130. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  5131. ssl->peerEccDsaKeyPresent = 0;
  5132. #endif /* HAVE_ECC */
  5133. #ifdef HAVE_ED25519
  5134. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  5135. ssl->peerEd25519KeyPresent = 0;
  5136. #endif /* HAVE_ED25519 */
  5137. }
  5138. #ifdef HAVE_ECC
  5139. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  5140. ssl->peerEccKeyPresent = 0;
  5141. #endif
  5142. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  5143. {
  5144. int dtype;
  5145. #ifdef HAVE_ECC
  5146. dtype = DYNAMIC_TYPE_ECC;
  5147. #endif
  5148. #ifdef HAVE_CURVE25519
  5149. #ifdef HAVE_ECC
  5150. if (ssl->peerX25519KeyPresent ||
  5151. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  5152. #endif /* HAVE_ECC */
  5153. {
  5154. dtype = DYNAMIC_TYPE_CURVE25519;
  5155. }
  5156. #endif /* HAVE_CURVE25519 */
  5157. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  5158. ssl->eccTempKeyPresent = 0;
  5159. }
  5160. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  5161. #ifdef HAVE_CURVE25519
  5162. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  5163. ssl->peerX25519KeyPresent = 0;
  5164. #endif
  5165. #ifndef NO_DH
  5166. if (ssl->buffers.serverDH_Priv.buffer) {
  5167. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  5168. ssl->buffers.serverDH_Priv.length);
  5169. }
  5170. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5171. ssl->buffers.serverDH_Priv.buffer = NULL;
  5172. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5173. ssl->buffers.serverDH_Pub.buffer = NULL;
  5174. /* parameters (p,g) may be owned by ctx */
  5175. if (ssl->buffers.weOwnDH) {
  5176. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5177. ssl->buffers.serverDH_G.buffer = NULL;
  5178. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5179. ssl->buffers.serverDH_P.buffer = NULL;
  5180. }
  5181. #endif /* !NO_DH */
  5182. #ifndef NO_CERTS
  5183. wolfSSL_UnloadCertsKeys(ssl);
  5184. #endif
  5185. #ifdef HAVE_PK_CALLBACKS
  5186. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5187. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  5188. #endif
  5189. {
  5190. #ifdef HAVE_ECC
  5191. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  5192. ssl->buffers.peerEccDsaKey.buffer = NULL;
  5193. #endif /* HAVE_ECC */
  5194. #ifndef NO_RSA
  5195. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  5196. ssl->buffers.peerRsaKey.buffer = NULL;
  5197. #endif /* NO_RSA */
  5198. #ifdef HAVE_ED25519
  5199. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  5200. DYNAMIC_TYPE_ED25519);
  5201. ssl->buffers.peerEd25519Key.buffer = NULL;
  5202. #endif
  5203. }
  5204. #endif /* HAVE_PK_CALLBACKS */
  5205. #ifdef HAVE_QSH
  5206. QSH_FreeAll(ssl);
  5207. #endif
  5208. #ifdef HAVE_SESSION_TICKET
  5209. if (ssl->session.isDynamic) {
  5210. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  5211. ssl->session.ticket = ssl->session.staticTicket;
  5212. ssl->session.isDynamic = 0;
  5213. ssl->session.ticketLen = 0;
  5214. }
  5215. #endif
  5216. #if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \
  5217. !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5218. /* Some extensions need to be kept for post-handshake querying. */
  5219. TLSX_FreeAll(ssl->extensions, ssl->heap);
  5220. ssl->extensions = NULL;
  5221. #endif
  5222. #ifdef WOLFSSL_STATIC_MEMORY
  5223. /* when done with handshake decrement current handshake count */
  5224. if (ssl->heap != NULL) {
  5225. #ifdef WOLFSSL_HEAP_TEST
  5226. /* avoid dereferencing a test value */
  5227. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  5228. #endif
  5229. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  5230. WOLFSSL_HEAP* ctx_heap;
  5231. ctx_heap = ssl_hint->memory;
  5232. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  5233. WOLFSSL_MSG("Bad memory_mutex lock");
  5234. }
  5235. ctx_heap->curHa--;
  5236. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  5237. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  5238. #ifdef WOLFSSL_HEAP_TEST
  5239. }
  5240. #endif
  5241. }
  5242. #endif /* WOLFSSL_STATIC_MEMORY */
  5243. }
  5244. /* heap argument is the heap hint used when creating SSL */
  5245. void FreeSSL(WOLFSSL* ssl, void* heap)
  5246. {
  5247. if (ssl->ctx) {
  5248. FreeSSL_Ctx(ssl->ctx); /* will decrement and free underlying CTX if 0 */
  5249. }
  5250. SSL_ResourceFree(ssl);
  5251. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  5252. (void)heap;
  5253. }
  5254. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  5255. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \
  5256. && defined(HAVE_AEAD))
  5257. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  5258. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  5259. {
  5260. if (verify) {
  5261. seq[0] = ssl->keys.peer_sequence_number_hi;
  5262. seq[1] = ssl->keys.peer_sequence_number_lo++;
  5263. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  5264. /* handle rollover */
  5265. ssl->keys.peer_sequence_number_hi++;
  5266. }
  5267. }
  5268. else {
  5269. seq[0] = ssl->keys.sequence_number_hi;
  5270. seq[1] = ssl->keys.sequence_number_lo++;
  5271. if (seq[1] > ssl->keys.sequence_number_lo) {
  5272. /* handle rollover */
  5273. ssl->keys.sequence_number_hi++;
  5274. }
  5275. }
  5276. }
  5277. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  5278. #ifdef WOLFSSL_DTLS
  5279. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  5280. {
  5281. if (order == PREV_ORDER) {
  5282. /* Previous epoch case */
  5283. if (ssl->options.haveMcast) {
  5284. #ifdef WOLFSSL_MULTICAST
  5285. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  5286. (ssl->options.mcastID << 8) |
  5287. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  5288. #endif
  5289. }
  5290. else
  5291. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  5292. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  5293. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  5294. }
  5295. else if (order == PEER_ORDER) {
  5296. if (ssl->options.haveMcast) {
  5297. #ifdef WOLFSSL_MULTICAST
  5298. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  5299. (ssl->keys.curPeerId << 8) |
  5300. (ssl->keys.curSeq_hi & 0xFF);
  5301. #endif
  5302. }
  5303. else
  5304. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  5305. (ssl->keys.curSeq_hi & 0xFFFF);
  5306. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  5307. }
  5308. else {
  5309. if (ssl->options.haveMcast) {
  5310. #ifdef WOLFSSL_MULTICAST
  5311. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  5312. (ssl->options.mcastID << 8) |
  5313. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  5314. #endif
  5315. }
  5316. else
  5317. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  5318. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  5319. seq[1] = ssl->keys.dtls_sequence_number_lo;
  5320. }
  5321. }
  5322. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  5323. {
  5324. word32 seq;
  5325. if (order == PREV_ORDER) {
  5326. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  5327. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  5328. /* handle rollover */
  5329. ssl->keys.dtls_prev_sequence_number_hi++;
  5330. }
  5331. }
  5332. else if (order == PEER_ORDER) {
  5333. seq = ssl->keys.peer_sequence_number_lo++;
  5334. if (seq > ssl->keys.peer_sequence_number_lo) {
  5335. /* handle rollover */
  5336. ssl->keys.peer_sequence_number_hi++;
  5337. }
  5338. }
  5339. else {
  5340. seq = ssl->keys.dtls_sequence_number_lo++;
  5341. if (seq > ssl->keys.dtls_sequence_number_lo) {
  5342. /* handle rollover */
  5343. ssl->keys.dtls_sequence_number_hi++;
  5344. }
  5345. }
  5346. }
  5347. #endif /* WOLFSSL_DTLS */
  5348. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  5349. static WC_INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  5350. {
  5351. word32 seq[2] = {0, 0};
  5352. if (!ssl->options.dtls) {
  5353. GetSEQIncrement(ssl, verifyOrder, seq);
  5354. }
  5355. else {
  5356. #ifdef WOLFSSL_DTLS
  5357. DtlsGetSEQ(ssl, verifyOrder, seq);
  5358. #endif
  5359. }
  5360. c32toa(seq[0], out);
  5361. c32toa(seq[1], out + OPAQUE32_LEN);
  5362. }
  5363. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  5364. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS ||
  5365. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */
  5366. #ifdef WOLFSSL_DTLS
  5367. /* functions for managing DTLS datagram reordering */
  5368. /* Need to allocate space for the handshake message header. The hashing
  5369. * routines assume the message pointer is still within the buffer that
  5370. * has the headers, and will include those headers in the hash. The store
  5371. * routines need to take that into account as well. New will allocate
  5372. * extra space for the headers. */
  5373. DtlsMsg* DtlsMsgNew(word32 sz, void* heap)
  5374. {
  5375. DtlsMsg* msg = NULL;
  5376. (void)heap;
  5377. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  5378. if (msg != NULL) {
  5379. XMEMSET(msg, 0, sizeof(DtlsMsg));
  5380. msg->buf = (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ,
  5381. heap, DYNAMIC_TYPE_DTLS_BUFFER);
  5382. if (msg->buf != NULL) {
  5383. msg->sz = sz;
  5384. msg->type = no_shake;
  5385. msg->msg = msg->buf + DTLS_HANDSHAKE_HEADER_SZ;
  5386. }
  5387. else {
  5388. XFREE(msg, heap, DYNAMIC_TYPE_DTLS_MSG);
  5389. msg = NULL;
  5390. }
  5391. }
  5392. return msg;
  5393. }
  5394. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  5395. {
  5396. (void)heap;
  5397. if (item != NULL) {
  5398. DtlsFrag* cur = item->fragList;
  5399. while (cur != NULL) {
  5400. DtlsFrag* next = cur->next;
  5401. XFREE(cur, heap, DYNAMIC_TYPE_DTLS_FRAG);
  5402. cur = next;
  5403. }
  5404. if (item->buf != NULL)
  5405. XFREE(item->buf, heap, DYNAMIC_TYPE_DTLS_BUFFER);
  5406. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  5407. }
  5408. }
  5409. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  5410. {
  5411. DtlsMsg* next;
  5412. while (head) {
  5413. next = head->next;
  5414. DtlsMsgDelete(head, heap);
  5415. head = next;
  5416. }
  5417. }
  5418. /* Create a DTLS Fragment from *begin - end, adjust new *begin and bytesLeft */
  5419. static DtlsFrag* CreateFragment(word32* begin, word32 end, const byte* data,
  5420. byte* buf, word32* bytesLeft, void* heap)
  5421. {
  5422. DtlsFrag* newFrag;
  5423. word32 added = end - *begin + 1;
  5424. (void)heap;
  5425. newFrag = (DtlsFrag*)XMALLOC(sizeof(DtlsFrag), heap,
  5426. DYNAMIC_TYPE_DTLS_FRAG);
  5427. if (newFrag != NULL) {
  5428. newFrag->next = NULL;
  5429. newFrag->begin = *begin;
  5430. newFrag->end = end;
  5431. XMEMCPY(buf + *begin, data, added);
  5432. *bytesLeft -= added;
  5433. *begin = newFrag->end + 1;
  5434. }
  5435. return newFrag;
  5436. }
  5437. int DtlsMsgSet(DtlsMsg* msg, word32 seq, const byte* data, byte type,
  5438. word32 fragOffset, word32 fragSz, void* heap)
  5439. {
  5440. if (msg != NULL && data != NULL && msg->fragSz <= msg->sz &&
  5441. (fragOffset + fragSz) <= msg->sz) {
  5442. DtlsFrag* cur = msg->fragList;
  5443. DtlsFrag* prev = cur;
  5444. DtlsFrag* newFrag;
  5445. word32 bytesLeft = fragSz; /* could be overlapping fragment */
  5446. word32 startOffset = fragOffset;
  5447. word32 added;
  5448. msg->seq = seq;
  5449. msg->type = type;
  5450. if (fragOffset == 0) {
  5451. XMEMCPY(msg->buf, data - DTLS_HANDSHAKE_HEADER_SZ,
  5452. DTLS_HANDSHAKE_HEADER_SZ);
  5453. c32to24(msg->sz, msg->msg - DTLS_HANDSHAKE_FRAG_SZ);
  5454. }
  5455. /* if no message data, just return */
  5456. if (fragSz == 0)
  5457. return 0;
  5458. /* if list is empty add full fragment to front */
  5459. if (cur == NULL) {
  5460. newFrag = CreateFragment(&fragOffset, fragOffset + fragSz - 1, data,
  5461. msg->msg, &bytesLeft, heap);
  5462. if (newFrag == NULL)
  5463. return MEMORY_E;
  5464. msg->fragSz = fragSz;
  5465. msg->fragList = newFrag;
  5466. return 0;
  5467. }
  5468. /* add to front if before current front, up to next->begin */
  5469. if (fragOffset < cur->begin) {
  5470. word32 end = fragOffset + fragSz - 1;
  5471. if (end >= cur->begin)
  5472. end = cur->begin - 1;
  5473. added = end - fragOffset + 1;
  5474. newFrag = CreateFragment(&fragOffset, end, data, msg->msg,
  5475. &bytesLeft, heap);
  5476. if (newFrag == NULL)
  5477. return MEMORY_E;
  5478. msg->fragSz += added;
  5479. newFrag->next = cur;
  5480. msg->fragList = newFrag;
  5481. }
  5482. /* while we have bytes left, try to find a gap to fill */
  5483. while (bytesLeft > 0) {
  5484. /* get previous packet in list */
  5485. while (cur && (fragOffset >= cur->begin)) {
  5486. prev = cur;
  5487. cur = cur->next;
  5488. }
  5489. /* don't add duplicate data */
  5490. if (prev->end >= fragOffset) {
  5491. if ( (fragOffset + bytesLeft - 1) <= prev->end)
  5492. return 0;
  5493. fragOffset = prev->end + 1;
  5494. bytesLeft = startOffset + fragSz - fragOffset;
  5495. }
  5496. if (cur == NULL)
  5497. /* we're at the end */
  5498. added = bytesLeft;
  5499. else
  5500. /* we're in between two frames */
  5501. added = min(bytesLeft, cur->begin - fragOffset);
  5502. /* data already there */
  5503. if (added == 0)
  5504. continue;
  5505. newFrag = CreateFragment(&fragOffset, fragOffset + added - 1,
  5506. data + fragOffset - startOffset,
  5507. msg->msg, &bytesLeft, heap);
  5508. if (newFrag == NULL)
  5509. return MEMORY_E;
  5510. msg->fragSz += added;
  5511. newFrag->next = prev->next;
  5512. prev->next = newFrag;
  5513. }
  5514. }
  5515. return 0;
  5516. }
  5517. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word32 seq)
  5518. {
  5519. while (head != NULL && head->seq != seq) {
  5520. head = head->next;
  5521. }
  5522. return head;
  5523. }
  5524. void DtlsMsgStore(WOLFSSL* ssl, word32 seq, const byte* data,
  5525. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  5526. {
  5527. /* See if seq exists in the list. If it isn't in the list, make
  5528. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  5529. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  5530. * the seq is in the list and it isn't full, copy fragSz bytes from
  5531. * data to msg->msg starting at offset fragOffset, and add fragSz to
  5532. * msg->fragSz. Insertions take into account data already in the list
  5533. * in case there are overlaps in the handshake message due to retransmit
  5534. * messages. The new item should be inserted into the list in its
  5535. * proper position.
  5536. *
  5537. * 1. Find seq in list, or where seq should go in list. If seq not in
  5538. * list, create new item and insert into list. Either case, keep
  5539. * pointer to item.
  5540. * 2. Copy the data from the message to the stored message where it
  5541. * belongs without overlaps.
  5542. */
  5543. DtlsMsg* head = ssl->dtls_rx_msg_list;
  5544. if (head != NULL) {
  5545. DtlsMsg* cur = DtlsMsgFind(head, seq);
  5546. if (cur == NULL) {
  5547. cur = DtlsMsgNew(dataSz, heap);
  5548. if (cur != NULL) {
  5549. if (DtlsMsgSet(cur, seq, data, type,
  5550. fragOffset, fragSz, heap) < 0) {
  5551. DtlsMsgDelete(cur, heap);
  5552. }
  5553. else {
  5554. ssl->dtls_rx_msg_list_sz++;
  5555. head = DtlsMsgInsert(head, cur);
  5556. }
  5557. }
  5558. }
  5559. else {
  5560. /* If this fails, the data is just dropped. */
  5561. DtlsMsgSet(cur, seq, data, type, fragOffset, fragSz, heap);
  5562. }
  5563. }
  5564. else {
  5565. head = DtlsMsgNew(dataSz, heap);
  5566. if (DtlsMsgSet(head, seq, data, type, fragOffset, fragSz, heap) < 0) {
  5567. DtlsMsgDelete(head, heap);
  5568. head = NULL;
  5569. }
  5570. else {
  5571. ssl->dtls_rx_msg_list_sz++;
  5572. }
  5573. }
  5574. ssl->dtls_rx_msg_list = head;
  5575. }
  5576. /* DtlsMsgInsert() is an in-order insert. */
  5577. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  5578. {
  5579. if (head == NULL || item->seq < head->seq) {
  5580. item->next = head;
  5581. head = item;
  5582. }
  5583. else if (head->next == NULL) {
  5584. head->next = item;
  5585. }
  5586. else {
  5587. DtlsMsg* cur = head->next;
  5588. DtlsMsg* prev = head;
  5589. while (cur) {
  5590. if (item->seq < cur->seq) {
  5591. item->next = cur;
  5592. prev->next = item;
  5593. break;
  5594. }
  5595. prev = cur;
  5596. cur = cur->next;
  5597. }
  5598. if (cur == NULL) {
  5599. prev->next = item;
  5600. }
  5601. }
  5602. return head;
  5603. }
  5604. /* DtlsMsgPoolSave() adds the message to the end of the stored transmit list. */
  5605. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz)
  5606. {
  5607. DtlsMsg* item;
  5608. int ret = 0;
  5609. WOLFSSL_ENTER("DtlsMsgPoolSave()");
  5610. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  5611. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  5612. return DTLS_POOL_SZ_E;
  5613. }
  5614. item = DtlsMsgNew(dataSz, ssl->heap);
  5615. if (item != NULL) {
  5616. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  5617. XMEMCPY(item->buf, data, dataSz);
  5618. item->sz = dataSz;
  5619. item->seq = ssl->keys.dtls_epoch;
  5620. if (cur == NULL)
  5621. ssl->dtls_tx_msg_list = item;
  5622. else {
  5623. while (cur->next)
  5624. cur = cur->next;
  5625. cur->next = item;
  5626. }
  5627. ssl->dtls_tx_msg_list_sz++;
  5628. }
  5629. else
  5630. ret = MEMORY_E;
  5631. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  5632. return ret;
  5633. }
  5634. /* DtlsMsgPoolTimeout() updates the timeout time. */
  5635. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  5636. {
  5637. int result = -1;
  5638. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  5639. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  5640. result = 0;
  5641. }
  5642. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  5643. return result;
  5644. }
  5645. /* DtlsMsgPoolReset() deletes the stored transmit list and resets the timeout
  5646. * value. */
  5647. void DtlsMsgPoolReset(WOLFSSL* ssl)
  5648. {
  5649. WOLFSSL_ENTER("DtlsMsgPoolReset()");
  5650. if (ssl->dtls_tx_msg_list) {
  5651. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  5652. ssl->dtls_tx_msg_list = NULL;
  5653. ssl->dtls_tx_msg = NULL;
  5654. ssl->dtls_tx_msg_list_sz = 0;
  5655. ssl->dtls_timeout = ssl->dtls_timeout_init;
  5656. }
  5657. }
  5658. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  5659. {
  5660. /**
  5661. * only the first message from previous flight should be valid
  5662. * to be used for triggering retransmission of whole DtlsMsgPool.
  5663. * change cipher suite type is not verified here
  5664. */
  5665. return ((fragOffset == 0) &&
  5666. (((ssl->options.side == WOLFSSL_SERVER_END) &&
  5667. ((type == client_hello) ||
  5668. ((ssl->options.verifyPeer) && (type == certificate)) ||
  5669. ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
  5670. ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  5671. (type == server_hello))));
  5672. }
  5673. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  5674. * updated with new sequence numbers, and will be re-encrypted if needed. */
  5675. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  5676. {
  5677. int ret = 0;
  5678. DtlsMsg* pool;
  5679. WOLFSSL_ENTER("DtlsMsgPoolSend()");
  5680. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  5681. if (pool != NULL) {
  5682. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  5683. !(ssl->options.acceptState == SERVER_HELLO_DONE ||
  5684. ssl->options.acceptState == ACCEPT_FINISHED_DONE)) ||
  5685. (ssl->options.side == WOLFSSL_CLIENT_END &&
  5686. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  5687. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  5688. ssl->options.connectState == FINISHED_DONE))) {
  5689. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  5690. ssl->error = DTLS_RETX_OVER_TX;
  5691. return WOLFSSL_FATAL_ERROR;
  5692. }
  5693. while (pool != NULL) {
  5694. if (pool->seq == 0) {
  5695. DtlsRecordLayerHeader* dtls;
  5696. int epochOrder;
  5697. dtls = (DtlsRecordLayerHeader*)pool->buf;
  5698. /* If the stored record's epoch is 0, and the currently set
  5699. * epoch is 0, use the "current order" sequence number.
  5700. * If the stored record's epoch is 0 and the currently set
  5701. * epoch is not 0, the stored record is considered a "previous
  5702. * order" sequence number. */
  5703. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  5704. CUR_ORDER : PREV_ORDER;
  5705. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  5706. DtlsSEQIncrement(ssl, epochOrder);
  5707. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  5708. WOLFSSL_ERROR(ret);
  5709. return ret;
  5710. }
  5711. XMEMCPY(ssl->buffers.outputBuffer.buffer,
  5712. pool->buf, pool->sz);
  5713. ssl->buffers.outputBuffer.idx = 0;
  5714. ssl->buffers.outputBuffer.length = pool->sz;
  5715. }
  5716. else if (pool->seq == ssl->keys.dtls_epoch) {
  5717. byte* input;
  5718. byte* output;
  5719. int inputSz, sendSz;
  5720. input = pool->buf;
  5721. inputSz = pool->sz;
  5722. sendSz = inputSz + MAX_MSG_EXTRA;
  5723. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  5724. WOLFSSL_ERROR(ret);
  5725. return ret;
  5726. }
  5727. output = ssl->buffers.outputBuffer.buffer +
  5728. ssl->buffers.outputBuffer.length;
  5729. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  5730. handshake, 0, 0, 0);
  5731. if (sendSz < 0) {
  5732. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  5733. return BUILD_MSG_ERROR;
  5734. }
  5735. ssl->buffers.outputBuffer.length += sendSz;
  5736. }
  5737. ret = SendBuffered(ssl);
  5738. if (ret < 0) {
  5739. WOLFSSL_ERROR(ret);
  5740. return ret;
  5741. }
  5742. /**
  5743. * on server side, retransmission is being triggered only by sending
  5744. * first message of given flight, in order to trigger client
  5745. * to retransmit its whole flight. Sending the whole previous flight
  5746. * could lead to retransmission of previous client flight for each
  5747. * server message from previous flight. Therefore one message should
  5748. * be enough to do the trick.
  5749. */
  5750. if (sendOnlyFirstPacket &&
  5751. ssl->options.side == WOLFSSL_SERVER_END) {
  5752. pool = NULL;
  5753. }
  5754. else
  5755. pool = pool->next;
  5756. ssl->dtls_tx_msg = pool;
  5757. }
  5758. }
  5759. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  5760. return ret;
  5761. }
  5762. #endif /* WOLFSSL_DTLS */
  5763. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  5764. ProtocolVersion MakeSSLv3(void)
  5765. {
  5766. ProtocolVersion pv;
  5767. pv.major = SSLv3_MAJOR;
  5768. pv.minor = SSLv3_MINOR;
  5769. return pv;
  5770. }
  5771. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  5772. #ifdef WOLFSSL_DTLS
  5773. ProtocolVersion MakeDTLSv1(void)
  5774. {
  5775. ProtocolVersion pv;
  5776. pv.major = DTLS_MAJOR;
  5777. pv.minor = DTLS_MINOR;
  5778. return pv;
  5779. }
  5780. #ifndef WOLFSSL_NO_TLS12
  5781. ProtocolVersion MakeDTLSv1_2(void)
  5782. {
  5783. ProtocolVersion pv;
  5784. pv.major = DTLS_MAJOR;
  5785. pv.minor = DTLSv1_2_MINOR;
  5786. return pv;
  5787. }
  5788. #endif /* !WOLFSSL_NO_TLS12 */
  5789. #endif /* WOLFSSL_DTLS */
  5790. #if defined(USER_TICKS)
  5791. #if 0
  5792. word32 LowResTimer(void)
  5793. {
  5794. /*
  5795. write your own clock tick function if don't want time(0)
  5796. needs second accuracy but doesn't have to correlated to EPOCH
  5797. */
  5798. }
  5799. #endif
  5800. #elif defined(TIME_OVERRIDES)
  5801. /* use same asn time overrides unless user wants tick override above */
  5802. #ifndef HAVE_TIME_T_TYPE
  5803. typedef long time_t;
  5804. #endif
  5805. extern time_t XTIME(time_t * timer);
  5806. word32 LowResTimer(void)
  5807. {
  5808. return (word32) XTIME(0);
  5809. }
  5810. #elif defined(USE_WINDOWS_API)
  5811. word32 LowResTimer(void)
  5812. {
  5813. static int init = 0;
  5814. static LARGE_INTEGER freq;
  5815. LARGE_INTEGER count;
  5816. if (!init) {
  5817. QueryPerformanceFrequency(&freq);
  5818. init = 1;
  5819. }
  5820. QueryPerformanceCounter(&count);
  5821. return (word32)(count.QuadPart / freq.QuadPart);
  5822. }
  5823. #elif defined(HAVE_RTP_SYS)
  5824. #include "rtptime.h"
  5825. word32 LowResTimer(void)
  5826. {
  5827. return (word32)rtp_get_system_sec();
  5828. }
  5829. #elif defined(WOLFSSL_DEOS)
  5830. word32 LowResTimer(void)
  5831. {
  5832. const uint32_t systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  5833. uint32_t *systemTickPtr = systemTickPointer();
  5834. return (word32) *systemTickPtr/systemTickTimeInHz;
  5835. }
  5836. #elif defined(MICRIUM)
  5837. word32 LowResTimer(void)
  5838. {
  5839. OS_TICK ticks = 0;
  5840. OS_ERR err;
  5841. ticks = OSTimeGet(&err);
  5842. return (word32) (ticks / OSCfg_TickRate_Hz);
  5843. }
  5844. #elif defined(MICROCHIP_TCPIP_V5)
  5845. word32 LowResTimer(void)
  5846. {
  5847. return (word32) (TickGet() / TICKS_PER_SECOND);
  5848. }
  5849. #elif defined(MICROCHIP_TCPIP)
  5850. #if defined(MICROCHIP_MPLAB_HARMONY)
  5851. #include <system/tmr/sys_tmr.h>
  5852. word32 LowResTimer(void)
  5853. {
  5854. return (word32) (SYS_TMR_TickCountGet() /
  5855. SYS_TMR_TickCounterFrequencyGet());
  5856. }
  5857. #else
  5858. word32 LowResTimer(void)
  5859. {
  5860. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  5861. }
  5862. #endif
  5863. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  5864. word32 LowResTimer(void)
  5865. {
  5866. TIME_STRUCT mqxTime;
  5867. _time_get_elapsed(&mqxTime);
  5868. return (word32) mqxTime.SECONDS;
  5869. }
  5870. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  5871. #include "include/task.h"
  5872. unsigned int LowResTimer(void)
  5873. {
  5874. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  5875. }
  5876. #elif defined(FREESCALE_KSDK_BM)
  5877. #include "lwip/sys.h" /* lwIP */
  5878. word32 LowResTimer(void)
  5879. {
  5880. return sys_now()/1000;
  5881. }
  5882. #elif defined(WOLFSSL_TIRTOS)
  5883. word32 LowResTimer(void)
  5884. {
  5885. return (word32) Seconds_get();
  5886. }
  5887. #elif defined(WOLFSSL_XILINX)
  5888. #include "xrtcpsu.h"
  5889. word32 LowResTimer(void)
  5890. {
  5891. XRtcPsu_Config* con;
  5892. XRtcPsu rtc;
  5893. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  5894. if (con != NULL) {
  5895. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  5896. == XST_SUCCESS) {
  5897. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  5898. }
  5899. else {
  5900. WOLFSSL_MSG("Unable to initialize RTC");
  5901. }
  5902. }
  5903. return 0;
  5904. }
  5905. #elif defined(WOLFSSL_UTASKER)
  5906. word32 LowResTimer(void)
  5907. {
  5908. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  5909. }
  5910. #elif defined(WOLFSSL_NUCLEUS_1_2)
  5911. #define NU_TICKS_PER_SECOND 100
  5912. word32 LowResTimer(void)
  5913. {
  5914. /* returns number of 10ms ticks, so 100 ticks/sec */
  5915. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  5916. }
  5917. #elif defined(WOLFSSL_APACHE_MYNEWT)
  5918. #include "os/os_time.h"
  5919. word32 LowResTimer(void)
  5920. {
  5921. word32 now;
  5922. struct os_timeval tv;
  5923. os_gettimeofday(&tv, NULL);
  5924. now = (word32)tv.tv_sec;
  5925. return now;
  5926. }
  5927. #elif defined(WOLFSSL_ZEPHYR)
  5928. word32 LowResTimer(void)
  5929. {
  5930. return k_uptime_get() / 1000;
  5931. }
  5932. #else
  5933. /* Posix style time */
  5934. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  5935. #include <time.h>
  5936. #endif
  5937. word32 LowResTimer(void)
  5938. {
  5939. return (word32)XTIME(0);
  5940. }
  5941. #endif
  5942. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && defined(HAVE_ED25519) && \
  5943. !defined(NO_ED25519_CLIENT_AUTH)
  5944. /* Store the message for use with CertificateVerify using Ed25519.
  5945. *
  5946. * ssl SSL/TLS object.
  5947. * data Message to store.
  5948. * sz Size of message to store.
  5949. * returns MEMORY_E if not able to reallocate, otherwise 0.
  5950. */
  5951. static int Ed25519Update(WOLFSSL* ssl, const byte* data, int sz)
  5952. {
  5953. int ret = 0;
  5954. byte* msgs;
  5955. if (ssl->options.cacheMessages) {
  5956. msgs = (byte*)XREALLOC(ssl->hsHashes->messages,
  5957. ssl->hsHashes->length + sz,
  5958. ssl->heap, DYNAMIC_TYPE_HASHES);
  5959. if (msgs == NULL)
  5960. ret = MEMORY_E;
  5961. if (ret == 0) {
  5962. ssl->hsHashes->messages = msgs;
  5963. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  5964. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  5965. ssl->hsHashes->length += sz;
  5966. }
  5967. }
  5968. return ret;
  5969. }
  5970. #endif /* HAVE_ED25519 && !WOLFSSL_NO_CLIENT_AUTH */
  5971. #ifndef NO_CERTS
  5972. int HashOutputRaw(WOLFSSL* ssl, const byte* output, int sz)
  5973. {
  5974. int ret = 0;
  5975. (void)output;
  5976. (void)sz;
  5977. if (ssl->hsHashes == NULL)
  5978. return BAD_FUNC_ARG;
  5979. #ifdef HAVE_FUZZER
  5980. if (ssl->fuzzerCb)
  5981. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  5982. #endif
  5983. #ifndef NO_OLD_TLS
  5984. #ifndef NO_SHA
  5985. wc_ShaUpdate(&ssl->hsHashes->hashSha, output, sz);
  5986. #endif
  5987. #ifndef NO_MD5
  5988. wc_Md5Update(&ssl->hsHashes->hashMd5, output, sz);
  5989. #endif
  5990. #endif /* NO_OLD_TLS */
  5991. if (IsAtLeastTLSv1_2(ssl)) {
  5992. #ifndef NO_SHA256
  5993. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, output, sz);
  5994. if (ret != 0)
  5995. return ret;
  5996. #endif
  5997. #ifdef WOLFSSL_SHA384
  5998. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, output, sz);
  5999. if (ret != 0)
  6000. return ret;
  6001. #endif
  6002. #ifdef WOLFSSL_SHA512
  6003. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, output, sz);
  6004. if (ret != 0)
  6005. return ret;
  6006. #endif
  6007. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && defined(HAVE_ED25519) && \
  6008. !defined(NO_ED25519_CLIENT_AUTH)
  6009. ret = Ed25519Update(ssl, output, sz);
  6010. if (ret != 0)
  6011. return ret;
  6012. #endif
  6013. }
  6014. return ret;
  6015. }
  6016. #endif /* NO_CERTS */
  6017. /* add output to md5 and sha handshake hashes, exclude record header */
  6018. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  6019. {
  6020. int ret = 0;
  6021. const byte* adj;
  6022. if (ssl->hsHashes == NULL)
  6023. return BAD_FUNC_ARG;
  6024. adj = output + RECORD_HEADER_SZ + ivSz;
  6025. sz -= RECORD_HEADER_SZ;
  6026. #ifdef HAVE_FUZZER
  6027. if (ssl->fuzzerCb)
  6028. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  6029. #endif
  6030. #ifdef WOLFSSL_DTLS
  6031. if (ssl->options.dtls) {
  6032. adj += DTLS_RECORD_EXTRA;
  6033. sz -= DTLS_RECORD_EXTRA;
  6034. }
  6035. #endif
  6036. #ifndef NO_OLD_TLS
  6037. #ifndef NO_SHA
  6038. wc_ShaUpdate(&ssl->hsHashes->hashSha, adj, sz);
  6039. #endif
  6040. #ifndef NO_MD5
  6041. wc_Md5Update(&ssl->hsHashes->hashMd5, adj, sz);
  6042. #endif
  6043. #endif
  6044. if (IsAtLeastTLSv1_2(ssl)) {
  6045. #ifndef NO_SHA256
  6046. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, adj, sz);
  6047. if (ret != 0)
  6048. return ret;
  6049. #endif
  6050. #ifdef WOLFSSL_SHA384
  6051. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, adj, sz);
  6052. if (ret != 0)
  6053. return ret;
  6054. #endif
  6055. #ifdef WOLFSSL_SHA512
  6056. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, adj, sz);
  6057. if (ret != 0)
  6058. return ret;
  6059. #endif
  6060. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && defined(HAVE_ED25519) && \
  6061. !defined(NO_ED25519_CLIENT_AUTH)
  6062. ret = Ed25519Update(ssl, adj, sz);
  6063. if (ret != 0)
  6064. return ret;
  6065. #endif
  6066. }
  6067. return ret;
  6068. }
  6069. /* add input to md5 and sha handshake hashes, include handshake header */
  6070. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  6071. {
  6072. int ret = 0;
  6073. const byte* adj;
  6074. adj = input - HANDSHAKE_HEADER_SZ;
  6075. sz += HANDSHAKE_HEADER_SZ;
  6076. (void)adj;
  6077. #ifdef WOLFSSL_DTLS
  6078. if (ssl->options.dtls) {
  6079. adj -= DTLS_HANDSHAKE_EXTRA;
  6080. sz += DTLS_HANDSHAKE_EXTRA;
  6081. }
  6082. #endif
  6083. if (ssl->hsHashes == NULL) {
  6084. return BAD_FUNC_ARG;
  6085. }
  6086. #ifndef NO_OLD_TLS
  6087. #ifndef NO_SHA
  6088. wc_ShaUpdate(&ssl->hsHashes->hashSha, adj, sz);
  6089. #endif
  6090. #ifndef NO_MD5
  6091. wc_Md5Update(&ssl->hsHashes->hashMd5, adj, sz);
  6092. #endif
  6093. #endif
  6094. if (IsAtLeastTLSv1_2(ssl)) {
  6095. #ifndef NO_SHA256
  6096. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, adj, sz);
  6097. if (ret != 0)
  6098. return ret;
  6099. #endif
  6100. #ifdef WOLFSSL_SHA384
  6101. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, adj, sz);
  6102. if (ret != 0)
  6103. return ret;
  6104. #endif
  6105. #ifdef WOLFSSL_SHA512
  6106. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, adj, sz);
  6107. if (ret != 0)
  6108. return ret;
  6109. #endif
  6110. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && defined(HAVE_ED25519) && \
  6111. !defined(NO_ED25519_CLIENT_AUTH)
  6112. ret = Ed25519Update(ssl, adj, sz);
  6113. if (ret != 0)
  6114. return ret;
  6115. #endif
  6116. }
  6117. return ret;
  6118. }
  6119. /* add record layer header for message */
  6120. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl)
  6121. {
  6122. RecordLayerHeader* rl;
  6123. /* record layer header */
  6124. rl = (RecordLayerHeader*)output;
  6125. if (rl == NULL) {
  6126. return;
  6127. }
  6128. rl->type = type;
  6129. rl->pvMajor = ssl->version.major; /* type and version same in each */
  6130. #ifdef WOLFSSL_TLS13
  6131. if (IsAtLeastTLSv1_3(ssl->version)) {
  6132. #ifdef WOLFSSL_TLS13_DRAFT_18
  6133. rl->pvMinor = TLSv1_MINOR;
  6134. #else
  6135. rl->pvMinor = TLSv1_2_MINOR;
  6136. #endif
  6137. }
  6138. else
  6139. #endif
  6140. rl->pvMinor = ssl->version.minor;
  6141. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  6142. if (ssl->options.side == WOLFSSL_CLIENT_END
  6143. && ssl->options.connectState == CONNECT_BEGIN
  6144. && !ssl->options.resuming) {
  6145. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  6146. : ssl->version.minor;
  6147. }
  6148. #endif
  6149. if (!ssl->options.dtls) {
  6150. c16toa((word16)length, rl->length);
  6151. }
  6152. else {
  6153. #ifdef WOLFSSL_DTLS
  6154. DtlsRecordLayerHeader* dtls;
  6155. /* dtls record layer header extensions */
  6156. dtls = (DtlsRecordLayerHeader*)output;
  6157. WriteSEQ(ssl, 0, dtls->sequence_number);
  6158. c16toa((word16)length, dtls->length);
  6159. #endif
  6160. }
  6161. }
  6162. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  6163. !defined(NO_WOLFSSL_SERVER))
  6164. /* add handshake header for message */
  6165. static void AddHandShakeHeader(byte* output, word32 length,
  6166. word32 fragOffset, word32 fragLength,
  6167. byte type, WOLFSSL* ssl)
  6168. {
  6169. HandShakeHeader* hs;
  6170. (void)fragOffset;
  6171. (void)fragLength;
  6172. (void)ssl;
  6173. /* handshake header */
  6174. hs = (HandShakeHeader*)output;
  6175. if (hs == NULL)
  6176. return;
  6177. hs->type = type;
  6178. c32to24(length, hs->length); /* type and length same for each */
  6179. #ifdef WOLFSSL_DTLS
  6180. if (ssl->options.dtls) {
  6181. DtlsHandShakeHeader* dtls;
  6182. /* dtls handshake header extensions */
  6183. dtls = (DtlsHandShakeHeader*)output;
  6184. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  6185. c32to24(fragOffset, dtls->fragment_offset);
  6186. c32to24(fragLength, dtls->fragment_length);
  6187. }
  6188. #endif
  6189. }
  6190. /* add both headers for handshake message */
  6191. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  6192. {
  6193. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  6194. word32 outputAdj = RECORD_HEADER_SZ;
  6195. #ifdef WOLFSSL_DTLS
  6196. if (ssl->options.dtls) {
  6197. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  6198. outputAdj += DTLS_RECORD_EXTRA;
  6199. }
  6200. #endif
  6201. AddRecordHeader(output, length + lengthAdj, handshake, ssl);
  6202. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  6203. }
  6204. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  6205. #ifndef WOLFSSL_NO_TLS12
  6206. #ifndef NO_CERTS
  6207. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  6208. word32 length, byte type, WOLFSSL* ssl)
  6209. {
  6210. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  6211. word32 outputAdj = RECORD_HEADER_SZ;
  6212. (void)fragSz;
  6213. #ifdef WOLFSSL_DTLS
  6214. if (ssl->options.dtls) {
  6215. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  6216. outputAdj += DTLS_RECORD_EXTRA;
  6217. }
  6218. #endif
  6219. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl);
  6220. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  6221. }
  6222. #endif /* NO_CERTS */
  6223. #endif /* !WOLFSSL_NO_TLS12 */
  6224. /* return bytes received, -1 on error */
  6225. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  6226. {
  6227. int recvd;
  6228. if (ssl->CBIORecv == NULL) {
  6229. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  6230. return -1;
  6231. }
  6232. retry:
  6233. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  6234. if (recvd < 0) {
  6235. switch (recvd) {
  6236. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  6237. return -1;
  6238. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  6239. return WANT_READ;
  6240. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  6241. #ifdef USE_WINDOWS_API
  6242. if (ssl->options.dtls) {
  6243. goto retry;
  6244. }
  6245. #endif
  6246. ssl->options.connReset = 1;
  6247. return -1;
  6248. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  6249. /* see if we got our timeout */
  6250. #ifdef WOLFSSL_CALLBACKS
  6251. if (ssl->toInfoOn) {
  6252. struct itimerval timeout;
  6253. getitimer(ITIMER_REAL, &timeout);
  6254. if (timeout.it_value.tv_sec == 0 &&
  6255. timeout.it_value.tv_usec == 0) {
  6256. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  6257. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  6258. ssl->timeoutInfo.timeoutName[
  6259. MAX_TIMEOUT_NAME_SZ] = '\0';
  6260. WOLFSSL_MSG("Got our timeout");
  6261. return WANT_READ;
  6262. }
  6263. }
  6264. #endif
  6265. goto retry;
  6266. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  6267. ssl->options.isClosed = 1;
  6268. return -1;
  6269. case WOLFSSL_CBIO_ERR_TIMEOUT:
  6270. #ifdef WOLFSSL_DTLS
  6271. if (IsDtlsNotSctpMode(ssl) &&
  6272. !ssl->options.handShakeDone &&
  6273. DtlsMsgPoolTimeout(ssl) == 0 &&
  6274. DtlsMsgPoolSend(ssl, 0) == 0) {
  6275. /* retry read for DTLS during handshake only */
  6276. goto retry;
  6277. }
  6278. #endif
  6279. return -1;
  6280. default:
  6281. WOLFSSL_MSG("Unexpected recv return code");
  6282. return recvd;
  6283. }
  6284. }
  6285. return recvd;
  6286. }
  6287. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  6288. void ShrinkOutputBuffer(WOLFSSL* ssl)
  6289. {
  6290. WOLFSSL_MSG("Shrinking output buffer\n");
  6291. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  6292. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  6293. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  6294. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  6295. ssl->buffers.outputBuffer.dynamicFlag = 0;
  6296. ssl->buffers.outputBuffer.offset = 0;
  6297. }
  6298. /* Switch dynamic input buffer back to static, keep any remaining input */
  6299. /* forced free means cleaning up */
  6300. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  6301. {
  6302. int usedLength = ssl->buffers.inputBuffer.length -
  6303. ssl->buffers.inputBuffer.idx;
  6304. if (!forcedFree && usedLength > STATIC_BUFFER_LEN)
  6305. return;
  6306. WOLFSSL_MSG("Shrinking input buffer\n");
  6307. if (!forcedFree && usedLength > 0)
  6308. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  6309. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  6310. usedLength);
  6311. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  6312. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  6313. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  6314. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  6315. ssl->buffers.inputBuffer.dynamicFlag = 0;
  6316. ssl->buffers.inputBuffer.offset = 0;
  6317. ssl->buffers.inputBuffer.idx = 0;
  6318. ssl->buffers.inputBuffer.length = usedLength;
  6319. }
  6320. int SendBuffered(WOLFSSL* ssl)
  6321. {
  6322. if (ssl->CBIOSend == NULL) {
  6323. WOLFSSL_MSG("Your IO Send callback is null, please set");
  6324. return SOCKET_ERROR_E;
  6325. }
  6326. #ifdef WOLFSSL_DEBUG_TLS
  6327. if (ssl->buffers.outputBuffer.idx == 0) {
  6328. WOLFSSL_MSG("Data to send");
  6329. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  6330. ssl->buffers.outputBuffer.length);
  6331. }
  6332. #endif
  6333. while (ssl->buffers.outputBuffer.length > 0) {
  6334. int sent = ssl->CBIOSend(ssl,
  6335. (char*)ssl->buffers.outputBuffer.buffer +
  6336. ssl->buffers.outputBuffer.idx,
  6337. (int)ssl->buffers.outputBuffer.length,
  6338. ssl->IOCB_WriteCtx);
  6339. if (sent < 0) {
  6340. switch (sent) {
  6341. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  6342. return WANT_WRITE;
  6343. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  6344. ssl->options.connReset = 1;
  6345. break;
  6346. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  6347. /* see if we got our timeout */
  6348. #ifdef WOLFSSL_CALLBACKS
  6349. if (ssl->toInfoOn) {
  6350. struct itimerval timeout;
  6351. getitimer(ITIMER_REAL, &timeout);
  6352. if (timeout.it_value.tv_sec == 0 &&
  6353. timeout.it_value.tv_usec == 0) {
  6354. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  6355. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  6356. ssl->timeoutInfo.timeoutName[
  6357. MAX_TIMEOUT_NAME_SZ] = '\0';
  6358. WOLFSSL_MSG("Got our timeout");
  6359. return WANT_WRITE;
  6360. }
  6361. }
  6362. #endif
  6363. continue;
  6364. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  6365. ssl->options.connReset = 1; /* treat same as reset */
  6366. break;
  6367. default:
  6368. return SOCKET_ERROR_E;
  6369. }
  6370. return SOCKET_ERROR_E;
  6371. }
  6372. if (sent > (int)ssl->buffers.outputBuffer.length) {
  6373. WOLFSSL_MSG("SendBuffered() out of bounds read");
  6374. return SEND_OOB_READ_E;
  6375. }
  6376. ssl->buffers.outputBuffer.idx += sent;
  6377. ssl->buffers.outputBuffer.length -= sent;
  6378. }
  6379. ssl->buffers.outputBuffer.idx = 0;
  6380. if (ssl->buffers.outputBuffer.dynamicFlag)
  6381. ShrinkOutputBuffer(ssl);
  6382. return 0;
  6383. }
  6384. /* Grow the output buffer */
  6385. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  6386. {
  6387. byte* tmp;
  6388. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  6389. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  6390. RECORD_HEADER_SZ;
  6391. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  6392. #else
  6393. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  6394. #endif
  6395. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  6396. /* the encrypted data will be offset from the front of the buffer by
  6397. the header, if the user wants encrypted alignment they need
  6398. to define their alignment requirement */
  6399. if (align) {
  6400. while (align < hdrSz)
  6401. align *= 2;
  6402. }
  6403. #endif
  6404. tmp = (byte*)XMALLOC(size + ssl->buffers.outputBuffer.length + align,
  6405. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  6406. WOLFSSL_MSG("growing output buffer\n");
  6407. if (tmp == NULL)
  6408. return MEMORY_E;
  6409. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  6410. if (align)
  6411. tmp += align - hdrSz;
  6412. #endif
  6413. if (ssl->buffers.outputBuffer.length)
  6414. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  6415. ssl->buffers.outputBuffer.length);
  6416. if (ssl->buffers.outputBuffer.dynamicFlag)
  6417. XFREE(ssl->buffers.outputBuffer.buffer -
  6418. ssl->buffers.outputBuffer.offset, ssl->heap,
  6419. DYNAMIC_TYPE_OUT_BUFFER);
  6420. ssl->buffers.outputBuffer.dynamicFlag = 1;
  6421. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  6422. if (align)
  6423. ssl->buffers.outputBuffer.offset = align - hdrSz;
  6424. else
  6425. #endif
  6426. ssl->buffers.outputBuffer.offset = 0;
  6427. ssl->buffers.outputBuffer.buffer = tmp;
  6428. ssl->buffers.outputBuffer.bufferSize = size +
  6429. ssl->buffers.outputBuffer.length;
  6430. return 0;
  6431. }
  6432. /* Grow the input buffer, should only be to read cert or big app data */
  6433. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  6434. {
  6435. byte* tmp;
  6436. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  6437. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  6438. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  6439. #else
  6440. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  6441. #endif
  6442. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  6443. /* the encrypted data will be offset from the front of the buffer by
  6444. the dtls record header, if the user wants encrypted alignment they need
  6445. to define their alignment requirement. in tls we read record header
  6446. to get size of record and put actual data back at front, so don't need */
  6447. if (align) {
  6448. while (align < hdrSz)
  6449. align *= 2;
  6450. }
  6451. #endif
  6452. if (usedLength < 0 || size < 0) {
  6453. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  6454. return BAD_FUNC_ARG;
  6455. }
  6456. tmp = (byte*)XMALLOC(size + usedLength + align,
  6457. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  6458. WOLFSSL_MSG("growing input buffer\n");
  6459. if (tmp == NULL)
  6460. return MEMORY_E;
  6461. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  6462. if (align)
  6463. tmp += align - hdrSz;
  6464. #endif
  6465. if (usedLength)
  6466. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  6467. ssl->buffers.inputBuffer.idx, usedLength);
  6468. if (ssl->buffers.inputBuffer.dynamicFlag)
  6469. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  6470. ssl->heap,DYNAMIC_TYPE_IN_BUFFER);
  6471. ssl->buffers.inputBuffer.dynamicFlag = 1;
  6472. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  6473. if (align)
  6474. ssl->buffers.inputBuffer.offset = align - hdrSz;
  6475. else
  6476. #endif
  6477. ssl->buffers.inputBuffer.offset = 0;
  6478. ssl->buffers.inputBuffer.buffer = tmp;
  6479. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  6480. ssl->buffers.inputBuffer.idx = 0;
  6481. ssl->buffers.inputBuffer.length = usedLength;
  6482. return 0;
  6483. }
  6484. /* check available size into output buffer, make room if needed */
  6485. int CheckAvailableSize(WOLFSSL *ssl, int size)
  6486. {
  6487. if (size < 0) {
  6488. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  6489. return BAD_FUNC_ARG;
  6490. }
  6491. if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
  6492. < (word32)size) {
  6493. if (GrowOutputBuffer(ssl, size) < 0)
  6494. return MEMORY_E;
  6495. }
  6496. return 0;
  6497. }
  6498. /* do all verify and sanity checks on record header */
  6499. static int GetRecordHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  6500. RecordLayerHeader* rh, word16 *size)
  6501. {
  6502. if (!ssl->options.dtls) {
  6503. #ifdef HAVE_FUZZER
  6504. if (ssl->fuzzerCb)
  6505. ssl->fuzzerCb(ssl, input + *inOutIdx, RECORD_HEADER_SZ, FUZZ_HEAD,
  6506. ssl->fuzzerCtx);
  6507. #endif
  6508. XMEMCPY(rh, input + *inOutIdx, RECORD_HEADER_SZ);
  6509. *inOutIdx += RECORD_HEADER_SZ;
  6510. ato16(rh->length, size);
  6511. }
  6512. else {
  6513. #ifdef WOLFSSL_DTLS
  6514. #ifdef HAVE_FUZZER
  6515. if (ssl->fuzzerCb)
  6516. ssl->fuzzerCb(ssl, input + *inOutIdx, DTLS_RECORD_HEADER_SZ,
  6517. FUZZ_HEAD, ssl->fuzzerCtx);
  6518. #endif
  6519. /* type and version in same sport */
  6520. XMEMCPY(rh, input + *inOutIdx, ENUM_LEN + VERSION_SZ);
  6521. *inOutIdx += ENUM_LEN + VERSION_SZ;
  6522. ato16(input + *inOutIdx, &ssl->keys.curEpoch);
  6523. *inOutIdx += OPAQUE16_LEN;
  6524. if (ssl->options.haveMcast) {
  6525. #ifdef WOLFSSL_MULTICAST
  6526. ssl->keys.curPeerId = input[*inOutIdx];
  6527. ssl->keys.curSeq_hi = input[*inOutIdx+1];
  6528. #endif
  6529. }
  6530. else
  6531. ato16(input + *inOutIdx, &ssl->keys.curSeq_hi);
  6532. *inOutIdx += OPAQUE16_LEN;
  6533. ato32(input + *inOutIdx, &ssl->keys.curSeq_lo);
  6534. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  6535. ato16(input + *inOutIdx, size);
  6536. *inOutIdx += LENGTH_SZ;
  6537. #endif
  6538. }
  6539. #ifdef WOLFSSL_DTLS
  6540. if (IsDtlsNotSctpMode(ssl) &&
  6541. (!DtlsCheckWindow(ssl) ||
  6542. (ssl->options.handShakeDone && ssl->keys.curEpoch == 0))) {
  6543. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  6544. return SEQUENCE_ERROR;
  6545. }
  6546. #endif
  6547. /* catch version mismatch */
  6548. #ifndef WOLFSSL_TLS13
  6549. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  6550. #else
  6551. if (rh->pvMajor != ssl->version.major ||
  6552. (rh->pvMinor != ssl->version.minor &&
  6553. #ifdef WOLFSSL_TLS13_DRAFT_18
  6554. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_MINOR)
  6555. #else
  6556. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_2_MINOR)
  6557. #endif
  6558. ))
  6559. #endif
  6560. {
  6561. if (ssl->options.side == WOLFSSL_SERVER_END &&
  6562. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  6563. WOLFSSL_MSG("Client attempting to connect with different version");
  6564. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  6565. ssl->options.downgrade &&
  6566. ssl->options.connectState < FIRST_REPLY_DONE)
  6567. WOLFSSL_MSG("Server attempting to accept with different version");
  6568. else if (ssl->options.dtls && rh->type == handshake)
  6569. /* Check the DTLS handshake message RH version later. */
  6570. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  6571. else {
  6572. WOLFSSL_MSG("SSL version error");
  6573. /* send alert per RFC5246 Appendix E. Backward Compatibility */
  6574. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  6575. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  6576. SendAlert(ssl, alert_fatal, wc_protocol_version);
  6577. #else
  6578. SendAlert(ssl, alert_fatal, protocol_version);
  6579. #endif
  6580. }
  6581. return VERSION_ERROR; /* only use requested version */
  6582. }
  6583. }
  6584. /* record layer length check */
  6585. #ifdef HAVE_MAX_FRAGMENT
  6586. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  6587. SendAlert(ssl, alert_fatal, record_overflow);
  6588. return LENGTH_ERROR;
  6589. }
  6590. #else
  6591. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA))
  6592. return LENGTH_ERROR;
  6593. #endif
  6594. /* verify record type here as well */
  6595. switch (rh->type) {
  6596. case handshake:
  6597. case change_cipher_spec:
  6598. case application_data:
  6599. case alert:
  6600. break;
  6601. case no_type:
  6602. default:
  6603. WOLFSSL_MSG("Unknown Record Type");
  6604. return UNKNOWN_RECORD_TYPE;
  6605. }
  6606. /* haven't decrypted this record yet */
  6607. ssl->keys.decryptedCur = 0;
  6608. return 0;
  6609. }
  6610. #ifndef WOLFSSL_NO_TLS12
  6611. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  6612. byte *type, word32 *size, word32 totalSz)
  6613. {
  6614. const byte *ptr = input + *inOutIdx;
  6615. (void)ssl;
  6616. *inOutIdx += HANDSHAKE_HEADER_SZ;
  6617. if (*inOutIdx > totalSz)
  6618. return BUFFER_E;
  6619. *type = ptr[0];
  6620. c24to32(&ptr[1], size);
  6621. return 0;
  6622. }
  6623. #endif
  6624. #ifdef WOLFSSL_DTLS
  6625. static int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  6626. word32* inOutIdx, byte *type, word32 *size,
  6627. word32 *fragOffset, word32 *fragSz,
  6628. word32 totalSz)
  6629. {
  6630. word32 idx = *inOutIdx;
  6631. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  6632. if (*inOutIdx > totalSz) {
  6633. WOLFSSL_ERROR(BUFFER_E);
  6634. return BUFFER_E;
  6635. }
  6636. *type = input[idx++];
  6637. c24to32(input + idx, size);
  6638. idx += OPAQUE24_LEN;
  6639. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  6640. idx += DTLS_HANDSHAKE_SEQ_SZ;
  6641. c24to32(input + idx, fragOffset);
  6642. idx += DTLS_HANDSHAKE_FRAG_SZ;
  6643. c24to32(input + idx, fragSz);
  6644. if (ssl->curRL.pvMajor != ssl->version.major ||
  6645. ssl->curRL.pvMinor != ssl->version.minor) {
  6646. if (*type != client_hello && *type != hello_verify_request) {
  6647. WOLFSSL_ERROR(VERSION_ERROR);
  6648. return VERSION_ERROR;
  6649. }
  6650. else {
  6651. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  6652. }
  6653. }
  6654. return 0;
  6655. }
  6656. #endif
  6657. #if !defined(NO_OLD_TLS) || \
  6658. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  6659. /* fill with MD5 pad size since biggest required */
  6660. static const byte PAD1[PAD_MD5] =
  6661. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  6662. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  6663. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  6664. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  6665. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  6666. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  6667. };
  6668. static const byte PAD2[PAD_MD5] =
  6669. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  6670. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  6671. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  6672. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  6673. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  6674. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  6675. };
  6676. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  6677. #ifndef NO_OLD_TLS
  6678. /* calculate MD5 hash for finished */
  6679. #ifdef WOLFSSL_TI_HASH
  6680. #include <wolfssl/wolfcrypt/hash.h>
  6681. #endif
  6682. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  6683. {
  6684. int ret;
  6685. byte md5_result[WC_MD5_DIGEST_SIZE];
  6686. #ifdef WOLFSSL_SMALL_STACK
  6687. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  6688. if (md5 == NULL)
  6689. return MEMORY_E;
  6690. #else
  6691. wc_Md5 md5[1];
  6692. #endif
  6693. /* make md5 inner */
  6694. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  6695. if (ret == 0)
  6696. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  6697. if (ret == 0)
  6698. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  6699. if (ret == 0)
  6700. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  6701. if (ret == 0)
  6702. ret = wc_Md5Final(md5, md5_result);
  6703. /* make md5 outer */
  6704. if (ret == 0) {
  6705. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  6706. if (ret == 0) {
  6707. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  6708. if (ret == 0)
  6709. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  6710. if (ret == 0)
  6711. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  6712. if (ret == 0)
  6713. ret = wc_Md5Final(md5, hashes->md5);
  6714. wc_Md5Free(md5);
  6715. }
  6716. }
  6717. #ifdef WOLFSSL_SMALL_STACK
  6718. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  6719. #endif
  6720. return ret;
  6721. }
  6722. /* calculate SHA hash for finished */
  6723. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  6724. {
  6725. int ret;
  6726. byte sha_result[WC_SHA_DIGEST_SIZE];
  6727. #ifdef WOLFSSL_SMALL_STACK
  6728. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  6729. if (sha == NULL)
  6730. return MEMORY_E;
  6731. #else
  6732. wc_Sha sha[1];
  6733. #endif
  6734. /* make sha inner */
  6735. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  6736. if (ret == 0)
  6737. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  6738. if (ret == 0)
  6739. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  6740. if (ret == 0)
  6741. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  6742. if (ret == 0)
  6743. ret = wc_ShaFinal(sha, sha_result);
  6744. /* make sha outer */
  6745. if (ret == 0) {
  6746. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  6747. if (ret == 0) {
  6748. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  6749. if (ret == 0)
  6750. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  6751. if (ret == 0)
  6752. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  6753. if (ret == 0)
  6754. ret = wc_ShaFinal(sha, hashes->sha);
  6755. wc_ShaFree(sha);
  6756. }
  6757. }
  6758. #ifdef WOLFSSL_SMALL_STACK
  6759. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  6760. #endif
  6761. return ret;
  6762. }
  6763. #endif
  6764. #ifndef WOLFSSL_NO_TLS12
  6765. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  6766. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  6767. {
  6768. int ret = 0;
  6769. if (ssl == NULL)
  6770. return BAD_FUNC_ARG;
  6771. #ifndef NO_TLS
  6772. if (ssl->options.tls) {
  6773. ret = BuildTlsFinished(ssl, hashes, sender);
  6774. }
  6775. #endif
  6776. #ifndef NO_OLD_TLS
  6777. if (!ssl->options.tls) {
  6778. ret = BuildMD5(ssl, hashes, sender);
  6779. if (ret == 0) {
  6780. ret = BuildSHA(ssl, hashes, sender);
  6781. }
  6782. }
  6783. #endif
  6784. return ret;
  6785. }
  6786. #endif /* WOLFSSL_NO_TLS12 */
  6787. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  6788. /* cipher requirements */
  6789. enum {
  6790. REQUIRES_RSA,
  6791. REQUIRES_DHE,
  6792. REQUIRES_ECC,
  6793. REQUIRES_ECC_STATIC,
  6794. REQUIRES_PSK,
  6795. REQUIRES_NTRU,
  6796. REQUIRES_RSA_SIG
  6797. };
  6798. /* Does this cipher suite (first, second) have the requirement
  6799. an ephemeral key exchange will still require the key for signing
  6800. the key exchange so ECHDE_RSA requires an rsa key thus rsa_kea */
  6801. static int CipherRequires(byte first, byte second, int requirement)
  6802. {
  6803. (void)requirement;
  6804. #ifndef WOLFSSL_NO_TLS12
  6805. #ifdef HAVE_CHACHA
  6806. if (first == CHACHA_BYTE) {
  6807. switch (second) {
  6808. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  6809. if (requirement == REQUIRES_RSA)
  6810. return 1;
  6811. break;
  6812. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  6813. if (requirement == REQUIRES_ECC)
  6814. return 1;
  6815. break;
  6816. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  6817. if (requirement == REQUIRES_RSA)
  6818. return 1;
  6819. if (requirement == REQUIRES_DHE)
  6820. return 1;
  6821. break;
  6822. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  6823. if (requirement == REQUIRES_RSA)
  6824. return 1;
  6825. break;
  6826. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  6827. if (requirement == REQUIRES_ECC)
  6828. return 1;
  6829. break;
  6830. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  6831. if (requirement == REQUIRES_RSA)
  6832. return 1;
  6833. if (requirement == REQUIRES_DHE)
  6834. return 1;
  6835. break;
  6836. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  6837. if (requirement == REQUIRES_PSK)
  6838. return 1;
  6839. break;
  6840. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  6841. if (requirement == REQUIRES_PSK)
  6842. return 1;
  6843. break;
  6844. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  6845. if (requirement == REQUIRES_PSK)
  6846. return 1;
  6847. if (requirement == REQUIRES_DHE)
  6848. return 1;
  6849. break;
  6850. }
  6851. }
  6852. #endif /* HAVE_CHACHA */
  6853. /* ECC extensions */
  6854. if (first == ECC_BYTE) {
  6855. switch (second) {
  6856. #ifdef HAVE_ECC
  6857. #ifndef NO_RSA
  6858. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  6859. if (requirement == REQUIRES_RSA)
  6860. return 1;
  6861. break;
  6862. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  6863. if (requirement == REQUIRES_ECC_STATIC)
  6864. return 1;
  6865. if (requirement == REQUIRES_RSA_SIG)
  6866. return 1;
  6867. break;
  6868. #ifndef NO_DES3
  6869. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  6870. if (requirement == REQUIRES_RSA)
  6871. return 1;
  6872. break;
  6873. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  6874. if (requirement == REQUIRES_ECC_STATIC)
  6875. return 1;
  6876. if (requirement == REQUIRES_RSA_SIG)
  6877. return 1;
  6878. break;
  6879. #endif /* !NO_DES3 */
  6880. #ifndef NO_RC4
  6881. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  6882. if (requirement == REQUIRES_RSA)
  6883. return 1;
  6884. break;
  6885. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  6886. if (requirement == REQUIRES_ECC_STATIC)
  6887. return 1;
  6888. if (requirement == REQUIRES_RSA_SIG)
  6889. return 1;
  6890. break;
  6891. #endif /* !NO_RC4 */
  6892. #endif /* NO_RSA */
  6893. #ifndef NO_DES3
  6894. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  6895. if (requirement == REQUIRES_ECC)
  6896. return 1;
  6897. break;
  6898. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  6899. if (requirement == REQUIRES_ECC_STATIC)
  6900. return 1;
  6901. break;
  6902. #endif /* !NO_DES3 */
  6903. #ifndef NO_RC4
  6904. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  6905. if (requirement == REQUIRES_ECC)
  6906. return 1;
  6907. break;
  6908. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  6909. if (requirement == REQUIRES_ECC_STATIC)
  6910. return 1;
  6911. break;
  6912. #endif /* !NO_RC4 */
  6913. #ifndef NO_RSA
  6914. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  6915. if (requirement == REQUIRES_RSA)
  6916. return 1;
  6917. break;
  6918. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  6919. if (requirement == REQUIRES_ECC_STATIC)
  6920. return 1;
  6921. if (requirement == REQUIRES_RSA_SIG)
  6922. return 1;
  6923. break;
  6924. #endif /* !NO_RSA */
  6925. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  6926. if (requirement == REQUIRES_ECC)
  6927. return 1;
  6928. break;
  6929. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  6930. if (requirement == REQUIRES_ECC_STATIC)
  6931. return 1;
  6932. break;
  6933. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  6934. if (requirement == REQUIRES_ECC)
  6935. return 1;
  6936. break;
  6937. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  6938. if (requirement == REQUIRES_ECC_STATIC)
  6939. return 1;
  6940. break;
  6941. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  6942. if (requirement == REQUIRES_ECC)
  6943. return 1;
  6944. break;
  6945. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  6946. if (requirement == REQUIRES_ECC)
  6947. return 1;
  6948. break;
  6949. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  6950. if (requirement == REQUIRES_ECC_STATIC)
  6951. return 1;
  6952. break;
  6953. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  6954. if (requirement == REQUIRES_ECC_STATIC)
  6955. return 1;
  6956. break;
  6957. #endif /* HAVE_ECC */
  6958. #ifndef NO_RSA
  6959. #ifdef HAVE_ECC
  6960. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  6961. if (requirement == REQUIRES_RSA)
  6962. return 1;
  6963. break;
  6964. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  6965. if (requirement == REQUIRES_RSA)
  6966. return 1;
  6967. break;
  6968. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  6969. if (requirement == REQUIRES_ECC_STATIC)
  6970. return 1;
  6971. if (requirement == REQUIRES_RSA_SIG)
  6972. return 1;
  6973. break;
  6974. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  6975. if (requirement == REQUIRES_ECC_STATIC)
  6976. return 1;
  6977. if (requirement == REQUIRES_RSA_SIG)
  6978. return 1;
  6979. break;
  6980. #endif /* HAVE_ECC */
  6981. #ifdef HAVE_AESCCM
  6982. case TLS_RSA_WITH_AES_128_CCM_8 :
  6983. case TLS_RSA_WITH_AES_256_CCM_8 :
  6984. if (requirement == REQUIRES_RSA)
  6985. return 1;
  6986. if (requirement == REQUIRES_RSA_SIG)
  6987. return 1;
  6988. break;
  6989. #endif /* HAVE_AESCCM */
  6990. #ifdef HAVE_ECC
  6991. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  6992. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  6993. if (requirement == REQUIRES_RSA)
  6994. return 1;
  6995. break;
  6996. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  6997. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  6998. if (requirement == REQUIRES_RSA_SIG)
  6999. return 1;
  7000. if (requirement == REQUIRES_ECC_STATIC)
  7001. return 1;
  7002. break;
  7003. #endif /* HAVE_ECC */
  7004. #endif /* !NO_RSA */
  7005. #ifdef HAVE_ECC
  7006. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  7007. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  7008. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  7009. if (requirement == REQUIRES_ECC)
  7010. return 1;
  7011. break;
  7012. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  7013. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  7014. if (requirement == REQUIRES_ECC)
  7015. return 1;
  7016. break;
  7017. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  7018. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  7019. if (requirement == REQUIRES_ECC)
  7020. return 1;
  7021. if (requirement == REQUIRES_ECC_STATIC)
  7022. return 1;
  7023. break;
  7024. #endif /* HAVE_ECC */
  7025. #ifndef NO_PSK
  7026. case TLS_PSK_WITH_AES_128_CCM:
  7027. case TLS_PSK_WITH_AES_256_CCM:
  7028. case TLS_PSK_WITH_AES_128_CCM_8:
  7029. case TLS_PSK_WITH_AES_256_CCM_8:
  7030. if (requirement == REQUIRES_PSK)
  7031. return 1;
  7032. break;
  7033. case TLS_DHE_PSK_WITH_AES_128_CCM:
  7034. case TLS_DHE_PSK_WITH_AES_256_CCM:
  7035. if (requirement == REQUIRES_PSK)
  7036. return 1;
  7037. if (requirement == REQUIRES_DHE)
  7038. return 1;
  7039. break;
  7040. #endif /* !NO_PSK */
  7041. #ifdef HAVE_ECC
  7042. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  7043. if (requirement == REQUIRES_ECC)
  7044. return 1;
  7045. break;
  7046. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  7047. if (requirement == REQUIRES_PSK)
  7048. return 1;
  7049. break;
  7050. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  7051. if (requirement == REQUIRES_PSK)
  7052. return 1;
  7053. break;
  7054. #endif /* HAVE_ECC */
  7055. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  7056. case TLS_SHA256_SHA256:
  7057. return 0;
  7058. case TLS_SHA384_SHA384:
  7059. return 0;
  7060. #endif
  7061. default:
  7062. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  7063. return 0;
  7064. } /* switch */
  7065. } /* if */
  7066. #endif /* !WOLFSSL_NO_TLS12 */
  7067. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  7068. if (first == TLS13_BYTE) {
  7069. switch (second) {
  7070. #ifdef WOLFSSL_TLS13
  7071. case TLS_AES_128_GCM_SHA256:
  7072. case TLS_AES_256_GCM_SHA384:
  7073. case TLS_CHACHA20_POLY1305_SHA256:
  7074. case TLS_AES_128_CCM_SHA256:
  7075. case TLS_AES_128_CCM_8_SHA256:
  7076. break;
  7077. #endif
  7078. default:
  7079. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  7080. "TLS v1.3");
  7081. return 0;
  7082. }
  7083. }
  7084. #ifndef WOLFSSL_NO_TLS12
  7085. if (first != ECC_BYTE && first != CHACHA_BYTE &&
  7086. first != TLS13_BYTE) { /* normal suites */
  7087. switch (second) {
  7088. #ifndef NO_RSA
  7089. #ifndef NO_RC4
  7090. case SSL_RSA_WITH_RC4_128_SHA :
  7091. if (requirement == REQUIRES_RSA)
  7092. return 1;
  7093. break;
  7094. case SSL_RSA_WITH_RC4_128_MD5 :
  7095. if (requirement == REQUIRES_RSA)
  7096. return 1;
  7097. break;
  7098. #endif /* NO_RC4 */
  7099. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  7100. if (requirement == REQUIRES_RSA)
  7101. return 1;
  7102. break;
  7103. #ifdef HAVE_NTRU
  7104. case TLS_NTRU_RSA_WITH_RC4_128_SHA :
  7105. if (requirement == REQUIRES_NTRU)
  7106. return 1;
  7107. break;
  7108. #endif /* HAVE_NTRU */
  7109. case TLS_RSA_WITH_AES_128_CBC_SHA :
  7110. if (requirement == REQUIRES_RSA)
  7111. return 1;
  7112. break;
  7113. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  7114. if (requirement == REQUIRES_RSA)
  7115. return 1;
  7116. break;
  7117. #ifdef HAVE_NTRU
  7118. case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA :
  7119. if (requirement == REQUIRES_NTRU)
  7120. return 1;
  7121. break;
  7122. #endif /* HAVE_NTRU */
  7123. case TLS_RSA_WITH_AES_256_CBC_SHA :
  7124. if (requirement == REQUIRES_RSA)
  7125. return 1;
  7126. break;
  7127. #ifdef HAVE_NTRU
  7128. case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA :
  7129. if (requirement == REQUIRES_NTRU)
  7130. return 1;
  7131. break;
  7132. #endif /* HAVE_NTRU */
  7133. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  7134. if (requirement == REQUIRES_RSA)
  7135. return 1;
  7136. break;
  7137. case TLS_RSA_WITH_NULL_MD5 :
  7138. case TLS_RSA_WITH_NULL_SHA :
  7139. case TLS_RSA_WITH_NULL_SHA256 :
  7140. if (requirement == REQUIRES_RSA)
  7141. return 1;
  7142. break;
  7143. #ifdef HAVE_NTRU
  7144. case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA :
  7145. if (requirement == REQUIRES_NTRU)
  7146. return 1;
  7147. break;
  7148. #endif /* HAVE_NTRU */
  7149. #ifdef HAVE_IDEA
  7150. case SSL_RSA_WITH_IDEA_CBC_SHA :
  7151. if (requirement == REQUIRES_RSA)
  7152. return 1;
  7153. break;
  7154. #endif /* HAVE_IDEA */
  7155. #endif /* !NO_RSA */
  7156. #ifndef NO_PSK
  7157. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  7158. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  7159. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  7160. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  7161. case TLS_PSK_WITH_AES_128_CBC_SHA :
  7162. case TLS_PSK_WITH_AES_256_CBC_SHA :
  7163. case TLS_PSK_WITH_NULL_SHA384 :
  7164. case TLS_PSK_WITH_NULL_SHA256 :
  7165. case TLS_PSK_WITH_NULL_SHA :
  7166. if (requirement == REQUIRES_PSK)
  7167. return 1;
  7168. break;
  7169. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  7170. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  7171. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  7172. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  7173. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  7174. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  7175. if (requirement == REQUIRES_DHE)
  7176. return 1;
  7177. if (requirement == REQUIRES_PSK)
  7178. return 1;
  7179. break;
  7180. #endif /* NO_PSK */
  7181. #ifndef NO_RSA
  7182. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  7183. if (requirement == REQUIRES_RSA)
  7184. return 1;
  7185. if (requirement == REQUIRES_DHE)
  7186. return 1;
  7187. break;
  7188. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  7189. if (requirement == REQUIRES_RSA)
  7190. return 1;
  7191. if (requirement == REQUIRES_DHE)
  7192. return 1;
  7193. break;
  7194. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  7195. if (requirement == REQUIRES_RSA)
  7196. return 1;
  7197. if (requirement == REQUIRES_DHE)
  7198. return 1;
  7199. break;
  7200. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  7201. if (requirement == REQUIRES_RSA)
  7202. return 1;
  7203. if (requirement == REQUIRES_DHE)
  7204. return 1;
  7205. break;
  7206. #ifndef NO_HC128
  7207. case TLS_RSA_WITH_HC_128_MD5 :
  7208. if (requirement == REQUIRES_RSA)
  7209. return 1;
  7210. break;
  7211. case TLS_RSA_WITH_HC_128_SHA :
  7212. if (requirement == REQUIRES_RSA)
  7213. return 1;
  7214. break;
  7215. case TLS_RSA_WITH_HC_128_B2B256:
  7216. if (requirement == REQUIRES_RSA)
  7217. return 1;
  7218. break;
  7219. #endif /* NO_HC128 */
  7220. #ifdef HAVE_BLAKE2
  7221. case TLS_RSA_WITH_AES_128_CBC_B2B256:
  7222. case TLS_RSA_WITH_AES_256_CBC_B2B256:
  7223. if (requirement == REQUIRES_RSA)
  7224. return 1;
  7225. break;
  7226. #endif /* HAVE_BLAKE2 */
  7227. #ifndef NO_RABBIT
  7228. case TLS_RSA_WITH_RABBIT_SHA :
  7229. if (requirement == REQUIRES_RSA)
  7230. return 1;
  7231. break;
  7232. #endif /* !NO_RABBIT */
  7233. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  7234. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  7235. if (requirement == REQUIRES_RSA)
  7236. return 1;
  7237. break;
  7238. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  7239. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  7240. if (requirement == REQUIRES_RSA)
  7241. return 1;
  7242. if (requirement == REQUIRES_DHE)
  7243. return 1;
  7244. break;
  7245. #ifdef HAVE_CAMELLIA
  7246. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  7247. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  7248. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  7249. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  7250. if (requirement == REQUIRES_RSA)
  7251. return 1;
  7252. break;
  7253. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  7254. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  7255. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  7256. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  7257. if (requirement == REQUIRES_RSA)
  7258. return 1;
  7259. if (requirement == REQUIRES_RSA_SIG)
  7260. return 1;
  7261. if (requirement == REQUIRES_DHE)
  7262. return 1;
  7263. break;
  7264. #endif /* HAVE_CAMELLIA */
  7265. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  7266. if (requirement == REQUIRES_RSA)
  7267. return 1;
  7268. if (requirement == REQUIRES_RSA_SIG)
  7269. return 1;
  7270. if (requirement == REQUIRES_DHE)
  7271. return 1;
  7272. break;
  7273. #endif
  7274. #ifdef HAVE_ANON
  7275. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  7276. if (requirement == REQUIRES_DHE)
  7277. return 1;
  7278. break;
  7279. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  7280. if (requirement == REQUIRES_DHE)
  7281. return 1;
  7282. break;
  7283. #endif
  7284. #ifdef WOLFSSL_MULTICAST
  7285. case WDM_WITH_NULL_SHA256 :
  7286. break;
  7287. #endif
  7288. default:
  7289. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  7290. return 0;
  7291. } /* switch */
  7292. } /* if ECC / Normal suites else */
  7293. #endif /* !WOLFSSL_NO_TLS12 */
  7294. return 0;
  7295. }
  7296. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  7297. #ifndef NO_CERTS
  7298. /* Match names with wildcards, each wildcard can represent a single name
  7299. component or fragment but not multiple names, i.e.,
  7300. *.z.com matches y.z.com but not x.y.z.com
  7301. return 1 on success */
  7302. int MatchDomainName(const char* pattern, int len, const char* str)
  7303. {
  7304. int ret = 0;
  7305. char p, s;
  7306. if (pattern == NULL || str == NULL || len <= 0)
  7307. return 0;
  7308. while (len > 0) {
  7309. p = (char)XTOLOWER((unsigned char)*pattern++);
  7310. if (p == '\0')
  7311. break;
  7312. if (p == '*') {
  7313. while (--len > 0 &&
  7314. (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') {
  7315. }
  7316. if (len == 0)
  7317. p = '\0';
  7318. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  7319. if (s == p)
  7320. break;
  7321. if (s == '.')
  7322. return 0;
  7323. str++;
  7324. }
  7325. }
  7326. else {
  7327. if (p != (char)XTOLOWER((unsigned char) *str))
  7328. return 0;
  7329. }
  7330. if (len > 0) {
  7331. str++;
  7332. len--;
  7333. }
  7334. }
  7335. if (*str == '\0' && len == 0) {
  7336. ret = 1; /* success */
  7337. }
  7338. return ret;
  7339. }
  7340. /* try to find an altName match to domain, return 1 on success */
  7341. int CheckAltNames(DecodedCert* dCert, char* domain)
  7342. {
  7343. int match = 0;
  7344. DNS_entry* altName = NULL;
  7345. WOLFSSL_MSG("Checking AltNames");
  7346. if (dCert)
  7347. altName = dCert->altNames;
  7348. while (altName) {
  7349. WOLFSSL_MSG("\tindividual AltName check");
  7350. if (MatchDomainName(altName->name, altName->len, domain)){
  7351. match = 1;
  7352. break;
  7353. }
  7354. altName = altName->next;
  7355. }
  7356. return match;
  7357. }
  7358. #ifdef OPENSSL_EXTRA
  7359. /* Check that alternative names, if they exists, match the domain.
  7360. * Fail if there are wild patterns and they didn't match.
  7361. * Check the common name if no alternative names matched.
  7362. *
  7363. * dCert Decoded cert to get the alternative names from.
  7364. * domain Domain name to compare against.
  7365. * checkCN Whether to check the common name.
  7366. * returns whether there was a problem in matching.
  7367. */
  7368. static int CheckForAltNames(DecodedCert* dCert, char* domain, int* checkCN)
  7369. {
  7370. int match;
  7371. DNS_entry* altName = NULL;
  7372. WOLFSSL_MSG("Checking AltNames");
  7373. if (dCert)
  7374. altName = dCert->altNames;
  7375. *checkCN = altName == NULL;
  7376. match = 0;
  7377. while (altName) {
  7378. WOLFSSL_MSG("\tindividual AltName check");
  7379. if (MatchDomainName(altName->name, altName->len, domain)) {
  7380. match = 1;
  7381. *checkCN = 0;
  7382. break;
  7383. }
  7384. /* No matches and wild pattern match failed. */
  7385. else if (altName->name && altName->len >=1 &&
  7386. altName->name[0] == '*' && match == 0) {
  7387. match = -1;
  7388. }
  7389. altName = altName->next;
  7390. }
  7391. return match != -1;
  7392. }
  7393. /* Check the domain name matches the subject alternative name or the subject
  7394. * name.
  7395. *
  7396. * dcert Decoded certificate.
  7397. * domainName The domain name.
  7398. * domainNameLen The length of the domain name.
  7399. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  7400. */
  7401. int CheckHostName(DecodedCert* dCert, char *domainName, size_t domainNameLen)
  7402. {
  7403. int checkCN;
  7404. /* Assume name is NUL terminated. */
  7405. (void)domainNameLen;
  7406. if (CheckForAltNames(dCert, domainName, &checkCN) == 0) {
  7407. WOLFSSL_MSG("DomainName match on alt names failed too");
  7408. return DOMAIN_NAME_MISMATCH;
  7409. }
  7410. if (checkCN == 1) {
  7411. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  7412. domainName) == 0) {
  7413. WOLFSSL_MSG("DomainName match on common name failed");
  7414. return DOMAIN_NAME_MISMATCH;
  7415. }
  7416. }
  7417. return 0;
  7418. }
  7419. #endif
  7420. #ifdef SESSION_CERTS
  7421. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  7422. byte* certBuf, word32 certSz)
  7423. {
  7424. if (chain->count < MAX_CHAIN_DEPTH &&
  7425. certSz < MAX_X509_SIZE) {
  7426. chain->certs[chain->count].length = certSz;
  7427. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  7428. chain->count++;
  7429. }
  7430. else {
  7431. WOLFSSL_MSG("Couldn't store chain cert for session");
  7432. }
  7433. }
  7434. #endif
  7435. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  7436. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7437. /* Copy parts X509 needs from Decoded cert, 0 on success */
  7438. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  7439. * altNames pointers could be free'd by second x509 still active by first */
  7440. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  7441. {
  7442. int ret = 0;
  7443. if (x509 == NULL || dCert == NULL ||
  7444. dCert->subjectCNLen < 0)
  7445. return BAD_FUNC_ARG;
  7446. x509->version = dCert->version + 1;
  7447. XSTRNCPY(x509->issuer.name, dCert->issuer, ASN_NAME_MAX);
  7448. x509->issuer.name[ASN_NAME_MAX - 1] = '\0';
  7449. x509->issuer.sz = (int)XSTRLEN(x509->issuer.name) + 1;
  7450. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7451. if (dCert->issuerName.fullName != NULL) {
  7452. XMEMCPY(&x509->issuer.fullName,
  7453. &dCert->issuerName, sizeof(DecodedName));
  7454. x509->issuer.fullName.fullName = (char*)XMALLOC(
  7455. dCert->issuerName.fullNameLen, x509->heap,
  7456. DYNAMIC_TYPE_X509);
  7457. if (x509->issuer.fullName.fullName != NULL)
  7458. XMEMCPY(x509->issuer.fullName.fullName,
  7459. dCert->issuerName.fullName, dCert->issuerName.fullNameLen);
  7460. }
  7461. x509->issuer.x509 = x509;
  7462. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  7463. XSTRNCPY(x509->subject.name, dCert->subject, ASN_NAME_MAX);
  7464. x509->subject.name[ASN_NAME_MAX - 1] = '\0';
  7465. x509->subject.sz = (int)XSTRLEN(x509->subject.name) + 1;
  7466. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7467. if (dCert->subjectName.fullName != NULL) {
  7468. XMEMCPY(&x509->subject.fullName,
  7469. &dCert->subjectName, sizeof(DecodedName));
  7470. x509->subject.fullName.fullName = (char*)XMALLOC(
  7471. dCert->subjectName.fullNameLen, x509->heap, DYNAMIC_TYPE_X509);
  7472. if (x509->subject.fullName.fullName != NULL)
  7473. XMEMCPY(x509->subject.fullName.fullName,
  7474. dCert->subjectName.fullName, dCert->subjectName.fullNameLen);
  7475. }
  7476. x509->subject.x509 = x509;
  7477. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  7478. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  7479. x509->subject.rawLen = min(dCert->subjectRawLen, sizeof(x509->subject.raw));
  7480. XMEMCPY(x509->subject.raw, dCert->subjectRaw, x509->subject.rawLen);
  7481. #ifdef WOLFSSL_CERT_EXT
  7482. x509->issuer.rawLen = min(dCert->issuerRawLen, sizeof(x509->issuer.raw));
  7483. XMEMCPY(x509->issuer.raw, dCert->issuerRaw, x509->issuer.rawLen);
  7484. #endif
  7485. #endif
  7486. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  7487. x509->serialSz = dCert->serialSz;
  7488. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  7489. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  7490. x509->subjectCN[dCert->subjectCNLen] = '\0';
  7491. }
  7492. else
  7493. x509->subjectCN[0] = '\0';
  7494. #ifdef WOLFSSL_SEP
  7495. {
  7496. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  7497. if (minSz > 0) {
  7498. x509->deviceTypeSz = minSz;
  7499. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  7500. }
  7501. else
  7502. x509->deviceTypeSz = 0;
  7503. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  7504. if (minSz > 0) {
  7505. x509->hwTypeSz = minSz;
  7506. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  7507. }
  7508. else
  7509. x509->hwTypeSz = 0;
  7510. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  7511. if (minSz > 0) {
  7512. x509->hwSerialNumSz = minSz;
  7513. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  7514. }
  7515. else
  7516. x509->hwSerialNumSz = 0;
  7517. }
  7518. #endif /* WOLFSSL_SEP */
  7519. {
  7520. int minSz = min(dCert->beforeDateLen, MAX_DATE_SZ);
  7521. if (minSz > 0) {
  7522. x509->notBeforeSz = minSz;
  7523. XMEMCPY(x509->notBefore, dCert->beforeDate, minSz);
  7524. }
  7525. else
  7526. x509->notBeforeSz = 0;
  7527. minSz = min(dCert->afterDateLen, MAX_DATE_SZ);
  7528. if (minSz > 0) {
  7529. x509->notAfterSz = minSz;
  7530. XMEMCPY(x509->notAfter, dCert->afterDate, minSz);
  7531. }
  7532. else
  7533. x509->notAfterSz = 0;
  7534. }
  7535. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  7536. x509->pubKey.buffer = (byte*)XMALLOC(
  7537. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7538. if (x509->pubKey.buffer != NULL) {
  7539. x509->pubKeyOID = dCert->keyOID;
  7540. x509->pubKey.length = dCert->pubKeySize;
  7541. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  7542. }
  7543. else
  7544. ret = MEMORY_E;
  7545. }
  7546. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  7547. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  7548. x509->sig.buffer = (byte*)XMALLOC(
  7549. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  7550. if (x509->sig.buffer == NULL) {
  7551. ret = MEMORY_E;
  7552. }
  7553. else {
  7554. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  7555. x509->sig.length = dCert->sigLength;
  7556. x509->sigOID = dCert->signatureOID;
  7557. }
  7558. }
  7559. /* store cert for potential retrieval */
  7560. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap) == 0) {
  7561. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  7562. }
  7563. else {
  7564. ret = MEMORY_E;
  7565. }
  7566. x509->altNames = dCert->altNames;
  7567. dCert->weOwnAltNames = 0;
  7568. x509->altNamesNext = x509->altNames; /* index hint */
  7569. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  7570. !defined(IGNORE_NAME_CONSTRAINTS)
  7571. /* add copies of alternate emails from dCert to X509 */
  7572. if (dCert->altEmailNames != NULL) {
  7573. DNS_entry* cur = dCert->altEmailNames;
  7574. while (cur != NULL) {
  7575. if (cur->type == ASN_RFC822_TYPE) {
  7576. DNS_entry* dnsEntry;
  7577. int strLen = cur->len;
  7578. dnsEntry = (DNS_entry*)XMALLOC(sizeof(DNS_entry), x509->heap,
  7579. DYNAMIC_TYPE_ALTNAME);
  7580. if (dnsEntry == NULL) {
  7581. WOLFSSL_MSG("\tOut of Memory");
  7582. return MEMORY_E;
  7583. }
  7584. dnsEntry->type = ASN_RFC822_TYPE;
  7585. dnsEntry->name = (char*)XMALLOC(strLen + 1, x509->heap,
  7586. DYNAMIC_TYPE_ALTNAME);
  7587. if (dnsEntry->name == NULL) {
  7588. WOLFSSL_MSG("\tOut of Memory");
  7589. XFREE(dnsEntry, x509->heap, DYNAMIC_TYPE_ALTNAME);
  7590. return MEMORY_E;
  7591. }
  7592. dnsEntry->len = strLen;
  7593. XMEMCPY(dnsEntry->name, cur->name, strLen);
  7594. dnsEntry->name[strLen] = '\0';
  7595. dnsEntry->next = x509->altNames;
  7596. x509->altNames = dnsEntry;
  7597. }
  7598. cur = cur->next;
  7599. }
  7600. }
  7601. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  7602. x509->isCa = dCert->isCA;
  7603. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7604. x509->pathLength = dCert->pathLength;
  7605. x509->keyUsage = dCert->extKeyUsage;
  7606. x509->CRLdistSet = dCert->extCRLdistSet;
  7607. x509->CRLdistCrit = dCert->extCRLdistCrit;
  7608. x509->CRLInfo = dCert->extCrlInfo;
  7609. x509->CRLInfoSz = dCert->extCrlInfoSz;
  7610. x509->authInfoSet = dCert->extAuthInfoSet;
  7611. x509->authInfoCrit = dCert->extAuthInfoCrit;
  7612. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  7613. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  7614. DYNAMIC_TYPE_X509_EXT);
  7615. if (x509->authInfo != NULL) {
  7616. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  7617. x509->authInfoSz = dCert->extAuthInfoSz;
  7618. }
  7619. else {
  7620. ret = MEMORY_E;
  7621. }
  7622. }
  7623. x509->basicConstSet = dCert->extBasicConstSet;
  7624. x509->basicConstCrit = dCert->extBasicConstCrit;
  7625. x509->basicConstPlSet = dCert->pathLengthSet;
  7626. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  7627. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  7628. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  7629. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  7630. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  7631. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  7632. DYNAMIC_TYPE_X509_EXT);
  7633. if (x509->authKeyId != NULL) {
  7634. XMEMCPY(x509->authKeyId,
  7635. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  7636. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  7637. }
  7638. else
  7639. ret = MEMORY_E;
  7640. }
  7641. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  7642. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  7643. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  7644. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  7645. DYNAMIC_TYPE_X509_EXT);
  7646. if (x509->subjKeyId != NULL) {
  7647. XMEMCPY(x509->subjKeyId,
  7648. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  7649. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  7650. }
  7651. else
  7652. ret = MEMORY_E;
  7653. }
  7654. x509->keyUsageSet = dCert->extKeyUsageSet;
  7655. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  7656. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  7657. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  7658. x509->heap, DYNAMIC_TYPE_X509_EXT);
  7659. if (x509->extKeyUsageSrc != NULL) {
  7660. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  7661. dCert->extExtKeyUsageSz);
  7662. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  7663. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  7664. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  7665. }
  7666. else {
  7667. ret = MEMORY_E;
  7668. }
  7669. }
  7670. #ifdef WOLFSSL_SEP
  7671. x509->certPolicySet = dCert->extCertPolicySet;
  7672. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  7673. #endif /* WOLFSSL_SEP */
  7674. #ifdef WOLFSSL_CERT_EXT
  7675. {
  7676. int i;
  7677. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  7678. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  7679. MAX_CERTPOL_SZ);
  7680. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  7681. }
  7682. #endif /* WOLFSSL_CERT_EXT */
  7683. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  7684. #if defined(HAVE_ECC) || defined(HAVE_ED25519)
  7685. x509->pkCurveOID = dCert->pkCurveOID;
  7686. #endif /* HAVE_ECC */
  7687. return ret;
  7688. }
  7689. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  7690. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  7691. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  7692. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  7693. word32 status_length)
  7694. {
  7695. int ret = 0;
  7696. OcspRequest* request;
  7697. #ifdef WOLFSSL_SMALL_STACK
  7698. CertStatus* status;
  7699. OcspResponse* response;
  7700. #else
  7701. CertStatus status[1];
  7702. OcspResponse response[1];
  7703. #endif
  7704. do {
  7705. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  7706. if (ssl->status_request) {
  7707. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  7708. ssl->status_request = 0;
  7709. break;
  7710. }
  7711. #endif
  7712. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  7713. if (ssl->status_request_v2) {
  7714. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  7715. WOLFSSL_CSR2_OCSP, 0);
  7716. ssl->status_request_v2 = 0;
  7717. break;
  7718. }
  7719. #endif
  7720. return BUFFER_ERROR;
  7721. } while(0);
  7722. if (request == NULL)
  7723. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  7724. #ifdef WOLFSSL_SMALL_STACK
  7725. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  7726. DYNAMIC_TYPE_OCSP_STATUS);
  7727. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  7728. DYNAMIC_TYPE_OCSP_REQUEST);
  7729. if (status == NULL || response == NULL) {
  7730. if (status)
  7731. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  7732. if (response)
  7733. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  7734. return MEMORY_ERROR;
  7735. }
  7736. #endif
  7737. InitOcspResponse(response, status, input +*inOutIdx, status_length);
  7738. if (OcspResponseDecode(response, ssl->ctx->cm, ssl->heap, 0) != 0)
  7739. ret = BAD_CERTIFICATE_STATUS_ERROR;
  7740. else if (CompareOcspReqResp(request, response) != 0)
  7741. ret = BAD_CERTIFICATE_STATUS_ERROR;
  7742. else if (response->responseStatus != OCSP_SUCCESSFUL)
  7743. ret = BAD_CERTIFICATE_STATUS_ERROR;
  7744. else if (response->status->status == CERT_REVOKED)
  7745. ret = OCSP_CERT_REVOKED;
  7746. else if (response->status->status != CERT_GOOD)
  7747. ret = BAD_CERTIFICATE_STATUS_ERROR;
  7748. *inOutIdx += status_length;
  7749. #ifdef WOLFSSL_SMALL_STACK
  7750. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  7751. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  7752. #endif
  7753. return ret;
  7754. }
  7755. #endif
  7756. #ifdef HAVE_PK_CALLBACKS
  7757. #ifdef HAVE_ECC
  7758. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  7759. const unsigned char* hash, unsigned int hashSz,
  7760. const unsigned char* keyDer, unsigned int keySz,
  7761. int* result, void* ctx)
  7762. {
  7763. int ret = NOT_COMPILED_IN;
  7764. WOLFSSL* ssl = (WOLFSSL*)ctx;
  7765. if (ssl && ssl->ctx->EccVerifyCb) {
  7766. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  7767. keyDer, keySz, result, ssl->EccVerifyCtx);
  7768. }
  7769. return ret;
  7770. }
  7771. #endif
  7772. #ifndef NO_RSA
  7773. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  7774. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  7775. void* ctx)
  7776. {
  7777. int ret = NOT_COMPILED_IN;
  7778. WOLFSSL* ssl = (WOLFSSL*)ctx;
  7779. if (ssl && ssl->ctx->RsaVerifyCb) {
  7780. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  7781. ssl->RsaVerifyCtx);
  7782. }
  7783. return ret;
  7784. }
  7785. #endif
  7786. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  7787. {
  7788. if (ssl == NULL || sigCtx == NULL)
  7789. return BAD_FUNC_ARG;
  7790. /* only setup the verify callback if a PK is set */
  7791. #ifdef HAVE_ECC
  7792. if (ssl->ctx->EccVerifyCb) {
  7793. sigCtx->pkCbEcc = SigPkCbEccVerify;
  7794. sigCtx->pkCtxEcc = ssl;
  7795. }
  7796. #endif
  7797. #ifndef NO_RSA
  7798. /* only setup the verify callback if a PK is set */
  7799. if (ssl->ctx->RsaVerifyCb) {
  7800. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  7801. sigCtx->pkCtxRsa = ssl;
  7802. }
  7803. #endif
  7804. return 0;
  7805. }
  7806. #endif /* HAVE_PK_CALLBACKS */
  7807. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  7808. typedef struct ProcPeerCertArgs {
  7809. buffer* certs;
  7810. #ifdef WOLFSSL_TLS13
  7811. buffer* exts; /* extensions */
  7812. #endif
  7813. DecodedCert* dCert;
  7814. word32 idx;
  7815. word32 begin;
  7816. int totalCerts; /* number of certs in certs buffer */
  7817. int count;
  7818. int certIdx;
  7819. int lastErr;
  7820. #ifdef WOLFSSL_TLS13
  7821. byte ctxSz;
  7822. #endif
  7823. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7824. char untrustedDepth;
  7825. #endif
  7826. word16 fatal:1;
  7827. word16 verifyErr:1;
  7828. word16 dCertInit:1;
  7829. #ifdef WOLFSSL_TRUST_PEER_CERT
  7830. word16 haveTrustPeer:1; /* was cert verified by loaded trusted peer cert */
  7831. #endif
  7832. } ProcPeerCertArgs;
  7833. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  7834. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  7835. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  7836. * The intermediates are done first then peer leaf cert last. Use the
  7837. * store->error_depth member to determine index (0=peer, >1 intermediates)
  7838. */
  7839. static int DoVerifyCallback(WOLFSSL* ssl, int ret, ProcPeerCertArgs* args)
  7840. {
  7841. int verify_ok = 0, alertWhy = 0, use_cb = 0;
  7842. /* Determine return code and alert reason */
  7843. if (ret != 0) {
  7844. alertWhy = bad_certificate;
  7845. if (ret == ASN_AFTER_DATE_E ||
  7846. ret == ASN_BEFORE_DATE_E) {
  7847. alertWhy = certificate_expired;
  7848. }
  7849. }
  7850. else {
  7851. verify_ok = 1;
  7852. }
  7853. /* Determine if verify callback should be used */
  7854. if (ret != 0) {
  7855. if (!ssl->options.verifyNone) {
  7856. use_cb = 1; /* always report errors */
  7857. }
  7858. }
  7859. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  7860. /* always use verify callback on peer leaf cert */
  7861. if (args->certIdx == 0) {
  7862. use_cb = 1;
  7863. }
  7864. #endif
  7865. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  7866. /* perform verify callback on other intermediate certs (not just peer) */
  7867. if (args->certIdx > 0) {
  7868. use_cb = 1;
  7869. }
  7870. #endif
  7871. #if defined(OPENSSL_EXTRA)
  7872. /* perform domain name check on the peer certificate */
  7873. if (args->dCertInit && args->dCert && args->dCert->subjectCN \
  7874. && ssl->param && ssl->param->hostName[0]) {
  7875. if(XSTRSTR(args->dCert->subjectCN, ssl->param->hostName) == NULL) {
  7876. return VERIFY_CERT_ERROR;
  7877. }
  7878. }
  7879. #endif
  7880. /* if verify callback has been set */
  7881. if (use_cb && ssl->verifyCallback) {
  7882. #ifdef WOLFSSL_SMALL_STACK
  7883. WOLFSSL_X509_STORE_CTX* store;
  7884. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7885. WOLFSSL_X509* x509;
  7886. #endif
  7887. char* domain = NULL;
  7888. #else
  7889. WOLFSSL_X509_STORE_CTX store[1];
  7890. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7891. WOLFSSL_X509 x509[1];
  7892. #endif
  7893. char domain[ASN_NAME_MAX];
  7894. #endif
  7895. #ifdef WOLFSSL_SMALL_STACK
  7896. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  7897. sizeof(WOLFSSL_X509_STORE_CTX), ssl->heap, DYNAMIC_TYPE_X509_STORE);
  7898. if (store == NULL) {
  7899. return MEMORY_E;
  7900. }
  7901. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7902. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), ssl->heap,
  7903. DYNAMIC_TYPE_X509);
  7904. if (x509 == NULL) {
  7905. XFREE(store, ssl->heap, DYNAMIC_TYPE_X509);
  7906. return MEMORY_E;
  7907. }
  7908. #endif
  7909. domain = (char*)XMALLOC(ASN_NAME_MAX, ssl->heap, DYNAMIC_TYPE_STRING);
  7910. if (domain == NULL) {
  7911. XFREE(store, ssl->heap, DYNAMIC_TYPE_X509);
  7912. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7913. XFREE(x509, ssl->heap, DYNAMIC_TYPE_X509);
  7914. #endif
  7915. return MEMORY_E;
  7916. }
  7917. #endif /* WOLFSSL_SMALL_STACK */
  7918. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  7919. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7920. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  7921. #endif
  7922. domain[0] = '\0';
  7923. /* build subject CN as string to return in store */
  7924. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  7925. int subjectCNLen = args->dCert->subjectCNLen;
  7926. if (subjectCNLen > ASN_NAME_MAX-1)
  7927. subjectCNLen = ASN_NAME_MAX-1;
  7928. if (subjectCNLen > 0) {
  7929. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  7930. domain[subjectCNLen] = '\0';
  7931. }
  7932. }
  7933. store->error = ret;
  7934. store->error_depth = args->certIdx;
  7935. store->discardSessionCerts = 0;
  7936. store->domain = domain;
  7937. store->userCtx = ssl->verifyCbCtx;
  7938. store->certs = args->certs;
  7939. store->totalCerts = args->totalCerts;
  7940. store->ex_data = ssl;
  7941. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  7942. if (ssl->ctx->x509_store_pt != NULL) {
  7943. store->store = ssl->ctx->x509_store_pt;
  7944. }
  7945. else {
  7946. store->store = &ssl->ctx->x509_store;
  7947. }
  7948. #if defined(OPENSSL_EXTRA)
  7949. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  7950. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  7951. ssl->heap, DYNAMIC_TYPE_OPENSSL);
  7952. if (store->param == NULL) {
  7953. return MEMORY_E;
  7954. }
  7955. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  7956. /* Overwrite with non-default param values in SSL */
  7957. if (ssl->param) {
  7958. if (ssl->param->check_time)
  7959. store->param->check_time = ssl->param->check_time;
  7960. if (ssl->param->flags)
  7961. store->param->flags = ssl->param->flags;
  7962. if (ssl->param->hostName[0])
  7963. XMEMCPY(store->param->hostName, ssl->param->hostName,
  7964. WOLFSSL_HOST_NAME_MAX);
  7965. }
  7966. #endif /* defined(OPENSSL_EXTRA) */
  7967. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  7968. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  7969. #ifdef KEEP_PEER_CERT
  7970. if (args->certIdx == 0) {
  7971. store->current_cert = &ssl->peerCert; /* use existing X509 */
  7972. }
  7973. else
  7974. #endif
  7975. {
  7976. InitX509(x509, 0, ssl->heap);
  7977. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  7978. store->current_cert = x509;
  7979. }
  7980. else {
  7981. FreeX509(x509);
  7982. }
  7983. }
  7984. #endif
  7985. #ifdef SESSION_CERTS
  7986. store->sesChain = &ssl->session.chain;
  7987. #endif
  7988. /* non-zero return code indicates failure override */
  7989. if (ssl->verifyCallback(verify_ok, store)) {
  7990. if (ret != 0) {
  7991. WOLFSSL_MSG("Verify callback overriding error!");
  7992. ret = 0;
  7993. }
  7994. }
  7995. else {
  7996. /* induce error if one not present */
  7997. if (ret == 0) {
  7998. ret = VERIFY_CERT_ERROR;
  7999. }
  8000. /* mark as verify error */
  8001. args->verifyErr = 1;
  8002. }
  8003. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8004. if (args->certIdx > 0)
  8005. FreeX509(x509);
  8006. #endif
  8007. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  8008. wolfSSL_sk_X509_free(store->chain);
  8009. store->chain = NULL;
  8010. #endif
  8011. #ifdef SESSION_CERTS
  8012. if (store->discardSessionCerts) {
  8013. WOLFSSL_MSG("Verify callback requested discard sess certs");
  8014. ssl->session.chain.count = 0;
  8015. #ifdef WOLFSSL_ALT_CERT_CHAINS
  8016. ssl->session.altChain.count = 0;
  8017. #endif
  8018. }
  8019. #endif /* SESSION_CERTS */
  8020. #ifdef OPENSSL_EXTRA
  8021. if (store->param){
  8022. XFREE(store->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  8023. }
  8024. #endif
  8025. #ifdef WOLFSSL_SMALL_STACK
  8026. XFREE(domain, ssl->heap, DYNAMIC_TYPE_STRING);
  8027. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8028. XFREE(x509, ssl->heap, DYNAMIC_TYPE_X509);
  8029. #endif
  8030. XFREE(store, ssl->heap, DYNAMIC_TYPE_X509_STORE);
  8031. #endif
  8032. }
  8033. if (ret != 0) {
  8034. if (!ssl->options.verifyNone) {
  8035. /* handle failure */
  8036. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  8037. ssl->options.isClosed = 1;
  8038. }
  8039. /* Report SSL error */
  8040. ssl->error = ret;
  8041. }
  8042. return ret;
  8043. }
  8044. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  8045. {
  8046. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  8047. (void)ssl;
  8048. if (args->certs) {
  8049. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  8050. args->certs = NULL;
  8051. }
  8052. #ifdef WOLFSSL_TLS13
  8053. if (args->exts) {
  8054. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  8055. args->exts = NULL;
  8056. }
  8057. #endif
  8058. if (args->dCert) {
  8059. if (args->dCertInit) {
  8060. FreeDecodedCert(args->dCert);
  8061. args->dCertInit = 0;
  8062. }
  8063. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  8064. args->dCert = NULL;
  8065. }
  8066. }
  8067. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  8068. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  8069. {
  8070. int ret = 0;
  8071. buffer* cert;
  8072. byte* subjectHash = NULL;
  8073. int alreadySigner = 0;
  8074. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  8075. int sigRet = 0;
  8076. #endif
  8077. if (ssl == NULL || args == NULL)
  8078. return BAD_FUNC_ARG;
  8079. /* check to make sure certificate index is valid */
  8080. if (args->certIdx > args->count)
  8081. return BUFFER_E;
  8082. /* check if returning from non-blocking OCSP */
  8083. /* skip this section because cert is already initialized and parsed */
  8084. #ifdef WOLFSSL_NONBLOCK_OCSP
  8085. if (args->lastErr == OCSP_WANT_READ) {
  8086. args->lastErr = 0; /* clear error */
  8087. return 0;
  8088. }
  8089. #endif
  8090. #ifdef WOLFSSL_TRUST_PEER_CERT
  8091. /* we have trusted peer */
  8092. if (args->haveTrustPeer) {
  8093. return 0;
  8094. }
  8095. #endif
  8096. /* get certificate buffer */
  8097. cert = &args->certs[args->certIdx];
  8098. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  8099. if (verify == VERIFY) {
  8100. /* for small cert verify, release decoded cert during signature check to
  8101. reduce peak memory usage */
  8102. if (args->dCert != NULL) {
  8103. if (args->dCertInit) {
  8104. FreeDecodedCert(args->dCert);
  8105. args->dCertInit = 0;
  8106. }
  8107. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  8108. args->dCert = NULL;
  8109. }
  8110. /* perform cert parsing and signature check */
  8111. sigRet = CheckCertSignature(cert->buffer, cert->length,
  8112. ssl->heap, ssl->ctx->cm);
  8113. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  8114. /* verify name only in ParseCertRelative below, signature check done */
  8115. verify = VERIFY_NAME;
  8116. }
  8117. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  8118. /* make sure the decoded cert structure is allocated and initialized */
  8119. if (!args->dCertInit
  8120. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  8121. || args->dCert == NULL
  8122. #endif
  8123. ) {
  8124. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  8125. if (args->dCert == NULL) {
  8126. args->dCert = (DecodedCert*)XMALLOC(
  8127. sizeof(DecodedCert), ssl->heap,
  8128. DYNAMIC_TYPE_DCERT);
  8129. if (args->dCert == NULL) {
  8130. return MEMORY_E;
  8131. }
  8132. }
  8133. #endif
  8134. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  8135. args->dCertInit = 1;
  8136. args->dCert->sigCtx.devId = ssl->devId;
  8137. #ifdef WOLFSSL_ASYNC_CRYPT
  8138. args->dCert->sigCtx.asyncCtx = ssl;
  8139. #endif
  8140. #ifdef HAVE_PK_CALLBACKS
  8141. /* setup the PK callback context */
  8142. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  8143. if (ret != 0)
  8144. return ret;
  8145. #endif
  8146. }
  8147. /* Parse Certificate */
  8148. ret = ParseCertRelative(args->dCert, certType, verify, ssl->ctx->cm);
  8149. if (ret == 0) {
  8150. /* get subject and determine if already loaded */
  8151. #ifndef NO_SKID
  8152. if (args->dCert->extAuthKeyIdSet)
  8153. subjectHash = args->dCert->extSubjKeyId;
  8154. else
  8155. #endif
  8156. subjectHash = args->dCert->subjectHash;
  8157. alreadySigner = AlreadySigner(ssl->ctx->cm, subjectHash);
  8158. }
  8159. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  8160. /* get signature check failures from above */
  8161. if (ret == 0)
  8162. ret = sigRet;
  8163. #endif
  8164. if (pSubjectHash)
  8165. *pSubjectHash = subjectHash;
  8166. if (pAlreadySigner)
  8167. *pAlreadySigner = alreadySigner;
  8168. #ifdef WOLFSSL_ASYNC_CRYPT
  8169. if (ret == WC_PENDING_E) {
  8170. ret = wolfSSL_AsyncPush(ssl,
  8171. args->dCert->sigCtx.asyncDev);
  8172. }
  8173. #endif
  8174. return ret;
  8175. }
  8176. /* Check key sizes for certs. Is redundant check since
  8177. ProcessBuffer also performs this check. */
  8178. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  8179. {
  8180. int ret = 0;
  8181. if (ssl->options.verifyNone) {
  8182. return ret;
  8183. }
  8184. switch (args->dCert->keyOID) {
  8185. #ifndef NO_RSA
  8186. case RSAk:
  8187. if (ssl->options.minRsaKeySz < 0 ||
  8188. args->dCert->pubKeySize <
  8189. (word16)ssl->options.minRsaKeySz) {
  8190. WOLFSSL_MSG(
  8191. "RSA key size in cert chain error");
  8192. ret = RSA_KEY_SIZE_E;
  8193. }
  8194. break;
  8195. #endif /* !NO_RSA */
  8196. #ifdef HAVE_ECC
  8197. case ECDSAk:
  8198. if (ssl->options.minEccKeySz < 0 ||
  8199. args->dCert->pubKeySize <
  8200. (word16)ssl->options.minEccKeySz) {
  8201. WOLFSSL_MSG(
  8202. "ECC key size in cert chain error");
  8203. ret = ECC_KEY_SIZE_E;
  8204. }
  8205. break;
  8206. #endif /* HAVE_ECC */
  8207. #ifdef HAVE_ED25519
  8208. case ED25519k:
  8209. if (ssl->options.minEccKeySz < 0 ||
  8210. ED25519_KEY_SIZE <
  8211. (word16)ssl->options.minEccKeySz) {
  8212. WOLFSSL_MSG(
  8213. "ECC key size in cert chain error");
  8214. ret = ECC_KEY_SIZE_E;
  8215. }
  8216. break;
  8217. #endif /* HAVE_ED25519 */
  8218. default:
  8219. WOLFSSL_MSG("Key size not checked");
  8220. /* key not being checked for size if not in
  8221. switch */
  8222. break;
  8223. }
  8224. return ret;
  8225. }
  8226. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  8227. word32 totalSz)
  8228. {
  8229. int ret = 0;
  8230. #ifdef WOLFSSL_ASYNC_CRYPT
  8231. ProcPeerCertArgs* args = (ProcPeerCertArgs*)ssl->async.args;
  8232. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  8233. (void)sizeof(args_test);
  8234. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  8235. ProcPeerCertArgs* args = ssl->nonblockarg;
  8236. #elif defined(WOLFSSL_SMALL_STACK)
  8237. ProcPeerCertArgs* args = NULL;
  8238. #else
  8239. ProcPeerCertArgs args[1];
  8240. #endif
  8241. byte* subjectHash = NULL;
  8242. int alreadySigner = 0;
  8243. WOLFSSL_ENTER("ProcessPeerCerts");
  8244. #ifdef WOLFSSL_ASYNC_CRYPT
  8245. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  8246. if (ret != WC_NOT_PENDING_E) {
  8247. /* Check for error */
  8248. if (ret < 0)
  8249. goto exit_ppc;
  8250. }
  8251. else
  8252. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  8253. if (args == NULL) {
  8254. args = (ProcPeerCertArgs*)XMALLOC(
  8255. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8256. if (args == NULL) {
  8257. ERROR_OUT(MEMORY_E, exit_ppc);
  8258. }
  8259. }
  8260. if (ssl->nonblockarg == NULL) /* new args */
  8261. #elif defined(WOLFSSL_SMALL_STACK)
  8262. args = (ProcPeerCertArgs*)XMALLOC(
  8263. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  8264. if (args == NULL) {
  8265. ERROR_OUT(MEMORY_E, exit_ppc);
  8266. }
  8267. #endif
  8268. {
  8269. /* Reset state */
  8270. ret = 0;
  8271. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  8272. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  8273. args->idx = *inOutIdx;
  8274. args->begin = *inOutIdx;
  8275. #ifdef WOLFSSL_ASYNC_CRYPT
  8276. ssl->async.freeArgs = FreeProcPeerCertArgs;
  8277. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  8278. ssl->nonblockarg = args;
  8279. #endif
  8280. }
  8281. switch (ssl->options.asyncState)
  8282. {
  8283. case TLS_ASYNC_BEGIN:
  8284. {
  8285. word32 listSz;
  8286. #ifdef WOLFSSL_CALLBACKS
  8287. if (ssl->hsInfoOn)
  8288. AddPacketName(ssl, "Certificate");
  8289. if (ssl->toInfoOn)
  8290. AddLateName("Certificate", &ssl->timeoutInfo);
  8291. #endif
  8292. #ifdef WOLFSSL_TLS13
  8293. if (ssl->options.tls1_3) {
  8294. byte ctxSz;
  8295. /* Certificate Request Context */
  8296. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  8297. return BUFFER_ERROR;
  8298. ctxSz = *(input + args->idx);
  8299. args->idx++;
  8300. if ((args->idx - args->begin) + ctxSz > totalSz)
  8301. return BUFFER_ERROR;
  8302. #ifndef NO_WOLFSSL_CLIENT
  8303. /* Must be empty when received from server. */
  8304. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  8305. if (ctxSz != 0) {
  8306. return INVALID_CERT_CTX_E;
  8307. }
  8308. }
  8309. #endif
  8310. #ifndef NO_WOLFSSL_SERVER
  8311. /* Must contain value sent in request. */
  8312. if (ssl->options.side == WOLFSSL_SERVER_END) {
  8313. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  8314. ctxSz != 0) {
  8315. return INVALID_CERT_CTX_E;
  8316. }
  8317. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  8318. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  8319. CertReqCtx* curr = ssl->certReqCtx;
  8320. CertReqCtx* prev = NULL;
  8321. while (curr != NULL) {
  8322. if ((ctxSz == curr->len) &&
  8323. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  8324. == 0) {
  8325. if (prev != NULL)
  8326. prev->next = curr->next;
  8327. else
  8328. ssl->certReqCtx = curr->next;
  8329. XFREE(curr, ssl->heap,
  8330. DYNAMIC_TYPE_TMP_BUFFER);
  8331. break;
  8332. }
  8333. prev = curr;
  8334. curr = curr->next;
  8335. }
  8336. if (curr == NULL)
  8337. #endif
  8338. return INVALID_CERT_CTX_E;
  8339. }
  8340. }
  8341. #endif
  8342. args->idx += ctxSz;
  8343. /* allocate buffer for cert extensions */
  8344. args->exts = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  8345. ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  8346. if (args->exts == NULL) {
  8347. ERROR_OUT(MEMORY_E, exit_ppc);
  8348. }
  8349. }
  8350. #endif
  8351. /* allocate buffer for certs */
  8352. #ifdef OPENSSL_EXTRA
  8353. args->certs = (buffer*)XMALLOC(sizeof(buffer) *
  8354. (ssl->verifyDepth + 1), ssl->heap, DYNAMIC_TYPE_DER);
  8355. if (args->certs == NULL) {
  8356. ERROR_OUT(MEMORY_E, exit_ppc);
  8357. }
  8358. XMEMSET(args->certs, 0, sizeof(buffer) * (ssl->verifyDepth + 1));
  8359. #else
  8360. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  8361. ssl->heap, DYNAMIC_TYPE_DER);
  8362. if (args->certs == NULL) {
  8363. ERROR_OUT(MEMORY_E, exit_ppc);
  8364. }
  8365. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  8366. #endif /* OPENSSL_EXTRA */
  8367. /* Certificate List */
  8368. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  8369. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  8370. }
  8371. c24to32(input + args->idx, &listSz);
  8372. args->idx += OPAQUE24_LEN;
  8373. if (listSz > MAX_CERTIFICATE_SZ) {
  8374. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  8375. }
  8376. if ((args->idx - args->begin) + listSz != totalSz) {
  8377. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  8378. }
  8379. WOLFSSL_MSG("Loading peer's cert chain");
  8380. /* first put cert chain into buffer so can verify top down
  8381. we're sent bottom up */
  8382. while (listSz) {
  8383. word32 certSz;
  8384. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8385. if (args->totalCerts > ssl->verifyDepth) {
  8386. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  8387. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  8388. }
  8389. #else
  8390. if (args->totalCerts >= ssl->verifyDepth ||
  8391. args->totalCerts >= MAX_CHAIN_DEPTH) {
  8392. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  8393. }
  8394. #endif
  8395. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  8396. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  8397. }
  8398. c24to32(input + args->idx, &certSz);
  8399. args->idx += OPAQUE24_LEN;
  8400. if ((args->idx - args->begin) + certSz > totalSz) {
  8401. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  8402. }
  8403. args->certs[args->totalCerts].length = certSz;
  8404. args->certs[args->totalCerts].buffer = input + args->idx;
  8405. #ifdef SESSION_CERTS
  8406. AddSessionCertToChain(&ssl->session.chain,
  8407. input + args->idx, certSz);
  8408. #endif /* SESSION_CERTS */
  8409. args->idx += certSz;
  8410. listSz -= certSz + CERT_HEADER_SZ;
  8411. #ifdef WOLFSSL_TLS13
  8412. /* Extensions */
  8413. if (ssl->options.tls1_3) {
  8414. word16 extSz;
  8415. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz)
  8416. return BUFFER_ERROR;
  8417. ato16(input + args->idx, &extSz);
  8418. args->idx += OPAQUE16_LEN;
  8419. if ((args->idx - args->begin) + extSz > totalSz)
  8420. return BUFFER_ERROR;
  8421. /* Store extension data info for later processing. */
  8422. args->exts[args->totalCerts].length = extSz;
  8423. args->exts[args->totalCerts].buffer = input + args->idx;
  8424. args->idx += extSz;
  8425. listSz -= extSz + OPAQUE16_LEN;
  8426. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  8427. args->exts[args->totalCerts].length, certificate, NULL);
  8428. if (ret < 0)
  8429. return ret;
  8430. }
  8431. #endif
  8432. args->totalCerts++;
  8433. WOLFSSL_MSG("\tPut another cert into chain");
  8434. } /* while (listSz) */
  8435. args->count = args->totalCerts;
  8436. args->certIdx = 0; /* select peer cert (first one) */
  8437. args->dCertInit = 0;
  8438. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  8439. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  8440. DYNAMIC_TYPE_DCERT);
  8441. if (args->dCert == NULL) {
  8442. ERROR_OUT(MEMORY_E, exit_ppc);
  8443. }
  8444. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  8445. #endif
  8446. /* Advance state and proceed */
  8447. ssl->options.asyncState = TLS_ASYNC_BUILD;
  8448. } /* case TLS_ASYNC_BEGIN */
  8449. FALL_THROUGH;
  8450. case TLS_ASYNC_BUILD:
  8451. {
  8452. if (args->count > 0) {
  8453. /* check for trusted peer and get untrustedDepth */
  8454. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  8455. if (args->certIdx == 0) {
  8456. #ifdef WOLFSSL_TRUST_PEER_CERT
  8457. TrustedPeerCert* tp;
  8458. int matchType = WC_MATCH_NAME;
  8459. #endif
  8460. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  8461. &subjectHash, &alreadySigner);
  8462. if (ret != 0)
  8463. goto exit_ppc;
  8464. #ifdef OPENSSL_EXTRA
  8465. /* Determine untrusted depth */
  8466. if (!alreadySigner) {
  8467. args->untrustedDepth = 1;
  8468. }
  8469. #endif
  8470. #ifdef WOLFSSL_TRUST_PEER_CERT
  8471. #ifndef NO_SKID
  8472. if (args->dCert->extAuthKeyIdSet)
  8473. matchType = WC_MATCH_SKID;
  8474. #endif
  8475. tp = GetTrustedPeer(ssl->ctx->cm, subjectHash, matchType);
  8476. WOLFSSL_MSG("Checking for trusted peer cert");
  8477. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  8478. WOLFSSL_MSG("Found matching trusted peer cert");
  8479. args->haveTrustPeer = 1;
  8480. }
  8481. else if (tp == NULL) {
  8482. /* no trusted peer cert */
  8483. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  8484. }
  8485. else {
  8486. WOLFSSL_MSG("Trusted peer cert did not match!");
  8487. }
  8488. if (!args->haveTrustPeer)
  8489. #endif
  8490. {
  8491. /* free cert if not trusted peer */
  8492. FreeDecodedCert(args->dCert);
  8493. args->dCertInit = 0;
  8494. }
  8495. }
  8496. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  8497. /* check certificate up to peer's first */
  8498. /* do not verify chain if trusted peer cert found */
  8499. while (args->count > 1
  8500. #ifdef WOLFSSL_TRUST_PEER_CERT
  8501. && !args->haveTrustPeer
  8502. #endif /* WOLFSSL_TRUST_PEER_CERT */
  8503. ) {
  8504. /* select last certificate */
  8505. args->certIdx = args->count - 1;
  8506. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  8507. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  8508. &subjectHash, &alreadySigner);
  8509. #ifdef WOLFSSL_ASYNC_CRYPT
  8510. if (ret == WC_PENDING_E)
  8511. goto exit_ppc;
  8512. #endif
  8513. if (ret == 0) {
  8514. ret = ProcessPeerCertCheckKey(ssl, args);
  8515. }
  8516. if (ret == 0 && args->dCert->isCA == 0) {
  8517. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  8518. }
  8519. else if (ret == 0 && ssl->options.verifyNone) {
  8520. WOLFSSL_MSG("Chain cert not verified by option, "
  8521. "not adding as CA");
  8522. }
  8523. else if (ret == 0) {
  8524. buffer* cert = &args->certs[args->certIdx];
  8525. /* Is valid CA */
  8526. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  8527. /* if using alternate chain, store the cert used */
  8528. if (ssl->options.usingAltCertChain) {
  8529. AddSessionCertToChain(&ssl->session.altChain,
  8530. cert->buffer, cert->length);
  8531. }
  8532. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  8533. #ifdef OPENSSL_EXTRA
  8534. if (args->certIdx > args->untrustedDepth) {
  8535. args->untrustedDepth = (char)args->certIdx + 1;
  8536. }
  8537. #endif
  8538. if (!alreadySigner) {
  8539. DerBuffer* add = NULL;
  8540. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  8541. if (ret < 0)
  8542. goto exit_ppc;
  8543. XMEMCPY(add->buffer, cert->buffer, cert->length);
  8544. /* CA already verified above in ParseCertRelative */
  8545. WOLFSSL_MSG("Adding CA from chain");
  8546. ret = AddCA(ssl->ctx->cm, &add, WOLFSSL_CHAIN_CA,
  8547. NO_VERIFY);
  8548. if (ret == WOLFSSL_SUCCESS) {
  8549. ret = 0;
  8550. }
  8551. }
  8552. else {
  8553. WOLFSSL_MSG("Verified CA from chain and already had it");
  8554. }
  8555. }
  8556. else {
  8557. WOLFSSL_MSG("Failed to verify CA from chain");
  8558. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8559. ssl->peerVerifyRet = X509_V_ERR_INVALID_CA;
  8560. #endif
  8561. }
  8562. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  8563. if (ret == 0) {
  8564. int doCrlLookup = 1;
  8565. #ifdef HAVE_OCSP
  8566. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  8567. if (ssl->status_request_v2) {
  8568. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  8569. args->dCert, 0, ssl->heap);
  8570. }
  8571. else /* skips OCSP and force CRL check */
  8572. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  8573. if (ssl->ctx->cm->ocspEnabled &&
  8574. ssl->ctx->cm->ocspCheckAll) {
  8575. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  8576. ret = CheckCertOCSP_ex(ssl->ctx->cm->ocsp,
  8577. args->dCert, NULL, ssl);
  8578. #ifdef WOLFSSL_NONBLOCK_OCSP
  8579. if (ret == OCSP_WANT_READ) {
  8580. args->lastErr = ret;
  8581. goto exit_ppc;
  8582. }
  8583. #endif
  8584. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  8585. if (ret != 0) {
  8586. doCrlLookup = 0;
  8587. WOLFSSL_MSG("\tOCSP Lookup not ok");
  8588. }
  8589. }
  8590. #endif /* HAVE_OCSP */
  8591. #ifdef HAVE_CRL
  8592. if (ret == 0 && doCrlLookup &&
  8593. ssl->ctx->cm->crlEnabled &&
  8594. ssl->ctx->cm->crlCheckAll) {
  8595. WOLFSSL_MSG("Doing Non Leaf CRL check");
  8596. ret = CheckCertCRL(ssl->ctx->cm->crl, args->dCert);
  8597. #ifdef WOLFSSL_NONBLOCK_OCSP
  8598. if (ret == OCSP_WANT_READ) {
  8599. args->lastErr = ret;
  8600. goto exit_ppc;
  8601. }
  8602. #endif
  8603. if (ret != 0) {
  8604. WOLFSSL_MSG("\tCRL check not ok");
  8605. }
  8606. }
  8607. #endif /* HAVE_CRL */
  8608. (void)doCrlLookup;
  8609. }
  8610. #endif /* HAVE_OCSP || HAVE_CRL */
  8611. #ifdef WOLFSSL_ALT_CERT_CHAINS
  8612. /* For alternate cert chain, its okay for a CA cert to fail
  8613. with ASN_NO_SIGNER_E here. The "alternate" certificate
  8614. chain mode only requires that the peer certificate
  8615. validate to a trusted CA */
  8616. if (ret != 0) {
  8617. if (ret == ASN_NO_SIGNER_E) {
  8618. if (!ssl->options.usingAltCertChain) {
  8619. WOLFSSL_MSG("Trying alternate cert chain");
  8620. ssl->options.usingAltCertChain = 1;
  8621. }
  8622. ret = 0; /* clear error and continue */
  8623. }
  8624. }
  8625. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  8626. /* Do verify callback */
  8627. ret = DoVerifyCallback(ssl, ret, args);
  8628. /* Handle error codes */
  8629. if (ret != 0 && args->lastErr == 0) {
  8630. args->lastErr = ret; /* save error from last time */
  8631. ret = 0; /* reset error */
  8632. }
  8633. FreeDecodedCert(args->dCert);
  8634. args->dCertInit = 0;
  8635. args->count--;
  8636. } /* while (count > 0 && !args->haveTrustPeer) */
  8637. } /* if (count > 0) */
  8638. /* Check for error */
  8639. if (ret != 0) {
  8640. goto exit_ppc;
  8641. }
  8642. /* Advance state and proceed */
  8643. ssl->options.asyncState = TLS_ASYNC_DO;
  8644. } /* case TLS_ASYNC_BUILD */
  8645. FALL_THROUGH;
  8646. case TLS_ASYNC_DO:
  8647. {
  8648. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  8649. if (args->count > 0) {
  8650. WOLFSSL_MSG("Verifying Peer's cert");
  8651. /* select peer cert (first one) */
  8652. args->certIdx = 0;
  8653. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  8654. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  8655. &subjectHash, &alreadySigner);
  8656. #ifdef WOLFSSL_ASYNC_CRYPT
  8657. if (ret == WC_PENDING_E)
  8658. goto exit_ppc;
  8659. #endif
  8660. if (ret == 0) {
  8661. WOLFSSL_MSG("Verified Peer's cert");
  8662. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8663. ssl->peerVerifyRet = X509_V_OK;
  8664. #endif
  8665. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  8666. /* if using alternate chain, store the cert used */
  8667. if (ssl->options.usingAltCertChain) {
  8668. buffer* cert = &args->certs[args->certIdx];
  8669. AddSessionCertToChain(&ssl->session.altChain,
  8670. cert->buffer, cert->length);
  8671. }
  8672. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  8673. /* check if fatal error */
  8674. if (args->verifyErr) {
  8675. args->fatal = 1;
  8676. if (ret == 0) {
  8677. ret = args->lastErr;
  8678. }
  8679. }
  8680. else {
  8681. args->fatal = 0;
  8682. }
  8683. }
  8684. else if (ret == ASN_PARSE_E || ret == BUFFER_E) {
  8685. WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR");
  8686. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8687. SendAlert(ssl, alert_fatal, bad_certificate);
  8688. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  8689. #endif
  8690. args->fatal = 1;
  8691. }
  8692. else {
  8693. WOLFSSL_MSG("Failed to verify Peer's cert");
  8694. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8695. ssl->peerVerifyRet = X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  8696. #endif
  8697. if (ssl->verifyCallback) {
  8698. WOLFSSL_MSG(
  8699. "\tCallback override available, will continue");
  8700. /* check if fatal error */
  8701. args->fatal = (args->verifyErr) ? 1 : 0;
  8702. }
  8703. else {
  8704. WOLFSSL_MSG("\tNo callback override available, fatal");
  8705. args->fatal = 1;
  8706. #ifdef OPENSSL_EXTRA
  8707. SendAlert(ssl, alert_fatal, bad_certificate);
  8708. #endif
  8709. }
  8710. }
  8711. #ifdef HAVE_SECURE_RENEGOTIATION
  8712. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  8713. && ssl->secure_renegotiation
  8714. && ssl->secure_renegotiation->enabled) {
  8715. if (IsEncryptionOn(ssl, 0)) {
  8716. /* compare against previous time */
  8717. if (XMEMCMP(args->dCert->subjectHash,
  8718. ssl->secure_renegotiation->subject_hash,
  8719. KEYID_SIZE) != 0) {
  8720. WOLFSSL_MSG(
  8721. "Peer sent different cert during scr, fatal");
  8722. args->fatal = 1;
  8723. ret = SCR_DIFFERENT_CERT_E;
  8724. }
  8725. }
  8726. /* cache peer's hash */
  8727. if (args->fatal == 0) {
  8728. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  8729. args->dCert->subjectHash, KEYID_SIZE);
  8730. }
  8731. }
  8732. #endif /* HAVE_SECURE_RENEGOTIATION */
  8733. } /* if (count > 0) */
  8734. /* Check for error */
  8735. if (args->fatal && ret != 0) {
  8736. goto exit_ppc;
  8737. }
  8738. /* Advance state and proceed */
  8739. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  8740. } /* case TLS_ASYNC_DO */
  8741. FALL_THROUGH;
  8742. case TLS_ASYNC_VERIFY:
  8743. {
  8744. if (args->count > 0) {
  8745. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  8746. if (args->fatal == 0) {
  8747. int doLookup = 1;
  8748. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  8749. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  8750. if (ssl->status_request) {
  8751. args->fatal = TLSX_CSR_InitRequest(ssl->extensions,
  8752. args->dCert, ssl->heap);
  8753. doLookup = 0;
  8754. #ifdef WOLFSSL_TLS13
  8755. if (ssl->options.tls1_3) {
  8756. TLSX* ext = TLSX_Find(ssl->extensions,
  8757. TLSX_STATUS_REQUEST);
  8758. if (ext != NULL) {
  8759. word32 idx = 0;
  8760. CertificateStatusRequest* csr =
  8761. (CertificateStatusRequest*)ext->data;
  8762. ret = ProcessCSR(ssl, csr->response.buffer,
  8763. &idx, csr->response.length);
  8764. if (ret < 0)
  8765. goto exit_ppc;
  8766. }
  8767. }
  8768. #endif
  8769. }
  8770. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  8771. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  8772. if (ssl->status_request_v2) {
  8773. args->fatal = TLSX_CSR2_InitRequests(ssl->extensions,
  8774. args->dCert, 1, ssl->heap);
  8775. doLookup = 0;
  8776. }
  8777. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  8778. }
  8779. #ifdef HAVE_OCSP
  8780. if (doLookup && ssl->ctx->cm->ocspEnabled) {
  8781. WOLFSSL_MSG("Doing Leaf OCSP check");
  8782. ret = CheckCertOCSP_ex(ssl->ctx->cm->ocsp,
  8783. args->dCert, NULL, ssl);
  8784. #ifdef WOLFSSL_NONBLOCK_OCSP
  8785. if (ret == OCSP_WANT_READ) {
  8786. goto exit_ppc;
  8787. }
  8788. #endif
  8789. doLookup = (ret == OCSP_CERT_UNKNOWN);
  8790. if (ret != 0) {
  8791. WOLFSSL_MSG("\tOCSP Lookup not ok");
  8792. args->fatal = 0;
  8793. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8794. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  8795. #endif
  8796. }
  8797. }
  8798. #endif /* HAVE_OCSP */
  8799. #ifdef HAVE_CRL
  8800. if (doLookup && ssl->ctx->cm->crlEnabled) {
  8801. WOLFSSL_MSG("Doing Leaf CRL check");
  8802. ret = CheckCertCRL(ssl->ctx->cm->crl, args->dCert);
  8803. #ifdef WOLFSSL_NONBLOCK_OCSP
  8804. if (ret == OCSP_WANT_READ) {
  8805. goto exit_ppc;
  8806. }
  8807. #endif
  8808. if (ret != 0) {
  8809. WOLFSSL_MSG("\tCRL check not ok");
  8810. args->fatal = 0;
  8811. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8812. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  8813. #endif
  8814. }
  8815. }
  8816. #endif /* HAVE_CRL */
  8817. (void)doLookup;
  8818. }
  8819. #endif /* HAVE_OCSP || HAVE_CRL */
  8820. #ifdef KEEP_PEER_CERT
  8821. if (args->fatal == 0) {
  8822. /* set X509 format for peer cert */
  8823. int copyRet = CopyDecodedToX509(&ssl->peerCert,
  8824. args->dCert);
  8825. if (copyRet == MEMORY_E) {
  8826. args->fatal = 1;
  8827. }
  8828. }
  8829. #endif /* KEEP_PEER_CERT */
  8830. #ifndef IGNORE_KEY_EXTENSIONS
  8831. #if defined(OPENSSL_EXTRA)
  8832. /* when compatibility layer is turned on and no verify is
  8833. * set then ignore the certificate key extension */
  8834. if (args->dCert->extKeyUsageSet &&
  8835. args->dCert->extKeyUsageCrit == 0 &&
  8836. ssl->options.verifyNone) {
  8837. WOLFSSL_MSG("Not verifying certificate key usage");
  8838. }
  8839. else
  8840. #endif
  8841. if (args->dCert->extKeyUsageSet) {
  8842. if ((ssl->specs.kea == rsa_kea) &&
  8843. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  8844. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  8845. ret = KEYUSE_ENCIPHER_E;
  8846. }
  8847. if ((ssl->specs.sig_algo == rsa_sa_algo ||
  8848. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  8849. !ssl->specs.static_ecdh)) &&
  8850. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  8851. WOLFSSL_MSG("KeyUse Digital Sig not set");
  8852. ret = KEYUSE_SIGNATURE_E;
  8853. }
  8854. }
  8855. #if defined(OPENSSL_EXTRA)
  8856. /* when compatibility layer is turned on and no verify is
  8857. * set then ignore the certificate key extension */
  8858. if (args->dCert->extExtKeyUsageSet &&
  8859. args->dCert->extExtKeyUsageCrit == 0 &&
  8860. ssl->options.verifyNone) {
  8861. WOLFSSL_MSG("Not verifying certificate ext key usage");
  8862. }
  8863. else
  8864. #endif
  8865. if (args->dCert->extExtKeyUsageSet) {
  8866. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  8867. if ((args->dCert->extExtKeyUsage &
  8868. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  8869. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  8870. ret = EXTKEYUSE_AUTH_E;
  8871. }
  8872. }
  8873. else {
  8874. if ((args->dCert->extExtKeyUsage &
  8875. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  8876. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  8877. ret = EXTKEYUSE_AUTH_E;
  8878. }
  8879. }
  8880. }
  8881. #endif /* IGNORE_KEY_EXTENSIONS */
  8882. if (args->fatal) {
  8883. ssl->error = ret;
  8884. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8885. SendAlert(ssl, alert_fatal, bad_certificate);
  8886. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  8887. #endif
  8888. goto exit_ppc;
  8889. }
  8890. ssl->options.havePeerCert = 1;
  8891. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  8892. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  8893. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  8894. * are to be bound into a certificate, the subject
  8895. * alternative name extension MUST be used." */
  8896. if (args->dCert->altNames) {
  8897. if (CheckAltNames(args->dCert,
  8898. (char*)ssl->buffers.domainName.buffer) == 0 ) {
  8899. WOLFSSL_MSG("DomainName match on alt names failed");
  8900. /* try to get peer key still */
  8901. ret = DOMAIN_NAME_MISMATCH;
  8902. }
  8903. }
  8904. else {
  8905. if (MatchDomainName(
  8906. args->dCert->subjectCN,
  8907. args->dCert->subjectCNLen,
  8908. (char*)ssl->buffers.domainName.buffer) == 0) {
  8909. WOLFSSL_MSG("DomainName match on common name failed");
  8910. ret = DOMAIN_NAME_MISMATCH;
  8911. }
  8912. }
  8913. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  8914. /* Old behavior. */
  8915. if (MatchDomainName(args->dCert->subjectCN,
  8916. args->dCert->subjectCNLen,
  8917. (char*)ssl->buffers.domainName.buffer) == 0) {
  8918. WOLFSSL_MSG("DomainName match on common name failed");
  8919. if (CheckAltNames(args->dCert,
  8920. (char*)ssl->buffers.domainName.buffer) == 0 ) {
  8921. WOLFSSL_MSG(
  8922. "DomainName match on alt names failed too");
  8923. /* try to get peer key still */
  8924. ret = DOMAIN_NAME_MISMATCH;
  8925. }
  8926. }
  8927. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  8928. }
  8929. /* decode peer key */
  8930. switch (args->dCert->keyOID) {
  8931. #ifndef NO_RSA
  8932. case RSAk:
  8933. {
  8934. word32 keyIdx = 0;
  8935. int keyRet = 0;
  8936. if (ssl->peerRsaKey == NULL) {
  8937. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  8938. (void**)&ssl->peerRsaKey);
  8939. } else if (ssl->peerRsaKeyPresent) {
  8940. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  8941. ssl->peerRsaKey);
  8942. ssl->peerRsaKeyPresent = 0;
  8943. }
  8944. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  8945. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  8946. args->dCert->pubKeySize) != 0) {
  8947. ret = PEER_KEY_ERROR;
  8948. }
  8949. else {
  8950. ssl->peerRsaKeyPresent = 1;
  8951. #ifdef HAVE_PK_CALLBACKS
  8952. #ifndef NO_RSA
  8953. #ifdef HAVE_SECURE_RENEGOTIATION
  8954. if (ssl->buffers.peerRsaKey.buffer) {
  8955. XFREE(ssl->buffers.peerRsaKey.buffer,
  8956. ssl->heap, DYNAMIC_TYPE_RSA);
  8957. ssl->buffers.peerRsaKey.buffer = NULL;
  8958. }
  8959. #endif
  8960. ssl->buffers.peerRsaKey.buffer =
  8961. (byte*)XMALLOC(args->dCert->pubKeySize,
  8962. ssl->heap, DYNAMIC_TYPE_RSA);
  8963. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  8964. ret = MEMORY_ERROR;
  8965. }
  8966. else {
  8967. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  8968. args->dCert->publicKey,
  8969. args->dCert->pubKeySize);
  8970. ssl->buffers.peerRsaKey.length =
  8971. args->dCert->pubKeySize;
  8972. }
  8973. #endif /* NO_RSA */
  8974. #endif /* HAVE_PK_CALLBACKS */
  8975. }
  8976. /* check size of peer RSA key */
  8977. if (ret == 0 && ssl->peerRsaKeyPresent &&
  8978. !ssl->options.verifyNone &&
  8979. wc_RsaEncryptSize(ssl->peerRsaKey)
  8980. < ssl->options.minRsaKeySz) {
  8981. ret = RSA_KEY_SIZE_E;
  8982. WOLFSSL_MSG("Peer RSA key is too small");
  8983. }
  8984. break;
  8985. }
  8986. #endif /* NO_RSA */
  8987. #ifdef HAVE_NTRU
  8988. case NTRUk:
  8989. {
  8990. if (args->dCert->pubKeySize > sizeof(ssl->peerNtruKey)) {
  8991. ret = PEER_KEY_ERROR;
  8992. }
  8993. else {
  8994. XMEMCPY(ssl->peerNtruKey, args->dCert->publicKey,
  8995. args->dCert->pubKeySize);
  8996. ssl->peerNtruKeyLen =
  8997. (word16)args->dCert->pubKeySize;
  8998. ssl->peerNtruKeyPresent = 1;
  8999. }
  9000. break;
  9001. }
  9002. #endif /* HAVE_NTRU */
  9003. #ifdef HAVE_ECC
  9004. case ECDSAk:
  9005. {
  9006. int keyRet = 0;
  9007. word32 idx = 0;
  9008. if (ssl->peerEccDsaKey == NULL) {
  9009. /* alloc/init on demand */
  9010. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  9011. (void**)&ssl->peerEccDsaKey);
  9012. } else if (ssl->peerEccDsaKeyPresent) {
  9013. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  9014. ssl->peerEccDsaKey);
  9015. ssl->peerEccDsaKeyPresent = 0;
  9016. }
  9017. if (keyRet != 0 ||
  9018. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  9019. ssl->peerEccDsaKey,
  9020. args->dCert->pubKeySize) != 0) {
  9021. ret = PEER_KEY_ERROR;
  9022. }
  9023. else {
  9024. ssl->peerEccDsaKeyPresent = 1;
  9025. #ifdef HAVE_PK_CALLBACKS
  9026. ssl->buffers.peerEccDsaKey.buffer =
  9027. (byte*)XMALLOC(args->dCert->pubKeySize,
  9028. ssl->heap, DYNAMIC_TYPE_ECC);
  9029. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  9030. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  9031. }
  9032. else {
  9033. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  9034. args->dCert->publicKey,
  9035. args->dCert->pubKeySize);
  9036. ssl->buffers.peerEccDsaKey.length =
  9037. args->dCert->pubKeySize;
  9038. }
  9039. #endif /* HAVE_PK_CALLBACKS */
  9040. }
  9041. /* check size of peer ECC key */
  9042. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  9043. !ssl->options.verifyNone &&
  9044. wc_ecc_size(ssl->peerEccDsaKey)
  9045. < ssl->options.minEccKeySz) {
  9046. ret = ECC_KEY_SIZE_E;
  9047. WOLFSSL_MSG("Peer ECC key is too small");
  9048. }
  9049. break;
  9050. }
  9051. #endif /* HAVE_ECC */
  9052. #ifdef HAVE_ED25519
  9053. case ED25519k:
  9054. {
  9055. int keyRet = 0;
  9056. if (ssl->peerEd25519Key == NULL) {
  9057. /* alloc/init on demand */
  9058. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  9059. (void**)&ssl->peerEd25519Key);
  9060. } else if (ssl->peerEd25519KeyPresent) {
  9061. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  9062. ssl->peerEd25519Key);
  9063. ssl->peerEd25519KeyPresent = 0;
  9064. }
  9065. if (keyRet != 0 ||
  9066. wc_ed25519_import_public(args->dCert->publicKey,
  9067. args->dCert->pubKeySize,
  9068. ssl->peerEd25519Key)
  9069. != 0) {
  9070. ret = PEER_KEY_ERROR;
  9071. }
  9072. else {
  9073. ssl->peerEd25519KeyPresent = 1;
  9074. #ifdef HAVE_PK_CALLBACKS
  9075. ssl->buffers.peerEd25519Key.buffer =
  9076. (byte*)XMALLOC(args->dCert->pubKeySize,
  9077. ssl->heap, DYNAMIC_TYPE_ED25519);
  9078. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  9079. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  9080. }
  9081. else {
  9082. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  9083. args->dCert->publicKey,
  9084. args->dCert->pubKeySize);
  9085. ssl->buffers.peerEd25519Key.length =
  9086. args->dCert->pubKeySize;
  9087. }
  9088. #endif /*HAVE_PK_CALLBACKS */
  9089. }
  9090. /* check size of peer ECC key */
  9091. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  9092. !ssl->options.verifyNone &&
  9093. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  9094. ret = ECC_KEY_SIZE_E;
  9095. WOLFSSL_MSG("Peer ECC key is too small");
  9096. }
  9097. break;
  9098. }
  9099. #endif /* HAVE_ED25519 */
  9100. default:
  9101. break;
  9102. }
  9103. /* args->dCert free'd in function cleanup after callback */
  9104. } /* if (count > 0) */
  9105. /* Check for error */
  9106. if (args->fatal && ret != 0) {
  9107. goto exit_ppc;
  9108. }
  9109. /* Advance state and proceed */
  9110. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  9111. } /* case TLS_ASYNC_VERIFY */
  9112. FALL_THROUGH;
  9113. case TLS_ASYNC_FINALIZE:
  9114. {
  9115. /* load last error */
  9116. if (args->lastErr != 0 && ret == 0) {
  9117. ret = args->lastErr;
  9118. }
  9119. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9120. if (args->untrustedDepth > ssl->options.verifyDepth) {
  9121. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  9122. ret = MAX_CHAIN_ERROR;
  9123. }
  9124. #endif
  9125. /* Do verify callback */
  9126. ret = DoVerifyCallback(ssl, ret, args);
  9127. if (ssl->options.verifyNone &&
  9128. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED)) {
  9129. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  9130. ret = ssl->error = 0;
  9131. }
  9132. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  9133. ssl->options.serverState = SERVER_CERT_COMPLETE;
  9134. }
  9135. if (IsEncryptionOn(ssl, 0)) {
  9136. args->idx += ssl->keys.padSz;
  9137. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  9138. if (ssl->options.encThenMac)
  9139. args->idx += MacSize(ssl);
  9140. #endif
  9141. }
  9142. /* Advance state and proceed */
  9143. ssl->options.asyncState = TLS_ASYNC_END;
  9144. } /* case TLS_ASYNC_FINALIZE */
  9145. FALL_THROUGH;
  9146. case TLS_ASYNC_END:
  9147. {
  9148. /* Set final index */
  9149. *inOutIdx = args->idx;
  9150. break;
  9151. }
  9152. default:
  9153. ret = INPUT_CASE_ERROR;
  9154. break;
  9155. } /* switch(ssl->options.asyncState) */
  9156. exit_ppc:
  9157. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  9158. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  9159. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  9160. /* Mark message as not received so it can process again */
  9161. ssl->msgsReceived.got_certificate = 0;
  9162. return ret;
  9163. }
  9164. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  9165. FreeProcPeerCertArgs(ssl, args);
  9166. #if defined(WOLFSSL_ASYNC_CRYPT)
  9167. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  9168. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9169. ssl->nonblockarg = NULL;
  9170. #elif defined(WOLFSSL_SMALL_STACK)
  9171. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9172. #endif
  9173. FreeKeyExchange(ssl);
  9174. return ret;
  9175. }
  9176. #endif
  9177. #ifndef WOLFSSL_NO_TLS12
  9178. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  9179. /* handle processing of certificate (11) */
  9180. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  9181. word32 size)
  9182. {
  9183. int ret;
  9184. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  9185. WOLFSSL_ENTER("DoCertificate");
  9186. #ifdef SESSION_CERTS
  9187. /* Reset the session cert chain count in case the session resume failed. */
  9188. ssl->session.chain.count = 0;
  9189. #ifdef WOLFSSL_ALT_CERT_CHAINS
  9190. ssl->session.altChain.count = 0;
  9191. #endif
  9192. #endif /* SESSION_CERTS */
  9193. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  9194. #ifdef WOLFSSL_EXTRA_ALERTS
  9195. if (ret == BUFFER_ERROR || ret == ASN_PARSE_E)
  9196. SendAlert(ssl, alert_fatal, decode_error);
  9197. #endif
  9198. #ifdef OPENSSL_EXTRA
  9199. ssl->options.serverState = SERVER_CERT_COMPLETE;
  9200. #endif
  9201. WOLFSSL_LEAVE("DoCertificate", ret);
  9202. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  9203. return ret;
  9204. }
  9205. /* handle processing of certificate_status (22) */
  9206. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  9207. word32 size)
  9208. {
  9209. int ret = 0;
  9210. byte status_type;
  9211. word32 status_length;
  9212. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  9213. WOLFSSL_ENTER("DoCertificateStatus");
  9214. if (size < ENUM_LEN + OPAQUE24_LEN)
  9215. return BUFFER_ERROR;
  9216. status_type = input[(*inOutIdx)++];
  9217. c24to32(input + *inOutIdx, &status_length);
  9218. *inOutIdx += OPAQUE24_LEN;
  9219. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  9220. return BUFFER_ERROR;
  9221. switch (status_type) {
  9222. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  9223. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  9224. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  9225. case WOLFSSL_CSR2_OCSP:
  9226. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  9227. break;
  9228. #endif
  9229. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  9230. case WOLFSSL_CSR2_OCSP_MULTI: {
  9231. OcspRequest* request;
  9232. word32 list_length = status_length;
  9233. byte idx = 0;
  9234. #ifdef WOLFSSL_SMALL_STACK
  9235. CertStatus* status;
  9236. OcspResponse* response;
  9237. #else
  9238. CertStatus status[1];
  9239. OcspResponse response[1];
  9240. #endif
  9241. do {
  9242. if (ssl->status_request_v2) {
  9243. ssl->status_request_v2 = 0;
  9244. break;
  9245. }
  9246. return BUFFER_ERROR;
  9247. } while(0);
  9248. #ifdef WOLFSSL_SMALL_STACK
  9249. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  9250. DYNAMIC_TYPE_OCSP_STATUS);
  9251. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  9252. DYNAMIC_TYPE_OCSP_REQUEST);
  9253. if (status == NULL || response == NULL) {
  9254. if (status)
  9255. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  9256. if (response)
  9257. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  9258. return MEMORY_ERROR;
  9259. }
  9260. #endif
  9261. while (list_length && ret == 0) {
  9262. if (OPAQUE24_LEN > list_length) {
  9263. ret = BUFFER_ERROR;
  9264. break;
  9265. }
  9266. c24to32(input + *inOutIdx, &status_length);
  9267. *inOutIdx += OPAQUE24_LEN;
  9268. list_length -= OPAQUE24_LEN;
  9269. if (status_length > list_length) {
  9270. ret = BUFFER_ERROR;
  9271. break;
  9272. }
  9273. if (status_length) {
  9274. InitOcspResponse(response, status, input +*inOutIdx,
  9275. status_length);
  9276. if ((OcspResponseDecode(response, ssl->ctx->cm, ssl->heap,
  9277. 0) != 0)
  9278. || (response->responseStatus != OCSP_SUCCESSFUL)
  9279. || (response->status->status != CERT_GOOD))
  9280. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9281. while (ret == 0) {
  9282. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  9283. ssl->extensions, status_type, idx++);
  9284. if (request == NULL)
  9285. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9286. else if (CompareOcspReqResp(request, response) == 0)
  9287. break;
  9288. else if (idx == 1) /* server cert must be OK */
  9289. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9290. }
  9291. *inOutIdx += status_length;
  9292. list_length -= status_length;
  9293. }
  9294. }
  9295. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  9296. ssl->status_request_v2 = 0;
  9297. #endif
  9298. #ifdef WOLFSSL_SMALL_STACK
  9299. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  9300. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  9301. #endif
  9302. }
  9303. break;
  9304. #endif
  9305. default:
  9306. ret = BUFFER_ERROR;
  9307. }
  9308. if (ret != 0)
  9309. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  9310. if (IsEncryptionOn(ssl, 0)) {
  9311. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  9312. if (ssl->options.encThenMac) {
  9313. word32 digestSz = MacSize(ssl);
  9314. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  9315. return BUFFER_E;
  9316. *inOutIdx += ssl->keys.padSz + digestSz;
  9317. }
  9318. else
  9319. #endif
  9320. {
  9321. if (*inOutIdx + ssl->keys.padSz > size)
  9322. return BUFFER_E;
  9323. *inOutIdx += ssl->keys.padSz;
  9324. }
  9325. }
  9326. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  9327. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  9328. return ret;
  9329. }
  9330. #endif
  9331. #endif /* !WOLFSSL_NO_TLS12 */
  9332. #endif /* !NO_CERTS */
  9333. #ifndef WOLFSSL_NO_TLS12
  9334. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  9335. word32 size, word32 totalSz)
  9336. {
  9337. (void)input;
  9338. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  9339. WOLFSSL_ENTER("DoHelloRequest");
  9340. if (size) /* must be 0 */
  9341. return BUFFER_ERROR;
  9342. if (IsEncryptionOn(ssl, 0)) {
  9343. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  9344. if (ssl->options.encThenMac) {
  9345. word32 digestSz = MacSize(ssl);
  9346. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  9347. return BUFFER_E;
  9348. *inOutIdx += ssl->keys.padSz + digestSz;
  9349. }
  9350. else
  9351. #endif
  9352. {
  9353. /* access beyond input + size should be checked against totalSz */
  9354. if (*inOutIdx + ssl->keys.padSz > totalSz)
  9355. return BUFFER_E;
  9356. *inOutIdx += ssl->keys.padSz;
  9357. }
  9358. }
  9359. if (ssl->options.side == WOLFSSL_SERVER_END) {
  9360. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  9361. return FATAL_ERROR;
  9362. }
  9363. #ifdef HAVE_SECURE_RENEGOTIATION
  9364. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  9365. ssl->secure_renegotiation->startScr = 1;
  9366. WOLFSSL_LEAVE("DoHelloRequest", 0);
  9367. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  9368. return 0;
  9369. }
  9370. #endif
  9371. else {
  9372. return SendAlert(ssl, alert_warning, no_renegotiation);
  9373. }
  9374. }
  9375. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  9376. word32 totalSz, int sniff)
  9377. {
  9378. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  9379. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  9380. WOLFSSL_ENTER("DoFinished");
  9381. if (finishedSz != size)
  9382. return BUFFER_ERROR;
  9383. /* check against totalSz */
  9384. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  9385. if (ssl->options.encThenMac) {
  9386. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  9387. return BUFFER_E;
  9388. }
  9389. else
  9390. #endif
  9391. {
  9392. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  9393. return BUFFER_E;
  9394. }
  9395. #ifdef WOLFSSL_CALLBACKS
  9396. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  9397. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  9398. #endif
  9399. if (sniff == NO_SNIFF) {
  9400. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  9401. WOLFSSL_MSG("Verify finished error on hashes");
  9402. #ifdef WOLFSSL_EXTRA_ALERTS
  9403. SendAlert(ssl, alert_fatal, decrypt_error);
  9404. #endif
  9405. return VERIFY_FINISHED_ERROR;
  9406. }
  9407. }
  9408. #ifdef HAVE_SECURE_RENEGOTIATION
  9409. if (ssl->secure_renegotiation) {
  9410. /* save peer's state */
  9411. if (ssl->options.side == WOLFSSL_CLIENT_END)
  9412. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  9413. input + *inOutIdx, TLS_FINISHED_SZ);
  9414. else
  9415. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  9416. input + *inOutIdx, TLS_FINISHED_SZ);
  9417. ssl->secure_renegotiation->verifySet = 1;
  9418. }
  9419. #endif
  9420. /* force input exhaustion at ProcessReply consuming padSz */
  9421. *inOutIdx += size + ssl->keys.padSz;
  9422. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  9423. if (ssl->options.encThenMac)
  9424. *inOutIdx += MacSize(ssl);
  9425. #endif
  9426. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9427. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  9428. #ifdef OPENSSL_EXTRA
  9429. ssl->cbmode = SSL_CB_MODE_WRITE;
  9430. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  9431. #endif
  9432. if (!ssl->options.resuming) {
  9433. #ifdef OPENSSL_EXTRA
  9434. if (ssl->CBIS != NULL) {
  9435. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  9436. }
  9437. #endif
  9438. ssl->options.handShakeState = HANDSHAKE_DONE;
  9439. ssl->options.handShakeDone = 1;
  9440. }
  9441. }
  9442. else {
  9443. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  9444. #ifdef OPENSSL_EXTRA
  9445. ssl->cbmode = SSL_CB_MODE_READ;
  9446. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  9447. #endif
  9448. if (ssl->options.resuming) {
  9449. #ifdef OPENSSL_EXTRA
  9450. if (ssl->CBIS != NULL) {
  9451. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  9452. }
  9453. #endif
  9454. ssl->options.handShakeState = HANDSHAKE_DONE;
  9455. ssl->options.handShakeDone = 1;
  9456. }
  9457. }
  9458. WOLFSSL_LEAVE("DoFinished", 0);
  9459. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  9460. return 0;
  9461. }
  9462. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  9463. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  9464. {
  9465. /* verify not a duplicate, mark received, check state */
  9466. switch (type) {
  9467. #ifndef NO_WOLFSSL_CLIENT
  9468. case hello_request:
  9469. if (ssl->msgsReceived.got_hello_request) {
  9470. WOLFSSL_MSG("Duplicate HelloRequest received");
  9471. return DUPLICATE_MSG_E;
  9472. }
  9473. ssl->msgsReceived.got_hello_request = 1;
  9474. break;
  9475. #endif
  9476. #ifndef NO_WOLFSSL_SERVER
  9477. case client_hello:
  9478. if (ssl->msgsReceived.got_client_hello) {
  9479. WOLFSSL_MSG("Duplicate ClientHello received");
  9480. #ifdef WOLFSSL_EXTRA_ALERTS
  9481. SendAlert(ssl, alert_fatal, unexpected_message);
  9482. #endif
  9483. return DUPLICATE_MSG_E;
  9484. }
  9485. ssl->msgsReceived.got_client_hello = 1;
  9486. break;
  9487. #endif
  9488. #ifndef NO_WOLFSSL_CLIENT
  9489. case server_hello:
  9490. if (ssl->msgsReceived.got_server_hello) {
  9491. WOLFSSL_MSG("Duplicate ServerHello received");
  9492. return DUPLICATE_MSG_E;
  9493. }
  9494. ssl->msgsReceived.got_server_hello = 1;
  9495. break;
  9496. #endif
  9497. #ifndef NO_WOLFSSL_CLIENT
  9498. case hello_verify_request:
  9499. if (ssl->msgsReceived.got_hello_verify_request) {
  9500. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  9501. return DUPLICATE_MSG_E;
  9502. }
  9503. ssl->msgsReceived.got_hello_verify_request = 1;
  9504. break;
  9505. #endif
  9506. #ifndef NO_WOLFSSL_CLIENT
  9507. case session_ticket:
  9508. if (ssl->msgsReceived.got_session_ticket) {
  9509. WOLFSSL_MSG("Duplicate SessionTicket received");
  9510. return DUPLICATE_MSG_E;
  9511. }
  9512. ssl->msgsReceived.got_session_ticket = 1;
  9513. break;
  9514. #endif
  9515. case certificate:
  9516. if (ssl->msgsReceived.got_certificate) {
  9517. WOLFSSL_MSG("Duplicate Certificate received");
  9518. return DUPLICATE_MSG_E;
  9519. }
  9520. ssl->msgsReceived.got_certificate = 1;
  9521. #ifndef NO_WOLFSSL_CLIENT
  9522. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9523. if ( ssl->msgsReceived.got_server_hello == 0) {
  9524. WOLFSSL_MSG("No ServerHello before Cert");
  9525. return OUT_OF_ORDER_E;
  9526. }
  9527. }
  9528. #endif
  9529. #ifndef NO_WOLFSSL_SERVER
  9530. if (ssl->options.side == WOLFSSL_SERVER_END) {
  9531. if ( ssl->msgsReceived.got_client_hello == 0) {
  9532. WOLFSSL_MSG("No ClientHello before Cert");
  9533. return OUT_OF_ORDER_E;
  9534. }
  9535. }
  9536. #endif
  9537. break;
  9538. #ifndef NO_WOLFSSL_CLIENT
  9539. case certificate_status:
  9540. if (ssl->msgsReceived.got_certificate_status) {
  9541. WOLFSSL_MSG("Duplicate CertificateSatatus received");
  9542. return DUPLICATE_MSG_E;
  9543. }
  9544. ssl->msgsReceived.got_certificate_status = 1;
  9545. if (ssl->msgsReceived.got_certificate == 0) {
  9546. WOLFSSL_MSG("No Certificate before CertificateStatus");
  9547. return OUT_OF_ORDER_E;
  9548. }
  9549. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  9550. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  9551. return OUT_OF_ORDER_E;
  9552. }
  9553. break;
  9554. #endif
  9555. #ifndef NO_WOLFSSL_CLIENT
  9556. case server_key_exchange:
  9557. if (ssl->msgsReceived.got_server_key_exchange) {
  9558. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  9559. return DUPLICATE_MSG_E;
  9560. }
  9561. ssl->msgsReceived.got_server_key_exchange = 1;
  9562. if (ssl->msgsReceived.got_server_hello == 0) {
  9563. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  9564. return OUT_OF_ORDER_E;
  9565. }
  9566. if (ssl->msgsReceived.got_certificate_status == 0) {
  9567. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  9568. if (ssl->status_request) {
  9569. int ret;
  9570. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  9571. if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0)
  9572. return ret;
  9573. }
  9574. #endif
  9575. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  9576. if (ssl->status_request_v2) {
  9577. int ret;
  9578. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  9579. if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0)
  9580. return ret;
  9581. }
  9582. #endif
  9583. }
  9584. break;
  9585. #endif
  9586. #ifndef NO_WOLFSSL_CLIENT
  9587. case certificate_request:
  9588. if (ssl->msgsReceived.got_certificate_request) {
  9589. WOLFSSL_MSG("Duplicate CertificateRequest received");
  9590. return DUPLICATE_MSG_E;
  9591. }
  9592. ssl->msgsReceived.got_certificate_request = 1;
  9593. break;
  9594. #endif
  9595. #ifndef NO_WOLFSSL_CLIENT
  9596. case server_hello_done:
  9597. if (ssl->msgsReceived.got_server_hello_done) {
  9598. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  9599. return DUPLICATE_MSG_E;
  9600. }
  9601. ssl->msgsReceived.got_server_hello_done = 1;
  9602. if (ssl->msgsReceived.got_certificate == 0) {
  9603. if (ssl->specs.kea == psk_kea ||
  9604. ssl->specs.kea == dhe_psk_kea ||
  9605. ssl->specs.kea == ecdhe_psk_kea ||
  9606. ssl->options.usingAnon_cipher) {
  9607. WOLFSSL_MSG("No Cert required");
  9608. } else {
  9609. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  9610. return OUT_OF_ORDER_E;
  9611. }
  9612. }
  9613. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  9614. int pskNoServerHint = 0; /* not required in this case */
  9615. #ifndef NO_PSK
  9616. if (ssl->specs.kea == psk_kea &&
  9617. ssl->arrays->server_hint[0] == 0)
  9618. pskNoServerHint = 1;
  9619. #endif
  9620. if (ssl->specs.static_ecdh == 1 ||
  9621. ssl->specs.kea == rsa_kea ||
  9622. ssl->specs.kea == ntru_kea ||
  9623. pskNoServerHint) {
  9624. WOLFSSL_MSG("No KeyExchange required");
  9625. } else {
  9626. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  9627. return OUT_OF_ORDER_E;
  9628. }
  9629. }
  9630. break;
  9631. #endif
  9632. #ifndef NO_WOLFSSL_SERVER
  9633. case certificate_verify:
  9634. if (ssl->msgsReceived.got_certificate_verify) {
  9635. WOLFSSL_MSG("Duplicate CertificateVerify received");
  9636. return DUPLICATE_MSG_E;
  9637. }
  9638. ssl->msgsReceived.got_certificate_verify = 1;
  9639. if ( ssl->msgsReceived.got_certificate == 0) {
  9640. WOLFSSL_MSG("No Cert before CertVerify");
  9641. return OUT_OF_ORDER_E;
  9642. }
  9643. break;
  9644. #endif
  9645. #ifndef NO_WOLFSSL_SERVER
  9646. case client_key_exchange:
  9647. if (ssl->msgsReceived.got_client_key_exchange) {
  9648. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  9649. #ifdef WOLFSSL_EXTRA_ALERTS
  9650. SendAlert(ssl, alert_fatal, unexpected_message);
  9651. #endif
  9652. return DUPLICATE_MSG_E;
  9653. }
  9654. ssl->msgsReceived.got_client_key_exchange = 1;
  9655. if (ssl->msgsReceived.got_client_hello == 0) {
  9656. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  9657. return OUT_OF_ORDER_E;
  9658. }
  9659. break;
  9660. #endif
  9661. case finished:
  9662. if (ssl->msgsReceived.got_finished) {
  9663. WOLFSSL_MSG("Duplicate Finished received");
  9664. return DUPLICATE_MSG_E;
  9665. }
  9666. ssl->msgsReceived.got_finished = 1;
  9667. if (ssl->msgsReceived.got_change_cipher == 0) {
  9668. WOLFSSL_MSG("Finished received before ChangeCipher");
  9669. #ifdef WOLFSSL_EXTRA_ALERTS
  9670. SendAlert(ssl, alert_fatal, unexpected_message);
  9671. #endif
  9672. return NO_CHANGE_CIPHER_E;
  9673. }
  9674. break;
  9675. case change_cipher_hs:
  9676. if (ssl->msgsReceived.got_change_cipher) {
  9677. WOLFSSL_MSG("Duplicate ChangeCipher received");
  9678. #ifdef WOLFSSL_EXTRA_ALERTS
  9679. SendAlert(ssl, alert_fatal, unexpected_message);
  9680. #endif
  9681. return DUPLICATE_MSG_E;
  9682. }
  9683. /* DTLS is going to ignore the CCS message if the client key
  9684. * exchange message wasn't received yet. */
  9685. if (!ssl->options.dtls)
  9686. ssl->msgsReceived.got_change_cipher = 1;
  9687. #ifndef NO_WOLFSSL_CLIENT
  9688. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9689. if (!ssl->options.resuming) {
  9690. if (ssl->msgsReceived.got_server_hello_done == 0) {
  9691. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  9692. return OUT_OF_ORDER_E;
  9693. }
  9694. }
  9695. else {
  9696. if (ssl->msgsReceived.got_server_hello == 0) {
  9697. WOLFSSL_MSG("No ServerHello before ChangeCipher on Resume");
  9698. return OUT_OF_ORDER_E;
  9699. }
  9700. }
  9701. #ifdef HAVE_SESSION_TICKET
  9702. if (ssl->expect_session_ticket) {
  9703. WOLFSSL_MSG("Expected session ticket missing");
  9704. #ifdef WOLFSSL_DTLS
  9705. if (ssl->options.dtls)
  9706. return OUT_OF_ORDER_E;
  9707. #endif
  9708. return SESSION_TICKET_EXPECT_E;
  9709. }
  9710. #endif
  9711. }
  9712. #endif
  9713. #ifndef NO_WOLFSSL_SERVER
  9714. if (ssl->options.side == WOLFSSL_SERVER_END) {
  9715. if (!ssl->options.resuming &&
  9716. ssl->msgsReceived.got_client_key_exchange == 0) {
  9717. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  9718. #ifdef WOLFSSL_EXTRA_ALERTS
  9719. SendAlert(ssl, alert_fatal, unexpected_message);
  9720. #endif
  9721. return OUT_OF_ORDER_E;
  9722. }
  9723. #ifndef NO_CERTS
  9724. if (ssl->options.verifyPeer &&
  9725. ssl->options.havePeerCert) {
  9726. if (!ssl->options.havePeerVerify) {
  9727. WOLFSSL_MSG("client didn't send cert verify");
  9728. #ifdef WOLFSSL_DTLS
  9729. if (ssl->options.dtls)
  9730. return OUT_OF_ORDER_E;
  9731. #endif
  9732. return NO_PEER_VERIFY;
  9733. }
  9734. }
  9735. #endif
  9736. }
  9737. #endif
  9738. if (ssl->options.dtls)
  9739. ssl->msgsReceived.got_change_cipher = 1;
  9740. break;
  9741. default:
  9742. WOLFSSL_MSG("Unknown message type");
  9743. return SANITY_MSG_E;
  9744. }
  9745. return 0;
  9746. }
  9747. static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  9748. byte type, word32 size, word32 totalSz)
  9749. {
  9750. int ret = 0;
  9751. word32 expectedIdx;
  9752. WOLFSSL_ENTER("DoHandShakeMsgType");
  9753. #ifdef WOLFSSL_TLS13
  9754. if (type == hello_retry_request) {
  9755. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  9756. totalSz);
  9757. }
  9758. #endif
  9759. /* make sure can read the message */
  9760. if (*inOutIdx + size > totalSz) {
  9761. WOLFSSL_MSG("Incomplete Data");
  9762. return INCOMPLETE_DATA;
  9763. }
  9764. expectedIdx = *inOutIdx + size +
  9765. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  9766. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  9767. if (ssl->options.encThenMac && ssl->keys.encryptionOn)
  9768. expectedIdx += MacSize(ssl);
  9769. #endif
  9770. #if !defined(WOLFSSL_NO_SERVER) && \
  9771. defined(HAVE_SECURE_RENEGOTIATION) && \
  9772. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  9773. if (ssl->options.handShakeDone && type == client_hello &&
  9774. ssl->secure_renegotiation &&
  9775. ssl->secure_renegotiation->enabled)
  9776. {
  9777. WOLFSSL_MSG("Reset handshake state");
  9778. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  9779. ssl->options.serverState = NULL_STATE;
  9780. ssl->options.clientState = NULL_STATE;
  9781. ssl->options.connectState = CONNECT_BEGIN;
  9782. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  9783. ssl->options.handShakeState = NULL_STATE;
  9784. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  9785. ret = InitHandshakeHashes(ssl);
  9786. if (ret != 0)
  9787. return ret;
  9788. }
  9789. #endif
  9790. /* sanity check msg received */
  9791. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  9792. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  9793. return ret;
  9794. }
  9795. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  9796. /* add name later, add on record and handshake header part back on */
  9797. if (ssl->toInfoOn) {
  9798. int add = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  9799. AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - add,
  9800. size + add, READ_PROTO, ssl->heap);
  9801. #ifdef WOLFSSL_CALLBACKS
  9802. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  9803. #endif
  9804. }
  9805. #endif
  9806. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  9807. WOLFSSL_MSG("HandShake message after handshake complete");
  9808. SendAlert(ssl, alert_fatal, unexpected_message);
  9809. return OUT_OF_ORDER_E;
  9810. }
  9811. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  9812. ssl->options.serverState == NULL_STATE && type != server_hello) {
  9813. WOLFSSL_MSG("First server message not server hello");
  9814. SendAlert(ssl, alert_fatal, unexpected_message);
  9815. return OUT_OF_ORDER_E;
  9816. }
  9817. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  9818. type == server_hello_done &&
  9819. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  9820. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  9821. SendAlert(ssl, alert_fatal, unexpected_message);
  9822. return OUT_OF_ORDER_E;
  9823. }
  9824. if (ssl->options.side == WOLFSSL_SERVER_END &&
  9825. ssl->options.clientState == NULL_STATE && type != client_hello) {
  9826. WOLFSSL_MSG("First client message not client hello");
  9827. SendAlert(ssl, alert_fatal, unexpected_message);
  9828. return OUT_OF_ORDER_E;
  9829. }
  9830. /* above checks handshake state */
  9831. /* hello_request not hashed */
  9832. /* Also, skip hashing the client_hello message here for DTLS. It will be
  9833. * hashed later if the DTLS cookie is correct. */
  9834. if (type != hello_request &&
  9835. !(IsDtlsNotSctpMode(ssl) && type == client_hello)
  9836. #ifdef WOLFSSL_ASYNC_CRYPT
  9837. && ssl->error != WC_PENDING_E
  9838. #endif
  9839. #ifdef WOLFSSL_NONBLOCK_OCSP
  9840. && ssl->error != OCSP_WANT_READ
  9841. #endif
  9842. ) {
  9843. ret = HashInput(ssl, input + *inOutIdx, size);
  9844. if (ret != 0) {
  9845. WOLFSSL_MSG("Incomplete handshake hashes");
  9846. return ret;
  9847. }
  9848. }
  9849. #ifdef OPENSSL_EXTRA
  9850. if (ssl->CBIS != NULL){
  9851. ssl->cbmode = SSL_CB_MODE_READ;
  9852. ssl->cbtype = type;
  9853. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  9854. }
  9855. #endif
  9856. switch (type) {
  9857. case hello_request:
  9858. WOLFSSL_MSG("processing hello request");
  9859. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  9860. break;
  9861. #ifndef NO_WOLFSSL_CLIENT
  9862. case hello_verify_request:
  9863. WOLFSSL_MSG("processing hello verify request");
  9864. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  9865. break;
  9866. case server_hello:
  9867. WOLFSSL_MSG("processing server hello");
  9868. ret = DoServerHello(ssl, input, inOutIdx, size);
  9869. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && defined(HAVE_ED25519) && \
  9870. !defined(NO_ED25519_CLIENT_AUTH)
  9871. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  9872. IsAtLeastTLSv1_3(ssl->version)) {
  9873. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  9874. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  9875. #endif
  9876. {
  9877. ssl->options.cacheMessages = 0;
  9878. if (ssl->hsHashes->messages != NULL) {
  9879. XFREE(ssl->hsHashes->messages, ssl->heap,
  9880. DYNAMIC_TYPE_HASHES);
  9881. ssl->hsHashes->messages = NULL;
  9882. }
  9883. }
  9884. }
  9885. #endif
  9886. break;
  9887. #ifndef NO_CERTS
  9888. case certificate_request:
  9889. WOLFSSL_MSG("processing certificate request");
  9890. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  9891. break;
  9892. #endif
  9893. case server_key_exchange:
  9894. WOLFSSL_MSG("processing server key exchange");
  9895. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  9896. break;
  9897. #ifdef HAVE_SESSION_TICKET
  9898. case session_ticket:
  9899. WOLFSSL_MSG("processing session ticket");
  9900. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  9901. break;
  9902. #endif /* HAVE_SESSION_TICKET */
  9903. #endif
  9904. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  9905. !defined(WOLFSSL_NO_CLIENT_AUTH))
  9906. case certificate:
  9907. WOLFSSL_MSG("processing certificate");
  9908. ret = DoCertificate(ssl, input, inOutIdx, size);
  9909. break;
  9910. case certificate_status:
  9911. WOLFSSL_MSG("processing certificate status");
  9912. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  9913. break;
  9914. #endif
  9915. case server_hello_done:
  9916. WOLFSSL_MSG("processing server hello done");
  9917. #ifdef WOLFSSL_CALLBACKS
  9918. if (ssl->hsInfoOn)
  9919. AddPacketName(ssl, "ServerHelloDone");
  9920. if (ssl->toInfoOn)
  9921. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  9922. #endif
  9923. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  9924. if (IsEncryptionOn(ssl, 0)) {
  9925. *inOutIdx += ssl->keys.padSz;
  9926. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  9927. if (ssl->options.encThenMac)
  9928. *inOutIdx += MacSize(ssl);
  9929. #endif
  9930. }
  9931. if (ssl->options.resuming) {
  9932. WOLFSSL_MSG("Not resuming as thought");
  9933. ssl->options.resuming = 0;
  9934. }
  9935. break;
  9936. case finished:
  9937. WOLFSSL_MSG("processing finished");
  9938. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  9939. break;
  9940. #ifndef NO_WOLFSSL_SERVER
  9941. case client_hello:
  9942. WOLFSSL_MSG("processing client hello");
  9943. ret = DoClientHello(ssl, input, inOutIdx, size);
  9944. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && defined(HAVE_ED25519) && \
  9945. !defined(NO_ED25519_CLIENT_AUTH)
  9946. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  9947. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  9948. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  9949. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  9950. #endif
  9951. {
  9952. ssl->options.cacheMessages = 0;
  9953. if (ssl->hsHashes->messages != NULL) {
  9954. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  9955. ssl->hsHashes->messages = NULL;
  9956. }
  9957. }
  9958. }
  9959. #endif
  9960. if (IsEncryptionOn(ssl, 0)) {
  9961. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  9962. if (ssl->options.encThenMac) {
  9963. word32 digestSz = MacSize(ssl);
  9964. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  9965. return BUFFER_E;
  9966. *inOutIdx += ssl->keys.padSz + digestSz;
  9967. }
  9968. else
  9969. #endif
  9970. {
  9971. /* access beyond input + size should be checked against totalSz
  9972. */
  9973. if (*inOutIdx + ssl->keys.padSz > totalSz)
  9974. return BUFFER_E;
  9975. *inOutIdx += ssl->keys.padSz;
  9976. }
  9977. }
  9978. break;
  9979. case client_key_exchange:
  9980. WOLFSSL_MSG("processing client key exchange");
  9981. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  9982. break;
  9983. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519)) && \
  9984. !defined(WOLFSSL_NO_CLIENT_AUTH)
  9985. case certificate_verify:
  9986. WOLFSSL_MSG("processing certificate verify");
  9987. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  9988. break;
  9989. #endif /* (!NO_RSA || HAVE_ECC || HAVE_ED25519) && !WOLFSSL_NO_CLIENT_AUTH */
  9990. #endif /* !NO_WOLFSSL_SERVER */
  9991. default:
  9992. WOLFSSL_MSG("Unknown handshake message type");
  9993. ret = UNKNOWN_HANDSHAKE_TYPE;
  9994. break;
  9995. }
  9996. if (ret == 0 && expectedIdx != *inOutIdx) {
  9997. WOLFSSL_MSG("Extra data in handshake message");
  9998. if (!ssl->options.dtls)
  9999. SendAlert(ssl, alert_fatal, decode_error);
  10000. ret = DECODE_E;
  10001. }
  10002. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag
  10003. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  10004. /* do not shrink input for async or non-block */
  10005. && ssl->error != WC_PENDING_E && ssl->error != OCSP_WANT_READ
  10006. #endif
  10007. ) {
  10008. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  10009. }
  10010. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  10011. /* if async, offset index so this msg will be processed again */
  10012. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  10013. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  10014. #ifdef WOLFSSL_DTLS
  10015. if (ssl->options.dtls) {
  10016. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  10017. }
  10018. #endif
  10019. }
  10020. /* make sure async error is cleared */
  10021. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  10022. ssl->error = 0;
  10023. }
  10024. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  10025. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  10026. return ret;
  10027. }
  10028. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10029. word32 totalSz)
  10030. {
  10031. int ret = 0;
  10032. word32 inputLength;
  10033. WOLFSSL_ENTER("DoHandShakeMsg()");
  10034. if (ssl->arrays == NULL) {
  10035. byte type;
  10036. word32 size;
  10037. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0)
  10038. return PARSE_ERROR;
  10039. ssl->options.handShakeState = type;
  10040. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  10041. }
  10042. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  10043. /* If there is a pending fragmented handshake message,
  10044. * pending message size will be non-zero. */
  10045. if (ssl->arrays->pendingMsgSz == 0) {
  10046. byte type;
  10047. word32 size;
  10048. if (GetHandShakeHeader(ssl,input, inOutIdx, &type, &size, totalSz) != 0)
  10049. return PARSE_ERROR;
  10050. /* Cap the maximum size of a handshake message to something reasonable.
  10051. * By default is the maximum size of a certificate message assuming
  10052. * nine 2048-bit RSA certificates in the chain. */
  10053. if (size > MAX_HANDSHAKE_SZ) {
  10054. WOLFSSL_MSG("Handshake message too large");
  10055. return HANDSHAKE_SIZE_ERROR;
  10056. }
  10057. /* size is the size of the certificate message payload */
  10058. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  10059. ssl->arrays->pendingMsgType = type;
  10060. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  10061. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  10062. ssl->heap,
  10063. DYNAMIC_TYPE_ARRAYS);
  10064. if (ssl->arrays->pendingMsg == NULL)
  10065. return MEMORY_E;
  10066. XMEMCPY(ssl->arrays->pendingMsg,
  10067. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  10068. inputLength);
  10069. ssl->arrays->pendingMsgOffset = inputLength;
  10070. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  10071. return 0;
  10072. }
  10073. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  10074. }
  10075. else {
  10076. word32 pendSz =
  10077. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  10078. /* Catch the case where there may be the remainder of a fragmented
  10079. * handshake message and the next handshake message in the same
  10080. * record. */
  10081. if (inputLength > pendSz)
  10082. inputLength = pendSz;
  10083. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  10084. input + *inOutIdx, inputLength);
  10085. ssl->arrays->pendingMsgOffset += inputLength;
  10086. *inOutIdx += inputLength;
  10087. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  10088. {
  10089. word32 idx = HANDSHAKE_HEADER_SZ;
  10090. ret = DoHandShakeMsgType(ssl,
  10091. ssl->arrays->pendingMsg,
  10092. &idx, ssl->arrays->pendingMsgType,
  10093. ssl->arrays->pendingMsgSz - idx,
  10094. ssl->arrays->pendingMsgSz);
  10095. #ifdef WOLFSSL_ASYNC_CRYPT
  10096. if (ret == WC_PENDING_E) {
  10097. /* setup to process fragment again */
  10098. ssl->arrays->pendingMsgOffset -= inputLength;
  10099. *inOutIdx -= inputLength;
  10100. }
  10101. else
  10102. #endif
  10103. {
  10104. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  10105. ssl->arrays->pendingMsg = NULL;
  10106. ssl->arrays->pendingMsgSz = 0;
  10107. }
  10108. }
  10109. }
  10110. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  10111. return ret;
  10112. }
  10113. #endif /* !WOLFSSL_NO_TLS12 */
  10114. #ifdef WOLFSSL_DTLS
  10115. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl)
  10116. {
  10117. word32* window;
  10118. word16 cur_hi, next_hi;
  10119. word32 cur_lo, next_lo, diff;
  10120. int curLT;
  10121. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  10122. if (!ssl->options.haveMcast)
  10123. peerSeq = ssl->keys.peerSeq;
  10124. else {
  10125. #ifdef WOLFSSL_MULTICAST
  10126. WOLFSSL_DTLS_PEERSEQ* p;
  10127. int i;
  10128. for (i = 0, p = ssl->keys.peerSeq;
  10129. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  10130. i++, p++) {
  10131. if (p->peerId == ssl->keys.curPeerId) {
  10132. peerSeq = p;
  10133. break;
  10134. }
  10135. }
  10136. #endif
  10137. }
  10138. if (peerSeq == NULL) {
  10139. WOLFSSL_MSG("Could not find peer sequence");
  10140. return 0;
  10141. }
  10142. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  10143. next_hi = peerSeq->nextSeq_hi;
  10144. next_lo = peerSeq->nextSeq_lo;
  10145. window = peerSeq->window;
  10146. }
  10147. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  10148. next_hi = peerSeq->prevSeq_hi;
  10149. next_lo = peerSeq->prevSeq_lo;
  10150. window = peerSeq->prevWindow;
  10151. }
  10152. else {
  10153. return 0;
  10154. }
  10155. cur_hi = ssl->keys.curSeq_hi;
  10156. cur_lo = ssl->keys.curSeq_lo;
  10157. /* If the difference between next and cur is > 2^32, way outside window. */
  10158. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  10159. WOLFSSL_MSG("Current record from way too far in the future.");
  10160. return 0;
  10161. }
  10162. if (cur_hi == next_hi) {
  10163. curLT = cur_lo < next_lo;
  10164. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  10165. }
  10166. else {
  10167. curLT = cur_hi < next_hi;
  10168. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  10169. }
  10170. /* Check to see that the next value is greater than the number of messages
  10171. * trackable in the window, and that the difference between the next
  10172. * expected sequence number and the received sequence number is inside the
  10173. * window. */
  10174. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  10175. curLT && (diff > DTLS_SEQ_BITS)) {
  10176. WOLFSSL_MSG("Current record sequence number from the past.");
  10177. return 0;
  10178. }
  10179. #ifndef WOLFSSL_DTLS_ALLOW_FUTURE
  10180. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  10181. WOLFSSL_MSG("Rejecting message too far into the future.");
  10182. return 0;
  10183. }
  10184. #endif
  10185. else if (curLT) {
  10186. word32 idx = diff / DTLS_WORD_BITS;
  10187. word32 newDiff = diff % DTLS_WORD_BITS;
  10188. /* verify idx is valid for window array */
  10189. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  10190. WOLFSSL_MSG("Invalid DTLS windows index");
  10191. return 0;
  10192. }
  10193. if (window[idx] & (1 << (newDiff - 1))) {
  10194. WOLFSSL_MSG("Current record sequence number already received.");
  10195. return 0;
  10196. }
  10197. }
  10198. return 1;
  10199. }
  10200. #ifdef WOLFSSL_MULTICAST
  10201. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  10202. word32 second, word32 max)
  10203. {
  10204. word32 newCur = 0;
  10205. if (cur < first)
  10206. newCur = first;
  10207. else if (cur < second)
  10208. newCur = second;
  10209. else if (cur < max)
  10210. newCur = max;
  10211. return newCur;
  10212. }
  10213. #endif /* WOLFSSL_MULTICAST */
  10214. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl)
  10215. {
  10216. word32* window;
  10217. word32* next_lo;
  10218. word16* next_hi;
  10219. int curLT;
  10220. word32 cur_lo, diff;
  10221. word16 cur_hi;
  10222. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  10223. cur_hi = ssl->keys.curSeq_hi;
  10224. cur_lo = ssl->keys.curSeq_lo;
  10225. #ifdef WOLFSSL_MULTICAST
  10226. if (ssl->options.haveMcast) {
  10227. WOLFSSL_DTLS_PEERSEQ* p;
  10228. int i;
  10229. peerSeq = NULL;
  10230. for (i = 0, p = ssl->keys.peerSeq;
  10231. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  10232. i++, p++) {
  10233. if (p->peerId == ssl->keys.curPeerId) {
  10234. peerSeq = p;
  10235. break;
  10236. }
  10237. }
  10238. if (peerSeq == NULL) {
  10239. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  10240. return 0;
  10241. }
  10242. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  10243. int cbError = 0;
  10244. if (ssl->ctx->mcastHwCb)
  10245. cbError = ssl->ctx->mcastHwCb(p->peerId,
  10246. ssl->ctx->mcastMaxSeq,
  10247. cur_lo, ssl->mcastHwCbCtx);
  10248. if (cbError) {
  10249. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  10250. return MCAST_HIGHWATER_CB_E;
  10251. }
  10252. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  10253. ssl->ctx->mcastFirstSeq,
  10254. ssl->ctx->mcastSecondSeq,
  10255. ssl->ctx->mcastMaxSeq);
  10256. }
  10257. }
  10258. #endif
  10259. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  10260. next_hi = &peerSeq->nextSeq_hi;
  10261. next_lo = &peerSeq->nextSeq_lo;
  10262. window = peerSeq->window;
  10263. }
  10264. else {
  10265. next_hi = &peerSeq->prevSeq_hi;
  10266. next_lo = &peerSeq->prevSeq_lo;
  10267. window = peerSeq->prevWindow;
  10268. }
  10269. if (cur_hi == *next_hi) {
  10270. curLT = cur_lo < *next_lo;
  10271. diff = curLT ? *next_lo - cur_lo : cur_lo - *next_lo;
  10272. }
  10273. else {
  10274. curLT = cur_hi < *next_hi;
  10275. diff = curLT ? cur_lo - *next_lo : *next_lo - cur_lo;
  10276. }
  10277. if (curLT) {
  10278. word32 idx = diff / DTLS_WORD_BITS;
  10279. word32 newDiff = diff % DTLS_WORD_BITS;
  10280. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  10281. window[idx] |= (1 << (newDiff - 1));
  10282. }
  10283. else {
  10284. if (diff >= DTLS_SEQ_BITS)
  10285. XMEMSET(window, 0, DTLS_SEQ_SZ);
  10286. else {
  10287. word32 idx, newDiff, temp, i;
  10288. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  10289. temp = 0;
  10290. diff++;
  10291. idx = diff / DTLS_WORD_BITS;
  10292. newDiff = diff % DTLS_WORD_BITS;
  10293. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  10294. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  10295. if (i < idx)
  10296. window[i] = 0;
  10297. else {
  10298. temp |= (oldWindow[i-idx] << newDiff);
  10299. window[i] = temp;
  10300. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - newDiff);
  10301. }
  10302. }
  10303. }
  10304. window[0] |= 1;
  10305. *next_lo = cur_lo + 1;
  10306. if (*next_lo < cur_lo)
  10307. (*next_hi)++;
  10308. }
  10309. return 1;
  10310. }
  10311. static int DtlsMsgDrain(WOLFSSL* ssl)
  10312. {
  10313. DtlsMsg* item = ssl->dtls_rx_msg_list;
  10314. int ret = 0;
  10315. WOLFSSL_ENTER("DtlsMsgDrain()");
  10316. /* While there is an item in the store list, and it is the expected
  10317. * message, and it is complete, and there hasn't been an error in the
  10318. * last message... */
  10319. while (item != NULL &&
  10320. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  10321. item->fragSz == item->sz &&
  10322. ret == 0) {
  10323. word32 idx = 0;
  10324. ssl->keys.dtls_expected_peer_handshake_number++;
  10325. ret = DoHandShakeMsgType(ssl, item->msg,
  10326. &idx, item->type, item->sz, item->sz);
  10327. #ifdef WOLFSSL_ASYNC_CRYPT
  10328. if (ret == WC_PENDING_E) {
  10329. ssl->keys.dtls_expected_peer_handshake_number--;
  10330. break;
  10331. }
  10332. #endif
  10333. ssl->dtls_rx_msg_list = item->next;
  10334. DtlsMsgDelete(item, ssl->heap);
  10335. item = ssl->dtls_rx_msg_list;
  10336. ssl->dtls_rx_msg_list_sz--;
  10337. }
  10338. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  10339. return ret;
  10340. }
  10341. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10342. word32 totalSz)
  10343. {
  10344. byte type;
  10345. word32 size;
  10346. word32 fragOffset, fragSz;
  10347. int ret = 0;
  10348. WOLFSSL_ENTER("DoDtlsHandShakeMsg()");
  10349. /* process any pending DTLS messages - this flow can happen with async */
  10350. if (ssl->dtls_rx_msg_list != NULL) {
  10351. ret = DtlsMsgDrain(ssl);
  10352. if (ret != 0)
  10353. return ret;
  10354. /* if done processing fragment exit with success */
  10355. if (totalSz == *inOutIdx)
  10356. return ret;
  10357. }
  10358. /* parse header */
  10359. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  10360. &size, &fragOffset, &fragSz, totalSz) != 0) {
  10361. WOLFSSL_ERROR(PARSE_ERROR);
  10362. return PARSE_ERROR;
  10363. }
  10364. /* check that we have complete fragment */
  10365. if (*inOutIdx + fragSz > totalSz) {
  10366. WOLFSSL_ERROR(INCOMPLETE_DATA);
  10367. return INCOMPLETE_DATA;
  10368. }
  10369. /* Check the handshake sequence number first. If out of order,
  10370. * add the current message to the list. If the message is in order,
  10371. * but it is a fragment, add the current message to the list, then
  10372. * check the head of the list to see if it is complete, if so, pop
  10373. * it out as the current message. If the message is complete and in
  10374. * order, process it. Check the head of the list to see if it is in
  10375. * order, if so, process it. (Repeat until list exhausted.) If the
  10376. * head is out of order, return for more processing.
  10377. */
  10378. if (ssl->keys.dtls_peer_handshake_number >
  10379. ssl->keys.dtls_expected_peer_handshake_number) {
  10380. /* Current message is out of order. It will get stored in the list.
  10381. * Storing also takes care of defragmentation. If the messages is a
  10382. * client hello, we need to process this out of order; the server
  10383. * is not supposed to keep state, but the second client hello will
  10384. * have a different handshake sequence number than is expected, and
  10385. * the server shouldn't be expecting any particular handshake sequence
  10386. * number. (If the cookie changes multiple times in quick succession,
  10387. * the client could be sending multiple new client hello messages
  10388. * with newer and newer cookies.) */
  10389. if (type != client_hello) {
  10390. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  10391. DtlsMsgStore(ssl, ssl->keys.dtls_peer_handshake_number,
  10392. input + *inOutIdx, size, type,
  10393. fragOffset, fragSz, ssl->heap);
  10394. }
  10395. *inOutIdx += fragSz;
  10396. ret = 0;
  10397. }
  10398. else {
  10399. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  10400. if (ret == 0) {
  10401. ssl->keys.dtls_expected_peer_handshake_number =
  10402. ssl->keys.dtls_peer_handshake_number + 1;
  10403. }
  10404. }
  10405. }
  10406. else if (ssl->keys.dtls_peer_handshake_number <
  10407. ssl->keys.dtls_expected_peer_handshake_number) {
  10408. /* Already saw this message and processed it. It can be ignored. */
  10409. *inOutIdx += fragSz;
  10410. if(type == finished ) {
  10411. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10412. if (ssl->options.encThenMac) {
  10413. word32 digestSz = MacSize(ssl);
  10414. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  10415. return BUFFER_E;
  10416. *inOutIdx += ssl->keys.padSz + digestSz;
  10417. }
  10418. else
  10419. #endif
  10420. {
  10421. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  10422. WOLFSSL_ERROR(BUFFER_E);
  10423. return BUFFER_E;
  10424. }
  10425. *inOutIdx += ssl->keys.padSz;
  10426. }
  10427. }
  10428. if (IsDtlsNotSctpMode(ssl) &&
  10429. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  10430. ret = DtlsMsgPoolSend(ssl, 0);
  10431. }
  10432. }
  10433. else if (fragSz < size) {
  10434. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  10435. * be pointing to the message with this fragment in it. Check it to see
  10436. * if it is completed. */
  10437. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  10438. DtlsMsgStore(ssl, ssl->keys.dtls_peer_handshake_number,
  10439. input + *inOutIdx, size, type,
  10440. fragOffset, fragSz, ssl->heap);
  10441. }
  10442. *inOutIdx += fragSz;
  10443. ret = 0;
  10444. if (ssl->dtls_rx_msg_list != NULL &&
  10445. ssl->dtls_rx_msg_list->fragSz >= ssl->dtls_rx_msg_list->sz)
  10446. ret = DtlsMsgDrain(ssl);
  10447. }
  10448. else {
  10449. /* This branch is in order next, and a complete message. */
  10450. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  10451. if (ret == 0) {
  10452. if (type != client_hello || !IsDtlsNotSctpMode(ssl))
  10453. ssl->keys.dtls_expected_peer_handshake_number++;
  10454. if (ssl->dtls_rx_msg_list != NULL) {
  10455. ret = DtlsMsgDrain(ssl);
  10456. }
  10457. }
  10458. }
  10459. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  10460. return ret;
  10461. }
  10462. #endif
  10463. #ifndef WOLFSSL_NO_TLS12
  10464. #ifdef HAVE_AEAD
  10465. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  10466. (((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  10467. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))) || \
  10468. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA)))
  10469. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  10470. {
  10471. int i;
  10472. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  10473. if (++ssl->keys.aead_exp_IV[i]) return;
  10474. }
  10475. }
  10476. #endif
  10477. #if defined(HAVE_POLY1305) && defined(HAVE_CHACHA)
  10478. /* Used for the older version of creating AEAD tags with Poly1305 */
  10479. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  10480. byte* cipher, word16 sz, byte* tag)
  10481. {
  10482. int ret = 0;
  10483. int msglen = (sz - ssl->specs.aead_mac_size);
  10484. word32 keySz = 32;
  10485. byte padding[8]; /* used to temporarily store lengths */
  10486. #ifdef CHACHA_AEAD_TEST
  10487. printf("Using old version of poly1305 input.\n");
  10488. #endif
  10489. if (msglen < 0)
  10490. return INPUT_CASE_ERROR;
  10491. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  10492. return ret;
  10493. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  10494. AEAD_AUTH_DATA_SZ)) != 0)
  10495. return ret;
  10496. /* length of additional input plus padding */
  10497. XMEMSET(padding, 0, sizeof(padding));
  10498. padding[0] = AEAD_AUTH_DATA_SZ;
  10499. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  10500. sizeof(padding))) != 0)
  10501. return ret;
  10502. /* add cipher info and then its length */
  10503. XMEMSET(padding, 0, sizeof(padding));
  10504. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  10505. return ret;
  10506. /* 32 bit size of cipher to 64 bit endian */
  10507. padding[0] = msglen & 0xff;
  10508. padding[1] = (msglen >> 8) & 0xff;
  10509. padding[2] = ((word32)msglen >> 16) & 0xff;
  10510. padding[3] = ((word32)msglen >> 24) & 0xff;
  10511. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  10512. != 0)
  10513. return ret;
  10514. /* generate tag */
  10515. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  10516. return ret;
  10517. return ret;
  10518. }
  10519. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  10520. * the implementation follows an older draft for creating the nonce and MAC.
  10521. * The flag oldPoly gets set automatically depending on what cipher suite was
  10522. * negotiated in the handshake. This is able to be done because the IDs for the
  10523. * cipher suites was updated in RFC7905 giving unique values for the older
  10524. * draft in comparison to the more recent RFC.
  10525. *
  10526. * ssl WOLFSSL structure to get cipher and TLS state from
  10527. * out output buffer to hold encrypted data
  10528. * input data to encrypt
  10529. * sz size of input
  10530. *
  10531. * Return 0 on success negative values in error case
  10532. */
  10533. static int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  10534. word16 sz)
  10535. {
  10536. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  10537. int ret = 0;
  10538. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  10539. byte tag[POLY1305_AUTH_SZ];
  10540. byte add[AEAD_AUTH_DATA_SZ];
  10541. byte nonce[CHACHA20_NONCE_SZ];
  10542. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  10543. #ifdef CHACHA_AEAD_TEST
  10544. int i;
  10545. #endif
  10546. XMEMSET(tag, 0, sizeof(tag));
  10547. XMEMSET(nonce, 0, sizeof(nonce));
  10548. XMEMSET(poly, 0, sizeof(poly));
  10549. XMEMSET(add, 0, sizeof(add));
  10550. /* opaque SEQ number stored for AD */
  10551. WriteSEQ(ssl, CUR_ORDER, add);
  10552. if (ssl->options.oldPoly != 0) {
  10553. /* get nonce. SEQ should not be incremented again here */
  10554. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  10555. }
  10556. /* Store the type, version. Unfortunately, they are in
  10557. * the input buffer ahead of the plaintext. */
  10558. #ifdef WOLFSSL_DTLS
  10559. if (ssl->options.dtls) {
  10560. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  10561. DtlsSEQIncrement(ssl, CUR_ORDER);
  10562. }
  10563. #endif
  10564. /* add TLS message size to additional data */
  10565. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  10566. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  10567. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  10568. #ifdef CHACHA_AEAD_TEST
  10569. printf("Encrypt Additional : ");
  10570. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  10571. printf("%02x", add[i]);
  10572. }
  10573. printf("\n\n");
  10574. printf("input before encryption :\n");
  10575. for (i = 0; i < sz; i++) {
  10576. printf("%02x", input[i]);
  10577. if ((i + 1) % 16 == 0)
  10578. printf("\n");
  10579. }
  10580. printf("\n");
  10581. #endif
  10582. if (ssl->options.oldPoly == 0) {
  10583. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  10584. * record sequence number XORed with client_write_IV/server_write_IV */
  10585. XMEMCPY(nonce, ssl->keys.aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  10586. nonce[4] ^= add[0];
  10587. nonce[5] ^= add[1];
  10588. nonce[6] ^= add[2];
  10589. nonce[7] ^= add[3];
  10590. nonce[8] ^= add[4];
  10591. nonce[9] ^= add[5];
  10592. nonce[10] ^= add[6];
  10593. nonce[11] ^= add[7];
  10594. }
  10595. /* set the nonce for chacha and get poly1305 key */
  10596. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  10597. ForceZero(nonce, CHACHA20_NONCE_SZ);
  10598. return ret;
  10599. }
  10600. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  10601. /* create Poly1305 key using chacha20 keystream */
  10602. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  10603. poly, sizeof(poly))) != 0)
  10604. return ret;
  10605. /* encrypt the plain text */
  10606. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  10607. input, msgLen)) != 0) {
  10608. ForceZero(poly, sizeof(poly));
  10609. return ret;
  10610. }
  10611. /* get the poly1305 tag using either old padding scheme or more recent */
  10612. if (ssl->options.oldPoly != 0) {
  10613. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  10614. poly, sz, tag)) != 0) {
  10615. ForceZero(poly, sizeof(poly));
  10616. return ret;
  10617. }
  10618. }
  10619. else {
  10620. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  10621. sizeof(poly))) != 0) {
  10622. ForceZero(poly, sizeof(poly));
  10623. return ret;
  10624. }
  10625. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  10626. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  10627. ForceZero(poly, sizeof(poly));
  10628. return ret;
  10629. }
  10630. }
  10631. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  10632. /* append tag to ciphertext */
  10633. XMEMCPY(out + msgLen, tag, sizeof(tag));
  10634. AeadIncrementExpIV(ssl);
  10635. #ifdef CHACHA_AEAD_TEST
  10636. printf("mac tag :\n");
  10637. for (i = 0; i < 16; i++) {
  10638. printf("%02x", tag[i]);
  10639. if ((i + 1) % 16 == 0)
  10640. printf("\n");
  10641. }
  10642. printf("\n\noutput after encrypt :\n");
  10643. for (i = 0; i < sz; i++) {
  10644. printf("%02x", out[i]);
  10645. if ((i + 1) % 16 == 0)
  10646. printf("\n");
  10647. }
  10648. printf("\n");
  10649. #endif
  10650. return ret;
  10651. }
  10652. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  10653. * the implementation follows an older draft for creating the nonce and MAC.
  10654. * The flag oldPoly gets set automatically depending on what cipher suite was
  10655. * negotiated in the handshake. This is able to be done because the IDs for the
  10656. * cipher suites was updated in RFC7905 giving unique values for the older
  10657. * draft in comparison to the more recent RFC.
  10658. *
  10659. * ssl WOLFSSL structure to get cipher and TLS state from
  10660. * plain output buffer to hold decrypted data
  10661. * input data to decrypt
  10662. * sz size of input
  10663. *
  10664. * Return 0 on success negative values in error case
  10665. */
  10666. static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  10667. word16 sz)
  10668. {
  10669. byte add[AEAD_AUTH_DATA_SZ];
  10670. byte nonce[CHACHA20_NONCE_SZ];
  10671. byte tag[POLY1305_AUTH_SZ];
  10672. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  10673. int ret = 0;
  10674. int msgLen = (sz - ssl->specs.aead_mac_size);
  10675. #ifdef CHACHA_AEAD_TEST
  10676. int i;
  10677. printf("input before decrypt :\n");
  10678. for (i = 0; i < sz; i++) {
  10679. printf("%02x", input[i]);
  10680. if ((i + 1) % 16 == 0)
  10681. printf("\n");
  10682. }
  10683. printf("\n");
  10684. #endif
  10685. XMEMSET(tag, 0, sizeof(tag));
  10686. XMEMSET(poly, 0, sizeof(poly));
  10687. XMEMSET(nonce, 0, sizeof(nonce));
  10688. XMEMSET(add, 0, sizeof(add));
  10689. /* sequence number field is 64-bits */
  10690. WriteSEQ(ssl, PEER_ORDER, add);
  10691. if (ssl->options.oldPoly != 0) {
  10692. /* get nonce, SEQ should not be incremented again here */
  10693. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  10694. }
  10695. /* get AD info */
  10696. /* Store the type, version. */
  10697. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  10698. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  10699. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  10700. /* add TLS message size to additional data */
  10701. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  10702. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  10703. #ifdef CHACHA_AEAD_TEST
  10704. printf("Decrypt Additional : ");
  10705. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  10706. printf("%02x", add[i]);
  10707. }
  10708. printf("\n\n");
  10709. #endif
  10710. if (ssl->options.oldPoly == 0) {
  10711. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  10712. * record sequence number XORed with client_write_IV/server_write_IV */
  10713. XMEMCPY(nonce, ssl->keys.aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  10714. nonce[4] ^= add[0];
  10715. nonce[5] ^= add[1];
  10716. nonce[6] ^= add[2];
  10717. nonce[7] ^= add[3];
  10718. nonce[8] ^= add[4];
  10719. nonce[9] ^= add[5];
  10720. nonce[10] ^= add[6];
  10721. nonce[11] ^= add[7];
  10722. }
  10723. /* set nonce and get poly1305 key */
  10724. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  10725. ForceZero(nonce, CHACHA20_NONCE_SZ);
  10726. return ret;
  10727. }
  10728. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  10729. /* use chacha20 keystream to get poly1305 key for tag */
  10730. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  10731. poly, sizeof(poly))) != 0)
  10732. return ret;
  10733. /* get the tag using Poly1305 */
  10734. if (ssl->options.oldPoly != 0) {
  10735. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  10736. ForceZero(poly, sizeof(poly));
  10737. return ret;
  10738. }
  10739. }
  10740. else {
  10741. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  10742. sizeof(poly))) != 0) {
  10743. ForceZero(poly, sizeof(poly));
  10744. return ret;
  10745. }
  10746. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  10747. sizeof(add), (byte*)input, msgLen, tag, sizeof(tag))) != 0) {
  10748. ForceZero(poly, sizeof(poly));
  10749. return ret;
  10750. }
  10751. }
  10752. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  10753. /* check tag sent along with packet */
  10754. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  10755. WOLFSSL_MSG("MAC did not match");
  10756. if (!ssl->options.dtls)
  10757. SendAlert(ssl, alert_fatal, bad_record_mac);
  10758. return VERIFY_MAC_ERROR;
  10759. }
  10760. /* if the tag was good decrypt message */
  10761. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  10762. input, msgLen)) != 0)
  10763. return ret;
  10764. #ifdef CHACHA_AEAD_TEST
  10765. printf("plain after decrypt :\n");
  10766. for (i = 0; i < sz; i++) {
  10767. printf("%02x", plain[i]);
  10768. if ((i + 1) % 16 == 0)
  10769. printf("\n");
  10770. }
  10771. printf("\n");
  10772. #endif
  10773. return ret;
  10774. }
  10775. #endif /* HAVE_CHACHA && HAVE_POLY1305 */
  10776. #endif /* HAVE_AEAD */
  10777. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  10778. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  10779. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  10780. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  10781. /* The following type is used to share code between AES-GCM and AES-CCM. */
  10782. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  10783. const byte* in, word32 sz,
  10784. byte* iv, word32 ivSz,
  10785. byte* authTag, word32 authTagSz,
  10786. const byte* authIn, word32 authInSz);
  10787. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  10788. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  10789. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  10790. #else
  10791. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  10792. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  10793. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  10794. #endif
  10795. #endif
  10796. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  10797. word16 sz, int asyncOkay)
  10798. {
  10799. int ret = 0;
  10800. #ifdef WOLFSSL_ASYNC_CRYPT
  10801. WC_ASYNC_DEV* asyncDev = NULL;
  10802. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  10803. #else
  10804. (void)asyncOkay;
  10805. #endif
  10806. (void)out;
  10807. (void)input;
  10808. (void)sz;
  10809. switch (ssl->specs.bulk_cipher_algorithm) {
  10810. #ifdef BUILD_ARC4
  10811. case wolfssl_rc4:
  10812. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  10813. break;
  10814. #endif
  10815. #ifdef BUILD_DES3
  10816. case wolfssl_triple_des:
  10817. #ifdef WOLFSSL_ASYNC_CRYPT
  10818. /* initialize event */
  10819. asyncDev = &ssl->encrypt.des3->asyncDev;
  10820. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  10821. if (ret != 0)
  10822. break;
  10823. #endif
  10824. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  10825. #ifdef WOLFSSL_ASYNC_CRYPT
  10826. if (ret == WC_PENDING_E && asyncOkay) {
  10827. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  10828. }
  10829. #endif
  10830. break;
  10831. #endif
  10832. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  10833. case wolfssl_aes:
  10834. #ifdef WOLFSSL_ASYNC_CRYPT
  10835. /* initialize event */
  10836. asyncDev = &ssl->encrypt.aes->asyncDev;
  10837. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  10838. if (ret != 0)
  10839. break;
  10840. #endif
  10841. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  10842. #ifdef WOLFSSL_ASYNC_CRYPT
  10843. if (ret == WC_PENDING_E && asyncOkay) {
  10844. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  10845. }
  10846. #endif
  10847. break;
  10848. #endif
  10849. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  10850. case wolfssl_aes_gcm:
  10851. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  10852. {
  10853. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  10854. const byte* additionalSrc;
  10855. #ifdef WOLFSSL_ASYNC_CRYPT
  10856. /* initialize event */
  10857. asyncDev = &ssl->encrypt.aes->asyncDev;
  10858. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  10859. if (ret != 0)
  10860. break;
  10861. #endif
  10862. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  10863. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  10864. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  10865. #elif defined(BUILD_AESGCM)
  10866. aes_auth_fn = AES_GCM_ENCRYPT;
  10867. #else
  10868. aes_auth_fn = AES_CCM_ENCRYPT;
  10869. #endif
  10870. additionalSrc = input - 5;
  10871. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  10872. /* sequence number field is 64-bits */
  10873. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  10874. /* Store the type, version. Unfortunately, they are in
  10875. * the input buffer ahead of the plaintext. */
  10876. #ifdef WOLFSSL_DTLS
  10877. if (ssl->options.dtls) {
  10878. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  10879. }
  10880. #endif
  10881. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  10882. additionalSrc, 3);
  10883. /* Store the length of the plain text minus the explicit
  10884. * IV length minus the authentication tag size. */
  10885. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  10886. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  10887. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  10888. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  10889. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  10890. XMEMCPY(ssl->encrypt.nonce,
  10891. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  10892. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  10893. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  10894. #endif
  10895. ret = aes_auth_fn(ssl->encrypt.aes,
  10896. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  10897. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  10898. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  10899. out + sz - ssl->specs.aead_mac_size,
  10900. ssl->specs.aead_mac_size,
  10901. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  10902. #ifdef WOLFSSL_ASYNC_CRYPT
  10903. if (ret == WC_PENDING_E && asyncOkay) {
  10904. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  10905. }
  10906. #endif
  10907. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  10908. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  10909. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  10910. XMEMCPY(out,
  10911. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  10912. #endif
  10913. }
  10914. break;
  10915. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  10916. #ifdef HAVE_CAMELLIA
  10917. case wolfssl_camellia:
  10918. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  10919. break;
  10920. #endif
  10921. #ifdef HAVE_HC128
  10922. case wolfssl_hc128:
  10923. ret = wc_Hc128_Process(ssl->encrypt.hc128, out, input, sz);
  10924. break;
  10925. #endif
  10926. #ifdef BUILD_RABBIT
  10927. case wolfssl_rabbit:
  10928. ret = wc_RabbitProcess(ssl->encrypt.rabbit, out, input, sz);
  10929. break;
  10930. #endif
  10931. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  10932. case wolfssl_chacha:
  10933. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  10934. break;
  10935. #endif
  10936. #ifdef HAVE_NULL_CIPHER
  10937. case wolfssl_cipher_null:
  10938. if (input != out) {
  10939. XMEMMOVE(out, input, sz);
  10940. }
  10941. break;
  10942. #endif
  10943. #ifdef HAVE_IDEA
  10944. case wolfssl_idea:
  10945. ret = wc_IdeaCbcEncrypt(ssl->encrypt.idea, out, input, sz);
  10946. break;
  10947. #endif
  10948. default:
  10949. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  10950. ret = ENCRYPT_ERROR;
  10951. }
  10952. #ifdef WOLFSSL_ASYNC_CRYPT
  10953. /* if async is not okay, then block */
  10954. if (ret == WC_PENDING_E && !asyncOkay) {
  10955. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  10956. }
  10957. #endif
  10958. return ret;
  10959. }
  10960. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz,
  10961. int asyncOkay)
  10962. {
  10963. int ret = 0;
  10964. #ifdef WOLFSSL_ASYNC_CRYPT
  10965. if (ssl->error == WC_PENDING_E) {
  10966. ssl->error = 0; /* clear async */
  10967. }
  10968. #endif
  10969. switch (ssl->encrypt.state) {
  10970. case CIPHER_STATE_BEGIN:
  10971. {
  10972. if (ssl->encrypt.setup == 0) {
  10973. WOLFSSL_MSG("Encrypt ciphers not setup");
  10974. return ENCRYPT_ERROR;
  10975. }
  10976. #ifdef HAVE_FUZZER
  10977. if (ssl->fuzzerCb)
  10978. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  10979. #endif
  10980. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  10981. /* make sure AES GCM/CCM memory is allocated */
  10982. /* free for these happens in FreeCiphers */
  10983. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  10984. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  10985. /* make sure auth iv and auth are allocated */
  10986. if (ssl->encrypt.additional == NULL)
  10987. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  10988. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  10989. if (ssl->encrypt.nonce == NULL)
  10990. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  10991. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  10992. if (ssl->encrypt.additional == NULL ||
  10993. ssl->encrypt.nonce == NULL) {
  10994. return MEMORY_E;
  10995. }
  10996. }
  10997. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  10998. /* Advance state and proceed */
  10999. ssl->encrypt.state = CIPHER_STATE_DO;
  11000. }
  11001. FALL_THROUGH;
  11002. case CIPHER_STATE_DO:
  11003. {
  11004. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  11005. /* Advance state */
  11006. ssl->encrypt.state = CIPHER_STATE_END;
  11007. #ifdef WOLFSSL_ASYNC_CRYPT
  11008. /* If pending, then leave and return will resume below */
  11009. if (ret == WC_PENDING_E) {
  11010. return ret;
  11011. }
  11012. #endif
  11013. }
  11014. FALL_THROUGH;
  11015. case CIPHER_STATE_END:
  11016. {
  11017. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  11018. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  11019. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  11020. {
  11021. /* finalize authentication cipher */
  11022. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  11023. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  11024. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  11025. AeadIncrementExpIV(ssl);
  11026. #endif
  11027. if (ssl->encrypt.nonce)
  11028. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  11029. #ifdef WOLFSSL_DTLS
  11030. if (ssl->options.dtls)
  11031. DtlsSEQIncrement(ssl, CUR_ORDER);
  11032. #endif
  11033. }
  11034. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  11035. break;
  11036. }
  11037. }
  11038. /* Reset state */
  11039. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  11040. return ret;
  11041. }
  11042. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  11043. word16 sz)
  11044. {
  11045. int ret = 0;
  11046. (void)plain;
  11047. (void)input;
  11048. (void)sz;
  11049. switch (ssl->specs.bulk_cipher_algorithm)
  11050. {
  11051. #ifdef BUILD_ARC4
  11052. case wolfssl_rc4:
  11053. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  11054. break;
  11055. #endif
  11056. #ifdef BUILD_DES3
  11057. case wolfssl_triple_des:
  11058. #ifdef WOLFSSL_ASYNC_CRYPT
  11059. /* initialize event */
  11060. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  11061. WC_ASYNC_FLAG_CALL_AGAIN);
  11062. if (ret != 0)
  11063. break;
  11064. #endif
  11065. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  11066. #ifdef WOLFSSL_ASYNC_CRYPT
  11067. if (ret == WC_PENDING_E) {
  11068. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  11069. }
  11070. #endif
  11071. break;
  11072. #endif
  11073. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  11074. case wolfssl_aes:
  11075. #ifdef WOLFSSL_ASYNC_CRYPT
  11076. /* initialize event */
  11077. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  11078. WC_ASYNC_FLAG_CALL_AGAIN);
  11079. if (ret != 0)
  11080. break;
  11081. #endif
  11082. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  11083. #ifdef WOLFSSL_ASYNC_CRYPT
  11084. if (ret == WC_PENDING_E) {
  11085. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  11086. }
  11087. #endif
  11088. break;
  11089. #endif
  11090. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  11091. case wolfssl_aes_gcm:
  11092. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  11093. {
  11094. wc_AesAuthDecryptFunc aes_auth_fn;
  11095. #ifdef WOLFSSL_ASYNC_CRYPT
  11096. /* initialize event */
  11097. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  11098. WC_ASYNC_FLAG_CALL_AGAIN);
  11099. if (ret != 0)
  11100. break;
  11101. #endif
  11102. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  11103. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  11104. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  11105. #elif defined(BUILD_AESGCM)
  11106. aes_auth_fn = wc_AesGcmDecrypt;
  11107. #else
  11108. aes_auth_fn = wc_AesCcmDecrypt;
  11109. #endif
  11110. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  11111. /* sequence number field is 64-bits */
  11112. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  11113. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  11114. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  11115. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  11116. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  11117. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  11118. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  11119. AESGCM_IMP_IV_SZ);
  11120. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  11121. AESGCM_EXP_IV_SZ);
  11122. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  11123. plain + AESGCM_EXP_IV_SZ,
  11124. input + AESGCM_EXP_IV_SZ,
  11125. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  11126. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  11127. input + sz - ssl->specs.aead_mac_size,
  11128. ssl->specs.aead_mac_size,
  11129. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  11130. #ifdef WOLFSSL_ASYNC_CRYPT
  11131. if (ret == WC_PENDING_E) {
  11132. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  11133. }
  11134. #endif
  11135. }
  11136. }
  11137. break;
  11138. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  11139. #ifdef HAVE_CAMELLIA
  11140. case wolfssl_camellia:
  11141. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  11142. break;
  11143. #endif
  11144. #ifdef HAVE_HC128
  11145. case wolfssl_hc128:
  11146. ret = wc_Hc128_Process(ssl->decrypt.hc128, plain, input, sz);
  11147. break;
  11148. #endif
  11149. #ifdef BUILD_RABBIT
  11150. case wolfssl_rabbit:
  11151. ret = wc_RabbitProcess(ssl->decrypt.rabbit, plain, input, sz);
  11152. break;
  11153. #endif
  11154. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  11155. case wolfssl_chacha:
  11156. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  11157. break;
  11158. #endif
  11159. #ifdef HAVE_NULL_CIPHER
  11160. case wolfssl_cipher_null:
  11161. if (input != plain) {
  11162. XMEMMOVE(plain, input, sz);
  11163. }
  11164. break;
  11165. #endif
  11166. #ifdef HAVE_IDEA
  11167. case wolfssl_idea:
  11168. ret = wc_IdeaCbcDecrypt(ssl->decrypt.idea, plain, input, sz);
  11169. break;
  11170. #endif
  11171. default:
  11172. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  11173. ret = DECRYPT_ERROR;
  11174. }
  11175. return ret;
  11176. }
  11177. static WC_INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  11178. word16 sz)
  11179. {
  11180. int ret = 0;
  11181. #ifdef WOLFSSL_ASYNC_CRYPT
  11182. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  11183. if (ret != WC_NOT_PENDING_E) {
  11184. /* check for still pending */
  11185. if (ret == WC_PENDING_E)
  11186. return ret;
  11187. ssl->error = 0; /* clear async */
  11188. /* let failures through so CIPHER_STATE_END logic is run */
  11189. }
  11190. else
  11191. #endif
  11192. {
  11193. /* Reset state */
  11194. ret = 0;
  11195. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  11196. }
  11197. switch (ssl->decrypt.state) {
  11198. case CIPHER_STATE_BEGIN:
  11199. {
  11200. if (ssl->decrypt.setup == 0) {
  11201. WOLFSSL_MSG("Decrypt ciphers not setup");
  11202. return DECRYPT_ERROR;
  11203. }
  11204. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  11205. /* make sure AES GCM/CCM memory is allocated */
  11206. /* free for these happens in FreeCiphers */
  11207. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  11208. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  11209. /* make sure auth iv and auth are allocated */
  11210. if (ssl->decrypt.additional == NULL)
  11211. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  11212. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  11213. if (ssl->decrypt.nonce == NULL)
  11214. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  11215. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  11216. if (ssl->decrypt.additional == NULL ||
  11217. ssl->decrypt.nonce == NULL) {
  11218. return MEMORY_E;
  11219. }
  11220. }
  11221. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  11222. /* Advance state and proceed */
  11223. ssl->decrypt.state = CIPHER_STATE_DO;
  11224. }
  11225. FALL_THROUGH;
  11226. case CIPHER_STATE_DO:
  11227. {
  11228. ret = DecryptDo(ssl, plain, input, sz);
  11229. /* Advance state */
  11230. ssl->decrypt.state = CIPHER_STATE_END;
  11231. #ifdef WOLFSSL_ASYNC_CRYPT
  11232. /* If pending, leave and return below */
  11233. if (ret == WC_PENDING_E) {
  11234. return ret;
  11235. }
  11236. #endif
  11237. }
  11238. FALL_THROUGH;
  11239. case CIPHER_STATE_END:
  11240. {
  11241. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  11242. /* make sure AES GCM/CCM nonce is cleared */
  11243. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  11244. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  11245. if (ssl->decrypt.nonce)
  11246. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  11247. if (ret < 0)
  11248. ret = VERIFY_MAC_ERROR;
  11249. }
  11250. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  11251. break;
  11252. }
  11253. }
  11254. /* Reset state */
  11255. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  11256. /* handle mac error case */
  11257. if (ret == VERIFY_MAC_ERROR) {
  11258. if (!ssl->options.dtls)
  11259. SendAlert(ssl, alert_fatal, bad_record_mac);
  11260. #ifdef WOLFSSL_DTLS_DROP_STATS
  11261. ssl->macDropCount++;
  11262. #endif /* WOLFSSL_DTLS_DROP_STATS */
  11263. }
  11264. return ret;
  11265. }
  11266. #endif /* !WOLFSSL_NO_TLS12 */
  11267. /* Check conditions for a cipher to have an explicit IV.
  11268. *
  11269. * ssl The SSL/TLS object.
  11270. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  11271. */
  11272. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  11273. {
  11274. #ifdef WOLFSSL_TLS13
  11275. if (ssl->options.tls1_3)
  11276. return 0;
  11277. #endif
  11278. return (ssl->specs.cipher_type == aead) &&
  11279. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  11280. }
  11281. /* check cipher text size for sanity */
  11282. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  11283. {
  11284. #ifdef HAVE_TRUNCATED_HMAC
  11285. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  11286. : ssl->specs.hash_size;
  11287. #else
  11288. word32 minLength = ssl->specs.hash_size; /* covers stream */
  11289. #endif
  11290. #ifndef WOLFSSL_AEAD_ONLY
  11291. if (ssl->specs.cipher_type == block) {
  11292. #ifdef HAVE_ENCRYPT_THEN_MAC
  11293. if (ssl->options.encThenMac) {
  11294. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  11295. WOLFSSL_MSG("Block ciphertext not block size");
  11296. return SANITY_CIPHER_E;
  11297. }
  11298. }
  11299. else
  11300. #endif
  11301. if (encryptSz % ssl->specs.block_size) {
  11302. WOLFSSL_MSG("Block ciphertext not block size");
  11303. return SANITY_CIPHER_E;
  11304. }
  11305. minLength++; /* pad byte */
  11306. if (ssl->specs.block_size > minLength)
  11307. minLength = ssl->specs.block_size;
  11308. if (ssl->options.tls1_1)
  11309. minLength += ssl->specs.block_size; /* explicit IV */
  11310. }
  11311. else
  11312. #endif
  11313. if (ssl->specs.cipher_type == aead) {
  11314. minLength = ssl->specs.aead_mac_size; /* authTag size */
  11315. if (CipherHasExpIV(ssl))
  11316. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  11317. }
  11318. if (encryptSz < minLength) {
  11319. WOLFSSL_MSG("Ciphertext not minimum size");
  11320. return SANITY_CIPHER_E;
  11321. }
  11322. return 0;
  11323. }
  11324. #ifndef WOLFSSL_AEAD_ONLY
  11325. /* check all length bytes for the pad value, return 0 on success */
  11326. static int PadCheck(const byte* a, byte pad, int length)
  11327. {
  11328. int i;
  11329. int compareSum = 0;
  11330. for (i = 0; i < length; i++) {
  11331. compareSum |= a[i] ^ pad;
  11332. }
  11333. return compareSum;
  11334. }
  11335. /* Mask the padding bytes with the expected values.
  11336. * Constant time implementation - does maximum pad size possible.
  11337. *
  11338. * data Message data.
  11339. * sz Size of the message including MAC and padding and padding length.
  11340. * macSz Size of the MAC.
  11341. * returns 0 on success, otherwise failure.
  11342. */
  11343. static byte MaskPadding(const byte* data, int sz, int macSz)
  11344. {
  11345. int i;
  11346. int checkSz = sz - 1;
  11347. byte paddingSz = data[sz - 1];
  11348. byte mask;
  11349. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  11350. if (checkSz > TLS_MAX_PAD_SZ)
  11351. checkSz = TLS_MAX_PAD_SZ;
  11352. for (i = 0; i < checkSz; i++) {
  11353. mask = ctMaskLTE(i, paddingSz);
  11354. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  11355. }
  11356. return good;
  11357. }
  11358. /* Mask the MAC in the message with the MAC calculated.
  11359. * Constant time implementation - starts looking for MAC where maximum padding
  11360. * size has it.
  11361. *
  11362. * data Message data.
  11363. * sz Size of the message including MAC and padding and padding length.
  11364. * macSz Size of the MAC data.
  11365. * expMac Expected MAC value.
  11366. * returns 0 on success, otherwise failure.
  11367. */
  11368. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  11369. {
  11370. int i, j;
  11371. unsigned char mac[WC_MAX_DIGEST_SIZE];
  11372. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  11373. int macEnd = sz - 1 - data[sz - 1];
  11374. int macStart = macEnd - macSz;
  11375. int r = 0;
  11376. unsigned char started, notEnded;
  11377. unsigned char good = 0;
  11378. scanStart &= (~scanStart) >> (sizeof(int) * 8 - 1);
  11379. macStart &= (~macStart) >> (sizeof(int) * 8 - 1);
  11380. /* Div on Intel has different speeds depending on value.
  11381. * Use a bitwise AND or mod a specific value (converted to mul). */
  11382. if ((macSz & (macSz - 1)) == 0)
  11383. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  11384. #ifndef NO_SHA
  11385. else if (macSz == WC_SHA_DIGEST_SIZE)
  11386. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  11387. #endif
  11388. #ifdef WOLFSSL_SHA384
  11389. else if (macSz == WC_SHA384_DIGEST_SIZE)
  11390. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  11391. #endif
  11392. XMEMSET(mac, 0, macSz);
  11393. for (i = scanStart; i < sz; i += macSz) {
  11394. for (j = 0; j < macSz && j + i < sz; j++) {
  11395. started = ctMaskGTE(i + j, macStart);
  11396. notEnded = ctMaskLT(i + j, macEnd);
  11397. mac[j] |= started & notEnded & data[i + j];
  11398. }
  11399. }
  11400. if ((macSz & (macSz - 1)) == 0) {
  11401. for (i = 0; i < macSz; i++)
  11402. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  11403. }
  11404. #ifndef NO_SHA
  11405. else if (macSz == WC_SHA_DIGEST_SIZE) {
  11406. for (i = 0; i < macSz; i++)
  11407. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  11408. }
  11409. #endif
  11410. #ifdef WOLFSSL_SHA384
  11411. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  11412. for (i = 0; i < macSz; i++)
  11413. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  11414. }
  11415. #endif
  11416. return good;
  11417. }
  11418. /* timing resistant pad/verify check, return 0 on success */
  11419. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  11420. int pLen, int content)
  11421. {
  11422. byte verify[WC_MAX_DIGEST_SIZE];
  11423. byte good;
  11424. int ret = 0;
  11425. good = MaskPadding(input, pLen, macSz);
  11426. /* 4th argument has potential to underflow, ssl->hmac function should
  11427. * either increment the size by (macSz + padLen + 1) before use or check on
  11428. * the size to make sure is valid. */
  11429. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  11430. content, 1);
  11431. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  11432. /* Non-zero on failure. */
  11433. good = (byte)~(word32)good;
  11434. good &= good >> 4;
  11435. good &= good >> 2;
  11436. good &= good >> 1;
  11437. /* Make ret negative on masking failure. */
  11438. ret -= 1 - good;
  11439. /* Treat any failure as verify MAC error. */
  11440. if (ret != 0)
  11441. ret = VERIFY_MAC_ERROR;
  11442. return ret;
  11443. }
  11444. #endif
  11445. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx)
  11446. {
  11447. word32 msgSz = ssl->keys.encryptSz;
  11448. word32 idx = *inOutIdx;
  11449. int dataSz;
  11450. int ivExtra = 0;
  11451. byte* rawData = input + idx; /* keep current for hmac */
  11452. #ifdef HAVE_LIBZ
  11453. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  11454. #endif
  11455. #ifdef WOLFSSL_EARLY_DATA
  11456. if (ssl->earlyData != no_early_data) {
  11457. }
  11458. else
  11459. #endif
  11460. if (ssl->options.handShakeDone == 0) {
  11461. WOLFSSL_MSG("Received App data before a handshake completed");
  11462. SendAlert(ssl, alert_fatal, unexpected_message);
  11463. return OUT_OF_ORDER_E;
  11464. }
  11465. #ifndef WOLFSSL_AEAD_ONLY
  11466. if (ssl->specs.cipher_type == block) {
  11467. if (ssl->options.tls1_1)
  11468. ivExtra = ssl->specs.block_size;
  11469. }
  11470. else
  11471. #endif
  11472. if (ssl->specs.cipher_type == aead) {
  11473. if (CipherHasExpIV(ssl))
  11474. ivExtra = AESGCM_EXP_IV_SZ;
  11475. }
  11476. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  11477. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11478. if (ssl->options.encThenMac)
  11479. dataSz -= MacSize(ssl);
  11480. #endif
  11481. if (dataSz < 0) {
  11482. WOLFSSL_MSG("App data buffer error, malicious input?");
  11483. SendAlert(ssl, alert_fatal, unexpected_message);
  11484. return BUFFER_ERROR;
  11485. }
  11486. #ifdef WOLFSSL_EARLY_DATA
  11487. if (ssl->earlyData != no_early_data) {
  11488. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  11489. SendAlert(ssl, alert_fatal, unexpected_message);
  11490. return WOLFSSL_FATAL_ERROR;
  11491. }
  11492. ssl->earlyDataSz += dataSz;
  11493. }
  11494. #endif
  11495. /* read data */
  11496. if (dataSz) {
  11497. int rawSz = dataSz; /* keep raw size for idx adjustment */
  11498. #ifdef HAVE_LIBZ
  11499. if (ssl->options.usingCompression) {
  11500. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  11501. if (dataSz < 0) return dataSz;
  11502. }
  11503. #endif
  11504. idx += rawSz;
  11505. ssl->buffers.clearOutputBuffer.buffer = rawData;
  11506. ssl->buffers.clearOutputBuffer.length = dataSz;
  11507. }
  11508. idx += ssl->keys.padSz;
  11509. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11510. if (ssl->options.encThenMac)
  11511. idx += MacSize(ssl);
  11512. #endif
  11513. #ifdef HAVE_LIBZ
  11514. /* decompress could be bigger, overwrite after verify */
  11515. if (ssl->options.usingCompression)
  11516. XMEMMOVE(rawData, decomp, dataSz);
  11517. #endif
  11518. *inOutIdx = idx;
  11519. return 0;
  11520. }
  11521. /* process alert, return level */
  11522. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type,
  11523. word32 totalSz)
  11524. {
  11525. byte level;
  11526. byte code;
  11527. word32 dataSz = totalSz - *inOutIdx;
  11528. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  11529. if (ssl->hsInfoOn)
  11530. AddPacketName(ssl, "Alert");
  11531. if (ssl->toInfoOn)
  11532. /* add record header back on to info + alert bytes level/code */
  11533. AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx -
  11534. RECORD_HEADER_SZ, RECORD_HEADER_SZ + ALERT_SIZE,
  11535. READ_PROTO, ssl->heap);
  11536. #endif
  11537. if (IsEncryptionOn(ssl, 0)) {
  11538. dataSz -= ssl->keys.padSz;
  11539. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11540. if (ssl->options.encThenMac)
  11541. dataSz -= MacSize(ssl);
  11542. #endif
  11543. }
  11544. /* make sure can read the message */
  11545. if (dataSz != ALERT_SIZE) {
  11546. #ifdef WOLFSSL_EXTRA_ALERTS
  11547. SendAlert(ssl, alert_fatal, unexpected_message);
  11548. #endif
  11549. return BUFFER_E;
  11550. }
  11551. level = input[(*inOutIdx)++];
  11552. code = input[(*inOutIdx)++];
  11553. ssl->alert_history.last_rx.code = code;
  11554. ssl->alert_history.last_rx.level = level;
  11555. *type = code;
  11556. if (level == alert_fatal) {
  11557. ssl->options.isClosed = 1; /* Don't send close_notify */
  11558. }
  11559. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  11560. WOLFSSL_MSG("Alert count exceeded");
  11561. #ifdef WOLFSSL_EXTRA_ALERTS
  11562. if (level != alert_warning || code != close_notify)
  11563. SendAlert(ssl, alert_fatal, unexpected_message);
  11564. #endif
  11565. return ALERT_COUNT_E;
  11566. }
  11567. WOLFSSL_MSG("Got alert");
  11568. if (*type == close_notify) {
  11569. WOLFSSL_MSG("\tclose notify");
  11570. ssl->options.closeNotify = 1;
  11571. }
  11572. #ifdef WOLFSSL_TLS13
  11573. if (*type == decode_error) {
  11574. WOLFSSL_MSG("\tdecode error");
  11575. }
  11576. if (*type == illegal_parameter) {
  11577. WOLFSSL_MSG("\tillegal parameter");
  11578. }
  11579. #endif
  11580. WOLFSSL_ERROR(*type);
  11581. if (IsEncryptionOn(ssl, 0)) {
  11582. *inOutIdx += ssl->keys.padSz;
  11583. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11584. if (ssl->options.encThenMac)
  11585. *inOutIdx += MacSize(ssl);
  11586. #endif
  11587. }
  11588. return level;
  11589. }
  11590. static int GetInputData(WOLFSSL *ssl, word32 size)
  11591. {
  11592. int in;
  11593. int inSz;
  11594. int maxLength;
  11595. int usedLength;
  11596. int dtlsExtra = 0;
  11597. /* check max input length */
  11598. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  11599. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  11600. inSz = (int)(size - usedLength); /* from last partial read */
  11601. #ifdef WOLFSSL_DTLS
  11602. if (ssl->options.dtls) {
  11603. if (size < ssl->dtls_expected_rx)
  11604. dtlsExtra = (int)(ssl->dtls_expected_rx - size);
  11605. inSz = ssl->dtls_expected_rx;
  11606. }
  11607. #endif
  11608. /* check that no lengths or size values are negative */
  11609. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  11610. return BUFFER_ERROR;
  11611. }
  11612. if (inSz > maxLength) {
  11613. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  11614. return MEMORY_E;
  11615. }
  11616. /* Put buffer data at start if not there */
  11617. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  11618. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  11619. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  11620. usedLength);
  11621. /* remove processed data */
  11622. ssl->buffers.inputBuffer.idx = 0;
  11623. ssl->buffers.inputBuffer.length = usedLength;
  11624. /* read data from network */
  11625. do {
  11626. in = wolfSSLReceive(ssl,
  11627. ssl->buffers.inputBuffer.buffer +
  11628. ssl->buffers.inputBuffer.length,
  11629. inSz);
  11630. if (in == WANT_READ)
  11631. return WANT_READ;
  11632. if (in < 0)
  11633. return SOCKET_ERROR_E;
  11634. if (in > inSz)
  11635. return RECV_OVERFLOW_E;
  11636. ssl->buffers.inputBuffer.length += in;
  11637. inSz -= in;
  11638. } while (ssl->buffers.inputBuffer.length < size);
  11639. #ifdef WOLFSSL_DEBUG_TLS
  11640. if (ssl->buffers.inputBuffer.idx == 0) {
  11641. WOLFSSL_MSG("Data received");
  11642. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  11643. ssl->buffers.inputBuffer.length);
  11644. }
  11645. #endif
  11646. return 0;
  11647. }
  11648. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11649. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  11650. int content)
  11651. {
  11652. int ret;
  11653. #ifdef HAVE_TRUNCATED_HMAC
  11654. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  11655. : ssl->specs.hash_size;
  11656. #else
  11657. word32 digestSz = ssl->specs.hash_size;
  11658. #endif
  11659. byte verify[WC_MAX_DIGEST_SIZE];
  11660. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  11661. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1);
  11662. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  11663. if (ret != 0) {
  11664. return VERIFY_MAC_ERROR;
  11665. }
  11666. return 0;
  11667. }
  11668. #endif
  11669. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  11670. int content, word32* padSz)
  11671. {
  11672. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  11673. int ivExtra = 0;
  11674. int ret;
  11675. word32 pad = 0;
  11676. word32 padByte = 0;
  11677. #ifdef HAVE_TRUNCATED_HMAC
  11678. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  11679. : ssl->specs.hash_size;
  11680. #else
  11681. word32 digestSz = ssl->specs.hash_size;
  11682. #endif
  11683. byte verify[WC_MAX_DIGEST_SIZE];
  11684. if (ssl->specs.cipher_type == block) {
  11685. if (ssl->options.tls1_1)
  11686. ivExtra = ssl->specs.block_size;
  11687. pad = *(input + msgSz - ivExtra - 1);
  11688. padByte = 1;
  11689. if (ssl->options.tls) {
  11690. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  11691. content);
  11692. if (ret != 0)
  11693. return ret;
  11694. }
  11695. else { /* sslv3, some implementations have bad padding, but don't
  11696. * allow bad read */
  11697. int badPadLen = 0;
  11698. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  11699. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  11700. (void)dmy;
  11701. if (pad > (msgSz - digestSz - 1)) {
  11702. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  11703. pad = 0; /* no bad read */
  11704. badPadLen = 1;
  11705. }
  11706. PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  11707. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1, pad,
  11708. content, 1);
  11709. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  11710. digestSz) != 0)
  11711. return VERIFY_MAC_ERROR;
  11712. if (ret != 0 || badPadLen)
  11713. return VERIFY_MAC_ERROR;
  11714. }
  11715. }
  11716. else if (ssl->specs.cipher_type == stream) {
  11717. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1);
  11718. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0){
  11719. return VERIFY_MAC_ERROR;
  11720. }
  11721. if (ret != 0)
  11722. return VERIFY_MAC_ERROR;
  11723. }
  11724. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  11725. if (ssl->specs.cipher_type == aead) {
  11726. *padSz = ssl->specs.aead_mac_size;
  11727. }
  11728. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  11729. else {
  11730. *padSz = digestSz + pad + padByte;
  11731. }
  11732. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  11733. (void)input;
  11734. (void)msgSz;
  11735. (void)content;
  11736. return 0;
  11737. }
  11738. /* process input requests, return 0 is done, 1 is call again to complete, and
  11739. negative number is error */
  11740. int ProcessReply(WOLFSSL* ssl)
  11741. {
  11742. int ret = 0, type, readSz;
  11743. int atomicUser = 0;
  11744. word32 startIdx = 0;
  11745. #if defined(WOLFSSL_DTLS)
  11746. int used;
  11747. #endif
  11748. #ifdef ATOMIC_USER
  11749. if (ssl->ctx->DecryptVerifyCb)
  11750. atomicUser = 1;
  11751. #endif
  11752. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  11753. #ifdef WOLFSSL_ASYNC_CRYPT
  11754. && ssl->error != WC_PENDING_E
  11755. #endif
  11756. #ifdef WOLFSSL_NONBLOCK_OCSP
  11757. && ssl->error != OCSP_WANT_READ
  11758. #endif
  11759. ) {
  11760. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  11761. return ssl->error;
  11762. }
  11763. for (;;) {
  11764. switch (ssl->options.processReply) {
  11765. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  11766. * old client hello */
  11767. case doProcessInit:
  11768. readSz = RECORD_HEADER_SZ;
  11769. #ifdef WOLFSSL_DTLS
  11770. if (ssl->options.dtls)
  11771. readSz = DTLS_RECORD_HEADER_SZ;
  11772. #endif
  11773. /* get header or return error */
  11774. if (!ssl->options.dtls) {
  11775. if ((ret = GetInputData(ssl, readSz)) < 0)
  11776. return ret;
  11777. } else {
  11778. #ifdef WOLFSSL_DTLS
  11779. /* read ahead may already have header */
  11780. used = ssl->buffers.inputBuffer.length -
  11781. ssl->buffers.inputBuffer.idx;
  11782. if (used < readSz) {
  11783. if ((ret = GetInputData(ssl, readSz)) < 0)
  11784. return ret;
  11785. }
  11786. #endif
  11787. }
  11788. #ifdef OLD_HELLO_ALLOWED
  11789. /* see if sending SSLv2 client hello */
  11790. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  11791. ssl->options.clientState == NULL_STATE &&
  11792. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  11793. != handshake) {
  11794. byte b0, b1;
  11795. ssl->options.processReply = runProcessOldClientHello;
  11796. /* sanity checks before getting size at front */
  11797. if (ssl->buffers.inputBuffer.buffer[
  11798. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  11799. WOLFSSL_MSG("Not a valid old client hello");
  11800. return PARSE_ERROR;
  11801. }
  11802. if (ssl->buffers.inputBuffer.buffer[
  11803. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  11804. ssl->buffers.inputBuffer.buffer[
  11805. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  11806. WOLFSSL_MSG("Not a valid version in old client hello");
  11807. return PARSE_ERROR;
  11808. }
  11809. /* how many bytes need ProcessOldClientHello */
  11810. b0 =
  11811. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  11812. b1 =
  11813. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  11814. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  11815. }
  11816. else {
  11817. ssl->options.processReply = getRecordLayerHeader;
  11818. continue;
  11819. }
  11820. FALL_THROUGH;
  11821. /* in the WOLFSSL_SERVER case, run the old client hello */
  11822. case runProcessOldClientHello:
  11823. /* get sz bytes or return error */
  11824. if (!ssl->options.dtls) {
  11825. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  11826. return ret;
  11827. } else {
  11828. #ifdef WOLFSSL_DTLS
  11829. /* read ahead may already have */
  11830. used = ssl->buffers.inputBuffer.length -
  11831. ssl->buffers.inputBuffer.idx;
  11832. if (used < ssl->curSize)
  11833. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  11834. return ret;
  11835. #endif /* WOLFSSL_DTLS */
  11836. }
  11837. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  11838. &ssl->buffers.inputBuffer.idx,
  11839. ssl->buffers.inputBuffer.length -
  11840. ssl->buffers.inputBuffer.idx,
  11841. ssl->curSize);
  11842. if (ret < 0)
  11843. return ret;
  11844. else if (ssl->buffers.inputBuffer.idx ==
  11845. ssl->buffers.inputBuffer.length) {
  11846. ssl->options.processReply = doProcessInit;
  11847. return 0;
  11848. }
  11849. #endif /* OLD_HELLO_ALLOWED */
  11850. FALL_THROUGH;
  11851. /* get the record layer header */
  11852. case getRecordLayerHeader:
  11853. ret = GetRecordHeader(ssl, ssl->buffers.inputBuffer.buffer,
  11854. &ssl->buffers.inputBuffer.idx,
  11855. &ssl->curRL, &ssl->curSize);
  11856. #ifdef WOLFSSL_DTLS
  11857. if (ssl->options.dtls && ret == SEQUENCE_ERROR) {
  11858. WOLFSSL_MSG("Silently dropping out of order DTLS message");
  11859. ssl->options.processReply = doProcessInit;
  11860. ssl->buffers.inputBuffer.length = 0;
  11861. ssl->buffers.inputBuffer.idx = 0;
  11862. #ifdef WOLFSSL_DTLS_DROP_STATS
  11863. ssl->replayDropCount++;
  11864. #endif /* WOLFSSL_DTLS_DROP_STATS */
  11865. if (IsDtlsNotSctpMode(ssl) && ssl->options.dtlsHsRetain) {
  11866. ret = DtlsMsgPoolSend(ssl, 0);
  11867. if (ret != 0)
  11868. return ret;
  11869. }
  11870. continue;
  11871. }
  11872. #endif
  11873. if (ret != 0)
  11874. return ret;
  11875. #ifdef WOLFSSL_TLS13
  11876. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  11877. ssl->curRL.type != application_data &&
  11878. ssl->curRL.type != change_cipher_spec) {
  11879. SendAlert(ssl, alert_fatal, unexpected_message);
  11880. return PARSE_ERROR;
  11881. }
  11882. #endif
  11883. ssl->options.processReply = getData;
  11884. FALL_THROUGH;
  11885. /* retrieve record layer data */
  11886. case getData:
  11887. /* get sz bytes or return error */
  11888. if (!ssl->options.dtls) {
  11889. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  11890. #ifdef WOLFSSL_EXTRA_ALERTS
  11891. if (ret != WANT_READ)
  11892. SendAlert(ssl, alert_fatal, bad_record_mac);
  11893. #endif
  11894. return ret;
  11895. }
  11896. }
  11897. else {
  11898. #ifdef WOLFSSL_DTLS
  11899. /* read ahead may already have */
  11900. used = ssl->buffers.inputBuffer.length -
  11901. ssl->buffers.inputBuffer.idx;
  11902. if (used < ssl->curSize)
  11903. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  11904. return ret;
  11905. #endif
  11906. }
  11907. if (IsEncryptionOn(ssl, 0)) {
  11908. int tooLong = 0;
  11909. #ifdef WOLFSSL_TLS13
  11910. if (IsAtLeastTLSv1_3(ssl->version)) {
  11911. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  11912. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  11913. MAX_TLS13_PLAIN_SZ;
  11914. }
  11915. #endif
  11916. #ifdef WOLFSSL_EXTRA_ALERTS
  11917. if (!IsAtLeastTLSv1_3(ssl->version))
  11918. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  11919. #endif
  11920. if (tooLong) {
  11921. WOLFSSL_MSG("Encrypted data too long");
  11922. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  11923. SendAlert(ssl, alert_fatal, record_overflow);
  11924. #endif
  11925. return BUFFER_ERROR;
  11926. }
  11927. }
  11928. ssl->keys.padSz = 0;
  11929. ssl->options.processReply = verifyEncryptedMessage;
  11930. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  11931. FALL_THROUGH;
  11932. /* verify digest of encrypted message */
  11933. case verifyEncryptedMessage:
  11934. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11935. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  11936. !atomicUser && ssl->options.encThenMac) {
  11937. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  11938. ssl->buffers.inputBuffer.idx,
  11939. ssl->curSize, ssl->curRL.type);
  11940. #ifdef WOLFSSL_ASYNC_CRYPT
  11941. if (ret == WC_PENDING_E)
  11942. return ret;
  11943. #endif
  11944. if (ret < 0) {
  11945. WOLFSSL_MSG("VerifyMacEnc failed");
  11946. WOLFSSL_ERROR(ret);
  11947. #ifdef WOLFSSL_DTLS
  11948. /* If in DTLS mode, if the decrypt fails for any
  11949. * reason, pretend the datagram never happened. */
  11950. if (ssl->options.dtls) {
  11951. ssl->options.processReply = doProcessInit;
  11952. ssl->buffers.inputBuffer.idx =
  11953. ssl->buffers.inputBuffer.length;
  11954. #ifdef WOLFSSL_DTLS_DROP_STATS
  11955. ssl->macDropCount++;
  11956. #endif /* WOLFSSL_DTLS_DROP_STATS */
  11957. }
  11958. #endif /* WOLFSSL_DTLS */
  11959. #ifdef WOLFSSL_EXTRA_ALERTS
  11960. if (!ssl->options.dtls)
  11961. SendAlert(ssl, alert_fatal, bad_record_mac);
  11962. #endif
  11963. return DECRYPT_ERROR;
  11964. }
  11965. ssl->keys.encryptSz = ssl->curSize;
  11966. }
  11967. #endif
  11968. ssl->options.processReply = decryptMessage;
  11969. FALL_THROUGH;
  11970. /* decrypt message */
  11971. case decryptMessage:
  11972. #if !defined(WOLFSSL_TLS13) || defined(WOLFSSL_TLS13_DRAFT_18)
  11973. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0)
  11974. #else
  11975. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  11976. (!IsAtLeastTLSv1_3(ssl->version) ||
  11977. ssl->curRL.type != change_cipher_spec))
  11978. #endif
  11979. {
  11980. bufferStatic* in = &ssl->buffers.inputBuffer;
  11981. ret = SanityCheckCipherText(ssl, ssl->curSize);
  11982. if (ret < 0) {
  11983. #ifdef WOLFSSL_EXTRA_ALERTS
  11984. SendAlert(ssl, alert_fatal, bad_record_mac);
  11985. #endif
  11986. return ret;
  11987. }
  11988. if (atomicUser) {
  11989. #ifdef ATOMIC_USER
  11990. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11991. if (ssl->options.encThenMac) {
  11992. ret = ssl->ctx->VerifyDecryptCb(ssl,
  11993. in->buffer + in->idx, in->buffer + in->idx,
  11994. ssl->curSize - MacSize(ssl),
  11995. ssl->curRL.type, 1, &ssl->keys.padSz,
  11996. ssl->DecryptVerifyCtx);
  11997. }
  11998. else
  11999. #endif
  12000. {
  12001. ret = ssl->ctx->DecryptVerifyCb(ssl,
  12002. in->buffer + in->idx,
  12003. in->buffer + in->idx,
  12004. ssl->curSize, ssl->curRL.type, 1,
  12005. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  12006. }
  12007. #endif /* ATOMIC_USER */
  12008. }
  12009. else {
  12010. if (!ssl->options.tls1_3) {
  12011. #ifndef WOLFSSL_NO_TLS12
  12012. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12013. if (ssl->options.encThenMac) {
  12014. word32 digestSz = MacSize(ssl);
  12015. ret = Decrypt(ssl,
  12016. in->buffer + in->idx,
  12017. in->buffer + in->idx,
  12018. ssl->curSize - digestSz);
  12019. ssl->keys.padSz =
  12020. in->buffer[in->idx + ssl->curSize - digestSz - 1];
  12021. ssl->keys.padSz += 1;
  12022. ssl->keys.decryptedCur = 1;
  12023. }
  12024. else
  12025. #endif
  12026. {
  12027. ret = Decrypt(ssl,
  12028. in->buffer + in->idx,
  12029. in->buffer + in->idx,
  12030. ssl->curSize);
  12031. }
  12032. #else
  12033. ret = DECRYPT_ERROR;
  12034. #endif
  12035. }
  12036. else
  12037. {
  12038. #ifdef WOLFSSL_TLS13
  12039. #if defined(WOLFSSL_TLS13_DRAFT_18) || \
  12040. defined(WOLFSSL_TLS13_DRAFT_22) || \
  12041. defined(WOLFSSL_TLS13_DRAFT_23)
  12042. ret = DecryptTls13(ssl,
  12043. in->buffer + in->idx,
  12044. in->buffer + in->idx,
  12045. ssl->curSize, NULL, 0);
  12046. #else
  12047. ret = DecryptTls13(ssl,
  12048. in->buffer + in->idx,
  12049. in->buffer + in->idx,
  12050. ssl->curSize,
  12051. (byte*)&ssl->curRL, RECORD_HEADER_SZ);
  12052. #endif
  12053. #else
  12054. ret = DECRYPT_ERROR;
  12055. #endif /* WOLFSSL_TLS13 */
  12056. }
  12057. }
  12058. #ifdef WOLFSSL_ASYNC_CRYPT
  12059. if (ret == WC_PENDING_E)
  12060. return ret;
  12061. #endif
  12062. if (ret >= 0) {
  12063. #ifndef WOLFSSL_NO_TLS12
  12064. /* handle success */
  12065. #ifndef WOLFSSL_AEAD_ONLY
  12066. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  12067. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  12068. #endif
  12069. /* go past TLSv1.1 IV */
  12070. if (CipherHasExpIV(ssl))
  12071. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  12072. #endif
  12073. }
  12074. else {
  12075. WOLFSSL_MSG("Decrypt failed");
  12076. WOLFSSL_ERROR(ret);
  12077. #ifdef WOLFSSL_EARLY_DATA
  12078. if (ssl->options.tls1_3) {
  12079. ssl->earlyDataSz += ssl->curSize;
  12080. if (ssl->earlyDataSz <= ssl->options.maxEarlyDataSz) {
  12081. if (ssl->keys.peer_sequence_number_lo-- == 0)
  12082. ssl->keys.peer_sequence_number_hi--;
  12083. ssl->options.processReply = doProcessInit;
  12084. ssl->buffers.inputBuffer.idx =
  12085. ssl->buffers.inputBuffer.length;
  12086. return 0;
  12087. }
  12088. }
  12089. #endif
  12090. #ifdef WOLFSSL_DTLS
  12091. /* If in DTLS mode, if the decrypt fails for any
  12092. * reason, pretend the datagram never happened. */
  12093. if (ssl->options.dtls) {
  12094. ssl->options.processReply = doProcessInit;
  12095. ssl->buffers.inputBuffer.idx =
  12096. ssl->buffers.inputBuffer.length;
  12097. #ifdef WOLFSSL_DTLS_DROP_STATS
  12098. ssl->macDropCount++;
  12099. #endif /* WOLFSSL_DTLS_DROP_STATS */
  12100. }
  12101. #endif /* WOLFSSL_DTLS */
  12102. return DECRYPT_ERROR;
  12103. }
  12104. }
  12105. ssl->options.processReply = verifyMessage;
  12106. FALL_THROUGH;
  12107. /* verify digest of message */
  12108. case verifyMessage:
  12109. #if !defined(WOLFSSL_TLS13) || defined(WOLFSSL_TLS13_DRAFT_18)
  12110. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0)
  12111. #else
  12112. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  12113. (!IsAtLeastTLSv1_3(ssl->version) ||
  12114. ssl->curRL.type != change_cipher_spec))
  12115. #endif
  12116. {
  12117. if (!atomicUser
  12118. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12119. && !ssl->options.encThenMac
  12120. #endif
  12121. ) {
  12122. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  12123. ssl->buffers.inputBuffer.idx,
  12124. ssl->curSize, ssl->curRL.type,
  12125. &ssl->keys.padSz);
  12126. #ifdef WOLFSSL_ASYNC_CRYPT
  12127. if (ret == WC_PENDING_E)
  12128. return ret;
  12129. #endif
  12130. if (ret < 0) {
  12131. WOLFSSL_MSG("VerifyMac failed");
  12132. WOLFSSL_ERROR(ret);
  12133. #ifdef WOLFSSL_DTLS
  12134. /* If in DTLS mode, if the decrypt fails for any
  12135. * reason, pretend the datagram never happened. */
  12136. if (ssl->options.dtls) {
  12137. ssl->options.processReply = doProcessInit;
  12138. ssl->buffers.inputBuffer.idx =
  12139. ssl->buffers.inputBuffer.length;
  12140. #ifdef WOLFSSL_DTLS_DROP_STATS
  12141. ssl->macDropCount++;
  12142. #endif /* WOLFSSL_DTLS_DROP_STATS */
  12143. }
  12144. #endif /* WOLFSSL_DTLS */
  12145. #ifdef WOLFSSL_EXTRA_ALERTS
  12146. if (!ssl->options.dtls)
  12147. SendAlert(ssl, alert_fatal, bad_record_mac);
  12148. #endif
  12149. return DECRYPT_ERROR;
  12150. }
  12151. }
  12152. ssl->keys.encryptSz = ssl->curSize;
  12153. ssl->keys.decryptedCur = 1;
  12154. #ifdef WOLFSSL_TLS13
  12155. if (ssl->options.tls1_3) {
  12156. word16 i = (word16)(ssl->buffers.inputBuffer.length -
  12157. ssl->keys.padSz);
  12158. /* Remove padding from end of plain text. */
  12159. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  12160. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  12161. break;
  12162. }
  12163. /* Get the real content type from the end of the data. */
  12164. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  12165. ssl->keys.padSz = ssl->buffers.inputBuffer.length - i;
  12166. }
  12167. #endif
  12168. }
  12169. ssl->options.processReply = runProcessingOneMessage;
  12170. FALL_THROUGH;
  12171. /* the record layer is here */
  12172. case runProcessingOneMessage:
  12173. if (ssl->buffers.inputBuffer.length - ssl->keys.padSz -
  12174. ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ) {
  12175. WOLFSSL_MSG("Plaintext too long");
  12176. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  12177. SendAlert(ssl, alert_fatal, record_overflow);
  12178. #endif
  12179. return BUFFER_ERROR;
  12180. }
  12181. #ifdef WOLFSSL_DTLS
  12182. if (IsDtlsNotSctpMode(ssl)) {
  12183. DtlsUpdateWindow(ssl);
  12184. }
  12185. #endif /* WOLFSSL_DTLS */
  12186. WOLFSSL_MSG("received record layer msg");
  12187. switch (ssl->curRL.type) {
  12188. case handshake :
  12189. /* debugging in DoHandShakeMsg */
  12190. if (ssl->options.dtls) {
  12191. #ifdef WOLFSSL_DTLS
  12192. ret = DoDtlsHandShakeMsg(ssl,
  12193. ssl->buffers.inputBuffer.buffer,
  12194. &ssl->buffers.inputBuffer.idx,
  12195. ssl->buffers.inputBuffer.length);
  12196. #endif
  12197. }
  12198. else if (!IsAtLeastTLSv1_3(ssl->version)) {
  12199. #ifndef WOLFSSL_NO_TLS12
  12200. ret = DoHandShakeMsg(ssl,
  12201. ssl->buffers.inputBuffer.buffer,
  12202. &ssl->buffers.inputBuffer.idx,
  12203. ssl->buffers.inputBuffer.length);
  12204. #else
  12205. ret = BUFFER_ERROR;
  12206. #endif
  12207. }
  12208. else {
  12209. #ifdef WOLFSSL_TLS13
  12210. ret = DoTls13HandShakeMsg(ssl,
  12211. ssl->buffers.inputBuffer.buffer,
  12212. &ssl->buffers.inputBuffer.idx,
  12213. ssl->buffers.inputBuffer.length);
  12214. #ifdef WOLFSSL_EARLY_DATA
  12215. if (ret != 0)
  12216. return ret;
  12217. if (ssl->options.side == WOLFSSL_SERVER_END &&
  12218. ssl->earlyData &&
  12219. ssl->options.handShakeState == HANDSHAKE_DONE) {
  12220. ssl->earlyData = no_early_data;
  12221. ssl->options.processReply = doProcessInit;
  12222. return ZERO_RETURN;
  12223. }
  12224. #endif
  12225. #else
  12226. ret = BUFFER_ERROR;
  12227. #endif
  12228. }
  12229. if (ret != 0) {
  12230. WOLFSSL_ERROR(ret);
  12231. return ret;
  12232. }
  12233. break;
  12234. case change_cipher_spec:
  12235. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  12236. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  12237. if (ssl->hsInfoOn)
  12238. AddPacketName(ssl, "ChangeCipher");
  12239. /* add record header back on info */
  12240. if (ssl->toInfoOn) {
  12241. AddPacketInfo(ssl, "ChangeCipher",
  12242. change_cipher_spec,
  12243. ssl->buffers.inputBuffer.buffer +
  12244. ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ,
  12245. 1 + RECORD_HEADER_SZ, READ_PROTO, ssl->heap);
  12246. #ifdef WOLFSSL_CALLBACKS
  12247. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  12248. #endif
  12249. }
  12250. #endif
  12251. #ifdef WOLFSSL_TLS13
  12252. #ifdef WOLFSSL_TLS13_DRAFT_18
  12253. if (IsAtLeastTLSv1_3(ssl->version)) {
  12254. SendAlert(ssl, alert_fatal, illegal_parameter);
  12255. return UNKNOWN_RECORD_TYPE;
  12256. }
  12257. #else
  12258. if (IsAtLeastTLSv1_3(ssl->version)) {
  12259. word32 i = ssl->buffers.inputBuffer.idx;
  12260. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  12261. SendAlert(ssl, alert_fatal, unexpected_message);
  12262. return UNKNOWN_RECORD_TYPE;
  12263. }
  12264. if (ssl->curSize != 1 ||
  12265. ssl->buffers.inputBuffer.buffer[i] != 1) {
  12266. SendAlert(ssl, alert_fatal, illegal_parameter);
  12267. return UNKNOWN_RECORD_TYPE;
  12268. }
  12269. ssl->buffers.inputBuffer.idx++;
  12270. break;
  12271. }
  12272. #endif
  12273. #endif
  12274. #ifndef WOLFSSL_NO_TLS12
  12275. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  12276. if (ret != 0) {
  12277. if (!ssl->options.dtls) {
  12278. return ret;
  12279. }
  12280. else {
  12281. #ifdef WOLFSSL_DTLS
  12282. /* Check for duplicate CCS message in DTLS mode.
  12283. * DTLS allows for duplicate messages, and it should be
  12284. * skipped. Also skip if out of order. */
  12285. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  12286. return ret;
  12287. if (IsDtlsNotSctpMode(ssl)) {
  12288. ret = DtlsMsgPoolSend(ssl, 1);
  12289. if (ret != 0)
  12290. return ret;
  12291. }
  12292. if (ssl->curSize != 1) {
  12293. WOLFSSL_MSG("Malicious or corrupted"
  12294. " duplicate ChangeCipher msg");
  12295. return LENGTH_ERROR;
  12296. }
  12297. ssl->buffers.inputBuffer.idx++;
  12298. break;
  12299. #endif /* WOLFSSL_DTLS */
  12300. }
  12301. }
  12302. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  12303. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  12304. ssl->curSize -= (word16) ssl->buffers.inputBuffer.idx;
  12305. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12306. if (ssl->options.encThenMac) {
  12307. word32 digestSz = MacSize(ssl);
  12308. ssl->buffers.inputBuffer.idx += digestSz;
  12309. ssl->curSize -= digestSz;
  12310. }
  12311. #endif
  12312. }
  12313. if (ssl->curSize != 1) {
  12314. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  12315. return LENGTH_ERROR;
  12316. }
  12317. ssl->buffers.inputBuffer.idx++;
  12318. ssl->keys.encryptionOn = 1;
  12319. /* setup decrypt keys for following messages */
  12320. /* XXX This might not be what we want to do when
  12321. * receiving a CCS with multicast. We update the
  12322. * key when the application updates them. */
  12323. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  12324. return ret;
  12325. #ifdef WOLFSSL_DTLS
  12326. if (ssl->options.dtls) {
  12327. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  12328. #ifdef WOLFSSL_MULTICAST
  12329. if (ssl->options.haveMcast) {
  12330. peerSeq += ssl->keys.curPeerId;
  12331. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  12332. ssl->ctx->mcastFirstSeq,
  12333. ssl->ctx->mcastSecondSeq,
  12334. ssl->ctx->mcastMaxSeq);
  12335. }
  12336. #endif
  12337. DtlsMsgPoolReset(ssl);
  12338. peerSeq->nextEpoch++;
  12339. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  12340. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  12341. peerSeq->nextSeq_lo = 0;
  12342. peerSeq->nextSeq_hi = 0;
  12343. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  12344. DTLS_SEQ_SZ);
  12345. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  12346. }
  12347. #endif
  12348. #ifdef HAVE_LIBZ
  12349. if (ssl->options.usingCompression)
  12350. if ( (ret = InitStreams(ssl)) != 0)
  12351. return ret;
  12352. #endif
  12353. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  12354. ssl->options.side == WOLFSSL_CLIENT_END ?
  12355. server : client);
  12356. if (ret != 0)
  12357. return ret;
  12358. #endif /* !WOLFSSL_NO_TLS12 */
  12359. break;
  12360. case application_data:
  12361. WOLFSSL_MSG("got app DATA");
  12362. #ifdef WOLFSSL_DTLS
  12363. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  12364. FreeHandshakeResources(ssl);
  12365. ssl->options.dtlsHsRetain = 0;
  12366. }
  12367. #endif
  12368. #ifdef WOLFSSL_TLS13
  12369. if (ssl->keys.keyUpdateRespond) {
  12370. WOLFSSL_MSG("No KeyUpdate from peer seen");
  12371. return SANITY_MSG_E;
  12372. }
  12373. #endif
  12374. if ((ret = DoApplicationData(ssl,
  12375. ssl->buffers.inputBuffer.buffer,
  12376. &ssl->buffers.inputBuffer.idx))
  12377. != 0) {
  12378. WOLFSSL_ERROR(ret);
  12379. return ret;
  12380. }
  12381. break;
  12382. case alert:
  12383. WOLFSSL_MSG("got ALERT!");
  12384. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  12385. &ssl->buffers.inputBuffer.idx, &type,
  12386. ssl->buffers.inputBuffer.length);
  12387. if (ret == alert_fatal)
  12388. return FATAL_ERROR;
  12389. else if (ret < 0)
  12390. return ret;
  12391. /* catch warnings that are handled as errors */
  12392. if (type == close_notify)
  12393. return ssl->error = ZERO_RETURN;
  12394. if (type == decrypt_error)
  12395. return FATAL_ERROR;
  12396. break;
  12397. default:
  12398. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  12399. return UNKNOWN_RECORD_TYPE;
  12400. }
  12401. ssl->options.processReply = doProcessInit;
  12402. /* input exhausted? */
  12403. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length)
  12404. return 0;
  12405. /* more messages per record */
  12406. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  12407. WOLFSSL_MSG("More messages in record");
  12408. ssl->options.processReply = runProcessingOneMessage;
  12409. if (IsEncryptionOn(ssl, 0)) {
  12410. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  12411. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12412. if (ssl->options.encThenMac) {
  12413. word32 digestSz = MacSize(ssl);
  12414. if (ssl->buffers.inputBuffer.idx >=
  12415. ssl->keys.padSz + digestSz) {
  12416. ssl->buffers.inputBuffer.idx -=
  12417. ssl->keys.padSz + digestSz;
  12418. }
  12419. else {
  12420. WOLFSSL_MSG("\tmiddle padding error");
  12421. return FATAL_ERROR;
  12422. }
  12423. }
  12424. else
  12425. #endif
  12426. {
  12427. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  12428. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  12429. }
  12430. else {
  12431. WOLFSSL_MSG("\tmiddle padding error");
  12432. return FATAL_ERROR;
  12433. }
  12434. }
  12435. }
  12436. continue;
  12437. }
  12438. /* more records */
  12439. else {
  12440. WOLFSSL_MSG("More records in input");
  12441. ssl->options.processReply = doProcessInit;
  12442. continue;
  12443. }
  12444. default:
  12445. WOLFSSL_MSG("Bad process input state, programming error");
  12446. return INPUT_CASE_ERROR;
  12447. }
  12448. }
  12449. }
  12450. int SendChangeCipher(WOLFSSL* ssl)
  12451. {
  12452. byte *output;
  12453. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  12454. int idx = RECORD_HEADER_SZ;
  12455. int ret;
  12456. #ifdef OPENSSL_EXTRA
  12457. ssl->cbmode = SSL_CB_MODE_WRITE;
  12458. if (ssl->options.side == WOLFSSL_SERVER_END){
  12459. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  12460. if (ssl->CBIS != NULL)
  12461. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  12462. }
  12463. else{
  12464. ssl->options.clientState =
  12465. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  12466. if (ssl->CBIS != NULL)
  12467. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  12468. }
  12469. #endif
  12470. #ifdef WOLFSSL_DTLS
  12471. if (ssl->options.dtls) {
  12472. sendSz += DTLS_RECORD_EXTRA;
  12473. idx += DTLS_RECORD_EXTRA;
  12474. }
  12475. #endif
  12476. /* are we in scr */
  12477. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  12478. sendSz += MAX_MSG_EXTRA;
  12479. }
  12480. /* check for available size */
  12481. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  12482. return ret;
  12483. /* get output buffer */
  12484. output = ssl->buffers.outputBuffer.buffer +
  12485. ssl->buffers.outputBuffer.length;
  12486. AddRecordHeader(output, 1, change_cipher_spec, ssl);
  12487. output[idx] = 1; /* turn it on */
  12488. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  12489. byte input[ENUM_LEN];
  12490. int inputSz = ENUM_LEN;
  12491. input[0] = 1; /* turn it on */
  12492. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  12493. change_cipher_spec, 0, 0, 0);
  12494. if (sendSz < 0) {
  12495. return sendSz;
  12496. }
  12497. }
  12498. #ifdef WOLFSSL_DTLS
  12499. if (IsDtlsNotSctpMode(ssl)) {
  12500. DtlsSEQIncrement(ssl, CUR_ORDER);
  12501. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
  12502. return ret;
  12503. }
  12504. #endif
  12505. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  12506. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  12507. if (ssl->toInfoOn)
  12508. AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  12509. sendSz, WRITE_PROTO, ssl->heap);
  12510. #endif
  12511. ssl->buffers.outputBuffer.length += sendSz;
  12512. if (ssl->options.groupMessages)
  12513. return 0;
  12514. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  12515. else if (ssl->options.dtls) {
  12516. /* If using DTLS, force the ChangeCipherSpec message to be in the
  12517. * same datagram as the finished message. */
  12518. return 0;
  12519. }
  12520. #endif
  12521. else
  12522. return SendBuffered(ssl);
  12523. }
  12524. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  12525. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  12526. int padLen, int content, int verify)
  12527. {
  12528. byte result[WC_MAX_DIGEST_SIZE];
  12529. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  12530. word32 padSz = ssl->specs.pad_size;
  12531. int ret = 0;
  12532. wc_Md5 md5;
  12533. wc_Sha sha;
  12534. /* data */
  12535. byte seq[SEQ_SZ];
  12536. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  12537. const byte* macSecret = wolfSSL_GetMacSecret(ssl, verify);
  12538. (void)padLen;
  12539. #ifdef HAVE_FUZZER
  12540. if (ssl->fuzzerCb)
  12541. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  12542. #endif
  12543. XMEMSET(seq, 0, SEQ_SZ);
  12544. conLen[0] = (byte)content;
  12545. c16toa((word16)sz, &conLen[ENUM_LEN]);
  12546. WriteSEQ(ssl, verify, seq);
  12547. if (ssl->specs.mac_algorithm == md5_mac) {
  12548. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  12549. if (ret != 0)
  12550. return ret;
  12551. /* inner */
  12552. ret = wc_Md5Update(&md5, macSecret, digestSz);
  12553. ret |= wc_Md5Update(&md5, PAD1, padSz);
  12554. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  12555. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  12556. /* in buffer */
  12557. ret |= wc_Md5Update(&md5, in, sz);
  12558. if (ret != 0)
  12559. return VERIFY_MAC_ERROR;
  12560. ret = wc_Md5Final(&md5, result);
  12561. #ifdef WOLFSSL_ASYNC_CRYPT
  12562. /* TODO: Make non-blocking */
  12563. if (ret == WC_PENDING_E) {
  12564. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  12565. }
  12566. #endif
  12567. if (ret != 0)
  12568. return VERIFY_MAC_ERROR;
  12569. /* outer */
  12570. ret = wc_Md5Update(&md5, macSecret, digestSz);
  12571. ret |= wc_Md5Update(&md5, PAD2, padSz);
  12572. ret |= wc_Md5Update(&md5, result, digestSz);
  12573. if (ret != 0)
  12574. return VERIFY_MAC_ERROR;
  12575. ret = wc_Md5Final(&md5, digest);
  12576. #ifdef WOLFSSL_ASYNC_CRYPT
  12577. /* TODO: Make non-blocking */
  12578. if (ret == WC_PENDING_E) {
  12579. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  12580. }
  12581. #endif
  12582. if (ret != 0)
  12583. return VERIFY_MAC_ERROR;
  12584. wc_Md5Free(&md5);
  12585. }
  12586. else {
  12587. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  12588. if (ret != 0)
  12589. return ret;
  12590. /* inner */
  12591. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  12592. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  12593. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  12594. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  12595. /* in buffer */
  12596. ret |= wc_ShaUpdate(&sha, in, sz);
  12597. if (ret != 0)
  12598. return VERIFY_MAC_ERROR;
  12599. ret = wc_ShaFinal(&sha, result);
  12600. #ifdef WOLFSSL_ASYNC_CRYPT
  12601. /* TODO: Make non-blocking */
  12602. if (ret == WC_PENDING_E) {
  12603. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  12604. }
  12605. #endif
  12606. if (ret != 0)
  12607. return VERIFY_MAC_ERROR;
  12608. /* outer */
  12609. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  12610. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  12611. ret |= wc_ShaUpdate(&sha, result, digestSz);
  12612. if (ret != 0)
  12613. return VERIFY_MAC_ERROR;
  12614. ret = wc_ShaFinal(&sha, digest);
  12615. #ifdef WOLFSSL_ASYNC_CRYPT
  12616. /* TODO: Make non-blocking */
  12617. if (ret == WC_PENDING_E) {
  12618. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  12619. }
  12620. #endif
  12621. if (ret != 0)
  12622. return VERIFY_MAC_ERROR;
  12623. wc_ShaFree(&sha);
  12624. }
  12625. return 0;
  12626. }
  12627. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  12628. #ifndef NO_CERTS
  12629. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  12630. static int BuildMD5_CertVerify(WOLFSSL* ssl, byte* digest)
  12631. {
  12632. int ret;
  12633. byte md5_result[WC_MD5_DIGEST_SIZE];
  12634. #ifdef WOLFSSL_SMALL_STACK
  12635. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  12636. #else
  12637. wc_Md5 md5[1];
  12638. #endif
  12639. /* make md5 inner */
  12640. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  12641. if (ret == 0)
  12642. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  12643. if (ret == 0)
  12644. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  12645. if (ret == 0)
  12646. ret = wc_Md5Final(md5, md5_result);
  12647. /* make md5 outer */
  12648. if (ret == 0) {
  12649. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  12650. if (ret == 0) {
  12651. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  12652. if (ret == 0)
  12653. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  12654. if (ret == 0)
  12655. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  12656. if (ret == 0)
  12657. ret = wc_Md5Final(md5, digest);
  12658. wc_Md5Free(md5);
  12659. }
  12660. }
  12661. #ifdef WOLFSSL_SMALL_STACK
  12662. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  12663. #endif
  12664. return ret;
  12665. }
  12666. #endif /* !NO_MD5 && !NO_OLD_TLS */
  12667. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  12668. defined(WOLFSSL_ALLOW_TLS_SHA1))
  12669. static int BuildSHA_CertVerify(WOLFSSL* ssl, byte* digest)
  12670. {
  12671. int ret;
  12672. byte sha_result[WC_SHA_DIGEST_SIZE];
  12673. #ifdef WOLFSSL_SMALL_STACK
  12674. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  12675. #else
  12676. wc_Sha sha[1];
  12677. #endif
  12678. /* make sha inner */
  12679. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  12680. if (ret == 0)
  12681. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  12682. if (ret == 0)
  12683. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  12684. if (ret == 0)
  12685. ret = wc_ShaFinal(sha, sha_result);
  12686. /* make sha outer */
  12687. if (ret == 0) {
  12688. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  12689. if (ret == 0) {
  12690. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  12691. if (ret == 0)
  12692. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  12693. if (ret == 0)
  12694. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  12695. if (ret == 0)
  12696. ret = wc_ShaFinal(sha, digest);
  12697. wc_ShaFree(sha);
  12698. }
  12699. }
  12700. #ifdef WOLFSSL_SMALL_STACK
  12701. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  12702. #endif
  12703. return ret;
  12704. }
  12705. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  12706. int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes)
  12707. {
  12708. int ret = 0;
  12709. (void)hashes;
  12710. if (ssl->options.tls) {
  12711. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  12712. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  12713. if (ret != 0)
  12714. return ret;
  12715. #endif
  12716. #if !defined(NO_SHA)
  12717. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  12718. if (ret != 0)
  12719. return ret;
  12720. #endif
  12721. if (IsAtLeastTLSv1_2(ssl)) {
  12722. #ifndef NO_SHA256
  12723. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  12724. hashes->sha256);
  12725. if (ret != 0)
  12726. return ret;
  12727. #endif
  12728. #ifdef WOLFSSL_SHA384
  12729. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  12730. hashes->sha384);
  12731. if (ret != 0)
  12732. return ret;
  12733. #endif
  12734. #ifdef WOLFSSL_SHA512
  12735. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  12736. hashes->sha512);
  12737. if (ret != 0)
  12738. return ret;
  12739. #endif
  12740. }
  12741. }
  12742. else {
  12743. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  12744. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  12745. if (ret != 0)
  12746. return ret;
  12747. #endif
  12748. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  12749. defined(WOLFSSL_ALLOW_TLS_SHA1))
  12750. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  12751. if (ret != 0)
  12752. return ret;
  12753. #endif
  12754. }
  12755. return ret;
  12756. }
  12757. #endif /* !NO_CERTS */
  12758. #ifndef WOLFSSL_NO_TLS12
  12759. /* Persistable BuildMessage arguments */
  12760. typedef struct BuildMsgArgs {
  12761. word32 digestSz;
  12762. word32 sz;
  12763. word32 pad;
  12764. word32 idx;
  12765. word32 headerSz;
  12766. word16 size;
  12767. word32 ivSz; /* TLSv1.1 IV */
  12768. byte* iv;
  12769. } BuildMsgArgs;
  12770. static void FreeBuildMsgArgs(WOLFSSL* ssl, void* pArgs)
  12771. {
  12772. BuildMsgArgs* args = (BuildMsgArgs*)pArgs;
  12773. (void)ssl;
  12774. (void)args;
  12775. if (args->iv) {
  12776. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  12777. args->iv = NULL;
  12778. }
  12779. }
  12780. #endif
  12781. /* Build SSL Message, encrypted */
  12782. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  12783. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay)
  12784. {
  12785. #ifndef WOLFSSL_NO_TLS12
  12786. int ret = 0;
  12787. BuildMsgArgs* args;
  12788. BuildMsgArgs lcl_args;
  12789. #ifdef WOLFSSL_ASYNC_CRYPT
  12790. args = (BuildMsgArgs*)ssl->async.args;
  12791. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  12792. (void)sizeof(args_test);
  12793. #endif
  12794. #endif
  12795. WOLFSSL_ENTER("BuildMessage");
  12796. if (ssl == NULL) {
  12797. return BAD_FUNC_ARG;
  12798. }
  12799. #ifdef WOLFSSL_NO_TLS12
  12800. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  12801. hashOutput, sizeOnly, asyncOkay);
  12802. #else
  12803. #ifdef WOLFSSL_TLS13
  12804. if (ssl->options.tls1_3) {
  12805. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  12806. hashOutput, sizeOnly, asyncOkay);
  12807. }
  12808. #endif
  12809. ret = WC_NOT_PENDING_E;
  12810. #ifdef WOLFSSL_ASYNC_CRYPT
  12811. if (asyncOkay) {
  12812. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  12813. if (ret != WC_NOT_PENDING_E) {
  12814. /* Check for error */
  12815. if (ret < 0)
  12816. goto exit_buildmsg;
  12817. }
  12818. }
  12819. else
  12820. #endif
  12821. {
  12822. args = &lcl_args;
  12823. }
  12824. /* Reset state */
  12825. if (ret == WC_NOT_PENDING_E) {
  12826. ret = 0;
  12827. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  12828. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  12829. args->sz = RECORD_HEADER_SZ + inSz;
  12830. args->idx = RECORD_HEADER_SZ;
  12831. args->headerSz = RECORD_HEADER_SZ;
  12832. #ifdef WOLFSSL_ASYNC_CRYPT
  12833. ssl->async.freeArgs = FreeBuildMsgArgs;
  12834. #endif
  12835. }
  12836. switch (ssl->options.buildMsgState) {
  12837. case BUILD_MSG_BEGIN:
  12838. {
  12839. /* catch mistaken sizeOnly parameter */
  12840. if (!sizeOnly && (output == NULL || input == NULL) ) {
  12841. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  12842. }
  12843. if (sizeOnly && (output || input) ) {
  12844. WOLFSSL_MSG("BuildMessage w/sizeOnly doesn't need input/output");
  12845. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  12846. }
  12847. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  12848. }
  12849. FALL_THROUGH;
  12850. case BUILD_MSG_SIZE:
  12851. {
  12852. args->digestSz = ssl->specs.hash_size;
  12853. #ifdef HAVE_TRUNCATED_HMAC
  12854. if (ssl->truncated_hmac)
  12855. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  12856. #endif
  12857. args->sz += args->digestSz;
  12858. #ifdef WOLFSSL_DTLS
  12859. if (ssl->options.dtls) {
  12860. args->sz += DTLS_RECORD_EXTRA;
  12861. args->idx += DTLS_RECORD_EXTRA;
  12862. args->headerSz += DTLS_RECORD_EXTRA;
  12863. }
  12864. #endif
  12865. #ifndef WOLFSSL_AEAD_ONLY
  12866. if (ssl->specs.cipher_type == block) {
  12867. word32 blockSz = ssl->specs.block_size;
  12868. if (ssl->options.tls1_1) {
  12869. args->ivSz = blockSz;
  12870. args->sz += args->ivSz;
  12871. if (args->ivSz > MAX_IV_SZ)
  12872. ERROR_OUT(BUFFER_E, exit_buildmsg);
  12873. }
  12874. args->sz += 1; /* pad byte */
  12875. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12876. if (ssl->options.encThenMac) {
  12877. args->pad = (args->sz - args->headerSz -
  12878. args->digestSz) % blockSz;
  12879. }
  12880. else
  12881. #endif
  12882. args->pad = (args->sz - args->headerSz) % blockSz;
  12883. #ifdef OPENSSL_EXTRA
  12884. if(args->pad != 0)
  12885. #endif
  12886. args->pad = blockSz - args->pad;
  12887. args->sz += args->pad;
  12888. }
  12889. #endif /* WOLFSSL_AEAD_ONLY */
  12890. #ifdef HAVE_AEAD
  12891. if (ssl->specs.cipher_type == aead) {
  12892. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  12893. args->ivSz = AESGCM_EXP_IV_SZ;
  12894. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  12895. }
  12896. #endif
  12897. /* done with size calculations */
  12898. if (sizeOnly)
  12899. goto exit_buildmsg;
  12900. if (args->sz > (word32)outSz) {
  12901. WOLFSSL_MSG("Oops, want to write past output buffer size");
  12902. ERROR_OUT(BUFFER_E, exit_buildmsg);
  12903. }
  12904. if (args->ivSz > 0) {
  12905. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap, DYNAMIC_TYPE_SALT);
  12906. if (args->iv == NULL)
  12907. ERROR_OUT(MEMORY_E, exit_buildmsg);
  12908. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  12909. if (ret != 0)
  12910. goto exit_buildmsg;
  12911. }
  12912. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  12913. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  12914. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  12915. defined(HAVE_AEAD))
  12916. if (ssl->specs.cipher_type == aead) {
  12917. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  12918. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  12919. }
  12920. #endif
  12921. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  12922. AddRecordHeader(output, args->size, (byte)type, ssl);
  12923. /* write to output */
  12924. if (args->ivSz > 0) {
  12925. XMEMCPY(output + args->idx, args->iv,
  12926. min(args->ivSz, MAX_IV_SZ));
  12927. args->idx += args->ivSz;
  12928. }
  12929. XMEMCPY(output + args->idx, input, inSz);
  12930. args->idx += inSz;
  12931. ssl->options.buildMsgState = BUILD_MSG_HASH;
  12932. }
  12933. FALL_THROUGH;
  12934. case BUILD_MSG_HASH:
  12935. {
  12936. if (type == handshake && hashOutput) {
  12937. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  12938. if (ret != 0)
  12939. goto exit_buildmsg;
  12940. }
  12941. #ifndef WOLFSSL_AEAD_ONLY
  12942. if (ssl->specs.cipher_type == block) {
  12943. word32 tmpIdx;
  12944. word32 i;
  12945. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12946. if (ssl->options.encThenMac)
  12947. tmpIdx = args->idx;
  12948. else
  12949. #endif
  12950. tmpIdx = args->idx + args->digestSz;
  12951. for (i = 0; i <= args->pad; i++)
  12952. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  12953. }
  12954. #endif
  12955. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  12956. }
  12957. FALL_THROUGH;
  12958. case BUILD_MSG_VERIFY_MAC:
  12959. {
  12960. /* User Record Layer Callback handling */
  12961. #ifdef ATOMIC_USER
  12962. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12963. if (ssl->options.encThenMac) {
  12964. if (ssl->ctx->EncryptMacCb) {
  12965. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  12966. args->pad + 1, type, 0,
  12967. output + args->headerSz,
  12968. output + args->headerSz,
  12969. args->size - args->digestSz,
  12970. ssl->MacEncryptCtx);
  12971. goto exit_buildmsg;
  12972. }
  12973. }
  12974. else
  12975. #endif
  12976. {
  12977. if (ssl->ctx->MacEncryptCb) {
  12978. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  12979. output + args->headerSz + args->ivSz, inSz,
  12980. type, 0, output + args->headerSz,
  12981. output + args->headerSz, args->size,
  12982. ssl->MacEncryptCtx);
  12983. goto exit_buildmsg;
  12984. }
  12985. }
  12986. #endif
  12987. #ifndef WOLFSSL_AEAD_ONLY
  12988. if (ssl->specs.cipher_type != aead
  12989. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12990. && !ssl->options.encThenMac
  12991. #endif
  12992. ) {
  12993. #ifdef HAVE_TRUNCATED_HMAC
  12994. if (ssl->truncated_hmac &&
  12995. ssl->specs.hash_size > args->digestSz) {
  12996. #ifdef WOLFSSL_SMALL_STACK
  12997. byte* hmac = NULL;
  12998. #else
  12999. byte hmac[WC_MAX_DIGEST_SIZE];
  13000. #endif
  13001. #ifdef WOLFSSL_SMALL_STACK
  13002. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  13003. DYNAMIC_TYPE_DIGEST);
  13004. if (hmac == NULL)
  13005. ERROR_OUT(MEMORY_E, exit_buildmsg);
  13006. #endif
  13007. ret = ssl->hmac(ssl, hmac,
  13008. output + args->headerSz + args->ivSz, inSz,
  13009. -1, type, 0);
  13010. XMEMCPY(output + args->idx, hmac, args->digestSz);
  13011. #ifdef WOLFSSL_SMALL_STACK
  13012. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  13013. #endif
  13014. }
  13015. else
  13016. #endif
  13017. {
  13018. ret = ssl->hmac(ssl, output + args->idx, output +
  13019. args->headerSz + args->ivSz, inSz, -1, type, 0);
  13020. }
  13021. }
  13022. #endif /* WOLFSSL_AEAD_ONLY */
  13023. if (ret != 0)
  13024. goto exit_buildmsg;
  13025. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  13026. }
  13027. FALL_THROUGH;
  13028. case BUILD_MSG_ENCRYPT:
  13029. {
  13030. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13031. if (ssl->options.encThenMac) {
  13032. ret = Encrypt(ssl, output + args->headerSz,
  13033. output + args->headerSz,
  13034. args->size - args->digestSz, asyncOkay);
  13035. }
  13036. else
  13037. #endif
  13038. {
  13039. ret = Encrypt(ssl, output + args->headerSz,
  13040. output + args->headerSz, args->size, asyncOkay);
  13041. }
  13042. if (ret != 0)
  13043. goto exit_buildmsg;
  13044. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  13045. }
  13046. FALL_THROUGH;
  13047. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  13048. {
  13049. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13050. if (ssl->options.encThenMac) {
  13051. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  13052. #ifdef HAVE_TRUNCATED_HMAC
  13053. if (ssl->truncated_hmac &&
  13054. ssl->specs.hash_size > args->digestSz) {
  13055. #ifdef WOLFSSL_SMALL_STACK
  13056. byte* hmac = NULL;
  13057. #else
  13058. byte hmac[WC_MAX_DIGEST_SIZE];
  13059. #endif
  13060. #ifdef WOLFSSL_SMALL_STACK
  13061. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  13062. DYNAMIC_TYPE_DIGEST);
  13063. if (hmac == NULL)
  13064. ERROR_OUT(MEMORY_E, exit_buildmsg);
  13065. #endif
  13066. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  13067. args->ivSz + inSz + args->pad + 1, -1, type,
  13068. 0);
  13069. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  13070. args->digestSz);
  13071. #ifdef WOLFSSL_SMALL_STACK
  13072. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  13073. #endif
  13074. }
  13075. else
  13076. #endif
  13077. {
  13078. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  13079. output + args->headerSz,
  13080. args->ivSz + inSz + args->pad + 1, -1, type,
  13081. 0);
  13082. }
  13083. }
  13084. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  13085. }
  13086. }
  13087. exit_buildmsg:
  13088. WOLFSSL_LEAVE("BuildMessage", ret);
  13089. #ifdef WOLFSSL_ASYNC_CRYPT
  13090. if (ret == WC_PENDING_E) {
  13091. return ret;
  13092. }
  13093. #endif
  13094. /* make sure build message state is reset */
  13095. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  13096. #ifdef WOLFSSL_DTLS
  13097. if (ret == 0 && ssl->options.dtls)
  13098. DtlsSEQIncrement(ssl, CUR_ORDER);
  13099. #endif
  13100. /* return sz on success */
  13101. if (ret == 0)
  13102. ret = args->sz;
  13103. /* Final cleanup */
  13104. FreeBuildMsgArgs(ssl, args);
  13105. #ifdef WOLFSSL_ASYNC_CRYPT
  13106. ssl->async.freeArgs = NULL;
  13107. #endif
  13108. return ret;
  13109. #endif /* !WOLFSSL_NO_TLS12 */
  13110. }
  13111. #ifndef WOLFSSL_NO_TLS12
  13112. int SendFinished(WOLFSSL* ssl)
  13113. {
  13114. int sendSz,
  13115. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  13116. FINISHED_SZ;
  13117. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  13118. byte *output;
  13119. Hashes* hashes;
  13120. int ret;
  13121. int headerSz = HANDSHAKE_HEADER_SZ;
  13122. int outputSz;
  13123. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  13124. WOLFSSL_ENTER("SendFinished");
  13125. /* setup encrypt keys */
  13126. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  13127. return ret;
  13128. /* check for available size */
  13129. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  13130. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  13131. return ret;
  13132. #ifdef WOLFSSL_DTLS
  13133. if (ssl->options.dtls) {
  13134. headerSz += DTLS_HANDSHAKE_EXTRA;
  13135. ssl->keys.dtls_epoch++;
  13136. ssl->keys.dtls_prev_sequence_number_hi =
  13137. ssl->keys.dtls_sequence_number_hi;
  13138. ssl->keys.dtls_prev_sequence_number_lo =
  13139. ssl->keys.dtls_sequence_number_lo;
  13140. ssl->keys.dtls_sequence_number_hi = 0;
  13141. ssl->keys.dtls_sequence_number_lo = 0;
  13142. }
  13143. #endif
  13144. /* get output buffer */
  13145. output = ssl->buffers.outputBuffer.buffer +
  13146. ssl->buffers.outputBuffer.length;
  13147. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  13148. /* make finished hashes */
  13149. hashes = (Hashes*)&input[headerSz];
  13150. ret = BuildFinished(ssl, hashes,
  13151. ssl->options.side == WOLFSSL_CLIENT_END ? client : server);
  13152. if (ret != 0) return ret;
  13153. #ifdef HAVE_SECURE_RENEGOTIATION
  13154. if (ssl->secure_renegotiation) {
  13155. if (ssl->options.side == WOLFSSL_CLIENT_END)
  13156. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  13157. TLS_FINISHED_SZ);
  13158. else
  13159. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  13160. TLS_FINISHED_SZ);
  13161. }
  13162. #endif
  13163. #ifdef WOLFSSL_DTLS
  13164. if (IsDtlsNotSctpMode(ssl)) {
  13165. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz)) != 0)
  13166. return ret;
  13167. }
  13168. #endif
  13169. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  13170. handshake, 1, 0, 0);
  13171. if (sendSz < 0)
  13172. return BUILD_MSG_ERROR;
  13173. if (!ssl->options.resuming) {
  13174. #ifndef NO_SESSION_CACHE
  13175. AddSession(ssl); /* just try */
  13176. #endif
  13177. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13178. #ifdef OPENSSL_EXTRA
  13179. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  13180. ssl->cbmode = SSL_CB_MODE_WRITE;
  13181. if (ssl->CBIS != NULL)
  13182. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  13183. #endif
  13184. ssl->options.handShakeState = HANDSHAKE_DONE;
  13185. ssl->options.handShakeDone = 1;
  13186. }
  13187. }
  13188. else {
  13189. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13190. #ifdef OPENSSL_EXTRA
  13191. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  13192. ssl->cbmode = SSL_CB_MODE_WRITE;
  13193. if (ssl->CBIS != NULL)
  13194. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  13195. #endif
  13196. ssl->options.handShakeState = HANDSHAKE_DONE;
  13197. ssl->options.handShakeDone = 1;
  13198. }
  13199. }
  13200. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13201. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  13202. if (ssl->toInfoOn)
  13203. AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  13204. WRITE_PROTO, ssl->heap);
  13205. #endif
  13206. ssl->buffers.outputBuffer.length += sendSz;
  13207. ret = SendBuffered(ssl);
  13208. WOLFSSL_LEAVE("SendFinished", ret);
  13209. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  13210. return ret;
  13211. }
  13212. #endif /* WOLFSSL_NO_TLS12 */
  13213. #ifndef NO_WOLFSSL_SERVER
  13214. #if (!defined(WOLFSSL_NO_TLS12) && \
  13215. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  13216. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  13217. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  13218. /* Parses and decodes the certificate then initializes "request". In the case
  13219. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  13220. *
  13221. * Returns 0 on success
  13222. */
  13223. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  13224. DecodedCert* cert, byte* certData, word32 length)
  13225. {
  13226. int ret;
  13227. if (request != NULL)
  13228. XMEMSET(request, 0, sizeof(OcspRequest));
  13229. InitDecodedCert(cert, certData, length, ssl->heap);
  13230. /* TODO: Setup async support here */
  13231. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, ssl->ctx->cm);
  13232. if (ret != 0) {
  13233. WOLFSSL_MSG("ParseCert failed");
  13234. }
  13235. if (ret == 0)
  13236. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  13237. if (ret == 0) {
  13238. /* make sure ctx OCSP request is updated */
  13239. if (!ssl->buffers.weOwnCert) {
  13240. wolfSSL_Mutex* ocspLock = &ssl->ctx->cm->ocsp_stapling->ocspLock;
  13241. if (wc_LockMutex(ocspLock) == 0) {
  13242. if (ssl->ctx->certOcspRequest == NULL)
  13243. ssl->ctx->certOcspRequest = request;
  13244. wc_UnLockMutex(ocspLock);
  13245. }
  13246. }
  13247. }
  13248. FreeDecodedCert(cert);
  13249. return ret;
  13250. }
  13251. /* Creates OCSP response and places it in variable "response". Memory
  13252. * management for "buffer* response" is up to the caller.
  13253. *
  13254. * Also creates an OcspRequest in the case that ocspRequest is null or that
  13255. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  13256. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  13257. * be set to point to "ocspRequest" and it then should not be free'd since
  13258. * wolfSSL_CTX_free will take care of it.
  13259. *
  13260. * Returns 0 on success
  13261. */
  13262. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  13263. buffer* response)
  13264. {
  13265. int ret = 0;
  13266. OcspRequest* request = NULL;
  13267. byte createdRequest = 0;
  13268. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  13269. return BAD_FUNC_ARG;
  13270. XMEMSET(response, 0, sizeof(*response));
  13271. request = *ocspRequest;
  13272. /* unable to fetch status. skip. */
  13273. if (ssl->ctx->cm == NULL || ssl->ctx->cm->ocspStaplingEnabled == 0)
  13274. return 0;
  13275. if (request == NULL || ssl->buffers.weOwnCert) {
  13276. DerBuffer* der = ssl->buffers.certificate;
  13277. #ifdef WOLFSSL_SMALL_STACK
  13278. DecodedCert* cert = NULL;
  13279. #else
  13280. DecodedCert cert[1];
  13281. #endif
  13282. /* unable to fetch status. skip. */
  13283. if (der->buffer == NULL || der->length == 0)
  13284. return 0;
  13285. #ifdef WOLFSSL_SMALL_STACK
  13286. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  13287. DYNAMIC_TYPE_DCERT);
  13288. if (cert == NULL)
  13289. return MEMORY_E;
  13290. #endif
  13291. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  13292. DYNAMIC_TYPE_OCSP_REQUEST);
  13293. if (request == NULL)
  13294. ret = MEMORY_E;
  13295. createdRequest = 1;
  13296. if (ret == 0) {
  13297. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  13298. der->length);
  13299. }
  13300. if (ret != 0) {
  13301. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  13302. request = NULL;
  13303. }
  13304. #ifdef WOLFSSL_SMALL_STACK
  13305. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  13306. #endif
  13307. }
  13308. if (ret == 0) {
  13309. request->ssl = ssl;
  13310. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling, request, response);
  13311. /* Suppressing, not critical */
  13312. if (ret == OCSP_CERT_REVOKED ||
  13313. ret == OCSP_CERT_UNKNOWN ||
  13314. ret == OCSP_LOOKUP_FAIL) {
  13315. ret = 0;
  13316. }
  13317. }
  13318. /* free request up if error case found otherwise return it */
  13319. if (ret != 0 && createdRequest) {
  13320. FreeOcspRequest(request);
  13321. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  13322. }
  13323. if (ret == 0)
  13324. *ocspRequest = request;
  13325. return ret;
  13326. }
  13327. #endif
  13328. #endif /* !NO_WOLFSSL_SERVER */
  13329. #ifndef WOLFSSL_NO_TLS12
  13330. #ifndef NO_CERTS
  13331. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  13332. /* handle generation of certificate (11) */
  13333. int SendCertificate(WOLFSSL* ssl)
  13334. {
  13335. int ret = 0;
  13336. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  13337. word32 length, maxFragment;
  13338. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  13339. WOLFSSL_ENTER("SendCertificate");
  13340. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  13341. return 0; /* not needed */
  13342. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  13343. #ifdef OPENSSL_EXTRA
  13344. if (ssl->version.major == SSLv3_MAJOR
  13345. && ssl->version.minor == SSLv3_MINOR){
  13346. SendAlert(ssl, alert_warning, no_certificate);
  13347. return 0;
  13348. } else {
  13349. #endif
  13350. certSz = 0;
  13351. certChainSz = 0;
  13352. headerSz = CERT_HEADER_SZ;
  13353. length = CERT_HEADER_SZ;
  13354. listSz = 0;
  13355. #ifdef OPENSSL_EXTRA
  13356. }
  13357. #endif
  13358. }
  13359. else {
  13360. if (!ssl->buffers.certificate) {
  13361. WOLFSSL_MSG("Send Cert missing certificate buffer");
  13362. return BUFFER_ERROR;
  13363. }
  13364. certSz = ssl->buffers.certificate->length;
  13365. headerSz = 2 * CERT_HEADER_SZ;
  13366. /* list + cert size */
  13367. length = certSz + headerSz;
  13368. listSz = certSz + CERT_HEADER_SZ;
  13369. /* may need to send rest of chain, already has leading size(s) */
  13370. if (certSz && ssl->buffers.certChain) {
  13371. certChainSz = ssl->buffers.certChain->length;
  13372. length += certChainSz;
  13373. listSz += certChainSz;
  13374. }
  13375. else
  13376. certChainSz = 0;
  13377. }
  13378. payloadSz = length;
  13379. if (ssl->fragOffset != 0)
  13380. length -= (ssl->fragOffset + headerSz);
  13381. maxFragment = MAX_RECORD_SIZE;
  13382. if (ssl->options.dtls) {
  13383. #ifdef WOLFSSL_DTLS
  13384. /* The 100 bytes is used to account for the UDP and IP headers.
  13385. It can also include the record padding and MAC if the
  13386. SendCertificate is called for a secure renegotiation. */
  13387. maxFragment = MAX_MTU - DTLS_RECORD_HEADER_SZ
  13388. - DTLS_HANDSHAKE_HEADER_SZ - 100;
  13389. #endif /* WOLFSSL_DTLS */
  13390. }
  13391. maxFragment = wolfSSL_GetMaxRecordSize(ssl, maxFragment);
  13392. while (length > 0 && ret == 0) {
  13393. byte* output = NULL;
  13394. word32 fragSz = 0;
  13395. word32 i = RECORD_HEADER_SZ;
  13396. int sendSz = RECORD_HEADER_SZ;
  13397. if (!ssl->options.dtls) {
  13398. if (ssl->fragOffset == 0) {
  13399. if (headerSz + certSz + certChainSz <=
  13400. maxFragment - HANDSHAKE_HEADER_SZ) {
  13401. fragSz = headerSz + certSz + certChainSz;
  13402. }
  13403. else {
  13404. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  13405. }
  13406. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  13407. i += HANDSHAKE_HEADER_SZ;
  13408. }
  13409. else {
  13410. fragSz = min(length, maxFragment);
  13411. sendSz += fragSz;
  13412. }
  13413. if (IsEncryptionOn(ssl, 1))
  13414. sendSz += MAX_MSG_EXTRA;
  13415. }
  13416. else {
  13417. #ifdef WOLFSSL_DTLS
  13418. fragSz = min(length, maxFragment);
  13419. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA
  13420. + HANDSHAKE_HEADER_SZ;
  13421. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA
  13422. + HANDSHAKE_HEADER_SZ;
  13423. #endif
  13424. }
  13425. /* check for available size */
  13426. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  13427. return ret;
  13428. /* get output buffer */
  13429. output = ssl->buffers.outputBuffer.buffer +
  13430. ssl->buffers.outputBuffer.length;
  13431. if (ssl->fragOffset == 0) {
  13432. if (!ssl->options.dtls) {
  13433. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  13434. if (!IsEncryptionOn(ssl, 1))
  13435. HashOutputRaw(ssl, output + RECORD_HEADER_SZ,
  13436. HANDSHAKE_HEADER_SZ);
  13437. }
  13438. else {
  13439. #ifdef WOLFSSL_DTLS
  13440. AddHeaders(output, payloadSz, certificate, ssl);
  13441. if (!IsEncryptionOn(ssl, 1))
  13442. HashOutputRaw(ssl,
  13443. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  13444. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  13445. /* Adding the headers increments these, decrement them for
  13446. * actual message header. */
  13447. ssl->keys.dtls_handshake_number--;
  13448. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  13449. ssl->keys.dtls_handshake_number--;
  13450. #endif /* WOLFSSL_DTLS */
  13451. }
  13452. /* list total */
  13453. c32to24(listSz, output + i);
  13454. if (!IsEncryptionOn(ssl, 1))
  13455. HashOutputRaw(ssl, output + i, CERT_HEADER_SZ);
  13456. i += CERT_HEADER_SZ;
  13457. length -= CERT_HEADER_SZ;
  13458. fragSz -= CERT_HEADER_SZ;
  13459. if (certSz) {
  13460. c32to24(certSz, output + i);
  13461. if (!IsEncryptionOn(ssl, 1))
  13462. HashOutputRaw(ssl, output + i, CERT_HEADER_SZ);
  13463. i += CERT_HEADER_SZ;
  13464. length -= CERT_HEADER_SZ;
  13465. fragSz -= CERT_HEADER_SZ;
  13466. if (!IsEncryptionOn(ssl, 1)) {
  13467. HashOutputRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  13468. if (certChainSz)
  13469. HashOutputRaw(ssl, ssl->buffers.certChain->buffer,
  13470. certChainSz);
  13471. }
  13472. }
  13473. }
  13474. else {
  13475. if (!ssl->options.dtls) {
  13476. AddRecordHeader(output, fragSz, handshake, ssl);
  13477. }
  13478. else {
  13479. #ifdef WOLFSSL_DTLS
  13480. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  13481. payloadSz, certificate, ssl);
  13482. ssl->keys.dtls_handshake_number--;
  13483. #endif /* WOLFSSL_DTLS */
  13484. }
  13485. }
  13486. /* member */
  13487. if (certSz && ssl->fragOffset < certSz) {
  13488. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  13489. XMEMCPY(output + i,
  13490. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  13491. i += copySz;
  13492. ssl->fragOffset += copySz;
  13493. length -= copySz;
  13494. fragSz -= copySz;
  13495. }
  13496. if (certChainSz && fragSz) {
  13497. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  13498. XMEMCPY(output + i,
  13499. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  13500. copySz);
  13501. i += copySz;
  13502. ssl->fragOffset += copySz;
  13503. length -= copySz;
  13504. }
  13505. if (IsEncryptionOn(ssl, 1)) {
  13506. byte* input = NULL;
  13507. int inputSz = i - RECORD_HEADER_SZ; /* build msg adds rec hdr */
  13508. if (inputSz < 0) {
  13509. WOLFSSL_MSG("Send Cert bad inputSz");
  13510. return BUFFER_E;
  13511. }
  13512. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  13513. input = (byte*)XMALLOC(inputSz, ssl->heap,
  13514. DYNAMIC_TYPE_IN_BUFFER);
  13515. if (input == NULL)
  13516. return MEMORY_E;
  13517. XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
  13518. }
  13519. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  13520. handshake, 1, 0, 0);
  13521. if (inputSz > 0)
  13522. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  13523. if (sendSz < 0)
  13524. return sendSz;
  13525. }
  13526. else {
  13527. #ifdef WOLFSSL_DTLS
  13528. if (ssl->options.dtls)
  13529. DtlsSEQIncrement(ssl, CUR_ORDER);
  13530. #endif
  13531. }
  13532. #ifdef WOLFSSL_DTLS
  13533. if (IsDtlsNotSctpMode(ssl)) {
  13534. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
  13535. return ret;
  13536. }
  13537. #endif
  13538. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13539. if (ssl->hsInfoOn)
  13540. AddPacketName(ssl, "Certificate");
  13541. if (ssl->toInfoOn)
  13542. AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  13543. WRITE_PROTO, ssl->heap);
  13544. #endif
  13545. ssl->buffers.outputBuffer.length += sendSz;
  13546. if (!ssl->options.groupMessages)
  13547. ret = SendBuffered(ssl);
  13548. }
  13549. if (ret != WANT_WRITE) {
  13550. /* Clean up the fragment offset. */
  13551. ssl->fragOffset = 0;
  13552. #ifdef WOLFSSL_DTLS
  13553. if (ssl->options.dtls)
  13554. ssl->keys.dtls_handshake_number++;
  13555. #endif
  13556. if (ssl->options.side == WOLFSSL_SERVER_END){
  13557. ssl->options.serverState = SERVER_CERT_COMPLETE;
  13558. }
  13559. }
  13560. WOLFSSL_LEAVE("SendCertificate", ret);
  13561. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  13562. return ret;
  13563. }
  13564. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  13565. /* handle generation of certificate_request (13) */
  13566. int SendCertificateRequest(WOLFSSL* ssl)
  13567. {
  13568. byte *output;
  13569. int ret;
  13570. int sendSz;
  13571. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  13572. word32 dnLen = 0;
  13573. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  13574. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  13575. #endif
  13576. int typeTotal = 1; /* only 1 for now */
  13577. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  13578. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  13579. WOLFSSL_ENTER("SendCertificateRequest");
  13580. if (IsAtLeastTLSv1_2(ssl))
  13581. reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz;
  13582. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  13583. /* Certificate Authorities */
  13584. names = ssl->ctx->ca_names;
  13585. while (names != NULL) {
  13586. byte seq[MAX_SEQ_SZ];
  13587. /* 16-bit length | SEQ | Len | DER of name */
  13588. dnLen += OPAQUE16_LEN + SetSequence(names->data.name->rawLen, seq) +
  13589. names->data.name->rawLen;
  13590. names = names->next;
  13591. }
  13592. reqSz += dnLen;
  13593. #endif
  13594. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  13595. return 0; /* not needed */
  13596. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  13597. if (!ssl->options.dtls) {
  13598. if (IsEncryptionOn(ssl, 1))
  13599. sendSz += MAX_MSG_EXTRA;
  13600. }
  13601. else {
  13602. #ifdef WOLFSSL_DTLS
  13603. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  13604. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  13605. #endif
  13606. }
  13607. /* check for available size */
  13608. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  13609. return ret;
  13610. /* get output buffer */
  13611. output = ssl->buffers.outputBuffer.buffer +
  13612. ssl->buffers.outputBuffer.length;
  13613. AddHeaders(output, reqSz, certificate_request, ssl);
  13614. /* write to output */
  13615. output[i++] = (byte)typeTotal; /* # of types */
  13616. #ifdef HAVE_ECC
  13617. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  13618. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  13619. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  13620. output[i++] = ecdsa_sign;
  13621. } else
  13622. #endif /* HAVE_ECC */
  13623. {
  13624. output[i++] = rsa_sign;
  13625. }
  13626. /* supported hash/sig */
  13627. if (IsAtLeastTLSv1_2(ssl)) {
  13628. c16toa(ssl->suites->hashSigAlgoSz, &output[i]);
  13629. i += OPAQUE16_LEN;
  13630. XMEMCPY(&output[i],
  13631. ssl->suites->hashSigAlgo, ssl->suites->hashSigAlgoSz);
  13632. i += ssl->suites->hashSigAlgoSz;
  13633. }
  13634. /* Certificate Authorities */
  13635. c16toa((word16)dnLen, &output[i]); /* auth's */
  13636. i += REQ_HEADER_SZ;
  13637. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  13638. names = ssl->ctx->ca_names;
  13639. while (names != NULL) {
  13640. byte seq[MAX_SEQ_SZ];
  13641. c16toa((word16)names->data.name->rawLen +
  13642. SetSequence(names->data.name->rawLen, seq), &output[i]);
  13643. i += OPAQUE16_LEN;
  13644. i += SetSequence(names->data.name->rawLen, output + i);
  13645. XMEMCPY(output + i, names->data.name->raw, names->data.name->rawLen);
  13646. i += names->data.name->rawLen;
  13647. names = names->next;
  13648. }
  13649. #endif
  13650. (void)i;
  13651. if (IsEncryptionOn(ssl, 1)) {
  13652. byte* input;
  13653. int inputSz = i - RECORD_HEADER_SZ; /* build msg adds rec hdr */
  13654. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  13655. if (input == NULL)
  13656. return MEMORY_E;
  13657. XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
  13658. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  13659. handshake, 1, 0, 0);
  13660. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  13661. if (sendSz < 0)
  13662. return sendSz;
  13663. } else {
  13664. #ifdef WOLFSSL_DTLS
  13665. if (ssl->options.dtls)
  13666. DtlsSEQIncrement(ssl, CUR_ORDER);
  13667. if (IsDtlsNotSctpMode(ssl)) {
  13668. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
  13669. return ret;
  13670. }
  13671. #endif
  13672. ret = HashOutput(ssl, output, sendSz, 0);
  13673. if (ret != 0)
  13674. return ret;
  13675. }
  13676. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13677. if (ssl->hsInfoOn)
  13678. AddPacketName(ssl, "CertificateRequest");
  13679. if (ssl->toInfoOn)
  13680. AddPacketInfo(ssl, "CertificateRequest", handshake, output, sendSz,
  13681. WRITE_PROTO, ssl->heap);
  13682. #endif
  13683. ssl->buffers.outputBuffer.length += sendSz;
  13684. if (ssl->options.groupMessages)
  13685. ret = 0;
  13686. else
  13687. ret = SendBuffered(ssl);
  13688. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  13689. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  13690. return ret;
  13691. }
  13692. #ifndef NO_WOLFSSL_SERVER
  13693. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  13694. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  13695. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  13696. byte count)
  13697. {
  13698. byte* output = NULL;
  13699. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  13700. word32 length = ENUM_LEN;
  13701. int sendSz = 0;
  13702. int ret = 0;
  13703. int i = 0;
  13704. WOLFSSL_ENTER("BuildCertificateStatus");
  13705. switch (type) {
  13706. case WOLFSSL_CSR2_OCSP_MULTI:
  13707. length += OPAQUE24_LEN;
  13708. FALL_THROUGH; /* followed by */
  13709. case WOLFSSL_CSR2_OCSP:
  13710. for (i = 0; i < count; i++)
  13711. length += OPAQUE24_LEN + status[i].length;
  13712. break;
  13713. default:
  13714. return 0;
  13715. }
  13716. sendSz = idx + length;
  13717. if (ssl->keys.encryptionOn)
  13718. sendSz += MAX_MSG_EXTRA;
  13719. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  13720. output = ssl->buffers.outputBuffer.buffer +
  13721. ssl->buffers.outputBuffer.length;
  13722. AddHeaders(output, length, certificate_status, ssl);
  13723. output[idx++] = type;
  13724. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  13725. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  13726. idx += OPAQUE24_LEN;
  13727. }
  13728. for (i = 0; i < count; i++) {
  13729. c32to24(status[i].length, output + idx);
  13730. idx += OPAQUE24_LEN;
  13731. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  13732. idx += status[i].length;
  13733. }
  13734. if (IsEncryptionOn(ssl, 1)) {
  13735. byte* input;
  13736. int inputSz = idx - RECORD_HEADER_SZ;
  13737. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  13738. if (input == NULL)
  13739. return MEMORY_E;
  13740. XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
  13741. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  13742. handshake, 1, 0, 0);
  13743. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  13744. if (sendSz < 0)
  13745. ret = sendSz;
  13746. }
  13747. else {
  13748. #ifdef WOLFSSL_DTLS
  13749. if (ssl->options.dtls)
  13750. DtlsSEQIncrement(ssl, CUR_ORDER);
  13751. #endif
  13752. ret = HashOutput(ssl, output, sendSz, 0);
  13753. }
  13754. #ifdef WOLFSSL_DTLS
  13755. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  13756. ret = DtlsMsgPoolSave(ssl, output, sendSz);
  13757. #endif
  13758. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13759. if (ret == 0 && ssl->hsInfoOn)
  13760. AddPacketName(ssl, "CertificateStatus");
  13761. if (ret == 0 && ssl->toInfoOn)
  13762. AddPacketInfo(ssl, "CertificateStatus", handshake, output, sendSz,
  13763. WRITE_PROTO, ssl->heap);
  13764. #endif
  13765. if (ret == 0) {
  13766. ssl->buffers.outputBuffer.length += sendSz;
  13767. if (!ssl->options.groupMessages)
  13768. ret = SendBuffered(ssl);
  13769. }
  13770. }
  13771. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  13772. return ret;
  13773. }
  13774. #endif
  13775. #endif /* NO_WOLFSSL_SERVER */
  13776. /* handle generation of certificate_status (22) */
  13777. int SendCertificateStatus(WOLFSSL* ssl)
  13778. {
  13779. int ret = 0;
  13780. byte status_type = 0;
  13781. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  13782. WOLFSSL_ENTER("SendCertificateStatus");
  13783. (void) ssl;
  13784. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  13785. status_type = ssl->status_request;
  13786. #endif
  13787. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13788. status_type = status_type ? status_type : ssl->status_request_v2;
  13789. #endif
  13790. switch (status_type) {
  13791. #ifndef NO_WOLFSSL_SERVER
  13792. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  13793. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  13794. /* case WOLFSSL_CSR_OCSP: */
  13795. case WOLFSSL_CSR2_OCSP:
  13796. {
  13797. OcspRequest* request = ssl->ctx->certOcspRequest;
  13798. buffer response;
  13799. ret = CreateOcspResponse(ssl, &request, &response);
  13800. /* if a request was successfully created and not stored in
  13801. * ssl->ctx then free it */
  13802. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  13803. FreeOcspRequest(request);
  13804. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  13805. request = NULL;
  13806. }
  13807. if (ret == 0 && response.buffer) {
  13808. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  13809. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  13810. response.buffer = NULL;
  13811. }
  13812. break;
  13813. }
  13814. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  13815. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  13816. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13817. case WOLFSSL_CSR2_OCSP_MULTI:
  13818. {
  13819. OcspRequest* request = ssl->ctx->certOcspRequest;
  13820. buffer responses[1 + MAX_CHAIN_DEPTH];
  13821. int i = 0;
  13822. XMEMSET(responses, 0, sizeof(responses));
  13823. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  13824. /* if a request was successfully created and not stored in
  13825. * ssl->ctx then free it */
  13826. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  13827. FreeOcspRequest(request);
  13828. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  13829. request = NULL;
  13830. }
  13831. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  13832. || ssl->buffers.weOwnCertChain)) {
  13833. buffer der;
  13834. word32 idx = 0;
  13835. #ifdef WOLFSSL_SMALL_STACK
  13836. DecodedCert* cert = NULL;
  13837. #else
  13838. DecodedCert cert[1];
  13839. #endif
  13840. #ifdef WOLFSSL_SMALL_STACK
  13841. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  13842. DYNAMIC_TYPE_DCERT);
  13843. if (cert == NULL)
  13844. return MEMORY_E;
  13845. #endif
  13846. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  13847. DYNAMIC_TYPE_OCSP_REQUEST);
  13848. if (request == NULL) {
  13849. #ifdef WOLFSSL_SMALL_STACK
  13850. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  13851. #endif
  13852. return MEMORY_E;
  13853. }
  13854. while (idx + OPAQUE24_LEN < ssl->buffers.certChain->length) {
  13855. c24to32(ssl->buffers.certChain->buffer + idx, &der.length);
  13856. idx += OPAQUE24_LEN;
  13857. der.buffer = ssl->buffers.certChain->buffer + idx;
  13858. idx += der.length;
  13859. if (idx > ssl->buffers.certChain->length)
  13860. break;
  13861. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  13862. der.length);
  13863. if (ret == 0) {
  13864. request->ssl = ssl;
  13865. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling,
  13866. request, &responses[i + 1]);
  13867. /* Suppressing, not critical */
  13868. if (ret == OCSP_CERT_REVOKED ||
  13869. ret == OCSP_CERT_UNKNOWN ||
  13870. ret == OCSP_LOOKUP_FAIL) {
  13871. ret = 0;
  13872. }
  13873. i++;
  13874. FreeOcspRequest(request);
  13875. }
  13876. }
  13877. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  13878. #ifdef WOLFSSL_SMALL_STACK
  13879. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  13880. #endif
  13881. }
  13882. else {
  13883. while (ret == 0 &&
  13884. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  13885. request->ssl = ssl;
  13886. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling,
  13887. request, &responses[++i]);
  13888. /* Suppressing, not critical */
  13889. if (ret == OCSP_CERT_REVOKED ||
  13890. ret == OCSP_CERT_UNKNOWN ||
  13891. ret == OCSP_LOOKUP_FAIL) {
  13892. ret = 0;
  13893. }
  13894. }
  13895. }
  13896. if (responses[0].buffer) {
  13897. if (ret == 0) {
  13898. ret = BuildCertificateStatus(ssl, status_type, responses,
  13899. (byte)i + 1);
  13900. }
  13901. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  13902. if (responses[i].buffer) {
  13903. XFREE(responses[i].buffer, ssl->heap,
  13904. DYNAMIC_TYPE_OCSP_REQUEST);
  13905. }
  13906. }
  13907. }
  13908. break;
  13909. }
  13910. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  13911. #endif /* NO_WOLFSSL_SERVER */
  13912. default:
  13913. break;
  13914. }
  13915. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  13916. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  13917. return ret;
  13918. }
  13919. #endif /* !NO_CERTS */
  13920. #endif /* WOLFSSL_NO_TLS12 */
  13921. int SendData(WOLFSSL* ssl, const void* data, int sz)
  13922. {
  13923. int sent = 0, /* plainText size */
  13924. sendSz,
  13925. ret,
  13926. dtlsExtra = 0;
  13927. int groupMsgs = 0;
  13928. if (ssl->error == WANT_WRITE
  13929. #ifdef WOLFSSL_ASYNC_CRYPT
  13930. || ssl->error == WC_PENDING_E
  13931. #endif
  13932. ) {
  13933. ssl->error = 0;
  13934. }
  13935. /* don't allow write after decrypt or mac error */
  13936. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  13937. /* For DTLS allow these possible errors and allow the session
  13938. to continue despite them */
  13939. if (ssl->options.dtls) {
  13940. ssl->error = 0;
  13941. }
  13942. else {
  13943. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  13944. return WOLFSSL_FATAL_ERROR;
  13945. }
  13946. }
  13947. #ifdef WOLFSSL_EARLY_DATA
  13948. if (ssl->earlyData != no_early_data) {
  13949. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  13950. WOLFSSL_MSG("handshake complete, trying to send early data");
  13951. return BUILD_MSG_ERROR;
  13952. }
  13953. #ifdef WOLFSSL_EARLY_DATA_GROUP
  13954. groupMsgs = 1;
  13955. #endif
  13956. }
  13957. else
  13958. #endif
  13959. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  13960. int err;
  13961. WOLFSSL_MSG("handshake not complete, trying to finish");
  13962. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  13963. #ifdef WOLFSSL_ASYNC_CRYPT
  13964. /* if async would block return WANT_WRITE */
  13965. if (ssl->error == WC_PENDING_E) {
  13966. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  13967. }
  13968. #endif
  13969. return err;
  13970. }
  13971. }
  13972. /* last time system socket output buffer was full, try again to send */
  13973. if (!groupMsgs && ssl->buffers.outputBuffer.length > 0) {
  13974. WOLFSSL_MSG("output buffer was full, trying to send again");
  13975. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  13976. WOLFSSL_ERROR(ssl->error);
  13977. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  13978. ssl->options.isClosed)) {
  13979. ssl->error = SOCKET_PEER_CLOSED_E;
  13980. WOLFSSL_ERROR(ssl->error);
  13981. return 0; /* peer reset or closed */
  13982. }
  13983. return ssl->error;
  13984. }
  13985. else {
  13986. /* advance sent to previous sent + plain size just sent */
  13987. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  13988. WOLFSSL_MSG("sent write buffered data");
  13989. if (sent > sz) {
  13990. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  13991. return ssl->error = BAD_FUNC_ARG;
  13992. }
  13993. }
  13994. }
  13995. #ifdef WOLFSSL_DTLS
  13996. if (ssl->options.dtls) {
  13997. dtlsExtra = DTLS_RECORD_EXTRA;
  13998. }
  13999. #endif
  14000. for (;;) {
  14001. int len;
  14002. byte* out;
  14003. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  14004. int buffSz; /* may switch on comp */
  14005. int outputSz;
  14006. #ifdef HAVE_LIBZ
  14007. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  14008. #endif
  14009. if (sent == sz) break;
  14010. len = wolfSSL_GetMaxRecordSize(ssl, sz - sent);
  14011. #ifdef WOLFSSL_DTLS
  14012. if (IsDtlsNotSctpMode(ssl)) {
  14013. len = min(len, MAX_UDP_SIZE);
  14014. }
  14015. #endif
  14016. buffSz = len;
  14017. /* check for available size */
  14018. outputSz = len + COMP_EXTRA + dtlsExtra + MAX_MSG_EXTRA;
  14019. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  14020. return ssl->error = ret;
  14021. /* get output buffer */
  14022. out = ssl->buffers.outputBuffer.buffer +
  14023. ssl->buffers.outputBuffer.length;
  14024. #ifdef HAVE_LIBZ
  14025. if (ssl->options.usingCompression) {
  14026. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  14027. if (buffSz < 0) {
  14028. return buffSz;
  14029. }
  14030. sendBuffer = comp;
  14031. }
  14032. #endif
  14033. if (!ssl->options.tls1_3) {
  14034. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  14035. application_data, 0, 0, 1);
  14036. }
  14037. else {
  14038. #ifdef WOLFSSL_TLS13
  14039. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  14040. application_data, 0, 0, 1);
  14041. #else
  14042. sendSz = BUFFER_ERROR;
  14043. #endif
  14044. }
  14045. if (sendSz < 0) {
  14046. #ifdef WOLFSSL_ASYNC_CRYPT
  14047. if (sendSz == WC_PENDING_E)
  14048. ssl->error = sendSz;
  14049. #endif
  14050. return BUILD_MSG_ERROR;
  14051. }
  14052. ssl->buffers.outputBuffer.length += sendSz;
  14053. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  14054. WOLFSSL_ERROR(ssl->error);
  14055. /* store for next call if WANT_WRITE or user embedSend() that
  14056. doesn't present like WANT_WRITE */
  14057. ssl->buffers.plainSz = len;
  14058. ssl->buffers.prevSent = sent;
  14059. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  14060. ssl->options.isClosed)) {
  14061. ssl->error = SOCKET_PEER_CLOSED_E;
  14062. WOLFSSL_ERROR(ssl->error);
  14063. return 0; /* peer reset or closed */
  14064. }
  14065. return ssl->error;
  14066. }
  14067. sent += len;
  14068. /* only one message per attempt */
  14069. if (ssl->options.partialWrite == 1) {
  14070. WOLFSSL_MSG("Partial Write on, only sending one record");
  14071. break;
  14072. }
  14073. }
  14074. return sent;
  14075. }
  14076. /* process input data */
  14077. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  14078. {
  14079. int size;
  14080. WOLFSSL_ENTER("ReceiveData()");
  14081. /* reset error state */
  14082. if (ssl->error == WANT_READ
  14083. #ifdef WOLFSSL_ASYNC_CRYPT
  14084. || ssl->error == WC_PENDING_E
  14085. #endif
  14086. ) {
  14087. ssl->error = 0;
  14088. }
  14089. #ifdef WOLFSSL_DTLS
  14090. if (ssl->options.dtls) {
  14091. /* In DTLS mode, we forgive some errors and allow the session
  14092. * to continue despite them. */
  14093. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR)
  14094. ssl->error = 0;
  14095. }
  14096. #endif /* WOLFSSL_DTLS */
  14097. if (ssl->error != 0 && ssl->error != WANT_WRITE) {
  14098. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  14099. return ssl->error;
  14100. }
  14101. #ifdef WOLFSSL_EARLY_DATA
  14102. if (ssl->earlyData != no_early_data) {
  14103. }
  14104. else
  14105. #endif
  14106. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  14107. int err;
  14108. WOLFSSL_MSG("Handshake not complete, trying to finish");
  14109. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  14110. #ifdef WOLFSSL_ASYNC_CRYPT
  14111. /* if async would block return WANT_WRITE */
  14112. if (ssl->error == WC_PENDING_E) {
  14113. return WOLFSSL_CBIO_ERR_WANT_READ;
  14114. }
  14115. #endif
  14116. return err;
  14117. }
  14118. }
  14119. #ifdef HAVE_SECURE_RENEGOTIATION
  14120. startScr:
  14121. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  14122. int err;
  14123. WOLFSSL_MSG("Need to start scr, server requested");
  14124. if ( (err = wolfSSL_Rehandshake(ssl)) != WOLFSSL_SUCCESS)
  14125. return err;
  14126. ssl->secure_renegotiation->startScr = 0; /* only start once */
  14127. }
  14128. #endif
  14129. while (ssl->buffers.clearOutputBuffer.length == 0) {
  14130. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  14131. WOLFSSL_ERROR(ssl->error);
  14132. if (ssl->error == ZERO_RETURN) {
  14133. WOLFSSL_MSG("Zero return, no more data coming");
  14134. return 0; /* no more data coming */
  14135. }
  14136. if (ssl->error == SOCKET_ERROR_E) {
  14137. if (ssl->options.connReset || ssl->options.isClosed) {
  14138. WOLFSSL_MSG("Peer reset or closed, connection done");
  14139. ssl->error = SOCKET_PEER_CLOSED_E;
  14140. WOLFSSL_ERROR(ssl->error);
  14141. return 0; /* peer reset or closed */
  14142. }
  14143. }
  14144. return ssl->error;
  14145. }
  14146. #ifdef HAVE_SECURE_RENEGOTIATION
  14147. if (ssl->secure_renegotiation &&
  14148. ssl->secure_renegotiation->startScr) {
  14149. goto startScr;
  14150. }
  14151. #endif
  14152. }
  14153. if (sz < (int)ssl->buffers.clearOutputBuffer.length)
  14154. size = sz;
  14155. else
  14156. size = ssl->buffers.clearOutputBuffer.length;
  14157. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  14158. if (peek == 0) {
  14159. ssl->buffers.clearOutputBuffer.length -= size;
  14160. ssl->buffers.clearOutputBuffer.buffer += size;
  14161. }
  14162. if (ssl->buffers.clearOutputBuffer.length == 0 &&
  14163. ssl->buffers.inputBuffer.dynamicFlag)
  14164. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  14165. WOLFSSL_LEAVE("ReceiveData()", size);
  14166. return size;
  14167. }
  14168. /* send alert message */
  14169. int SendAlert(WOLFSSL* ssl, int severity, int type)
  14170. {
  14171. byte input[ALERT_SIZE];
  14172. byte *output;
  14173. int sendSz;
  14174. int ret;
  14175. int outputSz;
  14176. int dtlsExtra = 0;
  14177. #ifdef HAVE_WRITE_DUP
  14178. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  14179. int notifyErr = 0;
  14180. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  14181. if (type == close_notify) {
  14182. notifyErr = ZERO_RETURN;
  14183. } else if (severity == alert_fatal) {
  14184. notifyErr = FATAL_ERROR;
  14185. }
  14186. if (notifyErr != 0) {
  14187. return NotifyWriteSide(ssl, notifyErr);
  14188. }
  14189. return 0;
  14190. }
  14191. #endif
  14192. /* if sendalert is called again for nonblocking */
  14193. if (ssl->options.sendAlertState != 0) {
  14194. ret = SendBuffered(ssl);
  14195. if (ret == 0)
  14196. ssl->options.sendAlertState = 0;
  14197. return ret;
  14198. }
  14199. #ifdef OPENSSL_EXTRA
  14200. if (ssl->CBIS != NULL) {
  14201. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  14202. }
  14203. #endif
  14204. #ifdef WOLFSSL_DTLS
  14205. if (ssl->options.dtls)
  14206. dtlsExtra = DTLS_RECORD_EXTRA;
  14207. #endif
  14208. /* check for available size */
  14209. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  14210. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  14211. return ret;
  14212. /* Check output buffer */
  14213. if (ssl->buffers.outputBuffer.buffer == NULL)
  14214. return BUFFER_E;
  14215. /* get output buffer */
  14216. output = ssl->buffers.outputBuffer.buffer +
  14217. ssl->buffers.outputBuffer.length;
  14218. input[0] = (byte)severity;
  14219. input[1] = (byte)type;
  14220. ssl->alert_history.last_tx.code = type;
  14221. ssl->alert_history.last_tx.level = severity;
  14222. if (severity == alert_fatal) {
  14223. ssl->options.isClosed = 1; /* Don't send close_notify */
  14224. }
  14225. /* only send encrypted alert if handshake actually complete, otherwise
  14226. other side may not be able to handle it */
  14227. if (IsEncryptionOn(ssl, 1) && (IsAtLeastTLSv1_3(ssl->version) ||
  14228. ssl->options.handShakeDone)) {
  14229. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  14230. 0, 0, 0);
  14231. }
  14232. else {
  14233. AddRecordHeader(output, ALERT_SIZE, alert, ssl);
  14234. output += RECORD_HEADER_SZ;
  14235. #ifdef WOLFSSL_DTLS
  14236. if (ssl->options.dtls)
  14237. output += DTLS_RECORD_EXTRA;
  14238. #endif
  14239. XMEMCPY(output, input, ALERT_SIZE);
  14240. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  14241. #ifdef WOLFSSL_DTLS
  14242. if (ssl->options.dtls)
  14243. sendSz += DTLS_RECORD_EXTRA;
  14244. #endif
  14245. }
  14246. if (sendSz < 0)
  14247. return BUILD_MSG_ERROR;
  14248. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14249. if (ssl->hsInfoOn)
  14250. AddPacketName(ssl, "Alert");
  14251. if (ssl->toInfoOn)
  14252. AddPacketInfo(ssl, "Alert", alert, output, sendSz, WRITE_PROTO,
  14253. ssl->heap);
  14254. #endif
  14255. ssl->buffers.outputBuffer.length += sendSz;
  14256. ssl->options.sendAlertState = 1;
  14257. return SendBuffered(ssl);
  14258. }
  14259. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  14260. {
  14261. #ifdef NO_ERROR_STRINGS
  14262. (void)e;
  14263. return "no support for error strings built in";
  14264. #else
  14265. int error = (int)e;
  14266. /* pass to wolfCrypt */
  14267. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  14268. return wc_GetErrorString(error);
  14269. }
  14270. switch (error) {
  14271. #ifdef WOLFSSL_WPAS
  14272. case 0 :
  14273. return "ok";
  14274. #endif
  14275. case UNSUPPORTED_SUITE :
  14276. return "unsupported cipher suite";
  14277. case INPUT_CASE_ERROR :
  14278. return "input state error";
  14279. case PREFIX_ERROR :
  14280. return "bad index to key rounds";
  14281. case MEMORY_ERROR :
  14282. return "out of memory";
  14283. case VERIFY_FINISHED_ERROR :
  14284. return "verify problem on finished";
  14285. case VERIFY_MAC_ERROR :
  14286. return "verify mac problem";
  14287. case PARSE_ERROR :
  14288. return "parse error on header";
  14289. case SIDE_ERROR :
  14290. return "wrong client/server type";
  14291. case NO_PEER_CERT :
  14292. return "peer didn't send cert";
  14293. case UNKNOWN_HANDSHAKE_TYPE :
  14294. return "weird handshake type";
  14295. case SOCKET_ERROR_E :
  14296. return "error state on socket";
  14297. case SOCKET_NODATA :
  14298. return "expected data, not there";
  14299. case INCOMPLETE_DATA :
  14300. return "don't have enough data to complete task";
  14301. case UNKNOWN_RECORD_TYPE :
  14302. return "unknown type in record hdr";
  14303. case DECRYPT_ERROR :
  14304. return "error during decryption";
  14305. case FATAL_ERROR :
  14306. return "received alert fatal error";
  14307. case ENCRYPT_ERROR :
  14308. return "error during encryption";
  14309. case FREAD_ERROR :
  14310. return "fread problem";
  14311. case NO_PEER_KEY :
  14312. return "need peer's key";
  14313. case NO_PRIVATE_KEY :
  14314. return "need the private key";
  14315. case NO_DH_PARAMS :
  14316. return "server missing DH params";
  14317. case RSA_PRIVATE_ERROR :
  14318. return "error during rsa priv op";
  14319. case MATCH_SUITE_ERROR :
  14320. return "can't match cipher suite";
  14321. case COMPRESSION_ERROR :
  14322. return "compression mismatch error";
  14323. case BUILD_MSG_ERROR :
  14324. return "build message failure";
  14325. case BAD_HELLO :
  14326. return "client hello malformed";
  14327. case DOMAIN_NAME_MISMATCH :
  14328. return "peer subject name mismatch";
  14329. case WANT_READ :
  14330. case WOLFSSL_ERROR_WANT_READ :
  14331. return "non-blocking socket wants data to be read";
  14332. case NOT_READY_ERROR :
  14333. return "handshake layer not ready yet, complete first";
  14334. case VERSION_ERROR :
  14335. return "record layer version error";
  14336. case WANT_WRITE :
  14337. case WOLFSSL_ERROR_WANT_WRITE :
  14338. return "non-blocking socket write buffer full";
  14339. case BUFFER_ERROR :
  14340. return "malformed buffer input error";
  14341. case VERIFY_CERT_ERROR :
  14342. return "verify problem on certificate";
  14343. case VERIFY_SIGN_ERROR :
  14344. return "verify problem based on signature";
  14345. case CLIENT_ID_ERROR :
  14346. return "psk client identity error";
  14347. case SERVER_HINT_ERROR:
  14348. return "psk server hint error";
  14349. case PSK_KEY_ERROR:
  14350. return "psk key callback error";
  14351. case NTRU_KEY_ERROR:
  14352. return "NTRU key error";
  14353. case NTRU_DRBG_ERROR:
  14354. return "NTRU drbg error";
  14355. case NTRU_ENCRYPT_ERROR:
  14356. return "NTRU encrypt error";
  14357. case NTRU_DECRYPT_ERROR:
  14358. return "NTRU decrypt error";
  14359. case GETTIME_ERROR:
  14360. return "gettimeofday() error";
  14361. case GETITIMER_ERROR:
  14362. return "getitimer() error";
  14363. case SIGACT_ERROR:
  14364. return "sigaction() error";
  14365. case SETITIMER_ERROR:
  14366. return "setitimer() error";
  14367. case LENGTH_ERROR:
  14368. return "record layer length error";
  14369. case PEER_KEY_ERROR:
  14370. return "cant decode peer key";
  14371. case ZERO_RETURN:
  14372. case WOLFSSL_ERROR_ZERO_RETURN:
  14373. return "peer sent close notify alert";
  14374. case ECC_CURVETYPE_ERROR:
  14375. return "Bad ECC Curve Type or unsupported";
  14376. case ECC_CURVE_ERROR:
  14377. return "Bad ECC Curve or unsupported";
  14378. case ECC_PEERKEY_ERROR:
  14379. return "Bad ECC Peer Key";
  14380. case ECC_MAKEKEY_ERROR:
  14381. return "ECC Make Key failure";
  14382. case ECC_EXPORT_ERROR:
  14383. return "ECC Export Key failure";
  14384. case ECC_SHARED_ERROR:
  14385. return "ECC DHE shared failure";
  14386. case NOT_CA_ERROR:
  14387. return "Not a CA by basic constraint error";
  14388. case HTTP_TIMEOUT:
  14389. return "HTTP timeout for OCSP or CRL req";
  14390. case BAD_CERT_MANAGER_ERROR:
  14391. return "Bad Cert Manager error";
  14392. case OCSP_CERT_REVOKED:
  14393. return "OCSP Cert revoked";
  14394. case CRL_CERT_REVOKED:
  14395. return "CRL Cert revoked";
  14396. case CRL_MISSING:
  14397. return "CRL missing, not loaded";
  14398. case MONITOR_SETUP_E:
  14399. return "CRL monitor setup error";
  14400. case THREAD_CREATE_E:
  14401. return "Thread creation problem";
  14402. case OCSP_NEED_URL:
  14403. return "OCSP need URL";
  14404. case OCSP_CERT_UNKNOWN:
  14405. return "OCSP Cert unknown";
  14406. case OCSP_LOOKUP_FAIL:
  14407. return "OCSP Responder lookup fail";
  14408. case MAX_CHAIN_ERROR:
  14409. return "Maximum Chain Depth Exceeded";
  14410. case COOKIE_ERROR:
  14411. return "DTLS Cookie Error";
  14412. case SEQUENCE_ERROR:
  14413. return "DTLS Sequence Error";
  14414. case SUITES_ERROR:
  14415. return "Suites Pointer Error";
  14416. case OUT_OF_ORDER_E:
  14417. return "Out of order message, fatal";
  14418. case BAD_KEA_TYPE_E:
  14419. return "Bad KEA type found";
  14420. case SANITY_CIPHER_E:
  14421. return "Sanity check on ciphertext failed";
  14422. case RECV_OVERFLOW_E:
  14423. return "Receive callback returned more than requested";
  14424. case GEN_COOKIE_E:
  14425. return "Generate Cookie Error";
  14426. case NO_PEER_VERIFY:
  14427. return "Need peer certificate verify Error";
  14428. case FWRITE_ERROR:
  14429. return "fwrite Error";
  14430. case CACHE_MATCH_ERROR:
  14431. return "Cache restore header match Error";
  14432. case UNKNOWN_SNI_HOST_NAME_E:
  14433. return "Unrecognized host name Error";
  14434. case UNKNOWN_MAX_FRAG_LEN_E:
  14435. return "Unrecognized max frag len Error";
  14436. case KEYUSE_SIGNATURE_E:
  14437. return "Key Use digitalSignature not set Error";
  14438. case KEYUSE_ENCIPHER_E:
  14439. return "Key Use keyEncipherment not set Error";
  14440. case EXTKEYUSE_AUTH_E:
  14441. return "Ext Key Use server/client auth not set Error";
  14442. case SEND_OOB_READ_E:
  14443. return "Send Callback Out of Bounds Read Error";
  14444. case SECURE_RENEGOTIATION_E:
  14445. return "Invalid Renegotiation Error";
  14446. case SESSION_TICKET_LEN_E:
  14447. return "Session Ticket Too Long Error";
  14448. case SESSION_TICKET_EXPECT_E:
  14449. return "Session Ticket Error";
  14450. case SESSION_SECRET_CB_E:
  14451. return "Session Secret Callback Error";
  14452. case NO_CHANGE_CIPHER_E:
  14453. return "Finished received from peer before Change Cipher Error";
  14454. case SANITY_MSG_E:
  14455. return "Sanity Check on message order Error";
  14456. case DUPLICATE_MSG_E:
  14457. return "Duplicate HandShake message Error";
  14458. case SNI_UNSUPPORTED:
  14459. return "Protocol version does not support SNI Error";
  14460. case SOCKET_PEER_CLOSED_E:
  14461. return "Peer closed underlying transport Error";
  14462. case BAD_TICKET_KEY_CB_SZ:
  14463. return "Bad user session ticket key callback Size Error";
  14464. case BAD_TICKET_MSG_SZ:
  14465. return "Bad session ticket message Size Error";
  14466. case BAD_TICKET_ENCRYPT:
  14467. return "Bad user ticket callback encrypt Error";
  14468. case DH_KEY_SIZE_E:
  14469. return "DH key too small Error";
  14470. case SNI_ABSENT_ERROR:
  14471. return "No Server Name Indication extension Error";
  14472. case RSA_SIGN_FAULT:
  14473. return "RSA Signature Fault Error";
  14474. case HANDSHAKE_SIZE_ERROR:
  14475. return "Handshake message too large Error";
  14476. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  14477. return "Unrecognized protocol name Error";
  14478. case BAD_CERTIFICATE_STATUS_ERROR:
  14479. return "Bad Certificate Status Message Error";
  14480. case OCSP_INVALID_STATUS:
  14481. return "Invalid OCSP Status Error";
  14482. case OCSP_WANT_READ:
  14483. return "OCSP nonblock wants read";
  14484. case RSA_KEY_SIZE_E:
  14485. return "RSA key too small";
  14486. case ECC_KEY_SIZE_E:
  14487. return "ECC key too small";
  14488. case DTLS_EXPORT_VER_E:
  14489. return "Version needs updated after code change or version mismatch";
  14490. case INPUT_SIZE_E:
  14491. return "Input size too large Error";
  14492. case CTX_INIT_MUTEX_E:
  14493. return "Initialize ctx mutex error";
  14494. case EXT_MASTER_SECRET_NEEDED_E:
  14495. return "Extended Master Secret must be enabled to resume EMS session";
  14496. case DTLS_POOL_SZ_E:
  14497. return "Maximum DTLS pool size exceeded";
  14498. case DECODE_E:
  14499. return "Decode handshake message error";
  14500. case WRITE_DUP_READ_E:
  14501. return "Write dup write side can't read error";
  14502. case WRITE_DUP_WRITE_E:
  14503. return "Write dup read side can't write error";
  14504. case INVALID_CERT_CTX_E:
  14505. return "Certificate context does not match request or not empty";
  14506. case BAD_KEY_SHARE_DATA:
  14507. return "The Key Share data contains group that wasn't in Client Hello";
  14508. case MISSING_HANDSHAKE_DATA:
  14509. return "The handshake message is missing required data";
  14510. case BAD_BINDER:
  14511. return "Binder value does not match value server calculated";
  14512. case EXT_NOT_ALLOWED:
  14513. return "Extension type not allowed in handshake message type";
  14514. case INVALID_PARAMETER:
  14515. return "The security parameter is invalid";
  14516. case UNSUPPORTED_EXTENSION:
  14517. return "TLS Extension not requested by the client";
  14518. case PRF_MISSING:
  14519. return "Pseudo-random function is not enabled";
  14520. case KEY_SHARE_ERROR:
  14521. return "Key share extension did not contain a valid named group";
  14522. case POST_HAND_AUTH_ERROR:
  14523. return "Client will not do post handshake authentication";
  14524. case HRR_COOKIE_ERROR:
  14525. return "Cookie does not match one sent in HelloRetryRequest";
  14526. case MCAST_HIGHWATER_CB_E:
  14527. return "Multicast highwater callback returned error";
  14528. case ALERT_COUNT_E:
  14529. return "Alert Count exceeded error";
  14530. case EXT_MISSING:
  14531. return "Required TLS extension missing";
  14532. case DTLS_RETX_OVER_TX:
  14533. return "DTLS interrupting flight transmit with retransmit";
  14534. case DH_PARAMS_NOT_FFDHE_E:
  14535. return "Server DH parameters were not from the FFDHE set as required";
  14536. case TCA_INVALID_ID_TYPE:
  14537. return "TLS Extension Trusted CA ID type invalid";
  14538. case TCA_ABSENT_ERROR:
  14539. return "TLS Extension Trusted CA ID response absent";
  14540. default :
  14541. return "unknown error number";
  14542. }
  14543. #endif /* NO_ERROR_STRINGS */
  14544. }
  14545. void SetErrorString(int error, char* str)
  14546. {
  14547. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  14548. }
  14549. #ifndef NO_ERROR_STRINGS
  14550. #define SUITE_INFO(x,y,z,w) {(x),(y),(z),(w)}
  14551. #else
  14552. #define SUITE_INFO(x,y,z,w) {(x),(z),(w)}
  14553. #endif
  14554. static const CipherSuiteInfo cipher_names[] =
  14555. {
  14556. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  14557. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256),
  14558. #endif
  14559. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  14560. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384),
  14561. #endif
  14562. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  14563. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256),
  14564. #endif
  14565. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  14566. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256),
  14567. #endif
  14568. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  14569. SUITE_INFO("TLS13-AES128-CCM-8-SHA256","TLS_AES_128_CCM_8_SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256),
  14570. #endif
  14571. #ifdef BUILD_TLS_SHA256_SHA256
  14572. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256),
  14573. #endif
  14574. #ifdef BUILD_TLS_SHA384_SHA384
  14575. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384),
  14576. #endif
  14577. #ifndef WOLFSSL_NO_TLS12
  14578. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  14579. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA),
  14580. #endif
  14581. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  14582. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5),
  14583. #endif
  14584. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  14585. SUITE_INFO("DES-CBC3-SHA","SSL_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,SSL_RSA_WITH_3DES_EDE_CBC_SHA),
  14586. #endif
  14587. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  14588. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA),
  14589. #endif
  14590. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  14591. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA),
  14592. #endif
  14593. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  14594. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5),
  14595. #endif
  14596. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  14597. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA),
  14598. #endif
  14599. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  14600. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256),
  14601. #endif
  14602. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  14603. SUITE_INFO("DHE-RSA-AES128-SHA","TLS_DHE_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_CBC_SHA),
  14604. #endif
  14605. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  14606. SUITE_INFO("DHE-RSA-AES256-SHA","TLS_DHE_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_CBC_SHA),
  14607. #endif
  14608. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  14609. 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),
  14610. #endif
  14611. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  14612. 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),
  14613. #endif
  14614. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  14615. SUITE_INFO("PSK-AES256-GCM-SHA384","TLS_PSK_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_PSK_WITH_AES_256_GCM_SHA384),
  14616. #endif
  14617. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  14618. SUITE_INFO("PSK-AES128-GCM-SHA256","TLS_PSK_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_PSK_WITH_AES_128_GCM_SHA256),
  14619. #endif
  14620. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  14621. 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),
  14622. #endif
  14623. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  14624. 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),
  14625. #endif
  14626. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  14627. SUITE_INFO("PSK-AES256-CBC-SHA384","TLS_PSK_WITH_AES_256_CBC_SHA384",CIPHER_BYTE,TLS_PSK_WITH_AES_256_CBC_SHA384),
  14628. #endif
  14629. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  14630. SUITE_INFO("PSK-AES128-CBC-SHA256","TLS_PSK_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_PSK_WITH_AES_128_CBC_SHA256),
  14631. #endif
  14632. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  14633. SUITE_INFO("PSK-AES128-CBC-SHA","TLS_PSK_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_PSK_WITH_AES_128_CBC_SHA),
  14634. #endif
  14635. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  14636. SUITE_INFO("PSK-AES256-CBC-SHA","TLS_PSK_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_PSK_WITH_AES_256_CBC_SHA),
  14637. #endif
  14638. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  14639. SUITE_INFO("DHE-PSK-AES128-CCM","TLS_DHE_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_DHE_PSK_WITH_AES_128_CCM),
  14640. #endif
  14641. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  14642. SUITE_INFO("DHE-PSK-AES256-CCM","TLS_DHE_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_DHE_PSK_WITH_AES_256_CCM),
  14643. #endif
  14644. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  14645. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM),
  14646. #endif
  14647. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  14648. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM),
  14649. #endif
  14650. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  14651. SUITE_INFO("PSK-AES128-CCM-8","TLS_PSK_WITH_AES_128_CCM_8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8),
  14652. #endif
  14653. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  14654. SUITE_INFO("PSK-AES256-CCM-8","TLS_PSK_WITH_AES_256_CCM_8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8),
  14655. #endif
  14656. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  14657. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384),
  14658. #endif
  14659. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  14660. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256),
  14661. #endif
  14662. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  14663. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384),
  14664. #endif
  14665. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  14666. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256),
  14667. #endif
  14668. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  14669. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA),
  14670. #endif
  14671. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  14672. SUITE_INFO("HC128-MD5","TLS_RSA_WITH_HC_128_MD5",CIPHER_BYTE,TLS_RSA_WITH_HC_128_MD5),
  14673. #endif
  14674. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  14675. SUITE_INFO("HC128-SHA","TLS_RSA_WITH_HC_128_SHA",CIPHER_BYTE,TLS_RSA_WITH_HC_128_SHA),
  14676. #endif
  14677. #ifdef BUILD_TLS_RSA_WITH_HC_128_B2B256
  14678. SUITE_INFO("HC128-B2B256","TLS_RSA_WITH_HC_128_B2B256",CIPHER_BYTE,TLS_RSA_WITH_HC_128_B2B256),
  14679. #endif
  14680. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_B2B256
  14681. SUITE_INFO("AES128-B2B256","TLS_RSA_WITH_AES_128_CBC_B2B256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_B2B256),
  14682. #endif
  14683. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_B2B256
  14684. SUITE_INFO("AES256-B2B256","TLS_RSA_WITH_AES_256_CBC_B2B256",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_B2B256),
  14685. #endif
  14686. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  14687. SUITE_INFO("RABBIT-SHA","TLS_RSA_WITH_RABBIT_SHA",CIPHER_BYTE,TLS_RSA_WITH_RABBIT_SHA),
  14688. #endif
  14689. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  14690. SUITE_INFO("NTRU-RC4-SHA","TLS_NTRU_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_RC4_128_SHA),
  14691. #endif
  14692. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  14693. SUITE_INFO("NTRU-DES-CBC3-SHA","TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA),
  14694. #endif
  14695. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  14696. SUITE_INFO("NTRU-AES128-SHA","TLS_NTRU_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_AES_128_CBC_SHA),
  14697. #endif
  14698. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  14699. SUITE_INFO("NTRU-AES256-SHA","TLS_NTRU_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_AES_256_CBC_SHA),
  14700. #endif
  14701. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  14702. SUITE_INFO("AES128-CCM-8","TLS_RSA_WITH_AES_128_CCM_8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8),
  14703. #endif
  14704. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  14705. SUITE_INFO("AES256-CCM-8","TLS_RSA_WITH_AES_256_CCM_8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8),
  14706. #endif
  14707. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  14708. SUITE_INFO("ECDHE-ECDSA-AES128-CCM","TLS_ECDHE_ECDSA_WITH_AES_128_CCM",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM),
  14709. #endif
  14710. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  14711. 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),
  14712. #endif
  14713. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  14714. 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),
  14715. #endif
  14716. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  14717. SUITE_INFO("ECDHE-RSA-AES128-SHA","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA),
  14718. #endif
  14719. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  14720. SUITE_INFO("ECDHE-RSA-AES256-SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA),
  14721. #endif
  14722. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  14723. SUITE_INFO("ECDHE-ECDSA-AES128-SHA","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA),
  14724. #endif
  14725. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  14726. SUITE_INFO("ECDHE-ECDSA-AES256-SHA","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA),
  14727. #endif
  14728. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  14729. SUITE_INFO("ECDHE-RSA-RC4-SHA","TLS_ECDHE_RSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_RC4_128_SHA),
  14730. #endif
  14731. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  14732. 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),
  14733. #endif
  14734. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  14735. SUITE_INFO("ECDHE-ECDSA-RC4-SHA","TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_RC4_128_SHA),
  14736. #endif
  14737. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  14738. 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),
  14739. #endif
  14740. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  14741. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256),
  14742. #endif
  14743. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  14744. SUITE_INFO("AES256-SHA256","TLS_RSA_WITH_AES_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA256),
  14745. #endif
  14746. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  14747. SUITE_INFO("DHE-RSA-AES128-SHA256","TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256),
  14748. #endif
  14749. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  14750. SUITE_INFO("DHE-RSA-AES256-SHA256","TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256),
  14751. #endif
  14752. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  14753. SUITE_INFO("ECDH-RSA-AES128-SHA","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA),
  14754. #endif
  14755. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  14756. SUITE_INFO("ECDH-RSA-AES256-SHA","TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA),
  14757. #endif
  14758. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  14759. SUITE_INFO("ECDH-ECDSA-AES128-SHA","TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA),
  14760. #endif
  14761. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  14762. SUITE_INFO("ECDH-ECDSA-AES256-SHA","TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA),
  14763. #endif
  14764. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  14765. SUITE_INFO("ECDH-RSA-RC4-SHA","TLS_ECDH_RSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_RC4_128_SHA),
  14766. #endif
  14767. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  14768. 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),
  14769. #endif
  14770. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  14771. SUITE_INFO("ECDH-ECDSA-RC4-SHA","TLS_ECDH_ECDSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_RC4_128_SHA),
  14772. #endif
  14773. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  14774. 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),
  14775. #endif
  14776. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  14777. SUITE_INFO("AES128-GCM-SHA256","TLS_RSA_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_GCM_SHA256),
  14778. #endif
  14779. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  14780. SUITE_INFO("AES256-GCM-SHA384","TLS_RSA_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_RSA_WITH_AES_256_GCM_SHA384),
  14781. #endif
  14782. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  14783. 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),
  14784. #endif
  14785. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  14786. 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),
  14787. #endif
  14788. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  14789. 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),
  14790. #endif
  14791. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  14792. 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),
  14793. #endif
  14794. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  14795. 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),
  14796. #endif
  14797. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  14798. 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),
  14799. #endif
  14800. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  14801. 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),
  14802. #endif
  14803. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  14804. 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),
  14805. #endif
  14806. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  14807. 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),
  14808. #endif
  14809. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  14810. 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),
  14811. #endif
  14812. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  14813. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA),
  14814. #endif
  14815. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  14816. SUITE_INFO("DHE-RSA-CAMELLIA128-SHA","TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA),
  14817. #endif
  14818. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  14819. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA),
  14820. #endif
  14821. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  14822. SUITE_INFO("DHE-RSA-CAMELLIA256-SHA","TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA),
  14823. #endif
  14824. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  14825. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256),
  14826. #endif
  14827. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  14828. SUITE_INFO("DHE-RSA-CAMELLIA128-SHA256","TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256),
  14829. #endif
  14830. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  14831. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256),
  14832. #endif
  14833. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  14834. SUITE_INFO("DHE-RSA-CAMELLIA256-SHA256","TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256),
  14835. #endif
  14836. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  14837. SUITE_INFO("ECDHE-RSA-AES128-SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256),
  14838. #endif
  14839. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  14840. SUITE_INFO("ECDHE-ECDSA-AES128-SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256),
  14841. #endif
  14842. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  14843. SUITE_INFO("ECDH-RSA-AES128-SHA256","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256),
  14844. #endif
  14845. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  14846. SUITE_INFO("ECDH-ECDSA-AES128-SHA256","TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256),
  14847. #endif
  14848. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  14849. SUITE_INFO("ECDHE-RSA-AES256-SHA384","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384),
  14850. #endif
  14851. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  14852. SUITE_INFO("ECDHE-ECDSA-AES256-SHA384","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384),
  14853. #endif
  14854. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  14855. SUITE_INFO("ECDH-RSA-AES256-SHA384","TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384),
  14856. #endif
  14857. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  14858. SUITE_INFO("ECDH-ECDSA-AES256-SHA384","TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384),
  14859. #endif
  14860. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  14861. SUITE_INFO("ECDHE-RSA-CHACHA20-POLY1305","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256),
  14862. #endif
  14863. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  14864. SUITE_INFO("ECDHE-ECDSA-CHACHA20-POLY1305","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256),
  14865. #endif
  14866. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  14867. SUITE_INFO("DHE-RSA-CHACHA20-POLY1305","TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256),
  14868. #endif
  14869. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  14870. 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),
  14871. #endif
  14872. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  14873. 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),
  14874. #endif
  14875. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  14876. 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),
  14877. #endif
  14878. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  14879. SUITE_INFO("ADH-AES128-SHA","TLS_DH_anon_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_DH_anon_WITH_AES_128_CBC_SHA),
  14880. #endif
  14881. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  14882. SUITE_INFO("ADH-AES256-GCM-SHA384","TLS_DH_anon_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_DH_anon_WITH_AES_256_GCM_SHA384),
  14883. #endif
  14884. #ifdef BUILD_TLS_QSH
  14885. SUITE_INFO("QSH","TLS_QSH",QSH_BYTE,TLS_QSH),
  14886. #endif
  14887. #ifdef HAVE_RENEGOTIATION_INDICATION
  14888. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV),
  14889. #endif
  14890. #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA
  14891. SUITE_INFO("IDEA-CBC-SHA","SSL_RSA_WITH_IDEA_CBC_SHA",CIPHER_BYTE,SSL_RSA_WITH_IDEA_CBC_SHA),
  14892. #endif
  14893. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  14894. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA),
  14895. #endif
  14896. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  14897. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256),
  14898. #endif
  14899. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  14900. 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),
  14901. #endif
  14902. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  14903. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256),
  14904. #endif
  14905. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  14906. SUITE_INFO("ECDHE-PSK-CHACHA20-POLY1305","TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256),
  14907. #endif
  14908. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  14909. SUITE_INFO("DHE-PSK-CHACHA20-POLY1305","TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256),
  14910. #endif
  14911. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  14912. 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),
  14913. #endif
  14914. #ifdef BUILD_WDM_WITH_NULL_SHA256
  14915. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256),
  14916. #endif
  14917. #endif /* WOLFSSL_NO_TLS12 */
  14918. };
  14919. /* returns the cipher_names array */
  14920. const CipherSuiteInfo* GetCipherNames(void)
  14921. {
  14922. return cipher_names;
  14923. }
  14924. /* returns the number of elements in the cipher_names array */
  14925. int GetCipherNamesSize(void)
  14926. {
  14927. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  14928. }
  14929. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  14930. {
  14931. int i;
  14932. const char* nameInternal = NULL;
  14933. for (i = 0; i < GetCipherNamesSize(); i++) {
  14934. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  14935. (cipher_names[i].cipherSuite == cipherSuite)) {
  14936. nameInternal = cipher_names[i].name;
  14937. break;
  14938. }
  14939. }
  14940. return nameInternal;
  14941. }
  14942. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  14943. {
  14944. #ifndef NO_ERROR_STRINGS
  14945. int i;
  14946. const char* nameIana = "NONE";
  14947. for (i = 0; i < GetCipherNamesSize(); i++) {
  14948. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  14949. (cipher_names[i].cipherSuite == cipherSuite)) {
  14950. nameIana = cipher_names[i].name_iana;
  14951. break;
  14952. }
  14953. }
  14954. return nameIana;
  14955. #else
  14956. (void)cipherSuite0;
  14957. (void)cipherSuite;
  14958. return NULL;
  14959. #endif
  14960. }
  14961. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  14962. {
  14963. if (ssl == NULL) {
  14964. return NULL;
  14965. }
  14966. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  14967. }
  14968. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  14969. {
  14970. if (ssl == NULL) {
  14971. return NULL;
  14972. }
  14973. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  14974. }
  14975. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  14976. byte* cipherSuite)
  14977. {
  14978. int ret = BAD_FUNC_ARG;
  14979. int i;
  14980. unsigned long len = (unsigned long)XSTRLEN(name);
  14981. for (i = 0; i < GetCipherNamesSize(); i++) {
  14982. if (XSTRNCMP(name, cipher_names[i].name, len) == 0) {
  14983. *cipherSuite0 = cipher_names[i].cipherSuite0;
  14984. *cipherSuite = cipher_names[i].cipherSuite;
  14985. ret = 0;
  14986. break;
  14987. }
  14988. }
  14989. return ret;
  14990. }
  14991. /**
  14992. Set the enabled cipher suites.
  14993. @param [out] suites Suites structure.
  14994. @param [in] list List of cipher suites, only supports full name from
  14995. cipher_names[] delimited by ':'.
  14996. @return true on success, else false.
  14997. */
  14998. int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list)
  14999. {
  15000. int ret = 0;
  15001. int idx = 0;
  15002. int haveRSAsig = 0;
  15003. int haveECDSAsig = 0;
  15004. int haveAnon = 0;
  15005. const int suiteSz = GetCipherNamesSize();
  15006. char* next = (char*)list;
  15007. if (suites == NULL || list == NULL) {
  15008. WOLFSSL_MSG("SetCipherList parameter error");
  15009. return 0;
  15010. }
  15011. if (next[0] == 0 || XSTRNCMP(next, "ALL", 3) == 0 ||
  15012. XSTRNCMP(next, "DEFAULT", 7) == 0)
  15013. return 1; /* wolfSSL default */
  15014. do {
  15015. char* current = next;
  15016. char name[MAX_SUITE_NAME + 1];
  15017. int i;
  15018. word32 length;
  15019. next = XSTRSTR(next, ":");
  15020. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /* last */
  15021. : (word32)(next - current));
  15022. XSTRNCPY(name, current, length);
  15023. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  15024. for (i = 0; i < suiteSz; i++) {
  15025. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  15026. #ifndef NO_ERROR_STRINGS
  15027. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  15028. #endif
  15029. ) {
  15030. #ifdef WOLFSSL_DTLS
  15031. /* don't allow stream ciphers with DTLS */
  15032. if (ctx->method->version.major == DTLS_MAJOR) {
  15033. if (XSTRSTR(name, "RC4") ||
  15034. XSTRSTR(name, "HC128") ||
  15035. XSTRSTR(name, "RABBIT"))
  15036. {
  15037. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  15038. continue;
  15039. }
  15040. }
  15041. #endif /* WOLFSSL_DTLS */
  15042. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  15043. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  15044. return 0; /* suites buffer not large enough, error out */
  15045. }
  15046. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  15047. suites->suites[idx++] = cipher_names[i].cipherSuite;
  15048. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  15049. * suites don't necessarily have RSA in the name. */
  15050. #ifdef WOLFSSL_TLS13
  15051. if (cipher_names[i].cipherSuite0 == TLS13_BYTE) {
  15052. #ifndef NO_RSA
  15053. haveRSAsig = 1;
  15054. #endif
  15055. #if defined(HAVE_ECC) || defined(HAVE_ED25519)
  15056. haveECDSAsig = 1;
  15057. #endif
  15058. }
  15059. else
  15060. #endif
  15061. #if defined(HAVE_ECC) || defined(HAVE_ED25519)
  15062. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  15063. haveECDSAsig = 1;
  15064. else
  15065. #endif
  15066. #ifdef HAVE_ANON
  15067. if (XSTRSTR(name, "ADH"))
  15068. haveAnon = 1;
  15069. else
  15070. #endif
  15071. if (haveRSAsig == 0
  15072. #ifndef NO_PSK
  15073. && (XSTRSTR(name, "PSK") == NULL)
  15074. #endif
  15075. ) {
  15076. haveRSAsig = 1;
  15077. }
  15078. ret = 1; /* found at least one */
  15079. break;
  15080. }
  15081. }
  15082. }
  15083. while (next++); /* ++ needed to skip ':' */
  15084. if (ret) {
  15085. int keySz = 0;
  15086. #ifndef NO_CERTS
  15087. keySz = ctx->privateKeySz;
  15088. #endif
  15089. suites->setSuites = 1;
  15090. suites->suiteSz = (word16)idx;
  15091. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig, haveAnon, 1,
  15092. keySz);
  15093. }
  15094. (void)ctx;
  15095. return ret;
  15096. }
  15097. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  15098. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  15099. {
  15100. word32 i;
  15101. int ret = MATCH_SUITE_ERROR;
  15102. ssl->suites->sigAlgo = ssl->specs.sig_algo;
  15103. /* set defaults */
  15104. if (IsAtLeastTLSv1_3(ssl->version)) {
  15105. ssl->suites->hashAlgo = sha256_mac;
  15106. #ifndef NO_CERTS
  15107. ssl->suites->sigAlgo = ssl->buffers.keyType;
  15108. #endif
  15109. }
  15110. #ifndef WOLFSSL_NO_TLS12
  15111. else if (IsAtLeastTLSv1_2(ssl)) {
  15112. #ifdef WOLFSSL_ALLOW_TLS_SHA1
  15113. ssl->suites->hashAlgo = sha_mac;
  15114. #else
  15115. ssl->suites->hashAlgo = sha256_mac;
  15116. #endif
  15117. }
  15118. else {
  15119. ssl->suites->hashAlgo = sha_mac;
  15120. }
  15121. #endif
  15122. if (hashSigAlgoSz == 0)
  15123. return 0;
  15124. /* i+1 since peek a byte ahead for type */
  15125. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  15126. byte hashAlgo = 0, sigAlgo = 0;
  15127. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  15128. #ifdef HAVE_ED25519
  15129. if (ssl->pkCurveOID == ECC_ED25519_OID && sigAlgo != ed25519_sa_algo)
  15130. continue;
  15131. if (sigAlgo == ed25519_sa_algo &&
  15132. ssl->suites->sigAlgo == ecc_dsa_sa_algo) {
  15133. ssl->suites->sigAlgo = sigAlgo;
  15134. ssl->suites->hashAlgo = sha512_mac;
  15135. ret = 0;
  15136. break;
  15137. }
  15138. #endif
  15139. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  15140. * algorithm that matches the ephemeral ECDHE key size or the next highest
  15141. * available. This workaround resolves issue with some peer's that do not
  15142. * properly support scenarios such as a P-256 key hashed with SHA512.
  15143. */
  15144. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  15145. if (sigAlgo == ssl->suites->sigAlgo && sigAlgo == ecc_dsa_sa_algo) {
  15146. int digestSz = GetMacDigestSize(hashAlgo);
  15147. if (digestSz <= 0)
  15148. continue;
  15149. /* For ecc_dsa_sa_algo, pick hash algo that is curve size unless
  15150. algorithm in not compiled in, then choose next highest */
  15151. if (digestSz == ssl->eccTempKeySz) {
  15152. ssl->suites->hashAlgo = hashAlgo;
  15153. ssl->suites->sigAlgo = sigAlgo;
  15154. ret = 0;
  15155. break; /* done selected sig/hash algorithms */
  15156. }
  15157. /* not strong enough, so keep checking hashSigAlso list */
  15158. if (digestSz < ssl->eccTempKeySz)
  15159. continue;
  15160. /* mark as highest and check remainder of hashSigAlgo list */
  15161. ssl->suites->hashAlgo = hashAlgo;
  15162. ssl->suites->sigAlgo = sigAlgo;
  15163. ret = 0;
  15164. }
  15165. else
  15166. #endif
  15167. #ifdef WC_RSA_PSS
  15168. if (sigAlgo == ssl->suites->sigAlgo || (sigAlgo == rsa_pss_sa_algo &&
  15169. ssl->suites->sigAlgo == rsa_sa_algo))
  15170. #else
  15171. if (sigAlgo == ssl->suites->sigAlgo)
  15172. #endif
  15173. {
  15174. /* pick highest available between both server and client */
  15175. switch (hashAlgo) {
  15176. case sha_mac:
  15177. #ifdef WOLFSSL_SHA224
  15178. case sha224_mac:
  15179. #endif
  15180. #ifndef NO_SHA256
  15181. case sha256_mac:
  15182. #endif
  15183. #ifdef WOLFSSL_SHA384
  15184. case sha384_mac:
  15185. #endif
  15186. #ifdef WOLFSSL_SHA512
  15187. case sha512_mac:
  15188. #endif
  15189. /* not strong enough, so keep checking hashSigAlso list */
  15190. if (hashAlgo < ssl->suites->hashAlgo) {
  15191. ret = 0;
  15192. continue;
  15193. }
  15194. /* mark as highest and check remainder of hashSigAlgo list */
  15195. ssl->suites->hashAlgo = hashAlgo;
  15196. ssl->suites->sigAlgo = sigAlgo;
  15197. break;
  15198. default:
  15199. continue;
  15200. }
  15201. ret = 0;
  15202. break;
  15203. }
  15204. #if !defined(WOLFSSL_TLS13) || !defined(HAVE_NULL_CIPHER)
  15205. else if (ssl->specs.sig_algo == 0 && IsAtLeastTLSv1_3(ssl->version)) {
  15206. }
  15207. #endif
  15208. else if (ssl->specs.sig_algo == 0)
  15209. {
  15210. ssl->suites->hashAlgo = ssl->specs.mac_algorithm;
  15211. ret = 0;
  15212. }
  15213. }
  15214. return ret;
  15215. }
  15216. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  15217. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15218. /* Initialize HandShakeInfo */
  15219. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  15220. {
  15221. int i;
  15222. info->ssl = ssl;
  15223. info->cipherName[0] = 0;
  15224. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  15225. info->packetNames[i][0] = 0;
  15226. info->numberPackets = 0;
  15227. info->negotiationError = 0;
  15228. }
  15229. /* Set Final HandShakeInfo parameters */
  15230. void FinishHandShakeInfo(HandShakeInfo* info)
  15231. {
  15232. int i;
  15233. int sz = GetCipherNamesSize();
  15234. for (i = 0; i < sz; i++)
  15235. if (info->ssl->options.cipherSuite ==
  15236. (byte)cipher_names[i].cipherSuite) {
  15237. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  15238. continue; /* ECC suites at end */
  15239. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  15240. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  15241. break;
  15242. }
  15243. /* error max and min are negative numbers */
  15244. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  15245. info->negotiationError = info->ssl->error;
  15246. }
  15247. /* Add name to info packet names, increase packet name count */
  15248. void AddPacketName(WOLFSSL* ssl, const char* name)
  15249. {
  15250. #ifdef WOLFSSL_CALLBACKS
  15251. HandShakeInfo* info = &ssl->handShakeInfo;
  15252. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  15253. char* packetName = info->packetNames[info->numberPackets];
  15254. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  15255. packetName[MAX_PACKETNAME_SZ] = '\0';
  15256. info->numberPackets++;
  15257. }
  15258. #endif
  15259. (void)ssl;
  15260. (void)name;
  15261. }
  15262. #ifdef WOLFSSL_CALLBACKS
  15263. /* Initialize TimeoutInfo */
  15264. void InitTimeoutInfo(TimeoutInfo* info)
  15265. {
  15266. int i;
  15267. info->timeoutName[0] = 0;
  15268. info->flags = 0;
  15269. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  15270. info->packets[i].packetName[0] = 0;
  15271. info->packets[i].timestamp.tv_sec = 0;
  15272. info->packets[i].timestamp.tv_usec = 0;
  15273. info->packets[i].bufferValue = 0;
  15274. info->packets[i].valueSz = 0;
  15275. }
  15276. info->numberPackets = 0;
  15277. info->timeoutValue.tv_sec = 0;
  15278. info->timeoutValue.tv_usec = 0;
  15279. }
  15280. /* Free TimeoutInfo */
  15281. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  15282. {
  15283. int i;
  15284. (void)heap;
  15285. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  15286. if (info->packets[i].bufferValue) {
  15287. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  15288. info->packets[i].bufferValue = 0;
  15289. }
  15290. }
  15291. /* Add packet name to previously added packet info */
  15292. void AddLateName(const char* name, TimeoutInfo* info)
  15293. {
  15294. /* make sure we have a valid previous one */
  15295. if (info->numberPackets > 0 && info->numberPackets <
  15296. MAX_PACKETS_HANDSHAKE) {
  15297. char* packetName = info->packets[info->numberPackets-1].packetName;
  15298. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  15299. packetName[MAX_PACKETNAME_SZ] = '\0';
  15300. }
  15301. }
  15302. /* Add record header to previously added packet info */
  15303. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  15304. {
  15305. /* make sure we have a valid previous one */
  15306. if (info->numberPackets > 0 && info->numberPackets <
  15307. MAX_PACKETS_HANDSHAKE) {
  15308. if (info->packets[info->numberPackets - 1].bufferValue)
  15309. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  15310. RECORD_HEADER_SZ);
  15311. else
  15312. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  15313. RECORD_HEADER_SZ);
  15314. }
  15315. }
  15316. #endif /* WOLFSSL_CALLBACKS */
  15317. /* Add PacketInfo to TimeoutInfo
  15318. *
  15319. * ssl WOLFSSL structure sending or receiving packet
  15320. * name name of packet being sent
  15321. * type type of packet being sent
  15322. * data data bing sent with packet
  15323. * sz size of data buffer
  15324. * written 1 if this packet is being written to wire, 0 if being read
  15325. * heap custom heap to use for mallocs/frees
  15326. */
  15327. void AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  15328. const byte* data, int sz, int written, void* heap)
  15329. {
  15330. #ifdef WOLFSSL_CALLBACKS
  15331. TimeoutInfo* info = &ssl->timeoutInfo;
  15332. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  15333. Timeval currTime;
  15334. /* may add name after */
  15335. if (name) {
  15336. char* packetName = info->packets[info->numberPackets].packetName;
  15337. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  15338. packetName[MAX_PACKETNAME_SZ] = '\0';
  15339. }
  15340. /* add data, put in buffer if bigger than static buffer */
  15341. info->packets[info->numberPackets].valueSz = sz;
  15342. if (sz < MAX_VALUE_SZ)
  15343. XMEMCPY(info->packets[info->numberPackets].value, data, sz);
  15344. else {
  15345. info->packets[info->numberPackets].bufferValue =
  15346. (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_INFO);
  15347. if (!info->packets[info->numberPackets].bufferValue)
  15348. /* let next alloc catch, just don't fill, not fatal here */
  15349. info->packets[info->numberPackets].valueSz = 0;
  15350. else
  15351. XMEMCPY(info->packets[info->numberPackets].bufferValue,
  15352. data, sz);
  15353. }
  15354. gettimeofday(&currTime, 0);
  15355. info->packets[info->numberPackets].timestamp.tv_sec =
  15356. currTime.tv_sec;
  15357. info->packets[info->numberPackets].timestamp.tv_usec =
  15358. currTime.tv_usec;
  15359. info->numberPackets++;
  15360. }
  15361. #endif /* WOLFSSL_CALLBACKS */
  15362. #ifdef OPENSSL_EXTRA
  15363. if (ssl->protoMsgCb != NULL && sz > RECORD_HEADER_SZ) {
  15364. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  15365. 4096 from 16^3 */
  15366. int version = (ssl->version.minor & 0X0F) +
  15367. (ssl->version.minor & 0xF0) * 16 +
  15368. (ssl->version.major & 0X0F) * 256 +
  15369. (ssl->version.major & 0xF0) * 4096;
  15370. ssl->protoMsgCb(written, version, type,
  15371. (const void *)(data + RECORD_HEADER_SZ),
  15372. (size_t)(sz - RECORD_HEADER_SZ),
  15373. ssl, ssl->protoMsgCtx);
  15374. }
  15375. #endif /* OPENSSL_EXTRA */
  15376. (void)written;
  15377. (void)name;
  15378. (void)heap;
  15379. (void)type;
  15380. (void)ssl;
  15381. }
  15382. #endif /* WOLFSSL_CALLBACKS */
  15383. #if !defined(NO_CERTS)
  15384. /* Decode the private key - RSA, ECC, or Ed25519 - and creates a key object.
  15385. * The signature type is set as well.
  15386. * The maximum length of a signature is returned.
  15387. *
  15388. * ssl The SSL/TLS object.
  15389. * length The length of a signature.
  15390. * returns 0 on success, otherwise failure.
  15391. */
  15392. int DecodePrivateKey(WOLFSSL *ssl, word16* length)
  15393. {
  15394. int ret = BAD_FUNC_ARG;
  15395. int keySz;
  15396. word32 idx;
  15397. #ifdef HAVE_PK_CALLBACKS
  15398. /* allow no private key if using PK callbacks and CB is set */
  15399. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  15400. *length = GetPrivateKeySigSize(ssl);
  15401. return 0;
  15402. }
  15403. else
  15404. #endif
  15405. /* make sure private key exists */
  15406. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  15407. WOLFSSL_MSG("Private key missing!");
  15408. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  15409. }
  15410. #ifdef HAVE_PKCS11
  15411. if (ssl->buffers.keyDevId != INVALID_DEVID && ssl->buffers.keyId) {
  15412. if (ssl->buffers.keyType == rsa_sa_algo)
  15413. ssl->hsType = DYNAMIC_TYPE_RSA;
  15414. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  15415. ssl->hsType = DYNAMIC_TYPE_ECC;
  15416. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  15417. if (ret != 0) {
  15418. goto exit_dpk;
  15419. }
  15420. if (ssl->buffers.keyType == rsa_sa_algo) {
  15421. #ifndef NO_RSA
  15422. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  15423. ssl->buffers.key->buffer, ssl->buffers.key->length,
  15424. ssl->heap, ssl->buffers.keyDevId);
  15425. if (ret == 0) {
  15426. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  15427. WOLFSSL_MSG("RSA key size too small");
  15428. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  15429. }
  15430. /* Return the maximum signature length. */
  15431. *length = (word16)ssl->buffers.keySz;
  15432. }
  15433. #else
  15434. ret = NOT_COMPILED_IN;
  15435. #endif
  15436. }
  15437. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  15438. #ifdef HAVE_ECC
  15439. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey, ssl->buffers.key->buffer,
  15440. ssl->buffers.key->length, ssl->heap,
  15441. ssl->buffers.keyDevId);
  15442. if (ret == 0) {
  15443. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  15444. WOLFSSL_MSG("ECC key size too small");
  15445. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  15446. }
  15447. /* Return the maximum signature length. */
  15448. *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz);
  15449. }
  15450. #else
  15451. ret = NOT_COMPILED_IN;
  15452. #endif
  15453. }
  15454. goto exit_dpk;
  15455. }
  15456. #endif
  15457. #ifndef NO_RSA
  15458. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  15459. ssl->hsType = DYNAMIC_TYPE_RSA;
  15460. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  15461. if (ret != 0) {
  15462. goto exit_dpk;
  15463. }
  15464. WOLFSSL_MSG("Trying RSA private key");
  15465. /* Set start of data to beginning of buffer. */
  15466. idx = 0;
  15467. /* Decode the key assuming it is an RSA private key. */
  15468. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  15469. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  15470. if (ret == 0) {
  15471. WOLFSSL_MSG("Using RSA private key");
  15472. /* It worked so check it meets minimum key size requirements. */
  15473. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  15474. if (keySz < 0) { /* check if keySz has error case */
  15475. ERROR_OUT(keySz, exit_dpk);
  15476. }
  15477. if (keySz < ssl->options.minRsaKeySz) {
  15478. WOLFSSL_MSG("RSA key size too small");
  15479. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  15480. }
  15481. /* Return the maximum signature length. */
  15482. *length = (word16)keySz;
  15483. goto exit_dpk;
  15484. }
  15485. }
  15486. #endif /* !NO_RSA */
  15487. #ifdef HAVE_ECC
  15488. #ifndef NO_RSA
  15489. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  15490. #endif /* !NO_RSA */
  15491. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0) {
  15492. ssl->hsType = DYNAMIC_TYPE_ECC;
  15493. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  15494. if (ret != 0) {
  15495. goto exit_dpk;
  15496. }
  15497. #ifndef NO_RSA
  15498. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  15499. #else
  15500. WOLFSSL_MSG("Trying ECC private key");
  15501. #endif
  15502. /* Set start of data to beginning of buffer. */
  15503. idx = 0;
  15504. /* Decode the key assuming it is an ECC private key. */
  15505. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  15506. (ecc_key*)ssl->hsKey,
  15507. ssl->buffers.key->length);
  15508. if (ret == 0) {
  15509. WOLFSSL_MSG("Using ECC private key");
  15510. /* Check it meets the minimum ECC key size requirements. */
  15511. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  15512. if (keySz < ssl->options.minEccKeySz) {
  15513. WOLFSSL_MSG("ECC key size too small");
  15514. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  15515. }
  15516. /* Return the maximum signature length. */
  15517. *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  15518. goto exit_dpk;
  15519. }
  15520. }
  15521. #endif
  15522. #ifdef HAVE_ED25519
  15523. #if !defined(NO_RSA) || defined(HAVE_ECC)
  15524. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  15525. #endif
  15526. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  15527. ssl->hsType = DYNAMIC_TYPE_ED25519;
  15528. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  15529. if (ret != 0) {
  15530. goto exit_dpk;
  15531. }
  15532. #ifdef HAVE_ECC
  15533. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  15534. #elif !defined(NO_RSA)
  15535. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  15536. #else
  15537. WOLFSSL_MSG("Trying ED25519 private key");
  15538. #endif
  15539. /* Set start of data to beginning of buffer. */
  15540. idx = 0;
  15541. /* Decode the key assuming it is an ED25519 private key. */
  15542. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  15543. (ed25519_key*)ssl->hsKey,
  15544. ssl->buffers.key->length);
  15545. if (ret == 0) {
  15546. WOLFSSL_MSG("Using ED25519 private key");
  15547. /* Check it meets the minimum ECC key size requirements. */
  15548. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  15549. WOLFSSL_MSG("ED25519 key size too small");
  15550. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  15551. }
  15552. /* Return the maximum signature length. */
  15553. *length = ED25519_SIG_SIZE;
  15554. goto exit_dpk;
  15555. }
  15556. }
  15557. #endif /* HAVE_ED25519 */
  15558. (void)idx;
  15559. (void)keySz;
  15560. (void)length;
  15561. exit_dpk:
  15562. return ret;
  15563. }
  15564. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  15565. /* client only parts */
  15566. #ifndef NO_WOLFSSL_CLIENT
  15567. #ifndef WOLFSSL_NO_TLS12
  15568. /* handle generation of client_hello (1) */
  15569. int SendClientHello(WOLFSSL* ssl)
  15570. {
  15571. byte *output;
  15572. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  15573. int sendSz;
  15574. int idSz = ssl->options.resuming
  15575. ? ssl->session.sessionIDSz
  15576. : 0;
  15577. int ret;
  15578. word16 extSz = 0;
  15579. #ifdef WOLFSSL_TLS13
  15580. if (IsAtLeastTLSv1_3(ssl->version))
  15581. return SendTls13ClientHello(ssl);
  15582. #endif
  15583. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  15584. WOLFSSL_ENTER("SendClientHello");
  15585. if (ssl->suites == NULL) {
  15586. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  15587. return SUITES_ERROR;
  15588. }
  15589. #ifdef HAVE_SESSION_TICKET
  15590. if (ssl->options.resuming && ssl->session.ticketLen > 0) {
  15591. SessionTicket* ticket;
  15592. ticket = TLSX_SessionTicket_Create(0, ssl->session.ticket,
  15593. ssl->session.ticketLen, ssl->heap);
  15594. if (ticket == NULL) return MEMORY_E;
  15595. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  15596. if (ret != WOLFSSL_SUCCESS) {
  15597. TLSX_SessionTicket_Free(ticket, ssl->heap);
  15598. return ret;
  15599. }
  15600. idSz = 0;
  15601. }
  15602. #endif
  15603. length = VERSION_SZ + RAN_LEN
  15604. + idSz + ENUM_LEN
  15605. + ssl->suites->suiteSz + SUITE_LEN
  15606. + COMP_LEN + ENUM_LEN;
  15607. #ifdef HAVE_TLS_EXTENSIONS
  15608. /* auto populate extensions supported unless user defined */
  15609. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  15610. return ret;
  15611. #ifdef HAVE_QSH
  15612. if (QSH_Init(ssl) != 0)
  15613. return MEMORY_E;
  15614. #endif
  15615. extSz = 0;
  15616. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  15617. if (ret != 0)
  15618. return ret;
  15619. length += extSz;
  15620. #else
  15621. if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
  15622. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  15623. + ssl->suites->hashSigAlgoSz;
  15624. #ifdef HAVE_EXTENDED_MASTER
  15625. if (ssl->options.haveEMS)
  15626. extSz += HELLO_EXT_SZ;
  15627. #endif
  15628. if (extSz != 0)
  15629. length += extSz + HELLO_EXT_SZ_SZ;
  15630. #endif
  15631. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  15632. #ifdef WOLFSSL_DTLS
  15633. if (ssl->options.dtls) {
  15634. length += ENUM_LEN; /* cookie */
  15635. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  15636. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  15637. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  15638. }
  15639. #endif
  15640. if (IsEncryptionOn(ssl, 1))
  15641. sendSz += MAX_MSG_EXTRA;
  15642. /* check for available size */
  15643. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  15644. return ret;
  15645. /* get output buffer */
  15646. output = ssl->buffers.outputBuffer.buffer +
  15647. ssl->buffers.outputBuffer.length;
  15648. AddHeaders(output, length, client_hello, ssl);
  15649. /* client hello, first version */
  15650. output[idx++] = ssl->version.major;
  15651. output[idx++] = ssl->version.minor;
  15652. ssl->chVersion = ssl->version; /* store in case changed */
  15653. /* then random */
  15654. if (ssl->options.connectState == CONNECT_BEGIN) {
  15655. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  15656. if (ret != 0)
  15657. return ret;
  15658. /* store random */
  15659. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  15660. } else {
  15661. #ifdef WOLFSSL_DTLS
  15662. /* send same random on hello again */
  15663. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  15664. #endif
  15665. }
  15666. idx += RAN_LEN;
  15667. /* then session id */
  15668. output[idx++] = (byte)idSz;
  15669. if (idSz) {
  15670. XMEMCPY(output + idx, ssl->session.sessionID,
  15671. ssl->session.sessionIDSz);
  15672. idx += ssl->session.sessionIDSz;
  15673. }
  15674. /* then DTLS cookie */
  15675. #ifdef WOLFSSL_DTLS
  15676. if (ssl->options.dtls) {
  15677. byte cookieSz = ssl->arrays->cookieSz;
  15678. output[idx++] = cookieSz;
  15679. if (cookieSz) {
  15680. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  15681. idx += cookieSz;
  15682. }
  15683. }
  15684. #endif
  15685. /* then cipher suites */
  15686. c16toa(ssl->suites->suiteSz, output + idx);
  15687. idx += OPAQUE16_LEN;
  15688. XMEMCPY(output + idx, &ssl->suites->suites, ssl->suites->suiteSz);
  15689. idx += ssl->suites->suiteSz;
  15690. /* last, compression */
  15691. output[idx++] = COMP_LEN;
  15692. if (ssl->options.usingCompression)
  15693. output[idx++] = ZLIB_COMPRESSION;
  15694. else
  15695. output[idx++] = NO_COMPRESSION;
  15696. #ifdef HAVE_TLS_EXTENSIONS
  15697. extSz = 0;
  15698. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  15699. if (ret != 0)
  15700. return ret;
  15701. idx += extSz;
  15702. (void)idx; /* suppress analyzer warning, keep idx current */
  15703. #else
  15704. if (extSz != 0) {
  15705. c16toa(extSz, output + idx);
  15706. idx += HELLO_EXT_SZ_SZ;
  15707. if (IsAtLeastTLSv1_2(ssl)) {
  15708. if (ssl->suites->hashSigAlgoSz) {
  15709. word16 i;
  15710. /* extension type */
  15711. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  15712. idx += HELLO_EXT_TYPE_SZ;
  15713. /* extension data length */
  15714. c16toa(HELLO_EXT_SIGALGO_SZ + ssl->suites->hashSigAlgoSz,
  15715. output + idx);
  15716. idx += HELLO_EXT_SZ_SZ;
  15717. /* sig algos length */
  15718. c16toa(ssl->suites->hashSigAlgoSz, output + idx);
  15719. idx += HELLO_EXT_SIGALGO_SZ;
  15720. for (i=0; i < ssl->suites->hashSigAlgoSz; i++, idx++) {
  15721. output[idx] = ssl->suites->hashSigAlgo[i];
  15722. }
  15723. }
  15724. }
  15725. #ifdef HAVE_EXTENDED_MASTER
  15726. if (ssl->options.haveEMS) {
  15727. c16toa(HELLO_EXT_EXTMS, output + idx);
  15728. idx += HELLO_EXT_TYPE_SZ;
  15729. c16toa(0, output + idx);
  15730. idx += HELLO_EXT_SZ_SZ;
  15731. }
  15732. #endif
  15733. }
  15734. #endif
  15735. if (IsEncryptionOn(ssl, 1)) {
  15736. byte* input;
  15737. int inputSz = idx - RECORD_HEADER_SZ; /* build msg adds rec hdr */
  15738. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15739. if (input == NULL)
  15740. return MEMORY_E;
  15741. XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
  15742. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15743. handshake, 1, 0, 0);
  15744. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15745. if (sendSz < 0)
  15746. return sendSz;
  15747. } else {
  15748. #ifdef WOLFSSL_DTLS
  15749. if (IsDtlsNotSctpMode(ssl)) {
  15750. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
  15751. return ret;
  15752. }
  15753. if (ssl->options.dtls)
  15754. DtlsSEQIncrement(ssl, CUR_ORDER);
  15755. #endif
  15756. ret = HashOutput(ssl, output, sendSz, 0);
  15757. if (ret != 0)
  15758. return ret;
  15759. }
  15760. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  15761. #ifdef OPENSSL_EXTRA
  15762. ssl->cbmode = SSL_CB_MODE_WRITE;
  15763. if (ssl->CBIS != NULL)
  15764. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  15765. #endif
  15766. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15767. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  15768. if (ssl->toInfoOn)
  15769. AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  15770. WRITE_PROTO, ssl->heap);
  15771. #endif
  15772. ssl->buffers.outputBuffer.length += sendSz;
  15773. ret = SendBuffered(ssl);
  15774. WOLFSSL_LEAVE("SendClientHello", ret);
  15775. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  15776. return ret;
  15777. }
  15778. /* handle processing of DTLS hello_verify_request (3) */
  15779. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input,
  15780. word32* inOutIdx, word32 size)
  15781. {
  15782. ProtocolVersion pv;
  15783. byte cookieSz;
  15784. word32 begin = *inOutIdx;
  15785. #ifdef WOLFSSL_CALLBACKS
  15786. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  15787. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  15788. #endif
  15789. #ifdef WOLFSSL_DTLS
  15790. if (ssl->options.dtls) {
  15791. DtlsMsgPoolReset(ssl);
  15792. }
  15793. #endif
  15794. if ((*inOutIdx - begin) + OPAQUE16_LEN + OPAQUE8_LEN > size)
  15795. return BUFFER_ERROR;
  15796. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  15797. *inOutIdx += OPAQUE16_LEN;
  15798. if (pv.major != DTLS_MAJOR ||
  15799. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  15800. return VERSION_ERROR;
  15801. cookieSz = input[(*inOutIdx)++];
  15802. if (cookieSz) {
  15803. if ((*inOutIdx - begin) + cookieSz > size)
  15804. return BUFFER_ERROR;
  15805. #ifdef WOLFSSL_DTLS
  15806. if (cookieSz <= MAX_COOKIE_LEN) {
  15807. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  15808. ssl->arrays->cookieSz = cookieSz;
  15809. }
  15810. #endif
  15811. *inOutIdx += cookieSz;
  15812. }
  15813. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  15814. return 0;
  15815. }
  15816. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  15817. {
  15818. int ret = 0;
  15819. #ifdef HAVE_SECRET_CALLBACK
  15820. /* If a session secret callback exists, we are using that
  15821. * key instead of the saved session key. */
  15822. ret = ret || (ssl->sessionSecretCb != NULL);
  15823. #endif
  15824. #ifdef HAVE_SESSION_TICKET
  15825. /* server may send blank ticket which may not be expected to indicate
  15826. * existing one ok but will also be sending a new one */
  15827. ret = ret || (ssl->session.ticketLen > 0);
  15828. #endif
  15829. ret = ret ||
  15830. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  15831. ssl->session.sessionID, ID_LEN) == 0);
  15832. return ret;
  15833. }
  15834. /* Check the version in the received message is valid and set protocol
  15835. * version to use.
  15836. *
  15837. * ssl The SSL/TLS object.
  15838. * pv The protocol version from the packet.
  15839. * returns 0 on success, otherwise failure.
  15840. */
  15841. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  15842. {
  15843. #ifdef WOLFSSL_TLS13_DRAFT
  15844. if (pv.major == TLS_DRAFT_MAJOR) {
  15845. pv.major = SSLv3_MAJOR;
  15846. pv.minor = TLSv1_3_MINOR;
  15847. }
  15848. #endif
  15849. #ifdef OPENSSL_EXTRA
  15850. if (ssl->CBIS != NULL) {
  15851. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, SSL_SUCCESS);
  15852. }
  15853. #endif
  15854. if (pv.minor > ssl->version.minor) {
  15855. WOLFSSL_MSG("Server using higher version, fatal error");
  15856. return VERSION_ERROR;
  15857. }
  15858. if (pv.minor < ssl->version.minor) {
  15859. WOLFSSL_MSG("server using lower version");
  15860. /* Check for downgrade attack. */
  15861. if (!ssl->options.downgrade) {
  15862. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  15863. return VERSION_ERROR;
  15864. }
  15865. if (pv.minor < ssl->options.minDowngrade) {
  15866. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  15867. return VERSION_ERROR;
  15868. }
  15869. #ifdef HAVE_SECURE_RENEGOTIATION
  15870. if (ssl->secure_renegotiation &&
  15871. ssl->secure_renegotiation->enabled &&
  15872. ssl->options.handShakeDone) {
  15873. WOLFSSL_MSG("Server changed version during scr");
  15874. return VERSION_ERROR;
  15875. }
  15876. #endif
  15877. /* Checks made - OK to downgrade. */
  15878. if (pv.minor == SSLv3_MINOR) {
  15879. /* turn off tls */
  15880. WOLFSSL_MSG("\tdowngrading to SSLv3");
  15881. ssl->options.tls = 0;
  15882. ssl->options.tls1_1 = 0;
  15883. ssl->version.minor = SSLv3_MINOR;
  15884. }
  15885. else if (pv.minor == TLSv1_MINOR) {
  15886. /* turn off tls 1.1+ */
  15887. WOLFSSL_MSG("\tdowngrading to TLSv1");
  15888. ssl->options.tls1_1 = 0;
  15889. ssl->version.minor = TLSv1_MINOR;
  15890. }
  15891. else if (pv.minor == TLSv1_1_MINOR) {
  15892. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  15893. ssl->version.minor = TLSv1_1_MINOR;
  15894. }
  15895. else if (pv.minor == TLSv1_2_MINOR) {
  15896. WOLFSSL_MSG(" downgrading to TLSv1.2");
  15897. ssl->version.minor = TLSv1_2_MINOR;
  15898. }
  15899. }
  15900. #ifdef OPENSSL_EXTRA
  15901. /* check if option is set to not allow the current version
  15902. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  15903. if (!ssl->options.dtls && ssl->options.downgrade &&
  15904. ssl->options.mask > 0) {
  15905. if (ssl->version.minor == TLSv1_2_MINOR &&
  15906. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  15907. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  15908. ssl->version.minor = TLSv1_1_MINOR;
  15909. }
  15910. if (ssl->version.minor == TLSv1_1_MINOR &&
  15911. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  15912. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  15913. ssl->options.tls1_1 = 0;
  15914. ssl->version.minor = TLSv1_MINOR;
  15915. }
  15916. if (ssl->version.minor == TLSv1_MINOR &&
  15917. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  15918. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  15919. ssl->options.tls = 0;
  15920. ssl->options.tls1_1 = 0;
  15921. ssl->version.minor = SSLv3_MINOR;
  15922. }
  15923. if (ssl->version.minor == SSLv3_MINOR &&
  15924. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  15925. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  15926. return VERSION_ERROR;
  15927. }
  15928. if (ssl->version.minor < ssl->options.minDowngrade) {
  15929. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  15930. return VERSION_ERROR;
  15931. }
  15932. }
  15933. #endif
  15934. return 0;
  15935. }
  15936. /* handle processing of server_hello (2) */
  15937. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  15938. word32 helloSz)
  15939. {
  15940. byte cs0; /* cipher suite bytes 0, 1 */
  15941. byte cs1;
  15942. ProtocolVersion pv;
  15943. byte compression;
  15944. word32 i = *inOutIdx;
  15945. word32 begin = i;
  15946. int ret;
  15947. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  15948. WOLFSSL_ENTER("DoServerHello");
  15949. #ifdef WOLFSSL_CALLBACKS
  15950. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  15951. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  15952. #endif
  15953. /* protocol version, random and session id length check */
  15954. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  15955. return BUFFER_ERROR;
  15956. /* protocol version */
  15957. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  15958. i += OPAQUE16_LEN;
  15959. ret = CheckVersion(ssl, pv);
  15960. if (ret != 0)
  15961. return ret;
  15962. #ifdef WOLFSSL_TLS13
  15963. if (IsAtLeastTLSv1_3(pv)) {
  15964. byte type = server_hello;
  15965. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  15966. }
  15967. #endif
  15968. /* random */
  15969. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  15970. i += RAN_LEN;
  15971. /* session id */
  15972. ssl->arrays->sessionIDSz = input[i++];
  15973. if (ssl->arrays->sessionIDSz > ID_LEN) {
  15974. WOLFSSL_MSG("Invalid session ID size");
  15975. ssl->arrays->sessionIDSz = 0;
  15976. return BUFFER_ERROR;
  15977. }
  15978. else if (ssl->arrays->sessionIDSz) {
  15979. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  15980. return BUFFER_ERROR;
  15981. XMEMCPY(ssl->arrays->sessionID, input + i,
  15982. ssl->arrays->sessionIDSz);
  15983. i += ssl->arrays->sessionIDSz;
  15984. ssl->options.haveSessionId = 1;
  15985. }
  15986. /* suite and compression */
  15987. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  15988. return BUFFER_ERROR;
  15989. cs0 = input[i++];
  15990. cs1 = input[i++];
  15991. #ifdef HAVE_SECURE_RENEGOTIATION
  15992. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  15993. ssl->options.handShakeDone) {
  15994. if (ssl->options.cipherSuite0 != cs0 ||
  15995. ssl->options.cipherSuite != cs1) {
  15996. WOLFSSL_MSG("Server changed cipher suite during scr");
  15997. return MATCH_SUITE_ERROR;
  15998. }
  15999. }
  16000. #endif
  16001. ssl->options.cipherSuite0 = cs0;
  16002. ssl->options.cipherSuite = cs1;
  16003. compression = input[i++];
  16004. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  16005. {
  16006. word32 idx, found = 0;
  16007. /* confirm server_hello cipher suite is one sent in client_hello */
  16008. for (idx = 0; idx < ssl->suites->suiteSz; idx += 2) {
  16009. if (ssl->suites->suites[idx] == cs0 &&
  16010. ssl->suites->suites[idx+1] == cs1) {
  16011. found = 1;
  16012. break;
  16013. }
  16014. }
  16015. if (!found) {
  16016. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  16017. return MATCH_SUITE_ERROR;
  16018. }
  16019. }
  16020. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  16021. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  16022. WOLFSSL_MSG("Server forcing compression w/o support");
  16023. return COMPRESSION_ERROR;
  16024. }
  16025. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  16026. WOLFSSL_MSG("Server refused compression, turning off");
  16027. ssl->options.usingCompression = 0; /* turn off if server refused */
  16028. }
  16029. *inOutIdx = i;
  16030. #ifdef HAVE_TLS_EXTENSIONS
  16031. if ( (i - begin) < helloSz) {
  16032. if (TLSX_SupportExtensions(ssl)) {
  16033. word16 totalExtSz;
  16034. if ((i - begin) + OPAQUE16_LEN > helloSz)
  16035. return BUFFER_ERROR;
  16036. ato16(&input[i], &totalExtSz);
  16037. i += OPAQUE16_LEN;
  16038. if ((i - begin) + totalExtSz > helloSz)
  16039. return BUFFER_ERROR;
  16040. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  16041. server_hello, NULL)))
  16042. return ret;
  16043. i += totalExtSz;
  16044. *inOutIdx = i;
  16045. }
  16046. else
  16047. *inOutIdx = begin + helloSz; /* skip extensions */
  16048. }
  16049. else
  16050. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  16051. #else
  16052. {
  16053. int allowExt = 0;
  16054. byte pendingEMS = 0;
  16055. if ( (i - begin) < helloSz) {
  16056. if (ssl->version.major == SSLv3_MAJOR &&
  16057. ssl->version.minor >= TLSv1_MINOR) {
  16058. allowExt = 1;
  16059. }
  16060. #ifdef WOLFSSL_DTLS
  16061. if (ssl->version.major == DTLS_MAJOR)
  16062. allowExt = 1;
  16063. #endif
  16064. if (allowExt) {
  16065. word16 totalExtSz;
  16066. if ((i - begin) + OPAQUE16_LEN > helloSz)
  16067. return BUFFER_ERROR;
  16068. ato16(&input[i], &totalExtSz);
  16069. i += OPAQUE16_LEN;
  16070. if ((i - begin) + totalExtSz > helloSz)
  16071. return BUFFER_ERROR;
  16072. while (totalExtSz) {
  16073. word16 extId, extSz;
  16074. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  16075. return BUFFER_ERROR;
  16076. ato16(&input[i], &extId);
  16077. i += OPAQUE16_LEN;
  16078. ato16(&input[i], &extSz);
  16079. i += OPAQUE16_LEN;
  16080. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  16081. return BUFFER_ERROR;
  16082. if (extId == HELLO_EXT_EXTMS)
  16083. pendingEMS = 1;
  16084. else
  16085. i += extSz;
  16086. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  16087. }
  16088. *inOutIdx = i;
  16089. }
  16090. else
  16091. *inOutIdx = begin + helloSz; /* skip extensions */
  16092. }
  16093. if (!pendingEMS && ssl->options.haveEMS)
  16094. ssl->options.haveEMS = 0;
  16095. }
  16096. #endif
  16097. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  16098. if (IsEncryptionOn(ssl, 0)) {
  16099. *inOutIdx += ssl->keys.padSz;
  16100. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16101. if (ssl->options.encThenMac && ssl->specs.cipher_type == block)
  16102. *inOutIdx += MacSize(ssl);
  16103. #endif
  16104. }
  16105. #ifdef HAVE_SECRET_CALLBACK
  16106. if (ssl->sessionSecretCb != NULL) {
  16107. int secretSz = SECRET_LEN;
  16108. ret = ssl->sessionSecretCb(ssl, ssl->session.masterSecret,
  16109. &secretSz, ssl->sessionSecretCtx);
  16110. if (ret != 0 || secretSz != SECRET_LEN)
  16111. return SESSION_SECRET_CB_E;
  16112. }
  16113. #endif /* HAVE_SECRET_CALLBACK */
  16114. ret = CompleteServerHello(ssl);
  16115. WOLFSSL_LEAVE("DoServerHello", ret);
  16116. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  16117. return ret;
  16118. }
  16119. #ifdef WOLFSSL_TLS13
  16120. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  16121. static int TLSv1_3_Capable(WOLFSSL* ssl)
  16122. {
  16123. #ifndef WOLFSSL_TLS13
  16124. return 0;
  16125. #else
  16126. int ret = 0;
  16127. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  16128. ret = 1;
  16129. }
  16130. #ifdef OPENSSL_EXTRA
  16131. if ((wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_3)) {
  16132. /* option set at run time to disable TLS 1.3 */
  16133. ret = 0;
  16134. }
  16135. #endif
  16136. return ret;
  16137. #endif
  16138. }
  16139. #endif /* WOLFSSL_TLS13 */
  16140. int CompleteServerHello(WOLFSSL* ssl)
  16141. {
  16142. int ret;
  16143. if (!ssl->options.resuming) {
  16144. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  16145. TLS13_DOWNGRADE_SZ - 1;
  16146. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  16147. #ifdef WOLFSSL_TLS13
  16148. if (TLSv1_3_Capable(ssl)) {
  16149. /* TLS v1.3 capable client not allowed to downgrade when
  16150. * connecting to TLS v1.3 capable server unless cipher suite
  16151. * demands it.
  16152. */
  16153. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  16154. (vers == 0 || vers == 1)) {
  16155. SendAlert(ssl, alert_fatal, illegal_parameter);
  16156. return VERSION_ERROR;
  16157. }
  16158. }
  16159. else
  16160. #endif
  16161. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  16162. ssl->ctx->method->version.minor == TLSv1_2_MINOR) {
  16163. /* TLS v1.2 capable client not allowed to downgrade when
  16164. * connecting to TLS v1.2 capable server.
  16165. */
  16166. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  16167. vers == 0) {
  16168. SendAlert(ssl, alert_fatal, illegal_parameter);
  16169. return VERSION_ERROR;
  16170. }
  16171. }
  16172. }
  16173. else {
  16174. if (DSH_CheckSessionId(ssl)) {
  16175. if (SetCipherSpecs(ssl) == 0) {
  16176. XMEMCPY(ssl->arrays->masterSecret,
  16177. ssl->session.masterSecret, SECRET_LEN);
  16178. #ifdef NO_OLD_TLS
  16179. ret = DeriveTlsKeys(ssl);
  16180. #else
  16181. ret = -1; /* default value */
  16182. #ifndef NO_TLS
  16183. if (ssl->options.tls)
  16184. ret = DeriveTlsKeys(ssl);
  16185. #endif
  16186. if (!ssl->options.tls)
  16187. ret = DeriveKeys(ssl);
  16188. #endif /* NO_OLD_TLS */
  16189. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  16190. return ret;
  16191. }
  16192. else {
  16193. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  16194. return UNSUPPORTED_SUITE;
  16195. }
  16196. }
  16197. else {
  16198. WOLFSSL_MSG("Server denied resumption attempt");
  16199. ssl->options.resuming = 0; /* server denied resumption try */
  16200. }
  16201. }
  16202. #ifdef WOLFSSL_DTLS
  16203. if (ssl->options.dtls) {
  16204. DtlsMsgPoolReset(ssl);
  16205. }
  16206. #endif
  16207. return SetCipherSpecs(ssl);
  16208. }
  16209. #endif /* WOLFSSL_NO_TLS12 */
  16210. /* Make sure client setup is valid for this suite, true on success */
  16211. int VerifyClientSuite(WOLFSSL* ssl)
  16212. {
  16213. int havePSK = 0;
  16214. byte first = ssl->options.cipherSuite0;
  16215. byte second = ssl->options.cipherSuite;
  16216. WOLFSSL_ENTER("VerifyClientSuite");
  16217. #ifndef NO_PSK
  16218. havePSK = ssl->options.havePSK;
  16219. #endif
  16220. if (CipherRequires(first, second, REQUIRES_PSK)) {
  16221. WOLFSSL_MSG("Requires PSK");
  16222. if (havePSK == 0) {
  16223. WOLFSSL_MSG("Don't have PSK");
  16224. return 0;
  16225. }
  16226. }
  16227. return 1; /* success */
  16228. }
  16229. #ifndef WOLFSSL_NO_TLS12
  16230. #ifndef NO_CERTS
  16231. /* handle processing of certificate_request (13) */
  16232. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  16233. inOutIdx, word32 size)
  16234. {
  16235. word16 len;
  16236. word32 begin = *inOutIdx;
  16237. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  16238. WOLFSSL_ENTER("DoCertificateRequest");
  16239. #ifdef WOLFSSL_CALLBACKS
  16240. if (ssl->hsInfoOn)
  16241. AddPacketName(ssl, "CertificateRequest");
  16242. if (ssl->toInfoOn)
  16243. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  16244. #endif
  16245. if ((*inOutIdx - begin) + OPAQUE8_LEN > size)
  16246. return BUFFER_ERROR;
  16247. len = input[(*inOutIdx)++];
  16248. if ((*inOutIdx - begin) + len > size)
  16249. return BUFFER_ERROR;
  16250. /* types, read in here */
  16251. *inOutIdx += len;
  16252. /* signature and hash signature algorithm */
  16253. if (IsAtLeastTLSv1_2(ssl)) {
  16254. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  16255. return BUFFER_ERROR;
  16256. ato16(input + *inOutIdx, &len);
  16257. *inOutIdx += OPAQUE16_LEN;
  16258. if ((*inOutIdx - begin) + len > size)
  16259. return BUFFER_ERROR;
  16260. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  16261. ssl->buffers.certificate &&
  16262. ssl->buffers.certificate->buffer) {
  16263. #ifdef HAVE_PK_CALLBACKS
  16264. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  16265. WOLFSSL_MSG("Using PK for client private key");
  16266. return INVALID_PARAMETER;
  16267. }
  16268. #endif
  16269. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  16270. return INVALID_PARAMETER;
  16271. }
  16272. }
  16273. *inOutIdx += len;
  16274. #ifdef WC_RSA_PSS
  16275. ssl->pssAlgo = 0;
  16276. if (ssl->suites->sigAlgo == rsa_pss_sa_algo)
  16277. ssl->pssAlgo |= 1 << ssl->suites->hashAlgo;
  16278. #endif
  16279. }
  16280. /* authorities */
  16281. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  16282. return BUFFER_ERROR;
  16283. ato16(input + *inOutIdx, &len);
  16284. *inOutIdx += OPAQUE16_LEN;
  16285. if ((*inOutIdx - begin) + len > size)
  16286. return BUFFER_ERROR;
  16287. while (len) {
  16288. word16 dnSz;
  16289. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  16290. return BUFFER_ERROR;
  16291. ato16(input + *inOutIdx, &dnSz);
  16292. *inOutIdx += OPAQUE16_LEN;
  16293. if ((*inOutIdx - begin) + dnSz > size)
  16294. return BUFFER_ERROR;
  16295. *inOutIdx += dnSz;
  16296. len -= OPAQUE16_LEN + dnSz;
  16297. }
  16298. /* don't send client cert or cert verify if user hasn't provided
  16299. cert and private key */
  16300. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  16301. #ifdef HAVE_PK_CALLBACKS
  16302. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  16303. WOLFSSL_MSG("Using PK for client private key");
  16304. ssl->options.sendVerify = SEND_CERT;
  16305. }
  16306. #endif
  16307. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  16308. ssl->options.sendVerify = SEND_CERT;
  16309. }
  16310. }
  16311. #ifdef OPENSSL_EXTRA
  16312. else
  16313. #else
  16314. else if (IsTLS(ssl))
  16315. #endif
  16316. {
  16317. ssl->options.sendVerify = SEND_BLANK_CERT;
  16318. }
  16319. if (IsEncryptionOn(ssl, 0)) {
  16320. *inOutIdx += ssl->keys.padSz;
  16321. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16322. if (ssl->options.encThenMac)
  16323. *inOutIdx += MacSize(ssl);
  16324. #endif
  16325. }
  16326. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  16327. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  16328. return 0;
  16329. }
  16330. #endif /* !NO_CERTS */
  16331. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  16332. static int CheckCurveId(int tlsCurveId)
  16333. {
  16334. int ret = ECC_CURVE_ERROR;
  16335. switch (tlsCurveId) {
  16336. #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
  16337. #ifndef NO_ECC_SECP
  16338. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  16339. #endif /* !NO_ECC_SECP */
  16340. #ifdef HAVE_ECC_SECPR2
  16341. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  16342. #endif /* HAVE_ECC_SECPR2 */
  16343. #ifdef HAVE_ECC_KOBLITZ
  16344. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  16345. #endif /* HAVE_ECC_KOBLITZ */
  16346. #endif
  16347. #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
  16348. #ifndef NO_ECC_SECP
  16349. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  16350. #endif /* !NO_ECC_SECP */
  16351. #ifdef HAVE_ECC_KOBLITZ
  16352. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  16353. #endif /* HAVE_ECC_KOBLITZ */
  16354. #endif
  16355. #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
  16356. #ifndef NO_ECC_SECP
  16357. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  16358. #endif /* !NO_ECC_SECP */
  16359. #ifdef HAVE_ECC_KOBLITZ
  16360. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  16361. #endif /* HAVE_ECC_KOBLITZ */
  16362. #endif
  16363. #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
  16364. #ifdef HAVE_CURVE25519
  16365. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  16366. #endif
  16367. #ifndef NO_ECC_SECP
  16368. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  16369. #endif /* !NO_ECC_SECP */
  16370. #ifdef HAVE_ECC_KOBLITZ
  16371. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  16372. #endif /* HAVE_ECC_KOBLITZ */
  16373. #ifdef HAVE_ECC_BRAINPOOL
  16374. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  16375. #endif /* HAVE_ECC_BRAINPOOL */
  16376. #endif
  16377. #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
  16378. #ifndef NO_ECC_SECP
  16379. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  16380. #endif /* !NO_ECC_SECP */
  16381. #ifdef HAVE_ECC_BRAINPOOL
  16382. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  16383. #endif /* HAVE_ECC_BRAINPOOL */
  16384. #endif
  16385. #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
  16386. #ifdef HAVE_ECC_BRAINPOOL
  16387. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  16388. #endif /* HAVE_ECC_BRAINPOOL */
  16389. #endif
  16390. #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
  16391. #ifndef NO_ECC_SECP
  16392. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  16393. #endif /* !NO_ECC_SECP */
  16394. #endif
  16395. }
  16396. return ret;
  16397. }
  16398. #endif /* HAVE_ECC */
  16399. /* Persistable DoServerKeyExchange arguments */
  16400. typedef struct DskeArgs {
  16401. byte* output; /* not allocated */
  16402. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_ED25519)
  16403. byte* verifySig;
  16404. #endif
  16405. word32 idx;
  16406. word32 begin;
  16407. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_ED25519)
  16408. word16 verifySigSz;
  16409. #endif
  16410. word16 sigSz;
  16411. byte sigAlgo;
  16412. byte hashAlgo;
  16413. } DskeArgs;
  16414. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  16415. {
  16416. DskeArgs* args = (DskeArgs*)pArgs;
  16417. (void)ssl;
  16418. (void)args;
  16419. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_ED25519)
  16420. if (args->verifySig) {
  16421. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  16422. args->verifySig = NULL;
  16423. }
  16424. #endif
  16425. }
  16426. #ifndef NO_DH
  16427. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  16428. DskeArgs* args)
  16429. {
  16430. int ret = 0;
  16431. word16 length;
  16432. #ifdef HAVE_FFDHE
  16433. const DhParams* params = NULL;
  16434. int group;
  16435. #endif
  16436. /* p */
  16437. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  16438. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  16439. }
  16440. ato16(input + args->idx, &length);
  16441. args->idx += OPAQUE16_LEN;
  16442. if ((args->idx - args->begin) + length > size) {
  16443. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  16444. }
  16445. if (length < ssl->options.minDhKeySz) {
  16446. WOLFSSL_MSG("Server using a DH key that is too small");
  16447. SendAlert(ssl, alert_fatal, handshake_failure);
  16448. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  16449. }
  16450. if (length > ssl->options.maxDhKeySz) {
  16451. WOLFSSL_MSG("Server using a DH key that is too big");
  16452. SendAlert(ssl, alert_fatal, handshake_failure);
  16453. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  16454. }
  16455. ssl->buffers.serverDH_P.buffer =
  16456. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  16457. if (ssl->buffers.serverDH_P.buffer) {
  16458. ssl->buffers.serverDH_P.length = length;
  16459. }
  16460. else {
  16461. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  16462. }
  16463. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  16464. length);
  16465. args->idx += length;
  16466. ssl->options.dhKeySz = length;
  16467. /* g */
  16468. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  16469. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  16470. }
  16471. ato16(input + args->idx, &length);
  16472. args->idx += OPAQUE16_LEN;
  16473. if ((args->idx - args->begin) + length > size) {
  16474. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  16475. }
  16476. ssl->buffers.serverDH_G.buffer =
  16477. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  16478. if (ssl->buffers.serverDH_G.buffer) {
  16479. ssl->buffers.serverDH_G.length = length;
  16480. }
  16481. else {
  16482. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  16483. }
  16484. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  16485. length);
  16486. args->idx += length;
  16487. ssl->buffers.weOwnDH = 1;
  16488. /* pub */
  16489. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  16490. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  16491. }
  16492. ato16(input + args->idx, &length);
  16493. args->idx += OPAQUE16_LEN;
  16494. if ((args->idx - args->begin) + length > size) {
  16495. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  16496. }
  16497. ssl->buffers.serverDH_Pub.buffer =
  16498. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  16499. if (ssl->buffers.serverDH_Pub.buffer) {
  16500. ssl->buffers.serverDH_Pub.length = length;
  16501. }
  16502. else {
  16503. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  16504. }
  16505. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  16506. length);
  16507. args->idx += length;
  16508. #ifdef HAVE_FFDHE
  16509. switch (ssl->options.dhKeySz) {
  16510. #ifdef HAVE_FFDHE_2048
  16511. case 2048/8:
  16512. params = wc_Dh_ffdhe2048_Get();
  16513. group = WOLFSSL_FFDHE_2048;
  16514. break;
  16515. #endif
  16516. #ifdef HAVE_FFDHE_3072
  16517. case 3072/8:
  16518. params = wc_Dh_ffdhe3072_Get();
  16519. group = WOLFSSL_FFDHE_3072;
  16520. break;
  16521. #endif
  16522. #ifdef HAVE_FFDHE_4096
  16523. case 4096/8:
  16524. params = wc_Dh_ffdhe4096_Get();
  16525. group = WOLFSSL_FFDHE_4096;
  16526. break;
  16527. #endif
  16528. #ifdef HAVE_FFDHE_6144
  16529. case 6144/8:
  16530. params = wc_Dh_ffdhe6144_Get();
  16531. group = WOLFSSL_FFDHE_6144;
  16532. break;
  16533. #endif
  16534. #ifdef HAVE_FFDHE_8192
  16535. case 8192/8:
  16536. params = wc_Dh_ffdhe8192_Get();
  16537. group = WOLFSSL_FFDHE_8192;
  16538. break;
  16539. #endif
  16540. default:
  16541. break;
  16542. }
  16543. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  16544. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  16545. params->g_len) != 0) ||
  16546. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  16547. params->p_len) != 0)) {
  16548. WOLFSSL_MSG("Server not using FFDHE parameters");
  16549. #ifdef WOLFSSL_REQUIRE_FFDHE
  16550. SendAlert(ssl, alert_fatal, handshake_failure);
  16551. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  16552. #endif
  16553. }
  16554. else {
  16555. ssl->namedGroup = group;
  16556. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  16557. !defined(HAVE_SELFTEST)
  16558. ssl->options.dhDoKeyTest = 0;
  16559. #endif
  16560. }
  16561. #endif /* HAVE_FFDHE */
  16562. exit_gdpk:
  16563. return ret;
  16564. }
  16565. #endif
  16566. /* handle processing of server_key_exchange (12) */
  16567. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  16568. word32* inOutIdx, word32 size)
  16569. {
  16570. int ret = 0;
  16571. #ifdef WOLFSSL_ASYNC_CRYPT
  16572. DskeArgs* args = (DskeArgs*)ssl->async.args;
  16573. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  16574. (void)sizeof(args_test);
  16575. #else
  16576. DskeArgs args[1];
  16577. #endif
  16578. (void)input;
  16579. (void)size;
  16580. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  16581. WOLFSSL_ENTER("DoServerKeyExchange");
  16582. #ifdef WOLFSSL_ASYNC_CRYPT
  16583. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  16584. if (ret != WC_NOT_PENDING_E) {
  16585. /* Check for error */
  16586. if (ret < 0)
  16587. goto exit_dske;
  16588. }
  16589. else
  16590. #endif
  16591. {
  16592. /* Reset state */
  16593. ret = 0;
  16594. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  16595. XMEMSET(args, 0, sizeof(DskeArgs));
  16596. args->idx = *inOutIdx;
  16597. args->begin = *inOutIdx;
  16598. args->sigAlgo = ssl->specs.sig_algo;
  16599. args->hashAlgo = sha_mac;
  16600. #ifdef WOLFSSL_ASYNC_CRYPT
  16601. ssl->async.freeArgs = FreeDskeArgs;
  16602. #endif
  16603. }
  16604. switch(ssl->options.asyncState)
  16605. {
  16606. case TLS_ASYNC_BEGIN:
  16607. {
  16608. #ifdef WOLFSSL_CALLBACKS
  16609. if (ssl->hsInfoOn)
  16610. AddPacketName(ssl, "ServerKeyExchange");
  16611. if (ssl->toInfoOn)
  16612. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  16613. #endif
  16614. switch(ssl->specs.kea)
  16615. {
  16616. #ifndef NO_PSK
  16617. case psk_kea:
  16618. {
  16619. int srvHintLen;
  16620. word16 length;
  16621. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  16622. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16623. }
  16624. ato16(input + args->idx, &length);
  16625. args->idx += OPAQUE16_LEN;
  16626. if ((args->idx - args->begin) + length > size) {
  16627. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16628. }
  16629. /* get PSK server hint from the wire */
  16630. srvHintLen = min(length, MAX_PSK_ID_LEN);
  16631. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  16632. srvHintLen);
  16633. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  16634. args->idx += length;
  16635. break;
  16636. }
  16637. #endif /* !NO_PSK */
  16638. #ifndef NO_DH
  16639. case diffie_hellman_kea:
  16640. {
  16641. ret = GetDhPublicKey(ssl, input, size, args);
  16642. if (ret != 0)
  16643. goto exit_dske;
  16644. break;
  16645. }
  16646. #endif /* !NO_DH */
  16647. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  16648. case ecc_diffie_hellman_kea:
  16649. {
  16650. byte b;
  16651. #ifdef HAVE_ECC
  16652. int curveId;
  16653. #endif
  16654. int curveOid;
  16655. word16 length;
  16656. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  16657. OPAQUE8_LEN > size) {
  16658. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16659. }
  16660. b = input[args->idx++];
  16661. if (b != named_curve) {
  16662. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  16663. }
  16664. args->idx += 1; /* curve type, eat leading 0 */
  16665. b = input[args->idx++];
  16666. if ((curveOid = CheckCurveId(b)) < 0) {
  16667. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  16668. }
  16669. ssl->ecdhCurveOID = curveOid;
  16670. length = input[args->idx++];
  16671. if ((args->idx - args->begin) + length > size) {
  16672. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16673. }
  16674. #ifdef HAVE_CURVE25519
  16675. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  16676. if (ssl->peerX25519Key == NULL) {
  16677. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  16678. (void**)&ssl->peerX25519Key);
  16679. if (ret != 0) {
  16680. goto exit_dske;
  16681. }
  16682. } else if (ssl->peerX25519KeyPresent) {
  16683. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  16684. ssl->peerX25519Key);
  16685. ssl->peerX25519KeyPresent = 0;
  16686. if (ret != 0) {
  16687. goto exit_dske;
  16688. }
  16689. }
  16690. if (wc_curve25519_import_public_ex(input + args->idx,
  16691. length, ssl->peerX25519Key,
  16692. EC25519_LITTLE_ENDIAN) != 0) {
  16693. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  16694. }
  16695. args->idx += length;
  16696. ssl->peerX25519KeyPresent = 1;
  16697. break;
  16698. }
  16699. #endif
  16700. #ifdef HAVE_ECC
  16701. if (ssl->peerEccKey == NULL) {
  16702. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  16703. (void**)&ssl->peerEccKey);
  16704. if (ret != 0) {
  16705. goto exit_dske;
  16706. }
  16707. } else if (ssl->peerEccKeyPresent) {
  16708. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  16709. ssl->peerEccKeyPresent = 0;
  16710. if (ret != 0) {
  16711. goto exit_dske;
  16712. }
  16713. }
  16714. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  16715. if (wc_ecc_import_x963_ex(input + args->idx, length,
  16716. ssl->peerEccKey, curveId) != 0) {
  16717. #ifdef WOLFSSL_EXTRA_ALERTS
  16718. SendAlert(ssl, alert_fatal, illegal_parameter);
  16719. #endif
  16720. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  16721. }
  16722. args->idx += length;
  16723. ssl->peerEccKeyPresent = 1;
  16724. #endif
  16725. break;
  16726. }
  16727. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  16728. #if !defined(NO_DH) && !defined(NO_PSK)
  16729. case dhe_psk_kea:
  16730. {
  16731. int srvHintLen;
  16732. word16 length;
  16733. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  16734. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16735. }
  16736. ato16(input + args->idx, &length);
  16737. args->idx += OPAQUE16_LEN;
  16738. if ((args->idx - args->begin) + length > size) {
  16739. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16740. }
  16741. /* get PSK server hint from the wire */
  16742. srvHintLen = min(length, MAX_PSK_ID_LEN);
  16743. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  16744. srvHintLen);
  16745. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  16746. args->idx += length;
  16747. ret = GetDhPublicKey(ssl, input, size, args);
  16748. if (ret != 0)
  16749. goto exit_dske;
  16750. break;
  16751. }
  16752. #endif /* !NO_DH && !NO_PSK */
  16753. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  16754. !defined(NO_PSK)
  16755. case ecdhe_psk_kea:
  16756. {
  16757. byte b;
  16758. int curveOid, curveId;
  16759. int srvHintLen;
  16760. word16 length;
  16761. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  16762. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16763. }
  16764. ato16(input + args->idx, &length);
  16765. args->idx += OPAQUE16_LEN;
  16766. if ((args->idx - args->begin) + length > size) {
  16767. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16768. }
  16769. /* get PSK server hint from the wire */
  16770. srvHintLen = min(length, MAX_PSK_ID_LEN);
  16771. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  16772. srvHintLen);
  16773. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  16774. args->idx += length;
  16775. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  16776. OPAQUE8_LEN > size) {
  16777. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16778. }
  16779. /* Check curve name and ID */
  16780. b = input[args->idx++];
  16781. if (b != named_curve) {
  16782. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  16783. }
  16784. args->idx += 1; /* curve type, eat leading 0 */
  16785. b = input[args->idx++];
  16786. if ((curveOid = CheckCurveId(b)) < 0) {
  16787. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  16788. }
  16789. length = input[args->idx++];
  16790. if ((args->idx - args->begin) + length > size) {
  16791. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16792. }
  16793. #ifdef HAVE_CURVE25519
  16794. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  16795. if (ssl->peerX25519Key == NULL) {
  16796. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  16797. (void**)&ssl->peerX25519Key);
  16798. if (ret != 0) {
  16799. goto exit_dske;
  16800. }
  16801. } else if (ssl->peerEccKeyPresent) {
  16802. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  16803. ssl->peerX25519Key);
  16804. ssl->peerX25519KeyPresent = 0;
  16805. if (ret != 0) {
  16806. goto exit_dske;
  16807. }
  16808. }
  16809. if (wc_curve25519_import_public_ex(input + args->idx,
  16810. length, ssl->peerX25519Key,
  16811. EC25519_LITTLE_ENDIAN) != 0) {
  16812. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  16813. }
  16814. args->idx += length;
  16815. ssl->peerX25519KeyPresent = 1;
  16816. break;
  16817. }
  16818. #endif
  16819. if (ssl->peerEccKey == NULL) {
  16820. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  16821. (void**)&ssl->peerEccKey);
  16822. if (ret != 0) {
  16823. goto exit_dske;
  16824. }
  16825. } else if (ssl->peerEccKeyPresent) {
  16826. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  16827. ssl->peerEccKeyPresent = 0;
  16828. if (ret != 0) {
  16829. goto exit_dske;
  16830. }
  16831. }
  16832. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  16833. if (wc_ecc_import_x963_ex(input + args->idx, length,
  16834. ssl->peerEccKey, curveId) != 0) {
  16835. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  16836. }
  16837. args->idx += length;
  16838. ssl->peerEccKeyPresent = 1;
  16839. break;
  16840. }
  16841. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  16842. default:
  16843. ret = BAD_KEA_TYPE_E;
  16844. } /* switch(ssl->specs.kea) */
  16845. /* Check for error */
  16846. if (ret != 0) {
  16847. goto exit_dske;
  16848. }
  16849. /* Advance state and proceed */
  16850. ssl->options.asyncState = TLS_ASYNC_BUILD;
  16851. } /* case TLS_ASYNC_BEGIN */
  16852. FALL_THROUGH;
  16853. case TLS_ASYNC_BUILD:
  16854. {
  16855. switch(ssl->specs.kea)
  16856. {
  16857. case psk_kea:
  16858. case dhe_psk_kea:
  16859. case ecdhe_psk_kea:
  16860. {
  16861. /* Nothing to do in this sub-state */
  16862. break;
  16863. }
  16864. case diffie_hellman_kea:
  16865. case ecc_diffie_hellman_kea:
  16866. {
  16867. #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(HAVE_ED25519)
  16868. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  16869. #else
  16870. enum wc_HashType hashType;
  16871. word16 verifySz;
  16872. if (ssl->options.usingAnon_cipher) {
  16873. break;
  16874. }
  16875. verifySz = (word16)(args->idx - args->begin);
  16876. if (verifySz > MAX_DH_SZ) {
  16877. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16878. }
  16879. if (IsAtLeastTLSv1_2(ssl)) {
  16880. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  16881. size) {
  16882. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16883. }
  16884. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  16885. &args->sigAlgo);
  16886. args->idx += 2;
  16887. hashType = HashAlgoToType(args->hashAlgo);
  16888. if (hashType == WC_HASH_TYPE_NONE) {
  16889. ERROR_OUT(ALGO_ID_E, exit_dske);
  16890. }
  16891. } else {
  16892. /* only using sha and md5 for rsa */
  16893. #ifndef NO_OLD_TLS
  16894. hashType = WC_HASH_TYPE_SHA;
  16895. if (args->sigAlgo == rsa_sa_algo) {
  16896. hashType = WC_HASH_TYPE_MD5_SHA;
  16897. }
  16898. #else
  16899. ERROR_OUT(ALGO_ID_E, exit_dske);
  16900. #endif
  16901. }
  16902. /* signature */
  16903. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  16904. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16905. }
  16906. ato16(input + args->idx, &args->verifySigSz);
  16907. args->idx += OPAQUE16_LEN;
  16908. if ((args->idx - args->begin) + args->verifySigSz > size) {
  16909. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16910. }
  16911. /* buffer for signature */
  16912. ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + verifySz,
  16913. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  16914. if (ssl->buffers.sig.buffer == NULL) {
  16915. ERROR_OUT(MEMORY_E, exit_dske);
  16916. }
  16917. ssl->buffers.sig.length = SEED_LEN + verifySz;
  16918. /* build message to hash */
  16919. XMEMCPY(ssl->buffers.sig.buffer,
  16920. ssl->arrays->clientRandom, RAN_LEN);
  16921. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN],
  16922. ssl->arrays->serverRandom, RAN_LEN);
  16923. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2],
  16924. input + args->begin, verifySz); /* message */
  16925. if (args->sigAlgo != ed25519_sa_algo) {
  16926. int digest_sz = wc_HashGetDigestSize(hashType);
  16927. if (digest_sz <= 0) {
  16928. ERROR_OUT(BUFFER_ERROR, exit_dske);
  16929. }
  16930. ssl->buffers.digest.length = (unsigned int)digest_sz;
  16931. /* buffer for hash */
  16932. ssl->buffers.digest.buffer = (byte*)XMALLOC(
  16933. ssl->buffers.digest.length, ssl->heap,
  16934. DYNAMIC_TYPE_DIGEST);
  16935. if (ssl->buffers.digest.buffer == NULL) {
  16936. ERROR_OUT(MEMORY_E, exit_dske);
  16937. }
  16938. /* Perform hash */
  16939. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  16940. ssl->buffers.sig.length,
  16941. ssl->buffers.digest.buffer,
  16942. ssl->buffers.digest.length);
  16943. if (ret != 0) {
  16944. goto exit_dske;
  16945. }
  16946. }
  16947. switch (args->sigAlgo)
  16948. {
  16949. #ifndef NO_RSA
  16950. #ifdef WC_RSA_PSS
  16951. case rsa_pss_sa_algo:
  16952. #endif
  16953. case rsa_sa_algo:
  16954. {
  16955. if (ssl->peerRsaKey == NULL ||
  16956. !ssl->peerRsaKeyPresent) {
  16957. ERROR_OUT(NO_PEER_KEY, exit_dske);
  16958. }
  16959. break;
  16960. }
  16961. #endif /* !NO_RSA */
  16962. #ifdef HAVE_ECC
  16963. case ecc_dsa_sa_algo:
  16964. {
  16965. if (!ssl->peerEccDsaKeyPresent) {
  16966. ERROR_OUT(NO_PEER_KEY, exit_dske);
  16967. }
  16968. break;
  16969. }
  16970. #endif /* HAVE_ECC */
  16971. #if defined(HAVE_ED25519)
  16972. case ed25519_sa_algo:
  16973. {
  16974. if (!ssl->peerEd25519KeyPresent) {
  16975. ERROR_OUT(NO_PEER_KEY, exit_dske);
  16976. }
  16977. break;
  16978. }
  16979. #endif /* HAVE_ED25519 */
  16980. default:
  16981. ret = ALGO_ID_E;
  16982. } /* switch (args->sigAlgo) */
  16983. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 */
  16984. break;
  16985. }
  16986. default:
  16987. ret = BAD_KEA_TYPE_E;
  16988. } /* switch(ssl->specs.kea) */
  16989. /* Check for error */
  16990. if (ret != 0) {
  16991. goto exit_dske;
  16992. }
  16993. /* Advance state and proceed */
  16994. ssl->options.asyncState = TLS_ASYNC_DO;
  16995. } /* case TLS_ASYNC_BUILD */
  16996. FALL_THROUGH;
  16997. case TLS_ASYNC_DO:
  16998. {
  16999. switch(ssl->specs.kea)
  17000. {
  17001. case psk_kea:
  17002. case dhe_psk_kea:
  17003. case ecdhe_psk_kea:
  17004. {
  17005. /* Nothing to do in this sub-state */
  17006. break;
  17007. }
  17008. case diffie_hellman_kea:
  17009. case ecc_diffie_hellman_kea:
  17010. {
  17011. #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(HAVE_ED25519)
  17012. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  17013. #else
  17014. if (ssl->options.usingAnon_cipher) {
  17015. break;
  17016. }
  17017. if (args->verifySig == NULL) {
  17018. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  17019. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  17020. if (args->verifySig == NULL) {
  17021. ERROR_OUT(MEMORY_E, exit_dske);
  17022. }
  17023. XMEMCPY(args->verifySig, input + args->idx,
  17024. args->verifySigSz);
  17025. }
  17026. switch (args->sigAlgo)
  17027. {
  17028. #ifndef NO_RSA
  17029. #ifdef WC_RSA_PSS
  17030. case rsa_pss_sa_algo:
  17031. #endif
  17032. case rsa_sa_algo:
  17033. {
  17034. ret = RsaVerify(ssl,
  17035. args->verifySig, args->verifySigSz,
  17036. &args->output,
  17037. args->sigAlgo, args->hashAlgo,
  17038. ssl->peerRsaKey,
  17039. #ifdef HAVE_PK_CALLBACKS
  17040. &ssl->buffers.peerRsaKey
  17041. #else
  17042. NULL
  17043. #endif
  17044. );
  17045. if (ret >= 0) {
  17046. args->sigSz = (word16)ret;
  17047. ret = 0;
  17048. }
  17049. #ifdef WOLFSSL_ASYNC_CRYPT
  17050. if (ret != WC_PENDING_E)
  17051. #endif
  17052. {
  17053. /* peerRsaKey */
  17054. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  17055. (void**)&ssl->peerRsaKey);
  17056. ssl->peerRsaKeyPresent = 0;
  17057. }
  17058. break;
  17059. }
  17060. #endif /* !NO_RSA */
  17061. #ifdef HAVE_ECC
  17062. case ecc_dsa_sa_algo:
  17063. {
  17064. ret = EccVerify(ssl,
  17065. args->verifySig, args->verifySigSz,
  17066. ssl->buffers.digest.buffer,
  17067. ssl->buffers.digest.length,
  17068. ssl->peerEccDsaKey,
  17069. #ifdef HAVE_PK_CALLBACKS
  17070. &ssl->buffers.peerEccDsaKey
  17071. #else
  17072. NULL
  17073. #endif
  17074. );
  17075. #ifdef WOLFSSL_ASYNC_CRYPT
  17076. if (ret != WC_PENDING_E)
  17077. #endif
  17078. {
  17079. /* peerEccDsaKey */
  17080. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  17081. (void**)&ssl->peerEccDsaKey);
  17082. ssl->peerEccDsaKeyPresent = 0;
  17083. }
  17084. break;
  17085. }
  17086. #endif /* HAVE_ECC */
  17087. #if defined(HAVE_ED25519)
  17088. case ed25519_sa_algo:
  17089. {
  17090. ret = Ed25519Verify(ssl,
  17091. args->verifySig, args->verifySigSz,
  17092. ssl->buffers.sig.buffer,
  17093. ssl->buffers.sig.length,
  17094. ssl->peerEd25519Key,
  17095. #ifdef HAVE_PK_CALLBACKS
  17096. &ssl->buffers.peerEd25519Key
  17097. #else
  17098. NULL
  17099. #endif
  17100. );
  17101. #ifdef WOLFSSL_ASYNC_CRYPT
  17102. if (ret != WC_PENDING_E)
  17103. #endif
  17104. {
  17105. /* peerEccDsaKey */
  17106. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  17107. (void**)&ssl->peerEd25519Key);
  17108. ssl->peerEd25519KeyPresent = 0;
  17109. }
  17110. break;
  17111. }
  17112. #endif /* HAVE_ED25519 */
  17113. default:
  17114. ret = ALGO_ID_E;
  17115. } /* switch (sigAlgo) */
  17116. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 */
  17117. break;
  17118. }
  17119. default:
  17120. ret = BAD_KEA_TYPE_E;
  17121. } /* switch(ssl->specs.kea) */
  17122. /* Check for error */
  17123. if (ret != 0) {
  17124. goto exit_dske;
  17125. }
  17126. /* Advance state and proceed */
  17127. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  17128. } /* case TLS_ASYNC_DO */
  17129. FALL_THROUGH;
  17130. case TLS_ASYNC_VERIFY:
  17131. {
  17132. switch(ssl->specs.kea)
  17133. {
  17134. case psk_kea:
  17135. case dhe_psk_kea:
  17136. case ecdhe_psk_kea:
  17137. {
  17138. /* Nothing to do in this sub-state */
  17139. break;
  17140. }
  17141. case diffie_hellman_kea:
  17142. case ecc_diffie_hellman_kea:
  17143. {
  17144. #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(HAVE_ED25519)
  17145. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  17146. #else
  17147. if (ssl->options.usingAnon_cipher) {
  17148. break;
  17149. }
  17150. /* increment index after verify is done */
  17151. args->idx += args->verifySigSz;
  17152. switch(args->sigAlgo)
  17153. {
  17154. #ifndef NO_RSA
  17155. #ifdef WC_RSA_PSS
  17156. case rsa_pss_sa_algo:
  17157. ret = wc_RsaPSS_CheckPadding(
  17158. ssl->buffers.digest.buffer,
  17159. ssl->buffers.digest.length,
  17160. args->output, args->sigSz,
  17161. HashAlgoToType(args->hashAlgo));
  17162. if (ret != 0)
  17163. return ret;
  17164. break;
  17165. #endif
  17166. case rsa_sa_algo:
  17167. {
  17168. if (IsAtLeastTLSv1_2(ssl)) {
  17169. #ifdef WOLFSSL_SMALL_STACK
  17170. byte* encodedSig = NULL;
  17171. #else
  17172. byte encodedSig[MAX_ENCODED_SIG_SZ];
  17173. #endif
  17174. word32 encSigSz;
  17175. #ifdef WOLFSSL_SMALL_STACK
  17176. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  17177. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  17178. if (encodedSig == NULL) {
  17179. ERROR_OUT(MEMORY_E, exit_dske);
  17180. }
  17181. #endif
  17182. encSigSz = wc_EncodeSignature(encodedSig,
  17183. ssl->buffers.digest.buffer,
  17184. ssl->buffers.digest.length,
  17185. TypeHash(args->hashAlgo));
  17186. if (encSigSz != args->sigSz || !args->output ||
  17187. XMEMCMP(args->output, encodedSig,
  17188. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  17189. ret = VERIFY_SIGN_ERROR;
  17190. }
  17191. #ifdef WOLFSSL_SMALL_STACK
  17192. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  17193. #endif
  17194. if (ret != 0) {
  17195. goto exit_dske;
  17196. }
  17197. }
  17198. else if (args->sigSz != FINISHED_SZ ||
  17199. !args->output ||
  17200. XMEMCMP(args->output,
  17201. ssl->buffers.digest.buffer,
  17202. FINISHED_SZ) != 0) {
  17203. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  17204. }
  17205. break;
  17206. }
  17207. #endif /* !NO_RSA */
  17208. #ifdef HAVE_ECC
  17209. case ecc_dsa_sa_algo:
  17210. /* Nothing to do in this algo */
  17211. break;
  17212. #endif /* HAVE_ECC */
  17213. #if defined(HAVE_ED25519)
  17214. case ed25519_sa_algo:
  17215. /* Nothing to do in this algo */
  17216. break;
  17217. #endif /* HAVE_ED25519 */
  17218. default:
  17219. ret = ALGO_ID_E;
  17220. } /* switch (sigAlgo) */
  17221. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 */
  17222. break;
  17223. }
  17224. default:
  17225. ret = BAD_KEA_TYPE_E;
  17226. } /* switch(ssl->specs.kea) */
  17227. /* Check for error */
  17228. if (ret != 0) {
  17229. goto exit_dske;
  17230. }
  17231. /* Advance state and proceed */
  17232. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  17233. } /* case TLS_ASYNC_VERIFY */
  17234. FALL_THROUGH;
  17235. case TLS_ASYNC_FINALIZE:
  17236. {
  17237. if (IsEncryptionOn(ssl, 0)) {
  17238. args->idx += ssl->keys.padSz;
  17239. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17240. if (ssl->options.encThenMac)
  17241. args->idx += MacSize(ssl);
  17242. #endif
  17243. }
  17244. /* QSH extensions */
  17245. #ifdef HAVE_QSH
  17246. if (ssl->peerQSHKeyPresent) {
  17247. word16 name;
  17248. int qshSz;
  17249. /* extension name */
  17250. ato16(input + args->idx, &name);
  17251. args->idx += OPAQUE16_LEN;
  17252. if (name == TLSX_QUANTUM_SAFE_HYBRID) {
  17253. /* if qshSz is larger than 0 it is the length of
  17254. buffer used */
  17255. if ((qshSz = TLSX_QSHCipher_Parse(ssl, input + args->idx,
  17256. size, 0)) < 0) {
  17257. ERROR_OUT(qshSz, exit_dske);
  17258. }
  17259. args->idx += qshSz;
  17260. }
  17261. else {
  17262. /* unknown extension sent server ignored handshake */
  17263. ERROR_OUT(BUFFER_ERROR, exit_dske);
  17264. }
  17265. }
  17266. #endif
  17267. /* Advance state and proceed */
  17268. ssl->options.asyncState = TLS_ASYNC_END;
  17269. } /* case TLS_ASYNC_FINALIZE */
  17270. FALL_THROUGH;
  17271. case TLS_ASYNC_END:
  17272. {
  17273. /* return index */
  17274. *inOutIdx = args->idx;
  17275. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  17276. break;
  17277. }
  17278. default:
  17279. ret = INPUT_CASE_ERROR;
  17280. } /* switch(ssl->options.asyncState) */
  17281. exit_dske:
  17282. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  17283. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  17284. #ifdef WOLFSSL_ASYNC_CRYPT
  17285. /* Handle async operation */
  17286. if (ret == WC_PENDING_E) {
  17287. /* Mark message as not received so it can process again */
  17288. ssl->msgsReceived.got_server_key_exchange = 0;
  17289. return ret;
  17290. }
  17291. #endif /* WOLFSSL_ASYNC_CRYPT */
  17292. /* Final cleanup */
  17293. FreeDskeArgs(ssl, args);
  17294. FreeKeyExchange(ssl);
  17295. return ret;
  17296. }
  17297. #ifdef HAVE_QSH
  17298. #ifdef HAVE_NTRU
  17299. /* Encrypt a byte array using ntru
  17300. key a struct containing the public key to use
  17301. bufIn array to be encrypted
  17302. inSz size of bufIn array
  17303. bufOut cipher text out
  17304. outSz will be set to the new size of cipher text
  17305. */
  17306. static int NtruSecretEncrypt(QSHKey* key, byte* bufIn, word32 inSz,
  17307. byte* bufOut, word16* outSz)
  17308. {
  17309. int ret;
  17310. DRBG_HANDLE drbg;
  17311. /* sanity checks on input arguments */
  17312. if (key == NULL || bufIn == NULL || bufOut == NULL || outSz == NULL)
  17313. return BAD_FUNC_ARG;
  17314. if (key->pub.buffer == NULL)
  17315. return BAD_FUNC_ARG;
  17316. switch (key->name) {
  17317. case WOLFSSL_NTRU_EESS439:
  17318. case WOLFSSL_NTRU_EESS593:
  17319. case WOLFSSL_NTRU_EESS743:
  17320. break;
  17321. default:
  17322. WOLFSSL_MSG("Unknown QSH encryption key!");
  17323. return -1;
  17324. }
  17325. /* set up ntru drbg */
  17326. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  17327. if (ret != DRBG_OK)
  17328. return NTRU_DRBG_ERROR;
  17329. /* encrypt the byte array */
  17330. ret = ntru_crypto_ntru_encrypt(drbg, key->pub.length, key->pub.buffer,
  17331. inSz, bufIn, outSz, bufOut);
  17332. ntru_crypto_drbg_uninstantiate(drbg);
  17333. if (ret != NTRU_OK)
  17334. return NTRU_ENCRYPT_ERROR;
  17335. return ret;
  17336. }
  17337. /* Decrypt a byte array using ntru
  17338. key a struct containing the private key to use
  17339. bufIn array to be decrypted
  17340. inSz size of bufIn array
  17341. bufOut plain text out
  17342. outSz will be set to the new size of plain text
  17343. */
  17344. static int NtruSecretDecrypt(QSHKey* key, byte* bufIn, word32 inSz,
  17345. byte* bufOut, word16* outSz)
  17346. {
  17347. int ret;
  17348. DRBG_HANDLE drbg;
  17349. /* sanity checks on input arguments */
  17350. if (key == NULL || bufIn == NULL || bufOut == NULL || outSz == NULL)
  17351. return BAD_FUNC_ARG;
  17352. if (key->pri.buffer == NULL)
  17353. return BAD_FUNC_ARG;
  17354. switch (key->name) {
  17355. case WOLFSSL_NTRU_EESS439:
  17356. case WOLFSSL_NTRU_EESS593:
  17357. case WOLFSSL_NTRU_EESS743:
  17358. break;
  17359. default:
  17360. WOLFSSL_MSG("Unknown QSH decryption key!");
  17361. return -1;
  17362. }
  17363. /* set up drbg */
  17364. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  17365. if (ret != DRBG_OK)
  17366. return NTRU_DRBG_ERROR;
  17367. /* decrypt cipher text */
  17368. ret = ntru_crypto_ntru_decrypt(key->pri.length, key->pri.buffer,
  17369. inSz, bufIn, outSz, bufOut);
  17370. ntru_crypto_drbg_uninstantiate(drbg);
  17371. if (ret != NTRU_OK)
  17372. return NTRU_ENCRYPT_ERROR;
  17373. return ret;
  17374. }
  17375. #endif /* HAVE_NTRU */
  17376. int QSH_Init(WOLFSSL* ssl)
  17377. {
  17378. /* check so not initializing twice when running DTLS */
  17379. if (ssl->QSH_secret != NULL)
  17380. return 0;
  17381. /* malloc memory for holding generated secret information */
  17382. if ((ssl->QSH_secret = (QSHSecret*)XMALLOC(sizeof(QSHSecret), ssl->heap,
  17383. DYNAMIC_TYPE_QSH)) == NULL)
  17384. return MEMORY_E;
  17385. ssl->QSH_secret->CliSi = (buffer*)XMALLOC(sizeof(buffer), ssl->heap,
  17386. DYNAMIC_TYPE_SECRET);
  17387. if (ssl->QSH_secret->CliSi == NULL)
  17388. return MEMORY_E;
  17389. ssl->QSH_secret->SerSi = (buffer*)XMALLOC(sizeof(buffer), ssl->heap,
  17390. DYNAMIC_TYPE_SECRET);
  17391. if (ssl->QSH_secret->SerSi == NULL)
  17392. return MEMORY_E;
  17393. /* initialize variables */
  17394. ssl->QSH_secret->list = NULL;
  17395. ssl->QSH_secret->CliSi->length = 0;
  17396. ssl->QSH_secret->CliSi->buffer = NULL;
  17397. ssl->QSH_secret->SerSi->length = 0;
  17398. ssl->QSH_secret->SerSi->buffer = NULL;
  17399. return 0;
  17400. }
  17401. static int QSH_Encrypt(QSHKey* key, byte* in, word32 szIn,
  17402. byte* out, word32* szOut)
  17403. {
  17404. int ret = 0;
  17405. word16 size = *szOut;
  17406. (void)in;
  17407. (void)szIn;
  17408. (void)out;
  17409. (void)szOut;
  17410. WOLFSSL_MSG("Encrypting QSH key material");
  17411. switch (key->name) {
  17412. #ifdef HAVE_NTRU
  17413. case WOLFSSL_NTRU_EESS439:
  17414. case WOLFSSL_NTRU_EESS593:
  17415. case WOLFSSL_NTRU_EESS743:
  17416. ret = NtruSecretEncrypt(key, in, szIn, out, &size);
  17417. break;
  17418. #endif
  17419. default:
  17420. WOLFSSL_MSG("Unknown QSH encryption key!");
  17421. return -1;
  17422. }
  17423. *szOut = size;
  17424. return ret;
  17425. }
  17426. /* Decrypt using Quantum Safe Handshake algorithms */
  17427. int QSH_Decrypt(QSHKey* key, byte* in, word32 szIn, byte* out, word16* szOut)
  17428. {
  17429. int ret = 0;
  17430. word16 size = *szOut;
  17431. (void)in;
  17432. (void)szIn;
  17433. (void)out;
  17434. (void)szOut;
  17435. WOLFSSL_MSG("Decrypting QSH key material");
  17436. switch (key->name) {
  17437. #ifdef HAVE_NTRU
  17438. case WOLFSSL_NTRU_EESS439:
  17439. case WOLFSSL_NTRU_EESS593:
  17440. case WOLFSSL_NTRU_EESS743:
  17441. ret = NtruSecretDecrypt(key, in, szIn, out, &size);
  17442. break;
  17443. #endif
  17444. default:
  17445. WOLFSSL_MSG("Unknown QSH decryption key!");
  17446. return -1;
  17447. }
  17448. *szOut = size;
  17449. return ret;
  17450. }
  17451. /* Get the max cipher text for corresponding encryption scheme
  17452. (encrypting 48 or max plain text whichever is smaller)
  17453. */
  17454. static word32 QSH_MaxSecret(QSHKey* key)
  17455. {
  17456. int ret = 0;
  17457. #ifdef HAVE_NTRU
  17458. byte isNtru = 0;
  17459. word16 inSz = 48;
  17460. word16 outSz;
  17461. DRBG_HANDLE drbg = 0;
  17462. byte bufIn[48];
  17463. #endif
  17464. if (key == NULL || key->pub.length == 0)
  17465. return 0;
  17466. switch(key->name) {
  17467. #ifdef HAVE_NTRU
  17468. case WOLFSSL_NTRU_EESS439:
  17469. isNtru = 1;
  17470. break;
  17471. case WOLFSSL_NTRU_EESS593:
  17472. isNtru = 1;
  17473. break;
  17474. case WOLFSSL_NTRU_EESS743:
  17475. isNtru = 1;
  17476. break;
  17477. #endif
  17478. default:
  17479. WOLFSSL_MSG("Unknown QSH encryption scheme size!");
  17480. return 0;
  17481. }
  17482. #ifdef HAVE_NTRU
  17483. if (isNtru) {
  17484. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  17485. if (ret != DRBG_OK)
  17486. return NTRU_DRBG_ERROR;
  17487. ret = ntru_crypto_ntru_encrypt(drbg, key->pub.length,
  17488. key->pub.buffer, inSz, bufIn, &outSz, NULL);
  17489. if (ret != NTRU_OK) {
  17490. return NTRU_ENCRYPT_ERROR;
  17491. }
  17492. ntru_crypto_drbg_uninstantiate(drbg);
  17493. ret = outSz;
  17494. }
  17495. #endif
  17496. return ret;
  17497. }
  17498. /* Generate the secret byte material for pms
  17499. returns length on success and -1 on fail
  17500. */
  17501. static int QSH_GenerateSerCliSecret(WOLFSSL* ssl, byte isServer)
  17502. {
  17503. int sz = 0;
  17504. int plainSz = 48; /* lesser of 48 and max plain text able to encrypt */
  17505. int offset = 0;
  17506. word32 tmpSz = 0;
  17507. buffer* buf;
  17508. QSHKey* current = ssl->peerQSHKey;
  17509. QSHScheme* schmPre = NULL;
  17510. QSHScheme* schm = NULL;
  17511. if (ssl == NULL)
  17512. return -1;
  17513. WOLFSSL_MSG("Generating QSH secret key material");
  17514. /* get size of buffer needed */
  17515. while (current) {
  17516. if (current->pub.length != 0) {
  17517. sz += plainSz;
  17518. }
  17519. current = (QSHKey*)current->next;
  17520. }
  17521. /* allocate memory for buffer */
  17522. if (isServer) {
  17523. buf = ssl->QSH_secret->SerSi;
  17524. }
  17525. else {
  17526. buf = ssl->QSH_secret->CliSi;
  17527. }
  17528. buf->length = sz;
  17529. buf->buffer = (byte*)XMALLOC(sz, ssl->heap, DYNAMIC_TYPE_SECRET);
  17530. if (buf->buffer == NULL) {
  17531. WOLFSSL_ERROR(MEMORY_E);
  17532. }
  17533. /* create secret information */
  17534. sz = 0;
  17535. current = ssl->peerQSHKey;
  17536. while (current) {
  17537. schm = (QSHScheme*)XMALLOC(sizeof(QSHScheme), ssl->heap,
  17538. DYNAMIC_TYPE_QSH);
  17539. if (schm == NULL)
  17540. return MEMORY_E;
  17541. /* initialize variables */
  17542. schm->name = 0;
  17543. schm->PK = NULL;
  17544. schm->PKLen = 0;
  17545. schm->next = NULL;
  17546. if (ssl->QSH_secret->list == NULL) {
  17547. ssl->QSH_secret->list = schm;
  17548. }
  17549. else {
  17550. if (schmPre)
  17551. schmPre->next = schm;
  17552. }
  17553. tmpSz = QSH_MaxSecret(current);
  17554. if ((schm->PK = (byte*)XMALLOC(tmpSz, ssl->heap,
  17555. DYNAMIC_TYPE_SECRET)) == NULL)
  17556. return -1;
  17557. /* store info for writing extension */
  17558. schm->name = current->name;
  17559. /* no key to use for encryption */
  17560. if (tmpSz == 0) {
  17561. current = (QSHKey*)current->next;
  17562. continue;
  17563. }
  17564. if (wc_RNG_GenerateBlock(ssl->rng, buf->buffer + offset, plainSz)
  17565. != 0) {
  17566. return -1;
  17567. }
  17568. if (QSH_Encrypt(current, buf->buffer + offset, plainSz, schm->PK,
  17569. &tmpSz) != 0) {
  17570. return -1;
  17571. }
  17572. schm->PKLen = tmpSz;
  17573. sz += tmpSz;
  17574. offset += plainSz;
  17575. schmPre = schm;
  17576. current = (QSHKey*)current->next;
  17577. }
  17578. return sz;
  17579. }
  17580. static word32 QSH_KeyGetSize(WOLFSSL* ssl)
  17581. {
  17582. word32 sz = 0;
  17583. QSHKey* current = ssl->peerQSHKey;
  17584. if (ssl == NULL)
  17585. return -1;
  17586. sz += OPAQUE16_LEN; /* type of extension ie 0x00 0x18 */
  17587. sz += OPAQUE24_LEN;
  17588. /* get size of buffer needed */
  17589. while (current) {
  17590. sz += OPAQUE16_LEN; /* scheme id */
  17591. sz += OPAQUE16_LEN; /* encrypted key len*/
  17592. sz += QSH_MaxSecret(current);
  17593. current = (QSHKey*)current->next;
  17594. }
  17595. return sz;
  17596. }
  17597. /* handle QSH key Exchange
  17598. return 0 on success
  17599. */
  17600. static word32 QSH_KeyExchangeWrite(WOLFSSL* ssl, byte isServer)
  17601. {
  17602. int ret = 0;
  17603. WOLFSSL_ENTER("QSH KeyExchange");
  17604. ret = QSH_GenerateSerCliSecret(ssl, isServer);
  17605. if (ret < 0)
  17606. return MEMORY_E;
  17607. return 0;
  17608. }
  17609. #endif /* HAVE_QSH */
  17610. typedef struct SckeArgs {
  17611. byte* output; /* not allocated */
  17612. byte* encSecret;
  17613. byte* input;
  17614. word32 encSz;
  17615. word32 length;
  17616. int sendSz;
  17617. int inputSz;
  17618. } SckeArgs;
  17619. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  17620. {
  17621. SckeArgs* args = (SckeArgs*)pArgs;
  17622. (void)ssl;
  17623. if (args->encSecret) {
  17624. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  17625. args->encSecret = NULL;
  17626. }
  17627. if (args->input) {
  17628. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17629. args->input = NULL;
  17630. }
  17631. }
  17632. /* handle generation client_key_exchange (16) */
  17633. int SendClientKeyExchange(WOLFSSL* ssl)
  17634. {
  17635. int ret = 0;
  17636. #ifdef WOLFSSL_ASYNC_CRYPT
  17637. SckeArgs* args = (SckeArgs*)ssl->async.args;
  17638. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  17639. (void)sizeof(args_test);
  17640. #else
  17641. SckeArgs args[1];
  17642. #endif
  17643. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  17644. WOLFSSL_ENTER("SendClientKeyExchange");
  17645. #ifdef OPENSSL_EXTRA
  17646. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  17647. ssl->cbmode = SSL_CB_MODE_WRITE;
  17648. if (ssl->CBIS != NULL)
  17649. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  17650. #endif
  17651. #ifdef WOLFSSL_ASYNC_CRYPT
  17652. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  17653. if (ret != WC_NOT_PENDING_E) {
  17654. /* Check for error */
  17655. if (ret < 0)
  17656. goto exit_scke;
  17657. }
  17658. else
  17659. #endif
  17660. {
  17661. /* Reset state */
  17662. ret = 0;
  17663. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  17664. XMEMSET(args, 0, sizeof(SckeArgs));
  17665. #ifdef WOLFSSL_ASYNC_CRYPT
  17666. ssl->async.freeArgs = FreeSckeArgs;
  17667. #endif
  17668. }
  17669. switch(ssl->options.asyncState)
  17670. {
  17671. case TLS_ASYNC_BEGIN:
  17672. {
  17673. switch (ssl->specs.kea) {
  17674. #ifndef NO_RSA
  17675. case rsa_kea:
  17676. if (ssl->peerRsaKey == NULL ||
  17677. ssl->peerRsaKeyPresent == 0) {
  17678. ERROR_OUT(NO_PEER_KEY, exit_scke);
  17679. }
  17680. break;
  17681. #endif
  17682. #ifndef NO_DH
  17683. case diffie_hellman_kea:
  17684. if (ssl->buffers.serverDH_P.buffer == NULL ||
  17685. ssl->buffers.serverDH_G.buffer == NULL ||
  17686. ssl->buffers.serverDH_Pub.buffer == NULL) {
  17687. ERROR_OUT(NO_PEER_KEY, exit_scke);
  17688. }
  17689. break;
  17690. #endif /* NO_DH */
  17691. #ifndef NO_PSK
  17692. case psk_kea:
  17693. /* sanity check that PSK client callback has been set */
  17694. if (ssl->options.client_psk_cb == NULL) {
  17695. WOLFSSL_MSG("No client PSK callback set");
  17696. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  17697. }
  17698. break;
  17699. #endif /* NO_PSK */
  17700. #if !defined(NO_DH) && !defined(NO_PSK)
  17701. case dhe_psk_kea:
  17702. if (ssl->buffers.serverDH_P.buffer == NULL ||
  17703. ssl->buffers.serverDH_G.buffer == NULL ||
  17704. ssl->buffers.serverDH_Pub.buffer == NULL) {
  17705. ERROR_OUT(NO_PEER_KEY, exit_scke);
  17706. }
  17707. /* sanity check that PSK client callback has been set */
  17708. if (ssl->options.client_psk_cb == NULL) {
  17709. WOLFSSL_MSG("No client PSK callback set");
  17710. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  17711. }
  17712. break;
  17713. #endif /* !NO_DH && !NO_PSK */
  17714. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  17715. !defined(NO_PSK)
  17716. case ecdhe_psk_kea:
  17717. /* sanity check that PSK client callback has been set */
  17718. if (ssl->options.client_psk_cb == NULL) {
  17719. WOLFSSL_MSG("No client PSK callback set");
  17720. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  17721. }
  17722. #ifdef HAVE_CURVE25519
  17723. if (ssl->peerX25519KeyPresent) {
  17724. /* Check client ECC public key */
  17725. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  17726. ERROR_OUT(NO_PEER_KEY, exit_scke);
  17727. }
  17728. #ifdef HAVE_PK_CALLBACKS
  17729. /* if callback then use it for shared secret */
  17730. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  17731. break;
  17732. }
  17733. #endif
  17734. /* create private key */
  17735. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  17736. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17737. if (ret != 0) {
  17738. goto exit_scke;
  17739. }
  17740. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  17741. ssl->peerX25519Key);
  17742. break;
  17743. }
  17744. #endif
  17745. /* Check client ECC public key */
  17746. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  17747. !ssl->peerEccKey->dp) {
  17748. ERROR_OUT(NO_PEER_KEY, exit_scke);
  17749. }
  17750. #ifdef HAVE_PK_CALLBACKS
  17751. /* if callback then use it for shared secret */
  17752. if (ssl->ctx->EccSharedSecretCb != NULL) {
  17753. break;
  17754. }
  17755. #endif
  17756. /* create ephemeral private key */
  17757. ssl->hsType = DYNAMIC_TYPE_ECC;
  17758. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17759. if (ret != 0) {
  17760. goto exit_scke;
  17761. }
  17762. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  17763. break;
  17764. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  17765. #ifdef HAVE_NTRU
  17766. case ntru_kea:
  17767. if (ssl->peerNtruKeyPresent == 0) {
  17768. ERROR_OUT(NO_PEER_KEY, exit_scke);
  17769. }
  17770. break;
  17771. #endif /* HAVE_NTRU */
  17772. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  17773. case ecc_diffie_hellman_kea:
  17774. {
  17775. #ifdef HAVE_ECC
  17776. ecc_key* peerKey;
  17777. #endif
  17778. #ifdef HAVE_PK_CALLBACKS
  17779. /* if callback then use it for shared secret */
  17780. #ifdef HAVE_CURVE25519
  17781. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  17782. if (ssl->ctx->X25519SharedSecretCb != NULL)
  17783. break;
  17784. }
  17785. else
  17786. #endif
  17787. if (ssl->ctx->EccSharedSecretCb != NULL) {
  17788. break;
  17789. }
  17790. #endif /* HAVE_PK_CALLBACKS */
  17791. #ifdef HAVE_CURVE25519
  17792. if (ssl->peerX25519KeyPresent) {
  17793. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  17794. ERROR_OUT(NO_PEER_KEY, exit_scke);
  17795. }
  17796. /* create private key */
  17797. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  17798. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17799. if (ret != 0) {
  17800. goto exit_scke;
  17801. }
  17802. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  17803. ssl->peerX25519Key);
  17804. break;
  17805. }
  17806. #endif
  17807. #ifdef HAVE_ECC
  17808. if (ssl->specs.static_ecdh) {
  17809. /* Note: EccDsa is really fixed Ecc key here */
  17810. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent ||
  17811. !ssl->peerEccDsaKey->dp) {
  17812. ERROR_OUT(NO_PEER_KEY, exit_scke);
  17813. }
  17814. peerKey = ssl->peerEccDsaKey;
  17815. }
  17816. else {
  17817. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  17818. !ssl->peerEccKey->dp) {
  17819. ERROR_OUT(NO_PEER_KEY, exit_scke);
  17820. }
  17821. peerKey = ssl->peerEccKey;
  17822. }
  17823. if (peerKey == NULL) {
  17824. ERROR_OUT(NO_PEER_KEY, exit_scke);
  17825. }
  17826. /* create ephemeral private key */
  17827. ssl->hsType = DYNAMIC_TYPE_ECC;
  17828. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17829. if (ret != 0) {
  17830. goto exit_scke;
  17831. }
  17832. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  17833. #endif
  17834. break;
  17835. }
  17836. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  17837. default:
  17838. ret = BAD_KEA_TYPE_E;
  17839. } /* switch(ssl->specs.kea) */
  17840. /* Check for error */
  17841. if (ret != 0) {
  17842. goto exit_scke;
  17843. }
  17844. /* Advance state and proceed */
  17845. ssl->options.asyncState = TLS_ASYNC_BUILD;
  17846. } /* case TLS_ASYNC_BEGIN */
  17847. FALL_THROUGH;
  17848. case TLS_ASYNC_BUILD:
  17849. {
  17850. args->encSz = MAX_ENCRYPT_SZ;
  17851. args->encSecret = (byte*)XMALLOC(args->encSz, ssl->heap,
  17852. DYNAMIC_TYPE_SECRET);
  17853. if (args->encSecret == NULL) {
  17854. ERROR_OUT(MEMORY_E, exit_scke);
  17855. }
  17856. if (ssl->arrays->preMasterSecret == NULL) {
  17857. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  17858. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  17859. ssl->heap, DYNAMIC_TYPE_SECRET);
  17860. if (ssl->arrays->preMasterSecret == NULL) {
  17861. ERROR_OUT(MEMORY_E, exit_scke);
  17862. }
  17863. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  17864. }
  17865. switch(ssl->specs.kea)
  17866. {
  17867. #ifndef NO_RSA
  17868. case rsa_kea:
  17869. {
  17870. /* build PreMasterSecret with RNG data */
  17871. ret = wc_RNG_GenerateBlock(ssl->rng,
  17872. &ssl->arrays->preMasterSecret[VERSION_SZ],
  17873. SECRET_LEN - VERSION_SZ);
  17874. if (ret != 0) {
  17875. goto exit_scke;
  17876. }
  17877. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  17878. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  17879. ssl->arrays->preMasterSz = SECRET_LEN;
  17880. break;
  17881. }
  17882. #endif /* !NO_RSA */
  17883. #ifndef NO_DH
  17884. case diffie_hellman_kea:
  17885. {
  17886. ssl->buffers.sig.length = ENCRYPT_LEN;
  17887. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  17888. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  17889. if (ssl->buffers.sig.buffer == NULL) {
  17890. ERROR_OUT(MEMORY_E, exit_scke);
  17891. }
  17892. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  17893. (void**)&ssl->buffers.serverDH_Key);
  17894. if (ret != 0) {
  17895. goto exit_scke;
  17896. }
  17897. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  17898. !defined(WOLFSSL_OLD_PRIME_CHECK)
  17899. if (ssl->options.dhDoKeyTest &&
  17900. !ssl->options.dhKeyTested)
  17901. {
  17902. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  17903. ssl->buffers.serverDH_P.buffer,
  17904. ssl->buffers.serverDH_P.length,
  17905. ssl->buffers.serverDH_G.buffer,
  17906. ssl->buffers.serverDH_G.length,
  17907. NULL, 0, 0, ssl->rng);
  17908. if (ret != 0) {
  17909. goto exit_scke;
  17910. }
  17911. ssl->options.dhKeyTested = 1;
  17912. }
  17913. else
  17914. #endif
  17915. {
  17916. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  17917. ssl->buffers.serverDH_P.buffer,
  17918. ssl->buffers.serverDH_P.length,
  17919. ssl->buffers.serverDH_G.buffer,
  17920. ssl->buffers.serverDH_G.length);
  17921. if (ret != 0) {
  17922. goto exit_scke;
  17923. }
  17924. }
  17925. /* for DH, encSecret is Yc, agree is pre-master */
  17926. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  17927. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  17928. args->encSecret, &args->encSz);
  17929. /* set the max agree result size */
  17930. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  17931. break;
  17932. }
  17933. #endif /* !NO_DH */
  17934. #ifndef NO_PSK
  17935. case psk_kea:
  17936. {
  17937. byte* pms = ssl->arrays->preMasterSecret;
  17938. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  17939. ssl->arrays->server_hint, ssl->arrays->client_identity,
  17940. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  17941. if (ssl->arrays->psk_keySz == 0 ||
  17942. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  17943. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  17944. }
  17945. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  17946. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  17947. if (args->encSz > MAX_PSK_ID_LEN) {
  17948. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  17949. }
  17950. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  17951. args->encSz);
  17952. /* make psk pre master secret */
  17953. /* length of key + length 0s + length of key + key */
  17954. c16toa((word16)ssl->arrays->psk_keySz, pms);
  17955. pms += OPAQUE16_LEN;
  17956. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  17957. pms += ssl->arrays->psk_keySz;
  17958. c16toa((word16)ssl->arrays->psk_keySz, pms);
  17959. pms += OPAQUE16_LEN;
  17960. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  17961. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
  17962. (2 * OPAQUE16_LEN);
  17963. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  17964. ssl->arrays->psk_keySz = 0; /* No further need */
  17965. break;
  17966. }
  17967. #endif /* !NO_PSK */
  17968. #if !defined(NO_DH) && !defined(NO_PSK)
  17969. case dhe_psk_kea:
  17970. {
  17971. word32 esSz = 0;
  17972. args->output = args->encSecret;
  17973. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  17974. ssl->arrays->server_hint, ssl->arrays->client_identity,
  17975. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  17976. if (ssl->arrays->psk_keySz == 0 ||
  17977. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  17978. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  17979. }
  17980. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  17981. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  17982. if (esSz > MAX_PSK_ID_LEN) {
  17983. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  17984. }
  17985. ssl->buffers.sig.length = ENCRYPT_LEN;
  17986. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  17987. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  17988. if (ssl->buffers.sig.buffer == NULL) {
  17989. ERROR_OUT(MEMORY_E, exit_scke);
  17990. }
  17991. c16toa((word16)esSz, args->output);
  17992. args->output += OPAQUE16_LEN;
  17993. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  17994. args->output += esSz;
  17995. args->encSz = esSz + OPAQUE16_LEN;
  17996. args->length = 0;
  17997. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  17998. (void**)&ssl->buffers.serverDH_Key);
  17999. if (ret != 0) {
  18000. goto exit_scke;
  18001. }
  18002. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  18003. !defined(WOLFSSL_OLD_PRIME_CHECK)
  18004. if (ssl->options.dhDoKeyTest &&
  18005. !ssl->options.dhKeyTested)
  18006. {
  18007. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  18008. ssl->buffers.serverDH_P.buffer,
  18009. ssl->buffers.serverDH_P.length,
  18010. ssl->buffers.serverDH_G.buffer,
  18011. ssl->buffers.serverDH_G.length,
  18012. NULL, 0, 0, ssl->rng);
  18013. if (ret != 0) {
  18014. goto exit_scke;
  18015. }
  18016. ssl->options.dhKeyTested = 1;
  18017. }
  18018. else
  18019. #endif
  18020. {
  18021. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  18022. ssl->buffers.serverDH_P.buffer,
  18023. ssl->buffers.serverDH_P.length,
  18024. ssl->buffers.serverDH_G.buffer,
  18025. ssl->buffers.serverDH_G.length);
  18026. if (ret != 0) {
  18027. goto exit_scke;
  18028. }
  18029. }
  18030. /* for DH, encSecret is Yc, agree is pre-master */
  18031. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  18032. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  18033. args->output + OPAQUE16_LEN, &args->length);
  18034. break;
  18035. }
  18036. #endif /* !NO_DH && !NO_PSK */
  18037. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  18038. !defined(NO_PSK)
  18039. case ecdhe_psk_kea:
  18040. {
  18041. word32 esSz = 0;
  18042. args->output = args->encSecret;
  18043. /* Send PSK client identity */
  18044. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  18045. ssl->arrays->server_hint, ssl->arrays->client_identity,
  18046. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  18047. if (ssl->arrays->psk_keySz == 0 ||
  18048. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  18049. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  18050. }
  18051. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  18052. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  18053. if (esSz > MAX_PSK_ID_LEN) {
  18054. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  18055. }
  18056. /* place size and identity in output buffer sz:identity */
  18057. c16toa((word16)esSz, args->output);
  18058. args->output += OPAQUE16_LEN;
  18059. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  18060. args->output += esSz;
  18061. args->encSz = esSz + OPAQUE16_LEN;
  18062. /* length is used for public key size */
  18063. args->length = MAX_ENCRYPT_SZ;
  18064. /* Create shared ECC key leaving room at the beginning
  18065. of buffer for size of shared key. */
  18066. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  18067. #ifdef HAVE_CURVE25519
  18068. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  18069. #ifdef HAVE_PK_CALLBACKS
  18070. /* if callback then use it for shared secret */
  18071. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  18072. break;
  18073. }
  18074. #endif
  18075. ret = wc_curve25519_export_public_ex(
  18076. (curve25519_key*)ssl->hsKey,
  18077. args->output + OPAQUE8_LEN, &args->length,
  18078. EC25519_LITTLE_ENDIAN);
  18079. if (ret != 0) {
  18080. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  18081. }
  18082. break;
  18083. }
  18084. #endif
  18085. #ifdef HAVE_PK_CALLBACKS
  18086. /* if callback then use it for shared secret */
  18087. if (ssl->ctx->EccSharedSecretCb != NULL) {
  18088. break;
  18089. }
  18090. #endif
  18091. /* Place ECC key in output buffer, leaving room for size */
  18092. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  18093. args->output + OPAQUE8_LEN, &args->length);
  18094. if (ret != 0) {
  18095. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  18096. }
  18097. break;
  18098. }
  18099. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  18100. #ifdef HAVE_NTRU
  18101. case ntru_kea:
  18102. {
  18103. ret = wc_RNG_GenerateBlock(ssl->rng,
  18104. ssl->arrays->preMasterSecret, SECRET_LEN);
  18105. if (ret != 0) {
  18106. goto exit_scke;
  18107. }
  18108. ssl->arrays->preMasterSz = SECRET_LEN;
  18109. args->encSz = MAX_ENCRYPT_SZ;
  18110. break;
  18111. }
  18112. #endif /* HAVE_NTRU */
  18113. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  18114. case ecc_diffie_hellman_kea:
  18115. {
  18116. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  18117. #ifdef HAVE_CURVE25519
  18118. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  18119. #ifdef HAVE_PK_CALLBACKS
  18120. /* if callback then use it for shared secret */
  18121. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  18122. break;
  18123. }
  18124. #endif
  18125. ret = wc_curve25519_export_public_ex(
  18126. (curve25519_key*)ssl->hsKey,
  18127. args->encSecret + OPAQUE8_LEN, &args->encSz,
  18128. EC25519_LITTLE_ENDIAN);
  18129. if (ret != 0) {
  18130. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  18131. }
  18132. break;
  18133. }
  18134. #endif
  18135. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  18136. #ifdef HAVE_PK_CALLBACKS
  18137. /* if callback then use it for shared secret */
  18138. if (ssl->ctx->EccSharedSecretCb != NULL) {
  18139. break;
  18140. }
  18141. #endif
  18142. /* Place ECC key in buffer, leaving room for size */
  18143. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  18144. args->encSecret + OPAQUE8_LEN, &args->encSz);
  18145. if (ret != 0) {
  18146. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  18147. }
  18148. #endif /* HAVE_ECC */
  18149. break;
  18150. }
  18151. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  18152. default:
  18153. ret = BAD_KEA_TYPE_E;
  18154. } /* switch(ssl->specs.kea) */
  18155. /* Check for error */
  18156. if (ret != 0) {
  18157. goto exit_scke;
  18158. }
  18159. /* Advance state and proceed */
  18160. ssl->options.asyncState = TLS_ASYNC_DO;
  18161. } /* case TLS_ASYNC_BUILD */
  18162. FALL_THROUGH;
  18163. case TLS_ASYNC_DO:
  18164. {
  18165. switch(ssl->specs.kea)
  18166. {
  18167. #ifndef NO_RSA
  18168. case rsa_kea:
  18169. {
  18170. ret = RsaEnc(ssl,
  18171. ssl->arrays->preMasterSecret, SECRET_LEN,
  18172. args->encSecret, &args->encSz,
  18173. ssl->peerRsaKey,
  18174. #if defined(HAVE_PK_CALLBACKS)
  18175. &ssl->buffers.peerRsaKey
  18176. #else
  18177. NULL
  18178. #endif
  18179. );
  18180. break;
  18181. }
  18182. #endif /* !NO_RSA */
  18183. #ifndef NO_DH
  18184. case diffie_hellman_kea:
  18185. {
  18186. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  18187. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  18188. ssl->buffers.serverDH_Pub.buffer,
  18189. ssl->buffers.serverDH_Pub.length,
  18190. ssl->arrays->preMasterSecret,
  18191. &ssl->arrays->preMasterSz);
  18192. break;
  18193. }
  18194. #endif /* !NO_DH */
  18195. #ifndef NO_PSK
  18196. case psk_kea:
  18197. {
  18198. break;
  18199. }
  18200. #endif /* !NO_PSK */
  18201. #if !defined(NO_DH) && !defined(NO_PSK)
  18202. case dhe_psk_kea:
  18203. {
  18204. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  18205. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  18206. ssl->buffers.serverDH_Pub.buffer,
  18207. ssl->buffers.serverDH_Pub.length,
  18208. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  18209. &ssl->arrays->preMasterSz);
  18210. break;
  18211. }
  18212. #endif /* !NO_DH && !NO_PSK */
  18213. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  18214. !defined(NO_PSK)
  18215. case ecdhe_psk_kea:
  18216. {
  18217. #ifdef HAVE_CURVE25519
  18218. if (ssl->peerX25519KeyPresent) {
  18219. ret = X25519SharedSecret(ssl,
  18220. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  18221. args->output + OPAQUE8_LEN, &args->length,
  18222. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  18223. &ssl->arrays->preMasterSz,
  18224. WOLFSSL_CLIENT_END
  18225. );
  18226. if (!ssl->specs.static_ecdh
  18227. #ifdef WOLFSSL_ASYNC_CRYPT
  18228. && ret != WC_PENDING_E
  18229. #endif
  18230. ) {
  18231. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  18232. (void**)&ssl->peerX25519Key);
  18233. ssl->peerX25519KeyPresent = 0;
  18234. }
  18235. break;
  18236. }
  18237. #endif
  18238. ret = EccSharedSecret(ssl,
  18239. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  18240. args->output + OPAQUE8_LEN, &args->length,
  18241. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  18242. &ssl->arrays->preMasterSz,
  18243. WOLFSSL_CLIENT_END
  18244. );
  18245. #ifdef WOLFSSL_ASYNC_CRYPT
  18246. if (ret != WC_PENDING_E)
  18247. #endif
  18248. {
  18249. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  18250. (void**)&ssl->peerEccKey);
  18251. ssl->peerEccKeyPresent = 0;
  18252. }
  18253. break;
  18254. }
  18255. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  18256. #ifdef HAVE_NTRU
  18257. case ntru_kea:
  18258. {
  18259. word32 rc;
  18260. word16 tmpEncSz = (word16)args->encSz;
  18261. DRBG_HANDLE drbg;
  18262. rc = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  18263. if (rc != DRBG_OK) {
  18264. ERROR_OUT(NTRU_DRBG_ERROR, exit_scke);
  18265. }
  18266. rc = ntru_crypto_ntru_encrypt(drbg, ssl->peerNtruKeyLen,
  18267. ssl->peerNtruKey,
  18268. ssl->arrays->preMasterSz,
  18269. ssl->arrays->preMasterSecret,
  18270. &tmpEncSz,
  18271. args->encSecret);
  18272. args->encSz = tmpEncSz;
  18273. ntru_crypto_drbg_uninstantiate(drbg);
  18274. if (rc != NTRU_OK) {
  18275. ERROR_OUT(NTRU_ENCRYPT_ERROR, exit_scke);
  18276. }
  18277. ret = 0;
  18278. break;
  18279. }
  18280. #endif /* HAVE_NTRU */
  18281. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  18282. case ecc_diffie_hellman_kea:
  18283. {
  18284. #ifdef HAVE_ECC
  18285. ecc_key* peerKey;
  18286. #endif
  18287. #ifdef HAVE_CURVE25519
  18288. if (ssl->peerX25519KeyPresent) {
  18289. ret = X25519SharedSecret(ssl,
  18290. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  18291. args->encSecret + OPAQUE8_LEN, &args->encSz,
  18292. ssl->arrays->preMasterSecret,
  18293. &ssl->arrays->preMasterSz,
  18294. WOLFSSL_CLIENT_END
  18295. );
  18296. if (!ssl->specs.static_ecdh
  18297. #ifdef WOLFSSL_ASYNC_CRYPT
  18298. && ret != WC_PENDING_E
  18299. #endif
  18300. ) {
  18301. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  18302. (void**)&ssl->peerX25519Key);
  18303. ssl->peerX25519KeyPresent = 0;
  18304. }
  18305. break;
  18306. }
  18307. #endif
  18308. #ifdef HAVE_ECC
  18309. peerKey = (ssl->specs.static_ecdh) ?
  18310. ssl->peerEccDsaKey : ssl->peerEccKey;
  18311. ret = EccSharedSecret(ssl,
  18312. (ecc_key*)ssl->hsKey, peerKey,
  18313. args->encSecret + OPAQUE8_LEN, &args->encSz,
  18314. ssl->arrays->preMasterSecret,
  18315. &ssl->arrays->preMasterSz,
  18316. WOLFSSL_CLIENT_END
  18317. );
  18318. if (!ssl->specs.static_ecdh
  18319. #ifdef WOLFSSL_ASYNC_CRYPT
  18320. && ret != WC_PENDING_E
  18321. #endif
  18322. ) {
  18323. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  18324. (void**)&ssl->peerEccKey);
  18325. ssl->peerEccKeyPresent = 0;
  18326. }
  18327. #endif
  18328. break;
  18329. }
  18330. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  18331. default:
  18332. ret = BAD_KEA_TYPE_E;
  18333. } /* switch(ssl->specs.kea) */
  18334. /* Check for error */
  18335. if (ret != 0) {
  18336. goto exit_scke;
  18337. }
  18338. /* Advance state and proceed */
  18339. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  18340. } /* case TLS_ASYNC_DO */
  18341. FALL_THROUGH;
  18342. case TLS_ASYNC_VERIFY:
  18343. {
  18344. switch(ssl->specs.kea)
  18345. {
  18346. #ifndef NO_RSA
  18347. case rsa_kea:
  18348. {
  18349. break;
  18350. }
  18351. #endif /* !NO_RSA */
  18352. #ifndef NO_DH
  18353. case diffie_hellman_kea:
  18354. {
  18355. break;
  18356. }
  18357. #endif /* !NO_DH */
  18358. #ifndef NO_PSK
  18359. case psk_kea:
  18360. {
  18361. break;
  18362. }
  18363. #endif /* !NO_PSK */
  18364. #if !defined(NO_DH) && !defined(NO_PSK)
  18365. case dhe_psk_kea:
  18366. {
  18367. byte* pms = ssl->arrays->preMasterSecret;
  18368. /* validate args */
  18369. if (args->output == NULL || args->length == 0) {
  18370. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  18371. }
  18372. c16toa((word16)args->length, args->output);
  18373. args->encSz += args->length + OPAQUE16_LEN;
  18374. c16toa((word16)ssl->arrays->preMasterSz, pms);
  18375. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  18376. pms += ssl->arrays->preMasterSz;
  18377. /* make psk pre master secret */
  18378. /* length of key + length 0s + length of key + key */
  18379. c16toa((word16)ssl->arrays->psk_keySz, pms);
  18380. pms += OPAQUE16_LEN;
  18381. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  18382. ssl->arrays->preMasterSz +=
  18383. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  18384. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  18385. ssl->arrays->psk_keySz = 0; /* No further need */
  18386. break;
  18387. }
  18388. #endif /* !NO_DH && !NO_PSK */
  18389. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  18390. !defined(NO_PSK)
  18391. case ecdhe_psk_kea:
  18392. {
  18393. byte* pms = ssl->arrays->preMasterSecret;
  18394. /* validate args */
  18395. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  18396. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  18397. }
  18398. /* place size of public key in output buffer */
  18399. *args->output = (byte)args->length;
  18400. args->encSz += args->length + OPAQUE8_LEN;
  18401. /* Create pre master secret is the concatenation of
  18402. eccSize + eccSharedKey + pskSize + pskKey */
  18403. c16toa((word16)ssl->arrays->preMasterSz, pms);
  18404. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  18405. pms += ssl->arrays->preMasterSz;
  18406. c16toa((word16)ssl->arrays->psk_keySz, pms);
  18407. pms += OPAQUE16_LEN;
  18408. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  18409. ssl->arrays->preMasterSz +=
  18410. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  18411. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  18412. ssl->arrays->psk_keySz = 0; /* No further need */
  18413. break;
  18414. }
  18415. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  18416. #ifdef HAVE_NTRU
  18417. case ntru_kea:
  18418. {
  18419. break;
  18420. }
  18421. #endif /* HAVE_NTRU */
  18422. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  18423. case ecc_diffie_hellman_kea:
  18424. {
  18425. /* place size of public key in buffer */
  18426. *args->encSecret = (byte)args->encSz;
  18427. args->encSz += OPAQUE8_LEN;
  18428. break;
  18429. }
  18430. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  18431. default:
  18432. ret = BAD_KEA_TYPE_E;
  18433. } /* switch(ssl->specs.kea) */
  18434. /* Check for error */
  18435. if (ret != 0) {
  18436. goto exit_scke;
  18437. }
  18438. /* Advance state and proceed */
  18439. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  18440. } /* case TLS_ASYNC_VERIFY */
  18441. FALL_THROUGH;
  18442. case TLS_ASYNC_FINALIZE:
  18443. {
  18444. word32 tlsSz = 0;
  18445. word32 idx = 0;
  18446. #ifdef HAVE_QSH
  18447. word32 qshSz = 0;
  18448. if (ssl->peerQSHKeyPresent) {
  18449. qshSz = QSH_KeyGetSize(ssl);
  18450. }
  18451. #endif
  18452. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  18453. tlsSz = 2;
  18454. }
  18455. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  18456. ssl->specs.kea == dhe_psk_kea ||
  18457. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  18458. tlsSz = 0;
  18459. }
  18460. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  18461. args->sendSz = args->encSz + tlsSz + idx;
  18462. #ifdef WOLFSSL_DTLS
  18463. if (ssl->options.dtls) {
  18464. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  18465. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  18466. }
  18467. #endif
  18468. if (IsEncryptionOn(ssl, 1)) {
  18469. args->sendSz += MAX_MSG_EXTRA;
  18470. }
  18471. #ifdef HAVE_QSH
  18472. args->encSz += qshSz;
  18473. args->sendSz += qshSz;
  18474. #endif
  18475. /* check for available size */
  18476. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  18477. goto exit_scke;
  18478. }
  18479. /* get output buffer */
  18480. args->output = ssl->buffers.outputBuffer.buffer +
  18481. ssl->buffers.outputBuffer.length;
  18482. #ifdef HAVE_QSH
  18483. if (ssl->peerQSHKeyPresent) {
  18484. byte idxSave = idx;
  18485. idx = args->sendSz - qshSz;
  18486. if (QSH_KeyExchangeWrite(ssl, 0) != 0) {
  18487. ERROR_OUT(MEMORY_E, exit_scke);
  18488. }
  18489. /* extension type */
  18490. c16toa(TLSX_QUANTUM_SAFE_HYBRID, args->output + idx);
  18491. idx += OPAQUE16_LEN;
  18492. /* write to output and check amount written */
  18493. if (TLSX_QSHPK_Write(ssl->QSH_secret->list,
  18494. args->output + idx) > qshSz - OPAQUE16_LEN) {
  18495. ERROR_OUT(MEMORY_E, exit_scke);
  18496. }
  18497. idx = idxSave;
  18498. }
  18499. #endif
  18500. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  18501. #ifdef HAVE_QSH
  18502. if (ssl->peerQSHKeyPresent) {
  18503. args->encSz -= qshSz;
  18504. }
  18505. #endif
  18506. if (tlsSz) {
  18507. c16toa((word16)args->encSz, &args->output[idx]);
  18508. idx += OPAQUE16_LEN;
  18509. }
  18510. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  18511. idx += args->encSz;
  18512. if (IsEncryptionOn(ssl, 1)) {
  18513. args->inputSz = idx - RECORD_HEADER_SZ; /* buildmsg adds rechdr */
  18514. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  18515. DYNAMIC_TYPE_IN_BUFFER);
  18516. if (args->input == NULL) {
  18517. ERROR_OUT(MEMORY_E, exit_scke);
  18518. }
  18519. XMEMCPY(args->input, args->output + RECORD_HEADER_SZ,
  18520. args->inputSz);
  18521. }
  18522. /* Advance state and proceed */
  18523. ssl->options.asyncState = TLS_ASYNC_END;
  18524. } /* case TLS_ASYNC_FINALIZE */
  18525. FALL_THROUGH;
  18526. case TLS_ASYNC_END:
  18527. {
  18528. if (IsEncryptionOn(ssl, 1)) {
  18529. ret = BuildMessage(ssl, args->output, args->sendSz,
  18530. args->input, args->inputSz, handshake, 1, 0, 0);
  18531. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18532. args->input = NULL; /* make sure its not double free'd on cleanup */
  18533. if (ret >= 0) {
  18534. args->sendSz = ret;
  18535. ret = 0;
  18536. }
  18537. }
  18538. else {
  18539. #ifdef WOLFSSL_DTLS
  18540. if (ssl->options.dtls)
  18541. DtlsSEQIncrement(ssl, CUR_ORDER);
  18542. #endif
  18543. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  18544. }
  18545. if (ret != 0) {
  18546. goto exit_scke;
  18547. }
  18548. #ifdef WOLFSSL_DTLS
  18549. if (IsDtlsNotSctpMode(ssl)) {
  18550. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz)) != 0) {
  18551. goto exit_scke;
  18552. }
  18553. }
  18554. #endif
  18555. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18556. if (ssl->hsInfoOn)
  18557. AddPacketName(ssl, "ClientKeyExchange");
  18558. if (ssl->toInfoOn)
  18559. AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  18560. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  18561. #endif
  18562. ssl->buffers.outputBuffer.length += args->sendSz;
  18563. if (!ssl->options.groupMessages) {
  18564. ret = SendBuffered(ssl);
  18565. }
  18566. if (ret == 0 || ret == WANT_WRITE) {
  18567. int tmpRet = MakeMasterSecret(ssl);
  18568. if (tmpRet != 0) {
  18569. ret = tmpRet; /* save WANT_WRITE unless more serious */
  18570. }
  18571. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  18572. }
  18573. break;
  18574. }
  18575. default:
  18576. ret = INPUT_CASE_ERROR;
  18577. } /* switch(ssl->options.asyncState) */
  18578. exit_scke:
  18579. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  18580. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  18581. #ifdef WOLFSSL_ASYNC_CRYPT
  18582. /* Handle async operation */
  18583. if (ret == WC_PENDING_E)
  18584. return ret;
  18585. #endif
  18586. /* No further need for PMS */
  18587. if (ssl->arrays->preMasterSecret != NULL) {
  18588. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  18589. }
  18590. ssl->arrays->preMasterSz = 0;
  18591. /* Final cleanup */
  18592. FreeSckeArgs(ssl, args);
  18593. FreeKeyExchange(ssl);
  18594. return ret;
  18595. }
  18596. #endif /* !WOLFSSL_NO_TLS12 */
  18597. #ifndef NO_CERTS
  18598. #ifdef HAVE_PK_CALLBACKS
  18599. int GetPrivateKeySigSize(WOLFSSL* ssl)
  18600. {
  18601. int sigSz = 0;
  18602. if (ssl == NULL)
  18603. return 0;
  18604. switch (ssl->buffers.keyType) {
  18605. #ifndef NO_RSA
  18606. #ifdef WC_RSA_PSS
  18607. case rsa_pss_sa_algo:
  18608. #endif
  18609. case rsa_sa_algo:
  18610. sigSz = ssl->buffers.keySz;
  18611. ssl->hsType = DYNAMIC_TYPE_RSA;
  18612. break;
  18613. #endif
  18614. #ifdef HAVE_ECC
  18615. case ecc_dsa_sa_algo:
  18616. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  18617. ssl->hsType = DYNAMIC_TYPE_ECC;
  18618. break;
  18619. #endif
  18620. #ifdef HAVE_ED25519
  18621. case ed25519_sa_algo:
  18622. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  18623. ssl->hsType = DYNAMIC_TYPE_ED25519;
  18624. break;
  18625. #endif
  18626. default:
  18627. break;
  18628. }
  18629. return sigSz;
  18630. }
  18631. #endif /* HAVE_PK_CALLBACKS */
  18632. #ifndef WOLFSSL_NO_TLS12
  18633. #ifndef WOLFSSL_NO_CLIENT_AUTH
  18634. typedef struct ScvArgs {
  18635. byte* output; /* not allocated */
  18636. #ifndef NO_RSA
  18637. byte* verifySig;
  18638. #endif
  18639. byte* verify; /* not allocated */
  18640. byte* input;
  18641. word32 idx;
  18642. word32 extraSz;
  18643. word32 sigSz;
  18644. int sendSz;
  18645. int inputSz;
  18646. word16 length;
  18647. byte sigAlgo;
  18648. } ScvArgs;
  18649. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  18650. {
  18651. ScvArgs* args = (ScvArgs*)pArgs;
  18652. (void)ssl;
  18653. #ifndef NO_RSA
  18654. if (args->verifySig) {
  18655. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  18656. args->verifySig = NULL;
  18657. }
  18658. #endif
  18659. if (args->input) {
  18660. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18661. args->input = NULL;
  18662. }
  18663. }
  18664. /* handle generation of certificate_verify (15) */
  18665. int SendCertificateVerify(WOLFSSL* ssl)
  18666. {
  18667. int ret = 0;
  18668. #ifdef WOLFSSL_ASYNC_CRYPT
  18669. ScvArgs* args = (ScvArgs*)ssl->async.args;
  18670. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  18671. (void)sizeof(args_test);
  18672. #else
  18673. ScvArgs args[1];
  18674. #endif
  18675. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  18676. WOLFSSL_ENTER("SendCertificateVerify");
  18677. #ifdef WOLFSSL_ASYNC_CRYPT
  18678. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  18679. if (ret != WC_NOT_PENDING_E) {
  18680. /* Check for error */
  18681. if (ret < 0)
  18682. goto exit_scv;
  18683. }
  18684. else
  18685. #endif
  18686. {
  18687. /* Reset state */
  18688. ret = 0;
  18689. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  18690. XMEMSET(args, 0, sizeof(ScvArgs));
  18691. #ifdef WOLFSSL_ASYNC_CRYPT
  18692. ssl->async.freeArgs = FreeScvArgs;
  18693. #endif
  18694. }
  18695. switch(ssl->options.asyncState)
  18696. {
  18697. case TLS_ASYNC_BEGIN:
  18698. {
  18699. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  18700. return 0; /* sent blank cert, can't verify */
  18701. }
  18702. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  18703. if (IsEncryptionOn(ssl, 1)) {
  18704. args->sendSz += MAX_MSG_EXTRA;
  18705. }
  18706. /* check for available size */
  18707. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  18708. goto exit_scv;
  18709. }
  18710. /* get output buffer */
  18711. args->output = ssl->buffers.outputBuffer.buffer +
  18712. ssl->buffers.outputBuffer.length;
  18713. /* Advance state and proceed */
  18714. ssl->options.asyncState = TLS_ASYNC_BUILD;
  18715. } /* case TLS_ASYNC_BEGIN */
  18716. FALL_THROUGH;
  18717. case TLS_ASYNC_BUILD:
  18718. {
  18719. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  18720. if (ret != 0) {
  18721. goto exit_scv;
  18722. }
  18723. if (ssl->buffers.key == NULL) {
  18724. #ifdef HAVE_PK_CALLBACKS
  18725. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  18726. args->length = GetPrivateKeySigSize(ssl);
  18727. else
  18728. #endif
  18729. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  18730. }
  18731. else {
  18732. /* Decode private key. */
  18733. ret = DecodePrivateKey(ssl, &args->length);
  18734. if (ret != 0) {
  18735. goto exit_scv;
  18736. }
  18737. }
  18738. if (args->length <= 0) {
  18739. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  18740. }
  18741. /* idx is used to track verify pointer offset to output */
  18742. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  18743. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  18744. args->extraSz = 0; /* tls 1.2 hash/sig */
  18745. /* build encoded signature buffer */
  18746. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  18747. ssl->buffers.sig.buffer = (byte*)XMALLOC(ssl->buffers.sig.length,
  18748. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  18749. if (ssl->buffers.sig.buffer == NULL) {
  18750. ERROR_OUT(MEMORY_E, exit_scv);
  18751. }
  18752. #ifdef WOLFSSL_DTLS
  18753. if (ssl->options.dtls) {
  18754. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  18755. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  18756. }
  18757. #endif
  18758. #ifndef NO_OLD_TLS
  18759. #ifndef NO_SHA
  18760. /* old tls default */
  18761. SetDigest(ssl, sha_mac);
  18762. #endif
  18763. #else
  18764. #ifndef NO_SHA256
  18765. /* new tls default */
  18766. SetDigest(ssl, sha256_mac);
  18767. #endif
  18768. #endif /* !NO_OLD_TLS */
  18769. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  18770. #ifdef WC_RSA_PSS
  18771. if (IsAtLeastTLSv1_2(ssl) &&
  18772. (ssl->pssAlgo & (1 << ssl->suites->hashAlgo))) {
  18773. args->sigAlgo = rsa_pss_sa_algo;
  18774. }
  18775. else
  18776. #endif
  18777. args->sigAlgo = rsa_sa_algo;
  18778. }
  18779. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  18780. args->sigAlgo = ecc_dsa_sa_algo;
  18781. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  18782. args->sigAlgo = ed25519_sa_algo;
  18783. if (IsAtLeastTLSv1_2(ssl)) {
  18784. EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo,
  18785. args->verify);
  18786. args->extraSz = HASH_SIG_SIZE;
  18787. SetDigest(ssl, ssl->suites->hashAlgo);
  18788. }
  18789. #ifndef NO_OLD_TLS
  18790. else {
  18791. /* if old TLS load MD5 and SHA hash as value to sign */
  18792. XMEMCPY(ssl->buffers.sig.buffer,
  18793. (byte*)ssl->hsHashes->certHashes.md5, FINISHED_SZ);
  18794. }
  18795. #endif
  18796. #ifndef NO_RSA
  18797. if (args->sigAlgo == rsa_sa_algo) {
  18798. ssl->buffers.sig.length = FINISHED_SZ;
  18799. args->sigSz = ENCRYPT_LEN;
  18800. if (IsAtLeastTLSv1_2(ssl)) {
  18801. ssl->buffers.sig.length = wc_EncodeSignature(
  18802. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  18803. ssl->buffers.digest.length,
  18804. TypeHash(ssl->suites->hashAlgo));
  18805. }
  18806. /* prepend hdr */
  18807. c16toa(args->length, args->verify + args->extraSz);
  18808. }
  18809. #ifdef WC_RSA_PSS
  18810. else if (args->sigAlgo == rsa_pss_sa_algo) {
  18811. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  18812. ssl->buffers.digest.length);
  18813. ssl->buffers.sig.length = ssl->buffers.digest.length;
  18814. args->sigSz = ENCRYPT_LEN;
  18815. /* prepend hdr */
  18816. c16toa(args->length, args->verify + args->extraSz);
  18817. }
  18818. #endif
  18819. #endif /* !NO_RSA */
  18820. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  18821. if (args->sigAlgo == ed25519_sa_algo) {
  18822. ret = Ed25519CheckPubKey(ssl);
  18823. if (ret != 0)
  18824. goto exit_scv;
  18825. }
  18826. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  18827. /* Advance state and proceed */
  18828. ssl->options.asyncState = TLS_ASYNC_DO;
  18829. } /* case TLS_ASYNC_BUILD */
  18830. FALL_THROUGH;
  18831. case TLS_ASYNC_DO:
  18832. {
  18833. #ifdef HAVE_ECC
  18834. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  18835. ecc_key* key = (ecc_key*)ssl->hsKey;
  18836. ret = EccSign(ssl,
  18837. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  18838. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  18839. key,
  18840. #ifdef HAVE_PK_CALLBACKS
  18841. ssl->buffers.key
  18842. #else
  18843. NULL
  18844. #endif
  18845. );
  18846. }
  18847. #endif /* HAVE_ECC */
  18848. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  18849. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  18850. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  18851. ret = Ed25519Sign(ssl,
  18852. ssl->hsHashes->messages, ssl->hsHashes->length,
  18853. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  18854. key,
  18855. #ifdef HAVE_PK_CALLBACKS
  18856. ssl->buffers.key
  18857. #else
  18858. NULL
  18859. #endif
  18860. );
  18861. }
  18862. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  18863. #ifndef NO_RSA
  18864. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  18865. RsaKey* key = (RsaKey*)ssl->hsKey;
  18866. /* restore verify pointer */
  18867. args->verify = &args->output[args->idx];
  18868. ret = RsaSign(ssl,
  18869. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  18870. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  18871. args->sigAlgo, ssl->suites->hashAlgo, key,
  18872. ssl->buffers.key
  18873. );
  18874. }
  18875. #endif /* !NO_RSA */
  18876. /* Check for error */
  18877. if (ret != 0) {
  18878. goto exit_scv;
  18879. }
  18880. /* Advance state and proceed */
  18881. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  18882. } /* case TLS_ASYNC_DO */
  18883. FALL_THROUGH;
  18884. case TLS_ASYNC_VERIFY:
  18885. {
  18886. /* restore verify pointer */
  18887. args->verify = &args->output[args->idx];
  18888. #ifdef HAVE_ECC
  18889. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  18890. args->length = (word16)ssl->buffers.sig.length;
  18891. /* prepend hdr */
  18892. c16toa(args->length, args->verify + args->extraSz);
  18893. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  18894. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  18895. }
  18896. #endif /* HAVE_ECC */
  18897. #ifdef HAVE_ED25519
  18898. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  18899. args->length = (word16)ssl->buffers.sig.length;
  18900. /* prepend hdr */
  18901. c16toa(args->length, args->verify + args->extraSz);
  18902. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  18903. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  18904. }
  18905. #endif /* HAVE_ED25519 */
  18906. #ifndef NO_RSA
  18907. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  18908. RsaKey* key = (RsaKey*)ssl->hsKey;
  18909. if (args->verifySig == NULL) {
  18910. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  18911. DYNAMIC_TYPE_SIGNATURE);
  18912. if (args->verifySig == NULL) {
  18913. ERROR_OUT(MEMORY_E, exit_scv);
  18914. }
  18915. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  18916. VERIFY_HEADER, args->sigSz);
  18917. }
  18918. /* check for signature faults */
  18919. ret = VerifyRsaSign(ssl,
  18920. args->verifySig, args->sigSz,
  18921. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  18922. args->sigAlgo, ssl->suites->hashAlgo, key,
  18923. ssl->buffers.key
  18924. );
  18925. }
  18926. #endif /* !NO_RSA */
  18927. /* Check for error */
  18928. if (ret != 0) {
  18929. goto exit_scv;
  18930. }
  18931. /* Advance state and proceed */
  18932. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  18933. } /* case TLS_ASYNC_VERIFY */
  18934. FALL_THROUGH;
  18935. case TLS_ASYNC_FINALIZE:
  18936. {
  18937. if (args->output == NULL) {
  18938. ERROR_OUT(BUFFER_ERROR, exit_scv);
  18939. }
  18940. AddHeaders(args->output, (word32)args->length + args->extraSz +
  18941. VERIFY_HEADER, certificate_verify, ssl);
  18942. args->sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ +
  18943. (word32)args->length + args->extraSz + VERIFY_HEADER;
  18944. #ifdef WOLFSSL_DTLS
  18945. if (ssl->options.dtls) {
  18946. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  18947. }
  18948. #endif
  18949. if (IsEncryptionOn(ssl, 1)) {
  18950. args->inputSz = args->sendSz - RECORD_HEADER_SZ;
  18951. /* build msg adds rec hdr */
  18952. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  18953. DYNAMIC_TYPE_IN_BUFFER);
  18954. if (args->input == NULL) {
  18955. ERROR_OUT(MEMORY_E, exit_scv);
  18956. }
  18957. XMEMCPY(args->input, args->output + RECORD_HEADER_SZ,
  18958. args->inputSz);
  18959. }
  18960. /* Advance state and proceed */
  18961. ssl->options.asyncState = TLS_ASYNC_END;
  18962. } /* case TLS_ASYNC_FINALIZE */
  18963. FALL_THROUGH;
  18964. case TLS_ASYNC_END:
  18965. {
  18966. if (IsEncryptionOn(ssl, 1)) {
  18967. ret = BuildMessage(ssl, args->output,
  18968. MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA,
  18969. args->input, args->inputSz, handshake,
  18970. 1, 0, 1);
  18971. #ifdef WOLFSSL_ASYNC_CRYPT
  18972. if (ret == WC_PENDING_E)
  18973. goto exit_scv;
  18974. #endif
  18975. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18976. args->input = NULL; /* make sure its not double free'd on cleanup */
  18977. if (ret >= 0) {
  18978. args->sendSz = ret;
  18979. ret = 0;
  18980. }
  18981. }
  18982. else {
  18983. #ifdef WOLFSSL_DTLS
  18984. if (ssl->options.dtls)
  18985. DtlsSEQIncrement(ssl, CUR_ORDER);
  18986. #endif
  18987. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  18988. }
  18989. if (ret != 0) {
  18990. goto exit_scv;
  18991. }
  18992. #ifdef WOLFSSL_DTLS
  18993. if (IsDtlsNotSctpMode(ssl)) {
  18994. ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz);
  18995. }
  18996. #endif
  18997. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18998. if (ssl->hsInfoOn)
  18999. AddPacketName(ssl, "CertificateVerify");
  19000. if (ssl->toInfoOn)
  19001. AddPacketInfo(ssl, "CertificateVerify", handshake,
  19002. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  19003. #endif
  19004. ssl->buffers.outputBuffer.length += args->sendSz;
  19005. if (!ssl->options.groupMessages) {
  19006. ret = SendBuffered(ssl);
  19007. }
  19008. break;
  19009. }
  19010. default:
  19011. ret = INPUT_CASE_ERROR;
  19012. } /* switch(ssl->options.asyncState) */
  19013. exit_scv:
  19014. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  19015. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  19016. #ifdef WOLFSSL_ASYNC_CRYPT
  19017. /* Handle async operation */
  19018. if (ret == WC_PENDING_E) {
  19019. return ret;
  19020. }
  19021. #endif /* WOLFSSL_ASYNC_CRYPT */
  19022. /* Digest is not allocated, so do this to prevent free */
  19023. ssl->buffers.digest.buffer = NULL;
  19024. ssl->buffers.digest.length = 0;
  19025. /* Final cleanup */
  19026. FreeScvArgs(ssl, args);
  19027. FreeKeyExchange(ssl);
  19028. return ret;
  19029. }
  19030. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  19031. #endif /* WOLFSSL_NO_TLS12 */
  19032. #endif /* NO_CERTS */
  19033. #ifdef HAVE_SESSION_TICKET
  19034. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  19035. {
  19036. /* Free old dynamic ticket if we already had one */
  19037. if (ssl->session.isDynamic) {
  19038. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  19039. ssl->session.ticket = ssl->session.staticTicket;
  19040. ssl->session.isDynamic = 0;
  19041. }
  19042. if (length > sizeof(ssl->session.staticTicket)) {
  19043. byte* sessionTicket =
  19044. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  19045. if (sessionTicket == NULL)
  19046. return MEMORY_E;
  19047. ssl->session.ticket = sessionTicket;
  19048. ssl->session.isDynamic = 1;
  19049. }
  19050. ssl->session.ticketLen = (word16)length;
  19051. if (length > 0) {
  19052. XMEMCPY(ssl->session.ticket, ticket, length);
  19053. if (ssl->session_ticket_cb != NULL) {
  19054. ssl->session_ticket_cb(ssl,
  19055. ssl->session.ticket, ssl->session.ticketLen,
  19056. ssl->session_ticket_ctx);
  19057. }
  19058. /* Create a fake sessionID based on the ticket, this will
  19059. * supersede the existing session cache info. */
  19060. ssl->options.haveSessionId = 1;
  19061. #ifdef WOLFSSL_TLS13
  19062. if (ssl->options.tls1_3) {
  19063. XMEMCPY(ssl->session.sessionID,
  19064. ssl->session.ticket + length - ID_LEN, ID_LEN);
  19065. }
  19066. else
  19067. #endif
  19068. XMEMCPY(ssl->arrays->sessionID,
  19069. ssl->session.ticket + length - ID_LEN, ID_LEN);
  19070. }
  19071. return 0;
  19072. }
  19073. #ifndef WOLFSSL_NO_TLS12
  19074. /* handle processing of session_ticket (4) */
  19075. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  19076. word32 size)
  19077. {
  19078. word32 begin = *inOutIdx;
  19079. word32 lifetime;
  19080. word16 length;
  19081. int ret;
  19082. if (ssl->expect_session_ticket == 0) {
  19083. WOLFSSL_MSG("Unexpected session ticket");
  19084. return SESSION_TICKET_EXPECT_E;
  19085. }
  19086. if ((*inOutIdx - begin) + OPAQUE32_LEN > size)
  19087. return BUFFER_ERROR;
  19088. ato32(input + *inOutIdx, &lifetime);
  19089. *inOutIdx += OPAQUE32_LEN;
  19090. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  19091. return BUFFER_ERROR;
  19092. ato16(input + *inOutIdx, &length);
  19093. *inOutIdx += OPAQUE16_LEN;
  19094. if ((*inOutIdx - begin) + length > size)
  19095. return BUFFER_ERROR;
  19096. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  19097. return ret;
  19098. *inOutIdx += length;
  19099. if (length > 0) {
  19100. ssl->timeout = lifetime;
  19101. #ifndef NO_SESSION_CACHE
  19102. AddSession(ssl);
  19103. #endif
  19104. }
  19105. if (IsEncryptionOn(ssl, 0)) {
  19106. *inOutIdx += ssl->keys.padSz;
  19107. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19108. if (ssl->options.encThenMac)
  19109. *inOutIdx += MacSize(ssl);
  19110. #endif
  19111. }
  19112. ssl->expect_session_ticket = 0;
  19113. return 0;
  19114. }
  19115. #endif /* !WOLFSSL_NO_TLS12 */
  19116. #endif /* HAVE_SESSION_TICKET */
  19117. #endif /* NO_WOLFSSL_CLIENT */
  19118. #ifndef NO_WOLFSSL_SERVER
  19119. #ifndef WOLFSSL_NO_TLS12
  19120. /* handle generation of server_hello (2) */
  19121. int SendServerHello(WOLFSSL* ssl)
  19122. {
  19123. int ret;
  19124. byte *output;
  19125. word16 length;
  19126. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  19127. int sendSz;
  19128. byte sessIdSz = ID_LEN;
  19129. byte echoId = 0; /* ticket echo id flag */
  19130. byte cacheOff = 0; /* session cache off flag */
  19131. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  19132. WOLFSSL_ENTER("SendServerHello");
  19133. length = VERSION_SZ + RAN_LEN
  19134. + ID_LEN + ENUM_LEN
  19135. + SUITE_LEN
  19136. + ENUM_LEN;
  19137. #ifdef HAVE_TLS_EXTENSIONS
  19138. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  19139. if (ret != 0)
  19140. return ret;
  19141. #ifdef HAVE_SESSION_TICKET
  19142. if (ssl->options.useTicket) {
  19143. /* echo session id sz can be 0,32 or bogus len in between */
  19144. sessIdSz = ssl->arrays->sessionIDSz;
  19145. if (sessIdSz > ID_LEN) {
  19146. WOLFSSL_MSG("Bad bogus session id len");
  19147. return BUFFER_ERROR;
  19148. }
  19149. if (!IsAtLeastTLSv1_3(ssl->version))
  19150. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  19151. echoId = 1;
  19152. }
  19153. #endif /* HAVE_SESSION_TICKET */
  19154. #else
  19155. if (ssl->options.haveEMS) {
  19156. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  19157. }
  19158. #endif
  19159. /* is the session cache off at build or runtime */
  19160. #ifdef NO_SESSION_CACHE
  19161. cacheOff = 1;
  19162. #else
  19163. if (ssl->options.sessionCacheOff == 1) {
  19164. cacheOff = 1;
  19165. }
  19166. #endif
  19167. /* if no session cache don't send a session ID unless we're echoing
  19168. * an ID as part of session tickets */
  19169. if (echoId == 0 && cacheOff == 1) {
  19170. length -= ID_LEN; /* adjust ID_LEN assumption */
  19171. sessIdSz = 0;
  19172. }
  19173. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  19174. #ifdef WOLFSSL_DTLS
  19175. if (ssl->options.dtls) {
  19176. /* Server Hello should use the same sequence number as the
  19177. * Client Hello. */
  19178. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  19179. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  19180. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19181. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19182. }
  19183. #endif /* WOLFSSL_DTLS */
  19184. if (IsEncryptionOn(ssl, 1))
  19185. sendSz += MAX_MSG_EXTRA;
  19186. /* check for available size */
  19187. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  19188. return ret;
  19189. /* get output buffer */
  19190. output = ssl->buffers.outputBuffer.buffer +
  19191. ssl->buffers.outputBuffer.length;
  19192. AddHeaders(output, length, server_hello, ssl);
  19193. /* now write to output */
  19194. /* first version */
  19195. output[idx++] = (byte)ssl->version.major;
  19196. output[idx++] = (byte)ssl->version.minor;
  19197. /* then random and session id */
  19198. if (!ssl->options.resuming) {
  19199. /* generate random part and session id */
  19200. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  19201. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  19202. if (ret != 0)
  19203. return ret;
  19204. #ifdef WOLFSSL_TLS13
  19205. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  19206. /* TLS v1.3 capable server downgraded. */
  19207. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  19208. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  19209. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  19210. }
  19211. else
  19212. #endif
  19213. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  19214. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  19215. !IsAtLeastTLSv1_2(ssl)) {
  19216. /* TLS v1.2 capable server downgraded. */
  19217. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  19218. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  19219. output[idx + RAN_LEN - 1] = 0;
  19220. }
  19221. /* store info in SSL for later */
  19222. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  19223. idx += RAN_LEN;
  19224. output[idx++] = sessIdSz;
  19225. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  19226. ssl->arrays->sessionIDSz = sessIdSz;
  19227. }
  19228. else {
  19229. /* If resuming, use info from SSL */
  19230. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  19231. idx += RAN_LEN;
  19232. output[idx++] = sessIdSz;
  19233. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  19234. }
  19235. idx += sessIdSz;
  19236. #ifdef SHOW_SECRETS
  19237. {
  19238. int j;
  19239. printf("server random: ");
  19240. for (j = 0; j < RAN_LEN; j++)
  19241. printf("%02x", ssl->arrays->serverRandom[j]);
  19242. printf("\n");
  19243. }
  19244. #endif
  19245. /* then cipher suite */
  19246. output[idx++] = ssl->options.cipherSuite0;
  19247. output[idx++] = ssl->options.cipherSuite;
  19248. /* then compression */
  19249. if (ssl->options.usingCompression)
  19250. output[idx++] = ZLIB_COMPRESSION;
  19251. else
  19252. output[idx++] = NO_COMPRESSION;
  19253. /* last, extensions */
  19254. #ifdef HAVE_TLS_EXTENSIONS
  19255. {
  19256. word16 offset = 0;
  19257. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  19258. if (ret != 0)
  19259. return ret;
  19260. idx += offset;
  19261. }
  19262. #else
  19263. #ifdef HAVE_EXTENDED_MASTER
  19264. if (ssl->options.haveEMS) {
  19265. c16toa(HELLO_EXT_SZ, output + idx);
  19266. idx += HELLO_EXT_SZ_SZ;
  19267. c16toa(HELLO_EXT_EXTMS, output + idx);
  19268. idx += HELLO_EXT_TYPE_SZ;
  19269. c16toa(0, output + idx);
  19270. /*idx += HELLO_EXT_SZ_SZ;*/
  19271. /* idx is not used after this point. uncomment the line above
  19272. * if adding any more extensions in the future. */
  19273. }
  19274. #endif
  19275. #endif
  19276. if (IsEncryptionOn(ssl, 1)) {
  19277. byte* input;
  19278. int inputSz = idx - RECORD_HEADER_SZ; /* build msg adds rec hdr */
  19279. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19280. if (input == NULL)
  19281. return MEMORY_E;
  19282. XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
  19283. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19284. handshake, 1, 0, 0);
  19285. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19286. if (sendSz < 0)
  19287. return sendSz;
  19288. } else {
  19289. #ifdef WOLFSSL_DTLS
  19290. if (ssl->options.dtls)
  19291. DtlsSEQIncrement(ssl, CUR_ORDER);
  19292. #endif
  19293. ret = HashOutput(ssl, output, sendSz, 0);
  19294. if (ret != 0)
  19295. return ret;
  19296. }
  19297. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19298. if (ssl->hsInfoOn)
  19299. AddPacketName(ssl, "ServerHello");
  19300. if (ssl->toInfoOn)
  19301. AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  19302. WRITE_PROTO, ssl->heap);
  19303. #endif
  19304. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  19305. ssl->buffers.outputBuffer.length += sendSz;
  19306. #ifdef WOLFSSL_DTLS
  19307. if (IsDtlsNotSctpMode(ssl)) {
  19308. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
  19309. return ret;
  19310. }
  19311. if (ssl->options.dtls) {
  19312. DtlsSEQIncrement(ssl, CUR_ORDER);
  19313. }
  19314. #endif
  19315. if (ssl->options.groupMessages)
  19316. ret = 0;
  19317. else
  19318. ret = SendBuffered(ssl);
  19319. WOLFSSL_LEAVE("SendServerHello", ret);
  19320. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  19321. return ret;
  19322. }
  19323. #if defined(HAVE_ECC)
  19324. static byte SetCurveId(ecc_key* key)
  19325. {
  19326. if (key == NULL || key->dp == NULL) {
  19327. WOLFSSL_MSG("SetCurveId: Invalid key!");
  19328. return 0;
  19329. }
  19330. switch(key->dp->oidSum) {
  19331. #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
  19332. #ifndef NO_ECC_SECP
  19333. case ECC_SECP160R1_OID:
  19334. return WOLFSSL_ECC_SECP160R1;
  19335. #endif /* !NO_ECC_SECP */
  19336. #ifdef HAVE_ECC_SECPR2
  19337. case ECC_SECP160R2_OID:
  19338. return WOLFSSL_ECC_SECP160R2;
  19339. #endif /* HAVE_ECC_SECPR2 */
  19340. #ifdef HAVE_ECC_KOBLITZ
  19341. case ECC_SECP160K1_OID:
  19342. return WOLFSSL_ECC_SECP160K1;
  19343. #endif /* HAVE_ECC_KOBLITZ */
  19344. #endif
  19345. #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
  19346. #ifndef NO_ECC_SECP
  19347. case ECC_SECP192R1_OID:
  19348. return WOLFSSL_ECC_SECP192R1;
  19349. #endif /* !NO_ECC_SECP */
  19350. #ifdef HAVE_ECC_KOBLITZ
  19351. case ECC_SECP192K1_OID:
  19352. return WOLFSSL_ECC_SECP192K1;
  19353. #endif /* HAVE_ECC_KOBLITZ */
  19354. #endif
  19355. #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
  19356. #ifndef NO_ECC_SECP
  19357. case ECC_SECP224R1_OID:
  19358. return WOLFSSL_ECC_SECP224R1;
  19359. #endif /* !NO_ECC_SECP */
  19360. #ifdef HAVE_ECC_KOBLITZ
  19361. case ECC_SECP224K1_OID:
  19362. return WOLFSSL_ECC_SECP224K1;
  19363. #endif /* HAVE_ECC_KOBLITZ */
  19364. #endif
  19365. #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
  19366. #ifndef NO_ECC_SECP
  19367. case ECC_SECP256R1_OID:
  19368. return WOLFSSL_ECC_SECP256R1;
  19369. #endif /* !NO_ECC_SECP */
  19370. #ifdef HAVE_ECC_KOBLITZ
  19371. case ECC_SECP256K1_OID:
  19372. return WOLFSSL_ECC_SECP256K1;
  19373. #endif /* HAVE_ECC_KOBLITZ */
  19374. #ifdef HAVE_ECC_BRAINPOOL
  19375. case ECC_BRAINPOOLP256R1_OID:
  19376. return WOLFSSL_ECC_BRAINPOOLP256R1;
  19377. #endif /* HAVE_ECC_BRAINPOOL */
  19378. #endif
  19379. #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
  19380. #ifndef NO_ECC_SECP
  19381. case ECC_SECP384R1_OID:
  19382. return WOLFSSL_ECC_SECP384R1;
  19383. #endif /* !NO_ECC_SECP */
  19384. #ifdef HAVE_ECC_BRAINPOOL
  19385. case ECC_BRAINPOOLP384R1_OID:
  19386. return WOLFSSL_ECC_BRAINPOOLP384R1;
  19387. #endif /* HAVE_ECC_BRAINPOOL */
  19388. #endif
  19389. #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
  19390. #ifdef HAVE_ECC_BRAINPOOL
  19391. case ECC_BRAINPOOLP512R1_OID:
  19392. return WOLFSSL_ECC_BRAINPOOLP512R1;
  19393. #endif /* HAVE_ECC_BRAINPOOL */
  19394. #endif
  19395. #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
  19396. #ifndef NO_ECC_SECP
  19397. case ECC_SECP521R1_OID:
  19398. return WOLFSSL_ECC_SECP521R1;
  19399. #endif /* !NO_ECC_SECP */
  19400. #endif
  19401. default:
  19402. return 0;
  19403. }
  19404. }
  19405. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  19406. typedef struct SskeArgs {
  19407. byte* output; /* not allocated */
  19408. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  19409. (!defined(NO_DH) && !defined(NO_RSA))
  19410. byte* sigDataBuf;
  19411. #endif
  19412. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  19413. byte* exportBuf;
  19414. #endif
  19415. #ifndef NO_RSA
  19416. byte* verifySig;
  19417. #endif
  19418. byte* input;
  19419. word32 idx;
  19420. word32 tmpSigSz;
  19421. word32 length;
  19422. word32 sigSz;
  19423. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  19424. (!defined(NO_DH) && !defined(NO_RSA))
  19425. word32 sigDataSz;
  19426. #endif
  19427. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  19428. word32 exportSz;
  19429. #endif
  19430. #ifdef HAVE_QSH
  19431. word32 qshSz;
  19432. #endif
  19433. int sendSz;
  19434. int inputSz;
  19435. } SskeArgs;
  19436. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  19437. {
  19438. SskeArgs* args = (SskeArgs*)pArgs;
  19439. (void)ssl;
  19440. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  19441. if (args->exportBuf) {
  19442. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  19443. args->exportBuf = NULL;
  19444. }
  19445. #endif
  19446. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  19447. (!defined(NO_DH) && !defined(NO_RSA))
  19448. if (args->sigDataBuf) {
  19449. XFREE(args->sigDataBuf, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  19450. args->sigDataBuf = NULL;
  19451. }
  19452. #endif
  19453. #ifndef NO_RSA
  19454. if (args->verifySig) {
  19455. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  19456. args->verifySig = NULL;
  19457. }
  19458. #endif
  19459. (void)args;
  19460. }
  19461. /* handle generation of server_key_exchange (12) */
  19462. int SendServerKeyExchange(WOLFSSL* ssl)
  19463. {
  19464. int ret;
  19465. #ifdef WOLFSSL_ASYNC_CRYPT
  19466. SskeArgs* args = (SskeArgs*)ssl->async.args;
  19467. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  19468. (void)sizeof(args_test);
  19469. #else
  19470. SskeArgs args[1];
  19471. #endif
  19472. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  19473. WOLFSSL_ENTER("SendServerKeyExchange");
  19474. #ifdef WOLFSSL_ASYNC_CRYPT
  19475. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  19476. if (ret != WC_NOT_PENDING_E) {
  19477. /* Check for error */
  19478. if (ret < 0)
  19479. goto exit_sske;
  19480. }
  19481. else
  19482. #endif
  19483. {
  19484. /* Reset state */
  19485. ret = 0;
  19486. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  19487. XMEMSET(args, 0, sizeof(SskeArgs));
  19488. #ifdef WOLFSSL_ASYNC_CRYPT
  19489. ssl->async.freeArgs = FreeSskeArgs;
  19490. #endif
  19491. }
  19492. switch(ssl->options.asyncState)
  19493. {
  19494. case TLS_ASYNC_BEGIN:
  19495. {
  19496. #ifdef HAVE_QSH
  19497. if (ssl->peerQSHKeyPresent && ssl->options.haveQSH) {
  19498. args->qshSz = QSH_KeyGetSize(ssl);
  19499. }
  19500. #endif
  19501. /* Do some checks / debug msgs */
  19502. switch(ssl->specs.kea)
  19503. {
  19504. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  19505. !defined(NO_PSK)
  19506. case ecdhe_psk_kea:
  19507. {
  19508. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  19509. break;
  19510. }
  19511. #endif /* (HAVE_ECC || CURVE25519) && !NO_PSK */
  19512. #if defined(HAVE_ECC)
  19513. case ecc_diffie_hellman_kea:
  19514. {
  19515. if (ssl->specs.static_ecdh) {
  19516. WOLFSSL_MSG("Using Static ECDH, not sending ServerKeyExchange");
  19517. ERROR_OUT(0, exit_sske);
  19518. }
  19519. WOLFSSL_MSG("Using ephemeral ECDH");
  19520. break;
  19521. }
  19522. #endif /* HAVE_ECC */
  19523. }
  19524. /* Preparing keys */
  19525. switch(ssl->specs.kea)
  19526. {
  19527. #ifndef NO_PSK
  19528. case psk_kea:
  19529. {
  19530. /* Nothing to do in this sub-state */
  19531. break;
  19532. }
  19533. #endif /* !NO_PSK */
  19534. #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA))
  19535. #if !defined(NO_PSK)
  19536. case dhe_psk_kea:
  19537. #endif
  19538. #if !defined(NO_RSA)
  19539. case diffie_hellman_kea:
  19540. #endif
  19541. {
  19542. /* Allocate DH key buffers and generate key */
  19543. if (ssl->buffers.serverDH_P.buffer == NULL ||
  19544. ssl->buffers.serverDH_G.buffer == NULL) {
  19545. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  19546. }
  19547. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  19548. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  19549. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  19550. ssl->buffers.serverDH_P.length + OPAQUE16_LEN,
  19551. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  19552. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  19553. ERROR_OUT(MEMORY_E, exit_sske);
  19554. }
  19555. }
  19556. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  19557. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  19558. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  19559. ssl->buffers.serverDH_P.length + OPAQUE16_LEN,
  19560. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  19561. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  19562. ERROR_OUT(MEMORY_E, exit_sske);
  19563. }
  19564. }
  19565. ssl->options.dhKeySz =
  19566. (word16)ssl->buffers.serverDH_P.length;
  19567. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  19568. (void**)&ssl->buffers.serverDH_Key);
  19569. if (ret != 0) {
  19570. goto exit_sske;
  19571. }
  19572. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  19573. !defined(HAVE_FIPS) && \
  19574. !defined(HAVE_SELFTEST)
  19575. if (ssl->options.dhDoKeyTest &&
  19576. !ssl->options.dhKeyTested)
  19577. {
  19578. ret = wc_DhSetCheckKey(
  19579. ssl->buffers.serverDH_Key,
  19580. ssl->buffers.serverDH_P.buffer,
  19581. ssl->buffers.serverDH_P.length,
  19582. ssl->buffers.serverDH_G.buffer,
  19583. ssl->buffers.serverDH_G.length,
  19584. NULL, 0, 0, ssl->rng);
  19585. if (ret != 0) {
  19586. goto exit_sske;
  19587. }
  19588. ssl->options.dhKeyTested = 1;
  19589. }
  19590. else
  19591. #endif
  19592. {
  19593. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  19594. ssl->buffers.serverDH_P.buffer,
  19595. ssl->buffers.serverDH_P.length,
  19596. ssl->buffers.serverDH_G.buffer,
  19597. ssl->buffers.serverDH_G.length);
  19598. if (ret != 0) {
  19599. goto exit_sske;
  19600. }
  19601. }
  19602. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  19603. ssl->buffers.serverDH_Priv.buffer,
  19604. (word32*)&ssl->buffers.serverDH_Priv.length,
  19605. ssl->buffers.serverDH_Pub.buffer,
  19606. (word32*)&ssl->buffers.serverDH_Pub.length);
  19607. break;
  19608. }
  19609. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  19610. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  19611. !defined(NO_PSK)
  19612. case ecdhe_psk_kea:
  19613. /* Fall through to create temp ECC key */
  19614. #endif /* (HAVE_ECC || CURVE25519) && !NO_PSK */
  19615. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  19616. case ecc_diffie_hellman_kea:
  19617. {
  19618. #ifdef HAVE_CURVE25519
  19619. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  19620. /* need ephemeral key now, create it if missing */
  19621. if (ssl->eccTempKey == NULL) {
  19622. /* alloc/init on demand */
  19623. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  19624. (void**)&ssl->eccTempKey);
  19625. if (ret != 0) {
  19626. goto exit_sske;
  19627. }
  19628. }
  19629. if (ssl->eccTempKeyPresent == 0) {
  19630. ret = X25519MakeKey(ssl,
  19631. (curve25519_key*)ssl->eccTempKey, NULL);
  19632. if (ret == 0 || ret == WC_PENDING_E) {
  19633. ssl->eccTempKeyPresent =
  19634. DYNAMIC_TYPE_CURVE25519;
  19635. }
  19636. }
  19637. break;
  19638. }
  19639. #endif
  19640. #ifdef HAVE_ECC
  19641. /* need ephemeral key now, create it if missing */
  19642. if (ssl->eccTempKey == NULL) {
  19643. /* alloc/init on demand */
  19644. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  19645. (void**)&ssl->eccTempKey);
  19646. if (ret != 0) {
  19647. goto exit_sske;
  19648. }
  19649. }
  19650. if (ssl->eccTempKeyPresent == 0) {
  19651. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  19652. if (ret == 0 || ret == WC_PENDING_E) {
  19653. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  19654. }
  19655. }
  19656. #endif
  19657. break;
  19658. }
  19659. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  19660. default:
  19661. /* Skip ServerKeyExchange */
  19662. goto exit_sske;
  19663. } /* switch(ssl->specs.kea) */
  19664. /* Check for error */
  19665. if (ret != 0) {
  19666. goto exit_sske;
  19667. }
  19668. /* Advance state and proceed */
  19669. ssl->options.asyncState = TLS_ASYNC_BUILD;
  19670. } /* case TLS_ASYNC_BEGIN */
  19671. FALL_THROUGH;
  19672. case TLS_ASYNC_BUILD:
  19673. {
  19674. #if (!defined(NO_DH) && !defined(NO_RSA)) || (defined(HAVE_ECC) || \
  19675. defined(HAVE_CURVE25519))
  19676. word32 preSigSz, preSigIdx;
  19677. #endif
  19678. switch(ssl->specs.kea)
  19679. {
  19680. #ifndef NO_PSK
  19681. case psk_kea:
  19682. {
  19683. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  19684. if (ssl->arrays->server_hint[0] == 0) {
  19685. ERROR_OUT(0, exit_sske); /* don't send */
  19686. }
  19687. /* include size part */
  19688. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  19689. if (args->length > MAX_PSK_ID_LEN) {
  19690. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  19691. }
  19692. args->length += HINT_LEN_SZ;
  19693. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  19694. RECORD_HEADER_SZ;
  19695. #ifdef HAVE_QSH
  19696. args->length += args->qshSz;
  19697. args->sendSz += args->qshSz;
  19698. #endif
  19699. #ifdef WOLFSSL_DTLS
  19700. if (ssl->options.dtls) {
  19701. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19702. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19703. }
  19704. #endif
  19705. if (IsEncryptionOn(ssl, 1)) {
  19706. args->sendSz += MAX_MSG_EXTRA;
  19707. }
  19708. /* check for available size */
  19709. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  19710. goto exit_sske;
  19711. }
  19712. /* get output buffer */
  19713. args->output = ssl->buffers.outputBuffer.buffer +
  19714. ssl->buffers.outputBuffer.length;
  19715. AddHeaders(args->output, args->length,
  19716. server_key_exchange, ssl);
  19717. /* key data */
  19718. #ifdef HAVE_QSH
  19719. c16toa((word16)(args->length - args->qshSz -
  19720. HINT_LEN_SZ), args->output + args->idx);
  19721. #else
  19722. c16toa((word16)(args->length - HINT_LEN_SZ),
  19723. args->output + args->idx);
  19724. #endif
  19725. args->idx += HINT_LEN_SZ;
  19726. XMEMCPY(args->output + args->idx,
  19727. ssl->arrays->server_hint,
  19728. args->length - HINT_LEN_SZ);
  19729. break;
  19730. }
  19731. #endif /* !NO_PSK */
  19732. #if !defined(NO_DH) && !defined(NO_PSK)
  19733. case dhe_psk_kea:
  19734. {
  19735. word32 hintLen;
  19736. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  19737. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  19738. ssl->buffers.serverDH_P.length +
  19739. ssl->buffers.serverDH_G.length +
  19740. ssl->buffers.serverDH_Pub.length;
  19741. /* include size part */
  19742. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  19743. if (hintLen > MAX_PSK_ID_LEN) {
  19744. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  19745. }
  19746. args->length += hintLen + HINT_LEN_SZ;
  19747. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  19748. RECORD_HEADER_SZ;
  19749. #ifdef HAVE_QSH
  19750. args->length += args->qshSz;
  19751. args->sendSz += args->qshSz;
  19752. #endif
  19753. #ifdef WOLFSSL_DTLS
  19754. if (ssl->options.dtls) {
  19755. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19756. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19757. }
  19758. #endif
  19759. if (IsEncryptionOn(ssl, 1)) {
  19760. args->sendSz += MAX_MSG_EXTRA;
  19761. }
  19762. /* check for available size */
  19763. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  19764. goto exit_sske;
  19765. }
  19766. /* get output buffer */
  19767. args->output = ssl->buffers.outputBuffer.buffer +
  19768. ssl->buffers.outputBuffer.length;
  19769. AddHeaders(args->output, args->length,
  19770. server_key_exchange, ssl);
  19771. /* key data */
  19772. c16toa((word16)hintLen, args->output + args->idx);
  19773. args->idx += HINT_LEN_SZ;
  19774. XMEMCPY(args->output + args->idx,
  19775. ssl->arrays->server_hint, hintLen);
  19776. args->idx += hintLen;
  19777. /* add p, g, pub */
  19778. c16toa((word16)ssl->buffers.serverDH_P.length,
  19779. args->output + args->idx);
  19780. args->idx += LENGTH_SZ;
  19781. XMEMCPY(args->output + args->idx,
  19782. ssl->buffers.serverDH_P.buffer,
  19783. ssl->buffers.serverDH_P.length);
  19784. args->idx += ssl->buffers.serverDH_P.length;
  19785. /* g */
  19786. c16toa((word16)ssl->buffers.serverDH_G.length,
  19787. args->output + args->idx);
  19788. args->idx += LENGTH_SZ;
  19789. XMEMCPY(args->output + args->idx,
  19790. ssl->buffers.serverDH_G.buffer,
  19791. ssl->buffers.serverDH_G.length);
  19792. args->idx += ssl->buffers.serverDH_G.length;
  19793. /* pub */
  19794. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  19795. args->output + args->idx);
  19796. args->idx += LENGTH_SZ;
  19797. XMEMCPY(args->output + args->idx,
  19798. ssl->buffers.serverDH_Pub.buffer,
  19799. ssl->buffers.serverDH_Pub.length);
  19800. /* No need to update idx, since sizes are already set */
  19801. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  19802. break;
  19803. }
  19804. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  19805. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  19806. !defined(NO_PSK)
  19807. case ecdhe_psk_kea:
  19808. {
  19809. word32 hintLen;
  19810. /* curve type, named curve, length(1) */
  19811. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  19812. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  19813. args->exportSz = MAX_EXPORT_ECC_SZ;
  19814. args->exportBuf = (byte*)XMALLOC(args->exportSz,
  19815. ssl->heap, DYNAMIC_TYPE_DER);
  19816. if (args->exportBuf == NULL) {
  19817. ERROR_OUT(MEMORY_E, exit_sske);
  19818. }
  19819. #ifdef HAVE_CURVE25519
  19820. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  19821. if (wc_curve25519_export_public_ex(
  19822. (curve25519_key*)ssl->eccTempKey,
  19823. args->exportBuf, &args->exportSz,
  19824. EC25519_LITTLE_ENDIAN) != 0) {
  19825. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  19826. }
  19827. }
  19828. else
  19829. #endif
  19830. {
  19831. if (wc_ecc_export_x963(ssl->eccTempKey,
  19832. args->exportBuf, &args->exportSz) != 0) {
  19833. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  19834. }
  19835. }
  19836. args->length += args->exportSz;
  19837. /* include size part */
  19838. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  19839. if (hintLen > MAX_PSK_ID_LEN) {
  19840. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  19841. }
  19842. args->length += hintLen + HINT_LEN_SZ;
  19843. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  19844. #ifdef HAVE_QSH
  19845. args->length += args->qshSz;
  19846. args->sendSz += args->qshSz;
  19847. #endif
  19848. #ifdef WOLFSSL_DTLS
  19849. if (ssl->options.dtls) {
  19850. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19851. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19852. }
  19853. #endif
  19854. if (IsEncryptionOn(ssl, 1)) {
  19855. args->sendSz += MAX_MSG_EXTRA;
  19856. }
  19857. /* check for available size */
  19858. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  19859. goto exit_sske;
  19860. }
  19861. /* get output buffer */
  19862. args->output = ssl->buffers.outputBuffer.buffer +
  19863. ssl->buffers.outputBuffer.length;
  19864. /* key data */
  19865. c16toa((word16)hintLen, args->output + args->idx);
  19866. args->idx += HINT_LEN_SZ;
  19867. XMEMCPY(args->output + args->idx,
  19868. ssl->arrays->server_hint, hintLen);
  19869. args->idx += hintLen;
  19870. /* ECC key exchange data */
  19871. args->output[args->idx++] = named_curve;
  19872. args->output[args->idx++] = 0x00; /* leading zero */
  19873. #ifdef HAVE_CURVE25519
  19874. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  19875. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  19876. else
  19877. #endif
  19878. {
  19879. #ifdef HAVE_ECC
  19880. args->output[args->idx++] =
  19881. SetCurveId(ssl->eccTempKey);
  19882. #endif
  19883. }
  19884. args->output[args->idx++] = (byte)args->exportSz;
  19885. XMEMCPY(args->output + args->idx, args->exportBuf,
  19886. args->exportSz);
  19887. break;
  19888. }
  19889. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  19890. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  19891. case ecc_diffie_hellman_kea:
  19892. {
  19893. enum wc_HashType hashType;
  19894. /* curve type, named curve, length(1) */
  19895. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  19896. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  19897. /* Export temp ECC key and add to length */
  19898. args->exportSz = MAX_EXPORT_ECC_SZ;
  19899. args->exportBuf = (byte*)XMALLOC(args->exportSz,
  19900. ssl->heap, DYNAMIC_TYPE_DER);
  19901. if (args->exportBuf == NULL) {
  19902. ERROR_OUT(MEMORY_E, exit_sske);
  19903. }
  19904. #ifdef HAVE_CURVE25519
  19905. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  19906. if (wc_curve25519_export_public_ex(
  19907. (curve25519_key*)ssl->eccTempKey,
  19908. args->exportBuf, &args->exportSz,
  19909. EC25519_LITTLE_ENDIAN) != 0) {
  19910. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  19911. }
  19912. }
  19913. else
  19914. #endif
  19915. {
  19916. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  19917. if (wc_ecc_export_x963(ssl->eccTempKey,
  19918. args->exportBuf, &args->exportSz) != 0) {
  19919. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  19920. }
  19921. #endif
  19922. }
  19923. args->length += args->exportSz;
  19924. preSigSz = args->length;
  19925. preSigIdx = args->idx;
  19926. if (ssl->buffers.key == NULL) {
  19927. #ifdef HAVE_PK_CALLBACKS
  19928. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  19929. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  19930. if (args->tmpSigSz <= 0) {
  19931. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  19932. }
  19933. }
  19934. else
  19935. #endif
  19936. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  19937. }
  19938. else {
  19939. switch(ssl->suites->sigAlgo) {
  19940. #ifndef NO_RSA
  19941. #ifdef WC_RSA_PSS
  19942. case rsa_pss_sa_algo:
  19943. #endif
  19944. case rsa_sa_algo:
  19945. {
  19946. word16 keySz;
  19947. ssl->buffers.keyType = rsa_sa_algo;
  19948. ret = DecodePrivateKey(ssl, &keySz);
  19949. if (ret != 0) {
  19950. goto exit_sske;
  19951. }
  19952. args->tmpSigSz = (word32)keySz;
  19953. break;
  19954. }
  19955. #endif /* !NO_RSA */
  19956. #ifdef HAVE_ECC
  19957. case ecc_dsa_sa_algo:
  19958. {
  19959. word16 keySz;
  19960. ssl->buffers.keyType = ecc_dsa_sa_algo;
  19961. ret = DecodePrivateKey(ssl, &keySz);
  19962. if (ret != 0) {
  19963. goto exit_sske;
  19964. }
  19965. /* worst case estimate */
  19966. args->tmpSigSz = keySz;
  19967. break;
  19968. }
  19969. #endif
  19970. #ifdef HAVE_ED25519
  19971. case ed25519_sa_algo:
  19972. {
  19973. word16 keySz;
  19974. ssl->buffers.keyType = ed25519_sa_algo;
  19975. ret = DecodePrivateKey(ssl, &keySz);
  19976. if (ret != 0) {
  19977. goto exit_sske;
  19978. }
  19979. /* worst case estimate */
  19980. args->tmpSigSz = ED25519_SIG_SIZE;
  19981. break;
  19982. }
  19983. #endif /* HAVE_ED25519 */
  19984. default:
  19985. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  19986. } /* switch(ssl->specs.sig_algo) */
  19987. }
  19988. /* sig length */
  19989. args->length += LENGTH_SZ;
  19990. args->length += args->tmpSigSz;
  19991. if (IsAtLeastTLSv1_2(ssl)) {
  19992. args->length += HASH_SIG_SIZE;
  19993. }
  19994. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  19995. #ifdef HAVE_QSH
  19996. args->length += args->qshSz;
  19997. args->sendSz += args->qshSz;
  19998. #endif
  19999. #ifdef WOLFSSL_DTLS
  20000. if (ssl->options.dtls) {
  20001. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  20002. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  20003. preSigIdx = args->idx;
  20004. }
  20005. #endif
  20006. if (IsEncryptionOn(ssl, 1)) {
  20007. args->sendSz += MAX_MSG_EXTRA;
  20008. }
  20009. /* check for available size */
  20010. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  20011. goto exit_sske;
  20012. }
  20013. /* get output buffer */
  20014. args->output = ssl->buffers.outputBuffer.buffer +
  20015. ssl->buffers.outputBuffer.length;
  20016. /* record and message headers will be added below, when we're sure
  20017. of the sig length */
  20018. /* key exchange data */
  20019. args->output[args->idx++] = named_curve;
  20020. args->output[args->idx++] = 0x00; /* leading zero */
  20021. #ifdef HAVE_CURVE25519
  20022. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  20023. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  20024. else
  20025. #endif
  20026. {
  20027. #ifdef HAVE_ECC
  20028. args->output[args->idx++] =
  20029. SetCurveId(ssl->eccTempKey);
  20030. #endif
  20031. }
  20032. args->output[args->idx++] = (byte)args->exportSz;
  20033. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  20034. args->idx += args->exportSz;
  20035. /* Determine hash type */
  20036. if (IsAtLeastTLSv1_2(ssl)) {
  20037. EncodeSigAlg(ssl->suites->hashAlgo,
  20038. ssl->suites->sigAlgo,
  20039. &args->output[args->idx]);
  20040. args->idx += 2;
  20041. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  20042. if (hashType == WC_HASH_TYPE_NONE) {
  20043. ERROR_OUT(ALGO_ID_E, exit_sske);
  20044. }
  20045. } else {
  20046. /* only using sha and md5 for rsa */
  20047. #ifndef NO_OLD_TLS
  20048. hashType = WC_HASH_TYPE_SHA;
  20049. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  20050. hashType = WC_HASH_TYPE_MD5_SHA;
  20051. }
  20052. #else
  20053. ERROR_OUT(ALGO_ID_E, exit_sske);
  20054. #endif
  20055. }
  20056. /* Signature length will be written later, when we're sure what it is */
  20057. #ifdef HAVE_FUZZER
  20058. if (ssl->fuzzerCb) {
  20059. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  20060. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  20061. }
  20062. #endif
  20063. /* Assemble buffer to hash for signature */
  20064. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  20065. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  20066. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20067. if (args->sigDataBuf == NULL) {
  20068. ERROR_OUT(MEMORY_E, exit_sske);
  20069. }
  20070. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  20071. RAN_LEN);
  20072. XMEMCPY(args->sigDataBuf+RAN_LEN,
  20073. ssl->arrays->serverRandom, RAN_LEN);
  20074. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  20075. args->output + preSigIdx, preSigSz);
  20076. if (ssl->suites->sigAlgo != ed25519_sa_algo) {
  20077. ssl->buffers.sig.length =
  20078. wc_HashGetDigestSize(hashType);
  20079. if ((int)ssl->buffers.sig.length < 0) {
  20080. ERROR_OUT(HASH_TYPE_E, exit_sske);
  20081. }
  20082. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  20083. ssl->buffers.sig.length,
  20084. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20085. if (ssl->buffers.sig.buffer == NULL) {
  20086. ERROR_OUT(MEMORY_E, exit_sske);
  20087. }
  20088. /* Perform hash */
  20089. ret = wc_Hash(hashType, args->sigDataBuf,
  20090. args->sigDataSz,
  20091. ssl->buffers.sig.buffer,
  20092. ssl->buffers.sig.length);
  20093. if (ret != 0) {
  20094. goto exit_sske;
  20095. }
  20096. }
  20097. args->sigSz = args->tmpSigSz;
  20098. /* Sign hash to create signature */
  20099. switch (ssl->suites->sigAlgo)
  20100. {
  20101. #ifndef NO_RSA
  20102. case rsa_sa_algo:
  20103. {
  20104. /* For TLS 1.2 re-encode signature */
  20105. if (IsAtLeastTLSv1_2(ssl)) {
  20106. byte* encodedSig = (byte*)XMALLOC(
  20107. MAX_ENCODED_SIG_SZ, ssl->heap,
  20108. DYNAMIC_TYPE_SIGNATURE);
  20109. if (encodedSig == NULL) {
  20110. ERROR_OUT(MEMORY_E, exit_sske);
  20111. }
  20112. ssl->buffers.sig.length =
  20113. wc_EncodeSignature(encodedSig,
  20114. ssl->buffers.sig.buffer,
  20115. ssl->buffers.sig.length,
  20116. TypeHash(ssl->suites->hashAlgo));
  20117. /* Replace sig buffer with new one */
  20118. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  20119. DYNAMIC_TYPE_SIGNATURE);
  20120. ssl->buffers.sig.buffer = encodedSig;
  20121. }
  20122. /* write sig size here */
  20123. c16toa((word16)args->sigSz,
  20124. args->output + args->idx);
  20125. args->idx += LENGTH_SZ;
  20126. break;
  20127. }
  20128. #ifdef WC_RSA_PSS
  20129. case rsa_pss_sa_algo:
  20130. /* write sig size here */
  20131. c16toa((word16)args->sigSz,
  20132. args->output + args->idx);
  20133. args->idx += LENGTH_SZ;
  20134. break;
  20135. #endif
  20136. #endif /* !NO_RSA */
  20137. case ecc_dsa_sa_algo:
  20138. {
  20139. break;
  20140. }
  20141. #ifdef HAVE_ED25519
  20142. case ed25519_sa_algo:
  20143. ret = Ed25519CheckPubKey(ssl);
  20144. if (ret != 0)
  20145. goto exit_sske;
  20146. break;
  20147. #endif /* HAVE_ED25519 */
  20148. } /* switch(ssl->specs.sig_algo) */
  20149. break;
  20150. }
  20151. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  20152. #if !defined(NO_DH) && !defined(NO_RSA)
  20153. case diffie_hellman_kea:
  20154. {
  20155. enum wc_HashType hashType;
  20156. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  20157. args->length = LENGTH_SZ * 3; /* p, g, pub */
  20158. args->length += ssl->buffers.serverDH_P.length +
  20159. ssl->buffers.serverDH_G.length +
  20160. ssl->buffers.serverDH_Pub.length;
  20161. preSigIdx = args->idx;
  20162. preSigSz = args->length;
  20163. if (!ssl->options.usingAnon_cipher) {
  20164. word16 keySz;
  20165. /* sig length */
  20166. args->length += LENGTH_SZ;
  20167. if (ssl->buffers.key == NULL) {
  20168. #ifdef HAVE_PK_CALLBACKS
  20169. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  20170. keySz = (word32)GetPrivateKeySigSize(ssl);
  20171. else
  20172. #endif
  20173. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  20174. }
  20175. else
  20176. {
  20177. if (ssl->buffers.keyType == 0)
  20178. ssl->buffers.keyType = rsa_sa_algo;
  20179. ret = DecodePrivateKey(ssl, &keySz);
  20180. if (ret != 0) {
  20181. goto exit_sske;
  20182. }
  20183. }
  20184. if (keySz <= 0) { /* test if keySz has error */
  20185. ERROR_OUT(keySz, exit_sske);
  20186. }
  20187. args->tmpSigSz = (word32)keySz;
  20188. args->length += args->tmpSigSz;
  20189. if (IsAtLeastTLSv1_2(ssl)) {
  20190. args->length += HASH_SIG_SIZE;
  20191. }
  20192. }
  20193. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  20194. RECORD_HEADER_SZ;
  20195. #ifdef HAVE_QSH
  20196. args->length += args->qshSz;
  20197. args->sendSz += args->qshSz;
  20198. #endif
  20199. #ifdef WOLFSSL_DTLS
  20200. if (ssl->options.dtls) {
  20201. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  20202. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  20203. preSigIdx = args->idx;
  20204. }
  20205. #endif
  20206. if (IsEncryptionOn(ssl, 1)) {
  20207. args->sendSz += MAX_MSG_EXTRA;
  20208. }
  20209. /* check for available size */
  20210. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  20211. goto exit_sske;
  20212. }
  20213. /* get output buffer */
  20214. args->output = ssl->buffers.outputBuffer.buffer +
  20215. ssl->buffers.outputBuffer.length;
  20216. AddHeaders(args->output, args->length,
  20217. server_key_exchange, ssl);
  20218. /* add p, g, pub */
  20219. c16toa((word16)ssl->buffers.serverDH_P.length,
  20220. args->output + args->idx);
  20221. args->idx += LENGTH_SZ;
  20222. XMEMCPY(args->output + args->idx,
  20223. ssl->buffers.serverDH_P.buffer,
  20224. ssl->buffers.serverDH_P.length);
  20225. args->idx += ssl->buffers.serverDH_P.length;
  20226. /* g */
  20227. c16toa((word16)ssl->buffers.serverDH_G.length,
  20228. args->output + args->idx);
  20229. args->idx += LENGTH_SZ;
  20230. XMEMCPY(args->output + args->idx,
  20231. ssl->buffers.serverDH_G.buffer,
  20232. ssl->buffers.serverDH_G.length);
  20233. args->idx += ssl->buffers.serverDH_G.length;
  20234. /* pub */
  20235. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  20236. args->output + args->idx);
  20237. args->idx += LENGTH_SZ;
  20238. XMEMCPY(args->output + args->idx,
  20239. ssl->buffers.serverDH_Pub.buffer,
  20240. ssl->buffers.serverDH_Pub.length);
  20241. args->idx += ssl->buffers.serverDH_Pub.length;
  20242. #ifdef HAVE_FUZZER
  20243. if (ssl->fuzzerCb) {
  20244. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  20245. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  20246. }
  20247. #endif
  20248. if (ssl->options.usingAnon_cipher) {
  20249. break;
  20250. }
  20251. /* Determine hash type */
  20252. if (IsAtLeastTLSv1_2(ssl)) {
  20253. EncodeSigAlg(ssl->suites->hashAlgo,
  20254. ssl->suites->sigAlgo,
  20255. &args->output[args->idx]);
  20256. args->idx += 2;
  20257. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  20258. if (hashType == WC_HASH_TYPE_NONE) {
  20259. ERROR_OUT(ALGO_ID_E, exit_sske);
  20260. }
  20261. } else {
  20262. /* only using sha and md5 for rsa */
  20263. #ifndef NO_OLD_TLS
  20264. hashType = WC_HASH_TYPE_SHA;
  20265. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  20266. hashType = WC_HASH_TYPE_MD5_SHA;
  20267. }
  20268. #else
  20269. ERROR_OUT(ALGO_ID_E, exit_sske);
  20270. #endif
  20271. }
  20272. /* signature size */
  20273. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  20274. args->idx += LENGTH_SZ;
  20275. /* Assemble buffer to hash for signature */
  20276. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  20277. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  20278. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20279. if (args->sigDataBuf == NULL) {
  20280. ERROR_OUT(MEMORY_E, exit_sske);
  20281. }
  20282. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  20283. RAN_LEN);
  20284. XMEMCPY(args->sigDataBuf+RAN_LEN,
  20285. ssl->arrays->serverRandom, RAN_LEN);
  20286. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  20287. args->output + preSigIdx, preSigSz);
  20288. if (ssl->suites->sigAlgo != ed25519_sa_algo) {
  20289. ssl->buffers.sig.length =
  20290. wc_HashGetDigestSize(hashType);
  20291. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  20292. ssl->buffers.sig.length, ssl->heap,
  20293. DYNAMIC_TYPE_SIGNATURE);
  20294. if (ssl->buffers.sig.buffer == NULL) {
  20295. ERROR_OUT(MEMORY_E, exit_sske);
  20296. }
  20297. /* Perform hash */
  20298. ret = wc_Hash(hashType, args->sigDataBuf,
  20299. args->sigDataSz,
  20300. ssl->buffers.sig.buffer,
  20301. ssl->buffers.sig.length);
  20302. if (ret != 0) {
  20303. goto exit_sske;
  20304. }
  20305. }
  20306. args->sigSz = args->tmpSigSz;
  20307. /* Sign hash to create signature */
  20308. switch (ssl->suites->sigAlgo)
  20309. {
  20310. #ifndef NO_RSA
  20311. case rsa_sa_algo:
  20312. {
  20313. /* For TLS 1.2 re-encode signature */
  20314. if (IsAtLeastTLSv1_2(ssl)) {
  20315. byte* encodedSig = (byte*)XMALLOC(
  20316. MAX_ENCODED_SIG_SZ, ssl->heap,
  20317. DYNAMIC_TYPE_SIGNATURE);
  20318. if (encodedSig == NULL) {
  20319. ERROR_OUT(MEMORY_E, exit_sske);
  20320. }
  20321. ssl->buffers.sig.length =
  20322. wc_EncodeSignature(encodedSig,
  20323. ssl->buffers.sig.buffer,
  20324. ssl->buffers.sig.length,
  20325. TypeHash(ssl->suites->hashAlgo));
  20326. /* Replace sig buffer with new one */
  20327. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  20328. DYNAMIC_TYPE_SIGNATURE);
  20329. ssl->buffers.sig.buffer = encodedSig;
  20330. }
  20331. break;
  20332. }
  20333. #endif /* NO_RSA */
  20334. } /* switch (ssl->suites->sigAlgo) */
  20335. break;
  20336. }
  20337. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  20338. } /* switch(ssl->specs.kea) */
  20339. /* Check for error */
  20340. if (ret != 0) {
  20341. goto exit_sske;
  20342. }
  20343. /* Advance state and proceed */
  20344. ssl->options.asyncState = TLS_ASYNC_DO;
  20345. } /* case TLS_ASYNC_BUILD */
  20346. FALL_THROUGH;
  20347. case TLS_ASYNC_DO:
  20348. {
  20349. switch(ssl->specs.kea)
  20350. {
  20351. #ifndef NO_PSK
  20352. case psk_kea:
  20353. {
  20354. break;
  20355. }
  20356. #endif /* !NO_PSK */
  20357. #if !defined(NO_DH) && !defined(NO_PSK)
  20358. case dhe_psk_kea:
  20359. {
  20360. break;
  20361. }
  20362. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  20363. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  20364. !defined(NO_PSK)
  20365. case ecdhe_psk_kea:
  20366. {
  20367. break;
  20368. }
  20369. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  20370. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  20371. case ecc_diffie_hellman_kea:
  20372. {
  20373. /* Sign hash to create signature */
  20374. switch (ssl->suites->sigAlgo)
  20375. {
  20376. #ifndef NO_RSA
  20377. #ifdef WC_RSA_PSS
  20378. case rsa_pss_sa_algo:
  20379. #endif
  20380. case rsa_sa_algo:
  20381. {
  20382. RsaKey* key = (RsaKey*)ssl->hsKey;
  20383. ret = RsaSign(ssl,
  20384. ssl->buffers.sig.buffer,
  20385. ssl->buffers.sig.length,
  20386. args->output + args->idx,
  20387. &args->sigSz,
  20388. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  20389. key,
  20390. ssl->buffers.key
  20391. );
  20392. break;
  20393. }
  20394. #endif /* !NO_RSA */
  20395. #ifdef HAVE_ECC
  20396. case ecc_dsa_sa_algo:
  20397. {
  20398. ecc_key* key = (ecc_key*)ssl->hsKey;
  20399. ret = EccSign(ssl,
  20400. ssl->buffers.sig.buffer,
  20401. ssl->buffers.sig.length,
  20402. args->output + LENGTH_SZ + args->idx,
  20403. &args->sigSz,
  20404. key,
  20405. #ifdef HAVE_PK_CALLBACKS
  20406. ssl->buffers.key
  20407. #else
  20408. NULL
  20409. #endif
  20410. );
  20411. break;
  20412. }
  20413. #endif /* HAVE_ECC */
  20414. #ifdef HAVE_ED25519
  20415. case ed25519_sa_algo:
  20416. {
  20417. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  20418. ret = Ed25519Sign(ssl,
  20419. args->sigDataBuf, args->sigDataSz,
  20420. args->output + LENGTH_SZ + args->idx,
  20421. &args->sigSz,
  20422. key,
  20423. #ifdef HAVE_PK_CALLBACKS
  20424. ssl->buffers.key
  20425. #else
  20426. NULL
  20427. #endif
  20428. );
  20429. break;
  20430. }
  20431. #endif
  20432. } /* switch(ssl->specs.sig_algo) */
  20433. break;
  20434. }
  20435. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  20436. #if !defined(NO_DH) && !defined(NO_RSA)
  20437. case diffie_hellman_kea:
  20438. {
  20439. /* Sign hash to create signature */
  20440. switch (ssl->suites->sigAlgo)
  20441. {
  20442. #ifndef NO_RSA
  20443. #ifdef WC_RSA_PSS
  20444. case rsa_pss_sa_algo:
  20445. #endif
  20446. case rsa_sa_algo:
  20447. {
  20448. RsaKey* key = (RsaKey*)ssl->hsKey;
  20449. if (ssl->options.usingAnon_cipher) {
  20450. break;
  20451. }
  20452. ret = RsaSign(ssl,
  20453. ssl->buffers.sig.buffer,
  20454. ssl->buffers.sig.length,
  20455. args->output + args->idx,
  20456. &args->sigSz,
  20457. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  20458. key,
  20459. ssl->buffers.key
  20460. );
  20461. break;
  20462. }
  20463. #endif /* NO_RSA */
  20464. } /* switch (ssl->suites->sigAlgo) */
  20465. break;
  20466. }
  20467. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  20468. } /* switch(ssl->specs.kea) */
  20469. /* Check for error */
  20470. if (ret != 0) {
  20471. goto exit_sske;
  20472. }
  20473. /* Advance state and proceed */
  20474. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  20475. } /* case TLS_ASYNC_DO */
  20476. FALL_THROUGH;
  20477. case TLS_ASYNC_VERIFY:
  20478. {
  20479. switch(ssl->specs.kea)
  20480. {
  20481. #ifndef NO_PSK
  20482. case psk_kea:
  20483. {
  20484. /* Nothing to do in this sub-state */
  20485. break;
  20486. }
  20487. #endif /* !NO_PSK */
  20488. #if !defined(NO_DH) && !defined(NO_PSK)
  20489. case dhe_psk_kea:
  20490. {
  20491. /* Nothing to do in this sub-state */
  20492. break;
  20493. }
  20494. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  20495. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  20496. !defined(NO_PSK)
  20497. case ecdhe_psk_kea:
  20498. {
  20499. /* Nothing to do in this sub-state */
  20500. break;
  20501. }
  20502. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  20503. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  20504. case ecc_diffie_hellman_kea:
  20505. {
  20506. switch(ssl->suites->sigAlgo)
  20507. {
  20508. #ifndef NO_RSA
  20509. #ifdef WC_RSA_PSS
  20510. case rsa_pss_sa_algo:
  20511. #endif
  20512. case rsa_sa_algo:
  20513. {
  20514. RsaKey* key = (RsaKey*)ssl->hsKey;
  20515. if (args->verifySig == NULL) {
  20516. if (args->sigSz == 0) {
  20517. ERROR_OUT(BAD_COND_E, exit_sske);
  20518. }
  20519. args->verifySig = (byte*)XMALLOC(
  20520. args->sigSz, ssl->heap,
  20521. DYNAMIC_TYPE_SIGNATURE);
  20522. if (!args->verifySig) {
  20523. ERROR_OUT(MEMORY_E, exit_sske);
  20524. }
  20525. XMEMCPY(args->verifySig,
  20526. args->output + args->idx, args->sigSz);
  20527. }
  20528. /* check for signature faults */
  20529. ret = VerifyRsaSign(ssl,
  20530. args->verifySig, args->sigSz,
  20531. ssl->buffers.sig.buffer,
  20532. ssl->buffers.sig.length,
  20533. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  20534. key, ssl->buffers.key
  20535. );
  20536. break;
  20537. }
  20538. #endif
  20539. case ecc_dsa_sa_algo:
  20540. #ifdef HAVE_ED25519
  20541. case ed25519_sa_algo:
  20542. #endif
  20543. {
  20544. /* Now that we know the real sig size, write it. */
  20545. c16toa((word16)args->sigSz,
  20546. args->output + args->idx);
  20547. /* And adjust length and sendSz from estimates */
  20548. args->length += args->sigSz - args->tmpSigSz;
  20549. args->sendSz += args->sigSz - args->tmpSigSz;
  20550. break;
  20551. }
  20552. default:
  20553. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  20554. } /* switch(ssl->specs.sig_algo) */
  20555. break;
  20556. }
  20557. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  20558. #if !defined(NO_DH) && !defined(NO_RSA)
  20559. case diffie_hellman_kea:
  20560. {
  20561. switch (ssl->suites->sigAlgo)
  20562. {
  20563. #ifndef NO_RSA
  20564. #ifndef WC_RSA_PSS
  20565. case rsa_pss_sa_algo:
  20566. #endif
  20567. case rsa_sa_algo:
  20568. {
  20569. RsaKey* key = (RsaKey*)ssl->hsKey;
  20570. if (ssl->options.usingAnon_cipher) {
  20571. break;
  20572. }
  20573. if (args->verifySig == NULL) {
  20574. if (args->sigSz == 0) {
  20575. ERROR_OUT(BAD_COND_E, exit_sske);
  20576. }
  20577. args->verifySig = (byte*)XMALLOC(
  20578. args->sigSz, ssl->heap,
  20579. DYNAMIC_TYPE_SIGNATURE);
  20580. if (!args->verifySig) {
  20581. ERROR_OUT(MEMORY_E, exit_sske);
  20582. }
  20583. XMEMCPY(args->verifySig,
  20584. args->output + args->idx, args->sigSz);
  20585. }
  20586. /* check for signature faults */
  20587. ret = VerifyRsaSign(ssl,
  20588. args->verifySig, args->sigSz,
  20589. ssl->buffers.sig.buffer,
  20590. ssl->buffers.sig.length,
  20591. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  20592. key, ssl->buffers.key
  20593. );
  20594. break;
  20595. }
  20596. #endif
  20597. } /* switch (ssl->suites->sigAlgo) */
  20598. break;
  20599. }
  20600. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  20601. } /* switch(ssl->specs.kea) */
  20602. /* Check for error */
  20603. if (ret != 0) {
  20604. goto exit_sske;
  20605. }
  20606. /* Advance state and proceed */
  20607. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  20608. } /* case TLS_ASYNC_VERIFY */
  20609. FALL_THROUGH;
  20610. case TLS_ASYNC_FINALIZE:
  20611. {
  20612. #ifdef HAVE_QSH
  20613. if (ssl->peerQSHKeyPresent) {
  20614. if (args->qshSz > 0) {
  20615. args->idx = args->sendSz - args->qshSz;
  20616. if (QSH_KeyExchangeWrite(ssl, 1) != 0) {
  20617. ERROR_OUT(MEMORY_E, exit_sske);
  20618. }
  20619. /* extension type */
  20620. c16toa(TLSX_QUANTUM_SAFE_HYBRID,
  20621. args->output + args->idx);
  20622. args->idx += OPAQUE16_LEN;
  20623. /* write to output and check amount written */
  20624. if (TLSX_QSHPK_Write(ssl->QSH_secret->list,
  20625. args->output + args->idx) >
  20626. args->qshSz - OPAQUE16_LEN) {
  20627. ERROR_OUT(MEMORY_E, exit_sske);
  20628. }
  20629. }
  20630. }
  20631. #endif
  20632. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  20633. if (ssl->specs.kea == ecdhe_psk_kea ||
  20634. ssl->specs.kea == ecc_diffie_hellman_kea) {
  20635. /* Check output to make sure it was set */
  20636. if (args->output) {
  20637. AddHeaders(args->output, args->length,
  20638. server_key_exchange, ssl);
  20639. }
  20640. else {
  20641. ERROR_OUT(BUFFER_ERROR, exit_sske);
  20642. }
  20643. }
  20644. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  20645. if (IsEncryptionOn(ssl, 1)) {
  20646. args->inputSz = args->length + HANDSHAKE_HEADER_SZ;
  20647. /* buildmsg adds rechdr */
  20648. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  20649. DYNAMIC_TYPE_IN_BUFFER);
  20650. if (args->input == NULL) {
  20651. ERROR_OUT(MEMORY_E, exit_sske);
  20652. }
  20653. XMEMCPY(args->input, args->output + RECORD_HEADER_SZ,
  20654. args->inputSz);
  20655. ret = BuildMessage(ssl, args->output, args->sendSz,
  20656. args->input, args->inputSz, handshake, 1, 0, 0);
  20657. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20658. args->input = NULL;
  20659. /* make sure its not double free'd on cleanup */
  20660. if (ret >= 0) {
  20661. args->sendSz = ret;
  20662. ret = 0;
  20663. }
  20664. }
  20665. else {
  20666. #ifdef WOLFSSL_DTLS
  20667. if (IsDtlsNotSctpMode(ssl)) {
  20668. if ((ret = DtlsMsgPoolSave(ssl,
  20669. args->output, args->sendSz)) != 0) {
  20670. goto exit_sske;
  20671. }
  20672. }
  20673. if (ssl->options.dtls)
  20674. DtlsSEQIncrement(ssl, CUR_ORDER);
  20675. #endif
  20676. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  20677. if (ret != 0) {
  20678. goto exit_sske;
  20679. }
  20680. }
  20681. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20682. if (ssl->hsInfoOn) {
  20683. AddPacketName(ssl, "ServerKeyExchange");
  20684. }
  20685. if (ssl->toInfoOn) {
  20686. AddPacketInfo(ssl, "ServerKeyExchange", handshake,
  20687. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  20688. }
  20689. #endif
  20690. /* Advance state and proceed */
  20691. ssl->options.asyncState = TLS_ASYNC_END;
  20692. } /* case TLS_ASYNC_FINALIZE */
  20693. FALL_THROUGH;
  20694. case TLS_ASYNC_END:
  20695. {
  20696. ssl->buffers.outputBuffer.length += args->sendSz;
  20697. if (!ssl->options.groupMessages) {
  20698. ret = SendBuffered(ssl);
  20699. }
  20700. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  20701. break;
  20702. }
  20703. default:
  20704. ret = INPUT_CASE_ERROR;
  20705. } /* switch(ssl->options.asyncState) */
  20706. exit_sske:
  20707. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  20708. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  20709. #ifdef WOLFSSL_ASYNC_CRYPT
  20710. /* Handle async operation */
  20711. if (ret == WC_PENDING_E)
  20712. return ret;
  20713. #endif /* WOLFSSL_ASYNC_CRYPT */
  20714. /* Final cleanup */
  20715. FreeSskeArgs(ssl, args);
  20716. FreeKeyExchange(ssl);
  20717. return ret;
  20718. }
  20719. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  20720. defined(OPENSSL_ALL)
  20721. /* search suites for specific one, idx on success, negative on error */
  20722. #ifndef WOLFSSL_TLS13
  20723. static
  20724. #endif
  20725. int FindSuite(Suites* suites, byte first, byte second)
  20726. {
  20727. int i;
  20728. if (suites == NULL || suites->suiteSz == 0) {
  20729. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  20730. return SUITES_ERROR;
  20731. }
  20732. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  20733. if (suites->suites[i] == first &&
  20734. suites->suites[i+1] == second )
  20735. return i;
  20736. }
  20737. return MATCH_SUITE_ERROR;
  20738. }
  20739. #endif
  20740. #endif /* !WOLFSSL_NO_TLS12 */
  20741. /* Make sure server cert/key are valid for this suite, true on success */
  20742. static int VerifyServerSuite(WOLFSSL* ssl, word16 idx)
  20743. {
  20744. int haveRSA = !ssl->options.haveStaticECC;
  20745. int havePSK = 0;
  20746. byte first;
  20747. byte second;
  20748. WOLFSSL_ENTER("VerifyServerSuite");
  20749. if (ssl->suites == NULL) {
  20750. WOLFSSL_MSG("Suites pointer error");
  20751. return 0;
  20752. }
  20753. first = ssl->suites->suites[idx];
  20754. second = ssl->suites->suites[idx+1];
  20755. #ifndef NO_PSK
  20756. havePSK = ssl->options.havePSK;
  20757. #endif
  20758. if (ssl->options.haveNTRU)
  20759. haveRSA = 0;
  20760. if (CipherRequires(first, second, REQUIRES_RSA)) {
  20761. WOLFSSL_MSG("Requires RSA");
  20762. if (haveRSA == 0) {
  20763. WOLFSSL_MSG("Don't have RSA");
  20764. return 0;
  20765. }
  20766. }
  20767. if (CipherRequires(first, second, REQUIRES_DHE)) {
  20768. WOLFSSL_MSG("Requires DHE");
  20769. if (ssl->options.haveDH == 0) {
  20770. WOLFSSL_MSG("Don't have DHE");
  20771. return 0;
  20772. }
  20773. }
  20774. if (CipherRequires(first, second, REQUIRES_ECC)) {
  20775. WOLFSSL_MSG("Requires ECC");
  20776. if (ssl->options.haveECC == 0) {
  20777. WOLFSSL_MSG("Don't have ECC");
  20778. return 0;
  20779. }
  20780. }
  20781. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  20782. WOLFSSL_MSG("Requires static ECC");
  20783. if (ssl->options.haveStaticECC == 0) {
  20784. WOLFSSL_MSG("Don't have static ECC");
  20785. return 0;
  20786. }
  20787. }
  20788. if (CipherRequires(first, second, REQUIRES_PSK)) {
  20789. WOLFSSL_MSG("Requires PSK");
  20790. if (havePSK == 0) {
  20791. WOLFSSL_MSG("Don't have PSK");
  20792. return 0;
  20793. }
  20794. }
  20795. if (CipherRequires(first, second, REQUIRES_NTRU)) {
  20796. WOLFSSL_MSG("Requires NTRU");
  20797. if (ssl->options.haveNTRU == 0) {
  20798. WOLFSSL_MSG("Don't have NTRU");
  20799. return 0;
  20800. }
  20801. }
  20802. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  20803. WOLFSSL_MSG("Requires RSA Signature");
  20804. if (ssl->options.side == WOLFSSL_SERVER_END &&
  20805. ssl->options.haveECDSAsig == 1) {
  20806. WOLFSSL_MSG("Don't have RSA Signature");
  20807. return 0;
  20808. }
  20809. }
  20810. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  20811. defined(HAVE_SUPPORTED_CURVES)
  20812. if (!TLSX_ValidateSupportedCurves(ssl, first, second)) {
  20813. WOLFSSL_MSG("Don't have matching curves");
  20814. return 0;
  20815. }
  20816. #endif
  20817. /* ECCDHE is always supported if ECC on */
  20818. #ifdef HAVE_QSH
  20819. /* need to negotiate a classic suite in addition to TLS_QSH */
  20820. if (first == QSH_BYTE && second == TLS_QSH) {
  20821. if (TLSX_SupportExtensions(ssl)) {
  20822. ssl->options.haveQSH = 1; /* matched TLS_QSH */
  20823. }
  20824. else {
  20825. WOLFSSL_MSG("Version of SSL connection does not support "
  20826. "TLS_QSH");
  20827. }
  20828. return 0;
  20829. }
  20830. #endif
  20831. #ifdef WOLFSSL_TLS13
  20832. if (IsAtLeastTLSv1_3(ssl->version) &&
  20833. ssl->options.side == WOLFSSL_SERVER_END) {
  20834. /* Try to establish a key share. */
  20835. int ret = TLSX_KeyShare_Establish(ssl);
  20836. if (ret == KEY_SHARE_ERROR)
  20837. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  20838. else if (ret != 0)
  20839. return 0;
  20840. }
  20841. else if (first == TLS13_BYTE) {
  20842. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  20843. * version. */
  20844. return 0;
  20845. }
  20846. #endif
  20847. return 1;
  20848. }
  20849. #ifndef NO_WOLFSSL_SERVER
  20850. static int CompareSuites(WOLFSSL* ssl, Suites* peerSuites, word16 i,
  20851. word16 j)
  20852. {
  20853. if (ssl->suites->suites[i] == peerSuites->suites[j] &&
  20854. ssl->suites->suites[i+1] == peerSuites->suites[j+1] ) {
  20855. if (VerifyServerSuite(ssl, i)) {
  20856. int result;
  20857. WOLFSSL_MSG("Verified suite validity");
  20858. ssl->options.cipherSuite0 = ssl->suites->suites[i];
  20859. ssl->options.cipherSuite = ssl->suites->suites[i+1];
  20860. result = SetCipherSpecs(ssl);
  20861. if (result == 0) {
  20862. result = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  20863. peerSuites->hashSigAlgoSz);
  20864. }
  20865. return result;
  20866. }
  20867. else {
  20868. WOLFSSL_MSG("Could not verify suite validity, continue");
  20869. }
  20870. }
  20871. return MATCH_SUITE_ERROR;
  20872. }
  20873. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  20874. {
  20875. int ret;
  20876. word16 i, j;
  20877. WOLFSSL_ENTER("MatchSuite");
  20878. /* & 0x1 equivalent % 2 */
  20879. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  20880. return BUFFER_ERROR;
  20881. if (ssl->suites == NULL)
  20882. return SUITES_ERROR;
  20883. if (!ssl->options.useClientOrder) {
  20884. /* Server order */
  20885. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  20886. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  20887. ret = CompareSuites(ssl, peerSuites, i, j);
  20888. if (ret != MATCH_SUITE_ERROR)
  20889. return ret;
  20890. }
  20891. }
  20892. }
  20893. else {
  20894. /* Client order */
  20895. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  20896. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  20897. ret = CompareSuites(ssl, peerSuites, i, j);
  20898. if (ret != MATCH_SUITE_ERROR)
  20899. return ret;
  20900. }
  20901. }
  20902. }
  20903. return MATCH_SUITE_ERROR;
  20904. }
  20905. #endif
  20906. #ifdef OLD_HELLO_ALLOWED
  20907. /* process old style client hello, deprecate? */
  20908. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  20909. word32 inSz, word16 sz)
  20910. {
  20911. word32 idx = *inOutIdx;
  20912. word16 sessionSz;
  20913. word16 randomSz;
  20914. word16 i, j;
  20915. ProtocolVersion pv;
  20916. Suites clSuites;
  20917. int ret = -1;
  20918. (void)inSz;
  20919. WOLFSSL_MSG("Got old format client hello");
  20920. #ifdef WOLFSSL_CALLBACKS
  20921. if (ssl->hsInfoOn)
  20922. AddPacketName(ssl, "ClientHello");
  20923. if (ssl->toInfoOn)
  20924. AddLateName("ClientHello", &ssl->timeoutInfo);
  20925. #endif
  20926. /* manually hash input since different format */
  20927. #ifndef NO_OLD_TLS
  20928. #ifndef NO_MD5
  20929. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  20930. #endif
  20931. #ifndef NO_SHA
  20932. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  20933. #endif
  20934. #endif
  20935. #ifndef NO_SHA256
  20936. if (IsAtLeastTLSv1_2(ssl)) {
  20937. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  20938. input + idx, sz);
  20939. if (shaRet != 0)
  20940. return shaRet;
  20941. }
  20942. #endif
  20943. /* does this value mean client_hello? */
  20944. idx++;
  20945. /* version */
  20946. pv.major = input[idx++];
  20947. pv.minor = input[idx++];
  20948. ssl->chVersion = pv; /* store */
  20949. if (ssl->version.minor > pv.minor) {
  20950. byte haveRSA = 0;
  20951. byte havePSK = 0;
  20952. int keySz = 0;
  20953. if (!ssl->options.downgrade) {
  20954. WOLFSSL_MSG("Client trying to connect with lesser version");
  20955. return VERSION_ERROR;
  20956. }
  20957. if (pv.minor < ssl->options.minDowngrade) {
  20958. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  20959. return VERSION_ERROR;
  20960. }
  20961. if (pv.minor == SSLv3_MINOR) {
  20962. /* turn off tls */
  20963. WOLFSSL_MSG("\tdowngrading to SSLv3");
  20964. ssl->options.tls = 0;
  20965. ssl->options.tls1_1 = 0;
  20966. ssl->version.minor = SSLv3_MINOR;
  20967. }
  20968. else if (pv.minor == TLSv1_MINOR) {
  20969. WOLFSSL_MSG("\tdowngrading to TLSv1");
  20970. /* turn off tls 1.1+ */
  20971. ssl->options.tls1_1 = 0;
  20972. ssl->version.minor = TLSv1_MINOR;
  20973. }
  20974. else if (pv.minor == TLSv1_1_MINOR) {
  20975. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  20976. ssl->version.minor = TLSv1_1_MINOR;
  20977. }
  20978. else if (pv.minor == TLSv1_2_MINOR) {
  20979. WOLFSSL_MSG(" downgrading to TLSv1.2");
  20980. ssl->version.minor = TLSv1_2_MINOR;
  20981. }
  20982. #ifndef NO_RSA
  20983. haveRSA = 1;
  20984. #endif
  20985. #ifndef NO_PSK
  20986. havePSK = ssl->options.havePSK;
  20987. #endif
  20988. #ifndef NO_CERTS
  20989. keySz = ssl->buffers.keySz;
  20990. #endif
  20991. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  20992. ssl->options.haveDH, ssl->options.haveNTRU,
  20993. ssl->options.haveECDSAsig, ssl->options.haveECC,
  20994. ssl->options.haveStaticECC, ssl->options.side);
  20995. }
  20996. /* suite size */
  20997. ato16(&input[idx], &clSuites.suiteSz);
  20998. idx += OPAQUE16_LEN;
  20999. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  21000. return BUFFER_ERROR;
  21001. clSuites.hashSigAlgoSz = 0;
  21002. /* session size */
  21003. ato16(&input[idx], &sessionSz);
  21004. idx += OPAQUE16_LEN;
  21005. if (sessionSz > ID_LEN)
  21006. return BUFFER_ERROR;
  21007. /* random size */
  21008. ato16(&input[idx], &randomSz);
  21009. idx += OPAQUE16_LEN;
  21010. if (randomSz > RAN_LEN)
  21011. return BUFFER_ERROR;
  21012. /* suites */
  21013. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  21014. byte first = input[idx++];
  21015. if (!first) { /* implicit: skip sslv2 type */
  21016. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  21017. j += SUITE_LEN;
  21018. }
  21019. idx += SUITE_LEN;
  21020. }
  21021. clSuites.suiteSz = j;
  21022. /* session id */
  21023. if (sessionSz) {
  21024. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  21025. ssl->arrays->sessionIDSz = (byte)sessionSz;
  21026. idx += sessionSz;
  21027. ssl->options.resuming = 1;
  21028. }
  21029. /* random */
  21030. if (randomSz < RAN_LEN)
  21031. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  21032. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  21033. randomSz);
  21034. idx += randomSz;
  21035. if (ssl->options.usingCompression)
  21036. ssl->options.usingCompression = 0; /* turn off */
  21037. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  21038. ssl->cbmode = SSL_CB_MODE_WRITE;
  21039. *inOutIdx = idx;
  21040. ssl->options.haveSessionId = 1;
  21041. /* DoClientHello uses same resume code */
  21042. if (ssl->options.resuming) { /* let's try */
  21043. WOLFSSL_SESSION* session = GetSession(ssl,
  21044. ssl->arrays->masterSecret, 1);
  21045. #ifdef HAVE_SESSION_TICKET
  21046. if (ssl->options.useTicket == 1) {
  21047. session = &ssl->session;
  21048. }
  21049. #endif
  21050. if (!session) {
  21051. WOLFSSL_MSG("Session lookup for resume failed");
  21052. ssl->options.resuming = 0;
  21053. } else {
  21054. #ifdef HAVE_EXT_CACHE
  21055. wolfSSL_SESSION_free(session);
  21056. #endif
  21057. if (MatchSuite(ssl, &clSuites) < 0) {
  21058. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  21059. return UNSUPPORTED_SUITE;
  21060. }
  21061. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  21062. RAN_LEN);
  21063. if (ret != 0)
  21064. return ret;
  21065. #ifdef NO_OLD_TLS
  21066. ret = DeriveTlsKeys(ssl);
  21067. #else
  21068. #ifndef NO_TLS
  21069. if (ssl->options.tls)
  21070. ret = DeriveTlsKeys(ssl);
  21071. #endif
  21072. if (!ssl->options.tls)
  21073. ret = DeriveKeys(ssl);
  21074. #endif
  21075. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  21076. return ret;
  21077. }
  21078. }
  21079. ret = MatchSuite(ssl, &clSuites);
  21080. if (ret != 0)return ret;
  21081. return SanityCheckMsgReceived(ssl, client_hello);
  21082. }
  21083. #endif /* OLD_HELLO_ALLOWED */
  21084. #ifndef WOLFSSL_NO_TLS12
  21085. int HandleTlsResumption(WOLFSSL* ssl, int bogusID, Suites* clSuites)
  21086. {
  21087. int ret = 0;
  21088. WOLFSSL_SESSION* session;
  21089. (void)bogusID;
  21090. session = GetSession(ssl, ssl->arrays->masterSecret, 1);
  21091. #ifdef HAVE_SESSION_TICKET
  21092. if (ssl->options.useTicket == 1) {
  21093. session = &ssl->session;
  21094. } else if (bogusID == 1 && ssl->options.rejectTicket == 0) {
  21095. WOLFSSL_MSG("Bogus session ID without session ticket");
  21096. return BUFFER_ERROR;
  21097. }
  21098. #endif
  21099. if (!session) {
  21100. WOLFSSL_MSG("Session lookup for resume failed");
  21101. ssl->options.resuming = 0;
  21102. }
  21103. else if (session->haveEMS != ssl->options.haveEMS) {
  21104. /* RFC 7627, 5.3, server-side */
  21105. /* if old sess didn't have EMS, but new does, full handshake */
  21106. if (!session->haveEMS && ssl->options.haveEMS) {
  21107. WOLFSSL_MSG("Attempting to resume a session that didn't "
  21108. "use EMS with a new session with EMS. Do full "
  21109. "handshake.");
  21110. ssl->options.resuming = 0;
  21111. }
  21112. /* if old sess used EMS, but new doesn't, MUST abort */
  21113. else if (session->haveEMS && !ssl->options.haveEMS) {
  21114. WOLFSSL_MSG("Trying to resume a session with EMS without "
  21115. "using EMS");
  21116. #ifdef WOLFSSL_EXTRA_ALERTS
  21117. SendAlert(ssl, alert_fatal, handshake_failure);
  21118. #endif
  21119. return EXT_MASTER_SECRET_NEEDED_E;
  21120. }
  21121. #ifdef HAVE_EXT_CACHE
  21122. wolfSSL_SESSION_free(session);
  21123. #endif
  21124. }
  21125. else {
  21126. #ifndef NO_RESUME_SUITE_CHECK
  21127. int j;
  21128. /* Check client suites include the one in session */
  21129. for (j = 0; j < clSuites->suiteSz; j += 2) {
  21130. if (clSuites->suites[j] == session->cipherSuite0 &&
  21131. clSuites->suites[j+1] == session->cipherSuite) {
  21132. break;
  21133. }
  21134. }
  21135. if (j == clSuites->suiteSz) {
  21136. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  21137. #ifdef WOLFSSL_EXTRA_ALERTS
  21138. SendAlert(ssl, alert_fatal, illegal_parameter);
  21139. #endif
  21140. return UNSUPPORTED_SUITE;
  21141. }
  21142. #endif
  21143. #ifdef HAVE_EXT_CACHE
  21144. wolfSSL_SESSION_free(session);
  21145. #endif
  21146. if (MatchSuite(ssl, clSuites) < 0) {
  21147. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  21148. return UNSUPPORTED_SUITE;
  21149. }
  21150. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  21151. RAN_LEN);
  21152. if (ret != 0)
  21153. return ret;
  21154. #ifdef NO_OLD_TLS
  21155. ret = DeriveTlsKeys(ssl);
  21156. #else
  21157. #ifndef NO_TLS
  21158. if (ssl->options.tls)
  21159. ret = DeriveTlsKeys(ssl);
  21160. #endif
  21161. if (!ssl->options.tls)
  21162. ret = DeriveKeys(ssl);
  21163. #endif
  21164. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  21165. }
  21166. return ret;
  21167. }
  21168. /* handle processing of client_hello (1) */
  21169. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  21170. word32 helloSz)
  21171. {
  21172. byte b;
  21173. byte bogusID = 0; /* flag for a bogus session id */
  21174. ProtocolVersion pv;
  21175. Suites clSuites;
  21176. word32 i = *inOutIdx;
  21177. word32 begin = i;
  21178. int ret = 0;
  21179. #ifdef WOLFSSL_DTLS
  21180. Hmac cookieHmac;
  21181. byte peerCookie[MAX_COOKIE_LEN];
  21182. byte peerCookieSz = 0;
  21183. byte cookieType;
  21184. byte cookieSz = 0;
  21185. XMEMSET(&cookieHmac, 0, sizeof(Hmac));
  21186. #endif /* WOLFSSL_DTLS */
  21187. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  21188. WOLFSSL_ENTER("DoClientHello");
  21189. #ifdef WOLFSSL_CALLBACKS
  21190. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  21191. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  21192. #endif
  21193. /* protocol version, random and session id length check */
  21194. if ((i - begin) + OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  21195. return BUFFER_ERROR;
  21196. /* protocol version */
  21197. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  21198. ssl->chVersion = pv; /* store */
  21199. #ifdef WOLFSSL_DTLS
  21200. if (IsDtlsNotSctpMode(ssl)) {
  21201. #if defined(NO_SHA) && defined(NO_SHA256)
  21202. #error "DTLS needs either SHA or SHA-256"
  21203. #endif /* NO_SHA && NO_SHA256 */
  21204. #if !defined(NO_SHA) && defined(NO_SHA256)
  21205. cookieType = WC_SHA;
  21206. cookieSz = WC_SHA_DIGEST_SIZE;
  21207. #endif /* NO_SHA */
  21208. #ifndef NO_SHA256
  21209. cookieType = WC_SHA256;
  21210. cookieSz = WC_SHA256_DIGEST_SIZE;
  21211. #endif /* NO_SHA256 */
  21212. ret = wc_HmacSetKey(&cookieHmac, cookieType,
  21213. ssl->buffers.dtlsCookieSecret.buffer,
  21214. ssl->buffers.dtlsCookieSecret.length);
  21215. if (ret != 0) return ret;
  21216. ret = wc_HmacUpdate(&cookieHmac,
  21217. (const byte*)ssl->buffers.dtlsCtx.peer.sa,
  21218. ssl->buffers.dtlsCtx.peer.sz);
  21219. if (ret != 0) return ret;
  21220. ret = wc_HmacUpdate(&cookieHmac, input + i, OPAQUE16_LEN);
  21221. if (ret != 0) return ret;
  21222. }
  21223. #endif /* WOLFSSL_DTLS */
  21224. i += OPAQUE16_LEN;
  21225. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  21226. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  21227. pv.minor = TLSv1_2_MINOR;
  21228. if ((!ssl->options.dtls && ssl->version.minor > pv.minor) ||
  21229. (ssl->options.dtls && ssl->version.minor != DTLS_MINOR
  21230. && ssl->version.minor != DTLSv1_2_MINOR && pv.minor != DTLS_MINOR
  21231. && pv.minor != DTLSv1_2_MINOR)) {
  21232. word16 haveRSA = 0;
  21233. word16 havePSK = 0;
  21234. int keySz = 0;
  21235. if (!ssl->options.downgrade) {
  21236. WOLFSSL_MSG("Client trying to connect with lesser version");
  21237. return VERSION_ERROR;
  21238. }
  21239. if (pv.minor < ssl->options.minDowngrade) {
  21240. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  21241. return VERSION_ERROR;
  21242. }
  21243. if (pv.minor == SSLv3_MINOR) {
  21244. /* turn off tls */
  21245. WOLFSSL_MSG("\tdowngrading to SSLv3");
  21246. ssl->options.tls = 0;
  21247. ssl->options.tls1_1 = 0;
  21248. ssl->version.minor = SSLv3_MINOR;
  21249. }
  21250. else if (pv.minor == TLSv1_MINOR) {
  21251. /* turn off tls 1.1+ */
  21252. WOLFSSL_MSG("\tdowngrading to TLSv1");
  21253. ssl->options.tls1_1 = 0;
  21254. ssl->version.minor = TLSv1_MINOR;
  21255. }
  21256. else if (pv.minor == TLSv1_1_MINOR) {
  21257. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  21258. ssl->version.minor = TLSv1_1_MINOR;
  21259. }
  21260. else if (pv.minor == TLSv1_2_MINOR) {
  21261. WOLFSSL_MSG(" downgrading to TLSv1.2");
  21262. ssl->version.minor = TLSv1_2_MINOR;
  21263. }
  21264. #ifndef NO_RSA
  21265. haveRSA = 1;
  21266. #endif
  21267. #ifndef NO_PSK
  21268. havePSK = ssl->options.havePSK;
  21269. #endif
  21270. #ifndef NO_CERTS
  21271. keySz = ssl->buffers.keySz;
  21272. #endif
  21273. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  21274. ssl->options.haveDH, ssl->options.haveNTRU,
  21275. ssl->options.haveECDSAsig, ssl->options.haveECC,
  21276. ssl->options.haveStaticECC, ssl->options.side);
  21277. }
  21278. #ifdef OPENSSL_EXTRA
  21279. /* check if option is set to not allow the current version
  21280. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  21281. if (!ssl->options.dtls && ssl->options.downgrade &&
  21282. ssl->options.mask > 0) {
  21283. int reset = 0;
  21284. if (ssl->version.minor == TLSv1_2_MINOR &&
  21285. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  21286. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  21287. ssl->version.minor = TLSv1_1_MINOR;
  21288. reset = 1;
  21289. }
  21290. if (ssl->version.minor == TLSv1_1_MINOR &&
  21291. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  21292. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  21293. ssl->options.tls1_1 = 0;
  21294. ssl->version.minor = TLSv1_MINOR;
  21295. reset = 1;
  21296. }
  21297. if (ssl->version.minor == TLSv1_MINOR &&
  21298. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  21299. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  21300. ssl->options.tls = 0;
  21301. ssl->options.tls1_1 = 0;
  21302. ssl->version.minor = SSLv3_MINOR;
  21303. reset = 1;
  21304. }
  21305. if (ssl->version.minor == SSLv3_MINOR &&
  21306. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  21307. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  21308. return VERSION_ERROR;
  21309. }
  21310. if (ssl->version.minor < ssl->options.minDowngrade) {
  21311. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  21312. return VERSION_ERROR;
  21313. }
  21314. if (reset) {
  21315. word16 haveRSA = 0;
  21316. word16 havePSK = 0;
  21317. int keySz = 0;
  21318. #ifndef NO_RSA
  21319. haveRSA = 1;
  21320. #endif
  21321. #ifndef NO_PSK
  21322. havePSK = ssl->options.havePSK;
  21323. #endif
  21324. #ifndef NO_CERTS
  21325. keySz = ssl->buffers.keySz;
  21326. #endif
  21327. /* reset cipher suites to account for TLS version change */
  21328. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  21329. ssl->options.haveDH, ssl->options.haveNTRU,
  21330. ssl->options.haveECDSAsig, ssl->options.haveECC,
  21331. ssl->options.haveStaticECC, ssl->options.side);
  21332. }
  21333. }
  21334. #endif
  21335. /* random */
  21336. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  21337. #ifdef WOLFSSL_DTLS
  21338. if (IsDtlsNotSctpMode(ssl)) {
  21339. ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN);
  21340. if (ret != 0) return ret;
  21341. }
  21342. #endif /* WOLFSSL_DTLS */
  21343. i += RAN_LEN;
  21344. #ifdef SHOW_SECRETS
  21345. {
  21346. int j;
  21347. printf("client random: ");
  21348. for (j = 0; j < RAN_LEN; j++)
  21349. printf("%02x", ssl->arrays->clientRandom[j]);
  21350. printf("\n");
  21351. }
  21352. #endif
  21353. /* session id */
  21354. b = input[i++];
  21355. #ifdef HAVE_SESSION_TICKET
  21356. if (b > 0 && b < ID_LEN) {
  21357. bogusID = 1;
  21358. WOLFSSL_MSG("Client sent bogus session id, let's allow for echo");
  21359. }
  21360. #endif
  21361. if (b == ID_LEN || bogusID) {
  21362. if ((i - begin) + b > helloSz)
  21363. return BUFFER_ERROR;
  21364. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  21365. #ifdef WOLFSSL_DTLS
  21366. if (IsDtlsNotSctpMode(ssl)) {
  21367. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  21368. if (ret != 0) return ret;
  21369. }
  21370. #endif /* WOLFSSL_DTLS */
  21371. ssl->arrays->sessionIDSz = b;
  21372. i += b;
  21373. ssl->options.resuming = 1; /* client wants to resume */
  21374. WOLFSSL_MSG("Client wants to resume session");
  21375. }
  21376. else if (b) {
  21377. WOLFSSL_MSG("Invalid session ID size");
  21378. return BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
  21379. }
  21380. #ifdef WOLFSSL_DTLS
  21381. /* cookie */
  21382. if (ssl->options.dtls) {
  21383. if ((i - begin) + OPAQUE8_LEN > helloSz)
  21384. return BUFFER_ERROR;
  21385. peerCookieSz = input[i++];
  21386. if (peerCookieSz) {
  21387. if (peerCookieSz > MAX_COOKIE_LEN)
  21388. return BUFFER_ERROR;
  21389. if ((i - begin) + peerCookieSz > helloSz)
  21390. return BUFFER_ERROR;
  21391. XMEMCPY(peerCookie, input + i, peerCookieSz);
  21392. i += peerCookieSz;
  21393. }
  21394. }
  21395. #endif
  21396. /* suites */
  21397. if ((i - begin) + OPAQUE16_LEN > helloSz)
  21398. return BUFFER_ERROR;
  21399. ato16(&input[i], &clSuites.suiteSz);
  21400. i += OPAQUE16_LEN;
  21401. /* suites and compression length check */
  21402. if ((i - begin) + clSuites.suiteSz + OPAQUE8_LEN > helloSz)
  21403. return BUFFER_ERROR;
  21404. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  21405. return BUFFER_ERROR;
  21406. XMEMCPY(clSuites.suites, input + i, clSuites.suiteSz);
  21407. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  21408. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  21409. if (FindSuite(&clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  21410. TLSX* extension;
  21411. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  21412. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  21413. if (ret != WOLFSSL_SUCCESS)
  21414. return ret;
  21415. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  21416. if (extension) {
  21417. ssl->secure_renegotiation =
  21418. (SecureRenegotiation*)extension->data;
  21419. ssl->secure_renegotiation->enabled = 1;
  21420. }
  21421. }
  21422. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  21423. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  21424. /* check for TLS_FALLBACK_SCSV suite */
  21425. if (FindSuite(&clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  21426. WOLFSSL_MSG("Found Fallback SCSV");
  21427. if (ssl->ctx->method->version.minor > pv.minor) {
  21428. WOLFSSL_MSG("Client trying to connect with lesser version");
  21429. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  21430. return VERSION_ERROR;
  21431. }
  21432. }
  21433. #endif
  21434. #ifdef WOLFSSL_DTLS
  21435. if (IsDtlsNotSctpMode(ssl)) {
  21436. ret = wc_HmacUpdate(&cookieHmac,
  21437. input + i - OPAQUE16_LEN,
  21438. clSuites.suiteSz + OPAQUE16_LEN);
  21439. if (ret != 0) return ret;
  21440. }
  21441. #endif /* WOLFSSL_DTLS */
  21442. i += clSuites.suiteSz;
  21443. clSuites.hashSigAlgoSz = 0;
  21444. /* compression length */
  21445. b = input[i++];
  21446. if ((i - begin) + b > helloSz)
  21447. return BUFFER_ERROR;
  21448. if (b == 0) {
  21449. WOLFSSL_MSG("No compression types in list");
  21450. #ifdef WOLFSSL_EXTRA_ALERTS
  21451. SendAlert(ssl, alert_fatal, decode_error);
  21452. #endif
  21453. return COMPRESSION_ERROR;
  21454. }
  21455. #ifdef WOLFSSL_DTLS
  21456. if (IsDtlsNotSctpMode(ssl)) {
  21457. byte newCookie[MAX_COOKIE_LEN];
  21458. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  21459. if (ret != 0) return ret;
  21460. ret = wc_HmacFinal(&cookieHmac, newCookie);
  21461. if (ret != 0) return ret;
  21462. /* If a cookie callback is set, call it to overwrite the cookie.
  21463. * This should be deprecated. The code now calculates the cookie
  21464. * using an HMAC as expected. */
  21465. if (ssl->ctx->CBIOCookie != NULL &&
  21466. ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz,
  21467. ssl->IOCB_CookieCtx) != cookieSz) {
  21468. return COOKIE_ERROR;
  21469. }
  21470. /* Check the cookie, see if we progress the state machine. */
  21471. if (peerCookieSz != cookieSz ||
  21472. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  21473. /* Send newCookie to client in a HelloVerifyRequest message
  21474. * and let the state machine alone. */
  21475. ssl->msgsReceived.got_client_hello = 0;
  21476. ssl->keys.dtls_handshake_number = 0;
  21477. ssl->keys.dtls_expected_peer_handshake_number = 0;
  21478. *inOutIdx += helloSz;
  21479. return SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  21480. }
  21481. /* This was skipped in the DTLS case so we could handle the hello
  21482. * verify request. */
  21483. ret = HashInput(ssl, input + *inOutIdx, helloSz);
  21484. if (ret != 0) return ret;
  21485. }
  21486. #endif /* WOLFSSL_DTLS */
  21487. {
  21488. /* compression match types */
  21489. int matchNo = 0;
  21490. int matchZlib = 0;
  21491. while (b--) {
  21492. byte comp = input[i++];
  21493. if (comp == NO_COMPRESSION) {
  21494. matchNo = 1;
  21495. }
  21496. if (comp == ZLIB_COMPRESSION) {
  21497. matchZlib = 1;
  21498. }
  21499. }
  21500. if (ssl->options.usingCompression == 0 && matchNo) {
  21501. WOLFSSL_MSG("Matched No Compression");
  21502. } else if (ssl->options.usingCompression && matchZlib) {
  21503. WOLFSSL_MSG("Matched zlib Compression");
  21504. } else if (ssl->options.usingCompression && matchNo) {
  21505. WOLFSSL_MSG("Could only match no compression, turning off");
  21506. ssl->options.usingCompression = 0; /* turn off */
  21507. } else {
  21508. WOLFSSL_MSG("Could not match compression");
  21509. #ifdef WOLFSSL_EXTRA_ALERTS
  21510. SendAlert(ssl, alert_fatal, illegal_parameter);
  21511. #endif
  21512. return COMPRESSION_ERROR;
  21513. }
  21514. }
  21515. *inOutIdx = i;
  21516. /* tls extensions */
  21517. if ((i - begin) < helloSz) {
  21518. #ifdef HAVE_TLS_EXTENSIONS
  21519. #ifdef HAVE_QSH
  21520. QSH_Init(ssl);
  21521. #endif
  21522. if (TLSX_SupportExtensions(ssl))
  21523. #else
  21524. if (IsAtLeastTLSv1_2(ssl))
  21525. #endif
  21526. {
  21527. /* Process the hello extension. Skip unsupported. */
  21528. word16 totalExtSz;
  21529. #ifdef HAVE_TLS_EXTENSIONS
  21530. /* auto populate extensions supported unless user defined */
  21531. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  21532. return ret;
  21533. #endif
  21534. if ((i - begin) + OPAQUE16_LEN > helloSz)
  21535. return BUFFER_ERROR;
  21536. ato16(&input[i], &totalExtSz);
  21537. i += OPAQUE16_LEN;
  21538. if ((i - begin) + totalExtSz > helloSz)
  21539. return BUFFER_ERROR;
  21540. #ifdef HAVE_TLS_EXTENSIONS
  21541. /* tls extensions */
  21542. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  21543. client_hello, &clSuites)))
  21544. return ret;
  21545. #ifdef WOLFSSL_TLS13
  21546. if (TLSX_Find(ssl->extensions,
  21547. TLSX_SUPPORTED_VERSIONS) != NULL) {
  21548. WOLFSSL_MSG(
  21549. "Client attempting to connect with higher version");
  21550. return VERSION_ERROR;
  21551. }
  21552. #endif
  21553. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  21554. if((ret=SNI_Callback(ssl)))
  21555. return ret;
  21556. ssl->options.side = WOLFSSL_SERVER_END;
  21557. #endif
  21558. i += totalExtSz;
  21559. #else
  21560. while (totalExtSz) {
  21561. word16 extId, extSz;
  21562. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  21563. return BUFFER_ERROR;
  21564. ato16(&input[i], &extId);
  21565. i += OPAQUE16_LEN;
  21566. ato16(&input[i], &extSz);
  21567. i += OPAQUE16_LEN;
  21568. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  21569. return BUFFER_ERROR;
  21570. if (extId == HELLO_EXT_SIG_ALGO) {
  21571. word16 hashSigAlgoSz;
  21572. ato16(&input[i], &hashSigAlgoSz);
  21573. i += OPAQUE16_LEN;
  21574. if (OPAQUE16_LEN + hashSigAlgoSz > extSz)
  21575. return BUFFER_ERROR;
  21576. clSuites.hashSigAlgoSz = hashSigAlgoSz;
  21577. if (clSuites.hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  21578. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  21579. "truncating");
  21580. clSuites.hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  21581. }
  21582. XMEMCPY(clSuites.hashSigAlgo, &input[i],
  21583. clSuites.hashSigAlgoSz);
  21584. i += hashSigAlgoSz;
  21585. }
  21586. #ifdef HAVE_EXTENDED_MASTER
  21587. else if (extId == HELLO_EXT_EXTMS)
  21588. ssl->options.haveEMS = 1;
  21589. #endif
  21590. else
  21591. i += extSz;
  21592. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  21593. }
  21594. #endif
  21595. *inOutIdx = i;
  21596. }
  21597. else
  21598. *inOutIdx = begin + helloSz; /* skip extensions */
  21599. }
  21600. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  21601. ssl->options.haveSessionId = 1;
  21602. /* ProcessOld uses same resume code */
  21603. if (ssl->options.resuming) {
  21604. ret = HandleTlsResumption(ssl, bogusID, &clSuites);
  21605. if (ret != 0)
  21606. return ret;
  21607. #ifdef HAVE_SECURE_RENEGOTIATION
  21608. if (ssl->secure_renegotiation &&
  21609. ssl->secure_renegotiation->enabled &&
  21610. IsEncryptionOn(ssl, 0))
  21611. ssl->secure_renegotiation->startScr = 1;
  21612. #endif
  21613. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  21614. WOLFSSL_LEAVE("DoClientHello", ret);
  21615. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  21616. return ret;
  21617. }
  21618. }
  21619. #ifdef HAVE_TLS_EXTENSIONS
  21620. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  21621. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  21622. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  21623. * present and no matches in the server's list. */
  21624. ret = TLSX_SupportedFFDHE_Set(ssl);
  21625. if (ret != 0)
  21626. return ret;
  21627. }
  21628. #endif
  21629. #endif
  21630. ret = MatchSuite(ssl, &clSuites);
  21631. #ifdef WOLFSSL_EXTRA_ALERTS
  21632. if (ret == BUFFER_ERROR)
  21633. SendAlert(ssl, alert_fatal, decode_error);
  21634. else if (ret < 0)
  21635. SendAlert(ssl, alert_fatal, handshake_failure);
  21636. #endif
  21637. #ifdef HAVE_SECURE_RENEGOTIATION
  21638. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  21639. IsEncryptionOn(ssl, 0)) {
  21640. ssl->secure_renegotiation->startScr = 1;
  21641. }
  21642. #endif
  21643. WOLFSSL_LEAVE("DoClientHello", ret);
  21644. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  21645. return ret;
  21646. }
  21647. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519)) && \
  21648. !defined(WOLFSSL_NO_CLIENT_AUTH)
  21649. typedef struct DcvArgs {
  21650. byte* output; /* not allocated */
  21651. word32 sendSz;
  21652. word16 sz;
  21653. word32 sigSz;
  21654. word32 idx;
  21655. word32 begin;
  21656. byte hashAlgo;
  21657. byte sigAlgo;
  21658. } DcvArgs;
  21659. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  21660. {
  21661. DcvArgs* args = (DcvArgs*)pArgs;
  21662. (void)ssl;
  21663. (void)args;
  21664. }
  21665. /* handle processing of certificate_verify (15) */
  21666. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  21667. word32* inOutIdx, word32 size)
  21668. {
  21669. int ret = 0;
  21670. #ifdef WOLFSSL_ASYNC_CRYPT
  21671. DcvArgs* args = (DcvArgs*)ssl->async.args;
  21672. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  21673. (void)sizeof(args_test);
  21674. #else
  21675. DcvArgs args[1];
  21676. #endif
  21677. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  21678. WOLFSSL_ENTER("DoCertificateVerify");
  21679. #ifdef WOLFSSL_ASYNC_CRYPT
  21680. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  21681. if (ret != WC_NOT_PENDING_E) {
  21682. /* Check for error */
  21683. if (ret < 0)
  21684. goto exit_dcv;
  21685. }
  21686. else
  21687. #endif
  21688. {
  21689. /* Reset state */
  21690. ret = 0;
  21691. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  21692. XMEMSET(args, 0, sizeof(DcvArgs));
  21693. args->hashAlgo = sha_mac;
  21694. args->sigAlgo = anonymous_sa_algo;
  21695. args->idx = *inOutIdx;
  21696. args->begin = *inOutIdx;
  21697. #ifdef WOLFSSL_ASYNC_CRYPT
  21698. ssl->async.freeArgs = FreeDcvArgs;
  21699. #endif
  21700. }
  21701. switch(ssl->options.asyncState)
  21702. {
  21703. case TLS_ASYNC_BEGIN:
  21704. {
  21705. #ifdef WOLFSSL_CALLBACKS
  21706. if (ssl->hsInfoOn)
  21707. AddPacketName(ssl, "CertificateVerify");
  21708. if (ssl->toInfoOn)
  21709. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  21710. #endif
  21711. /* Advance state and proceed */
  21712. ssl->options.asyncState = TLS_ASYNC_BUILD;
  21713. } /* case TLS_ASYNC_BEGIN */
  21714. FALL_THROUGH;
  21715. case TLS_ASYNC_BUILD:
  21716. {
  21717. if (IsAtLeastTLSv1_2(ssl)) {
  21718. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  21719. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  21720. }
  21721. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  21722. &args->sigAlgo);
  21723. args->idx += 2;
  21724. }
  21725. #ifndef NO_RSA
  21726. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  21727. args->sigAlgo = rsa_sa_algo;
  21728. #endif
  21729. #ifdef HAVE_ECC
  21730. else if (ssl->peerEccDsaKeyPresent)
  21731. args->sigAlgo = ecc_dsa_sa_algo;
  21732. #endif
  21733. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  21734. else if (ssl->peerEd25519KeyPresent)
  21735. args->sigAlgo = ed25519_sa_algo;
  21736. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  21737. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  21738. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  21739. }
  21740. ato16(input + args->idx, &args->sz);
  21741. args->idx += OPAQUE16_LEN;
  21742. if ((args->idx - args->begin) + args->sz > size ||
  21743. args->sz > ENCRYPT_LEN) {
  21744. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  21745. }
  21746. #ifdef HAVE_ECC
  21747. if (ssl->peerEccDsaKeyPresent) {
  21748. WOLFSSL_MSG("Doing ECC peer cert verify");
  21749. /* make sure a default is defined */
  21750. #if !defined(NO_SHA)
  21751. SetDigest(ssl, sha_mac);
  21752. #elif !defined(NO_SHA256)
  21753. SetDigest(ssl, sha256_mac);
  21754. #elif defined(WOLFSSL_SHA384)
  21755. SetDigest(ssl, sha384_mac);
  21756. #elif defined(WOLFSSL_SHA512)
  21757. SetDigest(ssl, sha512_mac);
  21758. #else
  21759. #error No digest enabled for ECC sig verify
  21760. #endif
  21761. if (IsAtLeastTLSv1_2(ssl)) {
  21762. if (args->sigAlgo != ecc_dsa_sa_algo) {
  21763. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  21764. }
  21765. SetDigest(ssl, args->hashAlgo);
  21766. }
  21767. }
  21768. #endif /* HAVE_ECC */
  21769. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  21770. if (ssl->peerEd25519KeyPresent) {
  21771. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  21772. if (IsAtLeastTLSv1_2(ssl) &&
  21773. args->sigAlgo != ed25519_sa_algo) {
  21774. WOLFSSL_MSG(
  21775. "Oops, peer sent ED25519 key but not in verify");
  21776. }
  21777. }
  21778. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  21779. /* Advance state and proceed */
  21780. ssl->options.asyncState = TLS_ASYNC_DO;
  21781. } /* case TLS_ASYNC_BUILD */
  21782. FALL_THROUGH;
  21783. case TLS_ASYNC_DO:
  21784. {
  21785. #ifndef NO_RSA
  21786. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  21787. WOLFSSL_MSG("Doing RSA peer cert verify");
  21788. ret = RsaVerify(ssl,
  21789. input + args->idx,
  21790. args->sz,
  21791. &args->output,
  21792. args->sigAlgo, args->hashAlgo,
  21793. ssl->peerRsaKey,
  21794. #ifdef HAVE_PK_CALLBACKS
  21795. &ssl->buffers.peerRsaKey
  21796. #else
  21797. NULL
  21798. #endif
  21799. );
  21800. if (ret >= 0) {
  21801. if (args->sigAlgo == rsa_sa_algo)
  21802. args->sendSz = ret;
  21803. else {
  21804. args->sigSz = ret;
  21805. args->sendSz = ssl->buffers.digest.length;
  21806. }
  21807. ret = 0;
  21808. }
  21809. }
  21810. #endif /* !NO_RSA */
  21811. #ifdef HAVE_ECC
  21812. if (ssl->peerEccDsaKeyPresent) {
  21813. WOLFSSL_MSG("Doing ECC peer cert verify");
  21814. ret = EccVerify(ssl,
  21815. input + args->idx, args->sz,
  21816. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  21817. ssl->peerEccDsaKey,
  21818. #ifdef HAVE_PK_CALLBACKS
  21819. &ssl->buffers.peerEccDsaKey
  21820. #else
  21821. NULL
  21822. #endif
  21823. );
  21824. }
  21825. #endif /* HAVE_ECC */
  21826. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  21827. if (ssl->peerEd25519KeyPresent) {
  21828. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  21829. ret = Ed25519Verify(ssl,
  21830. input + args->idx, args->sz,
  21831. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  21832. ssl->peerEd25519Key,
  21833. #ifdef HAVE_PK_CALLBACKS
  21834. &ssl->buffers.peerEd25519Key
  21835. #else
  21836. NULL
  21837. #endif
  21838. );
  21839. }
  21840. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  21841. #ifdef WOLFSSL_ASYNC_CRYPT
  21842. /* handle async pending */
  21843. if (ret == WC_PENDING_E)
  21844. goto exit_dcv;
  21845. #endif
  21846. /* Check for error */
  21847. if (ret != 0) {
  21848. ret = SIG_VERIFY_E;
  21849. goto exit_dcv;
  21850. }
  21851. /* Advance state and proceed */
  21852. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  21853. } /* case TLS_ASYNC_DO */
  21854. FALL_THROUGH;
  21855. case TLS_ASYNC_VERIFY:
  21856. {
  21857. #ifndef NO_RSA
  21858. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  21859. if (IsAtLeastTLSv1_2(ssl)) {
  21860. #ifdef WC_RSA_PSS
  21861. if (args->sigAlgo == rsa_pss_sa_algo) {
  21862. SetDigest(ssl, args->hashAlgo);
  21863. ret = wc_RsaPSS_CheckPadding(
  21864. ssl->buffers.digest.buffer,
  21865. ssl->buffers.digest.length,
  21866. args->output, args->sigSz,
  21867. HashAlgoToType(args->hashAlgo));
  21868. if (ret != 0) {
  21869. ret = SIG_VERIFY_E;
  21870. goto exit_dcv;
  21871. }
  21872. }
  21873. else
  21874. #endif
  21875. {
  21876. #ifdef WOLFSSL_SMALL_STACK
  21877. byte* encodedSig = NULL;
  21878. #else
  21879. byte encodedSig[MAX_ENCODED_SIG_SZ];
  21880. #endif
  21881. #ifdef WOLFSSL_SMALL_STACK
  21882. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  21883. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21884. if (encodedSig == NULL) {
  21885. ERROR_OUT(MEMORY_E, exit_dcv);
  21886. }
  21887. #endif
  21888. if (args->sigAlgo != rsa_sa_algo) {
  21889. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  21890. "in verify");
  21891. }
  21892. SetDigest(ssl, args->hashAlgo);
  21893. args->sigSz = wc_EncodeSignature(encodedSig,
  21894. ssl->buffers.digest.buffer,
  21895. ssl->buffers.digest.length,
  21896. TypeHash(args->hashAlgo));
  21897. if (args->sendSz != args->sigSz || !args->output ||
  21898. XMEMCMP(args->output, encodedSig,
  21899. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  21900. ret = VERIFY_CERT_ERROR;
  21901. }
  21902. #ifdef WOLFSSL_SMALL_STACK
  21903. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21904. #endif
  21905. }
  21906. }
  21907. else {
  21908. if (args->sendSz != FINISHED_SZ || !args->output ||
  21909. XMEMCMP(args->output,
  21910. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  21911. ret = VERIFY_CERT_ERROR;
  21912. }
  21913. }
  21914. }
  21915. #endif /* !NO_RSA */
  21916. /* Advance state and proceed */
  21917. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  21918. } /* case TLS_ASYNC_VERIFY */
  21919. FALL_THROUGH;
  21920. case TLS_ASYNC_FINALIZE:
  21921. {
  21922. if (IsEncryptionOn(ssl, 0)) {
  21923. args->idx += ssl->keys.padSz;
  21924. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  21925. if (ssl->options.encThenMac)
  21926. args->idx += MacSize(ssl);
  21927. #endif
  21928. }
  21929. ssl->options.havePeerVerify = 1;
  21930. /* Set final index */
  21931. args->idx += args->sz;
  21932. *inOutIdx = args->idx;
  21933. /* Advance state and proceed */
  21934. ssl->options.asyncState = TLS_ASYNC_END;
  21935. } /* case TLS_ASYNC_FINALIZE */
  21936. case TLS_ASYNC_END:
  21937. {
  21938. break;
  21939. }
  21940. default:
  21941. ret = INPUT_CASE_ERROR;
  21942. } /* switch(ssl->options.asyncState) */
  21943. exit_dcv:
  21944. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  21945. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  21946. #ifdef WOLFSSL_ASYNC_CRYPT
  21947. /* Handle async operation */
  21948. if (ret == WC_PENDING_E) {
  21949. /* Mark message as not received so it can process again */
  21950. ssl->msgsReceived.got_certificate_verify = 0;
  21951. return ret;
  21952. }
  21953. #endif /* WOLFSSL_ASYNC_CRYPT */
  21954. #ifdef WOLFSSL_EXTRA_ALERTS
  21955. if (ret == SIG_VERIFY_E)
  21956. SendAlert(ssl, alert_fatal, decrypt_error);
  21957. else if (ret != 0)
  21958. SendAlert(ssl, alert_fatal, bad_certificate);
  21959. #endif
  21960. /* Digest is not allocated, so do this to prevent free */
  21961. ssl->buffers.digest.buffer = NULL;
  21962. ssl->buffers.digest.length = 0;
  21963. /* Final cleanup */
  21964. FreeDcvArgs(ssl, args);
  21965. FreeKeyExchange(ssl);
  21966. return ret;
  21967. }
  21968. #endif /* (!NO_RSA || HAVE_ECC || HAVE_ED25519) && !WOLFSSL_NO_CLIENT_AUTH */
  21969. /* handle generation of server_hello_done (14) */
  21970. int SendServerHelloDone(WOLFSSL* ssl)
  21971. {
  21972. byte* output;
  21973. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  21974. int ret;
  21975. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  21976. WOLFSSL_ENTER("SendServerHelloDone");
  21977. #ifdef WOLFSSL_DTLS
  21978. if (ssl->options.dtls)
  21979. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21980. #endif
  21981. if (IsEncryptionOn(ssl, 1))
  21982. sendSz += MAX_MSG_EXTRA;
  21983. /* check for available size */
  21984. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  21985. return ret;
  21986. /* get output buffer */
  21987. output = ssl->buffers.outputBuffer.buffer +
  21988. ssl->buffers.outputBuffer.length;
  21989. AddHeaders(output, 0, server_hello_done, ssl);
  21990. if (IsEncryptionOn(ssl, 1)) {
  21991. byte* input;
  21992. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  21993. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21994. if (input == NULL)
  21995. return MEMORY_E;
  21996. XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
  21997. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  21998. handshake, 1, 0, 0);
  21999. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22000. if (sendSz < 0)
  22001. return sendSz;
  22002. } else {
  22003. #ifdef WOLFSSL_DTLS
  22004. if (IsDtlsNotSctpMode(ssl)) {
  22005. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
  22006. return ret;
  22007. }
  22008. if (ssl->options.dtls)
  22009. DtlsSEQIncrement(ssl, CUR_ORDER);
  22010. #endif
  22011. ret = HashOutput(ssl, output, sendSz, 0);
  22012. if (ret != 0)
  22013. return ret;
  22014. }
  22015. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  22016. if (ssl->hsInfoOn)
  22017. AddPacketName(ssl, "ServerHelloDone");
  22018. if (ssl->toInfoOn)
  22019. AddPacketInfo(ssl, "ServerHelloDone", handshake, output, sendSz,
  22020. WRITE_PROTO, ssl->heap);
  22021. #endif
  22022. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  22023. ssl->buffers.outputBuffer.length += sendSz;
  22024. ret = SendBuffered(ssl);
  22025. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  22026. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  22027. return ret;
  22028. }
  22029. #endif /* !WOLFSSL_NO_TLS12 */
  22030. #ifdef HAVE_SESSION_TICKET
  22031. #define WOLFSSL_TICKET_FIXED_SZ (WOLFSSL_TICKET_NAME_SZ + \
  22032. WOLFSSL_TICKET_IV_SZ + WOLFSSL_TICKET_MAC_SZ + LENGTH_SZ)
  22033. #define WOLFSSL_TICKET_ENC_SZ (SESSION_TICKET_LEN - WOLFSSL_TICKET_FIXED_SZ)
  22034. /* our ticket format */
  22035. typedef struct InternalTicket {
  22036. ProtocolVersion pv; /* version when ticket created */
  22037. byte suite[SUITE_LEN]; /* cipher suite when created */
  22038. byte msecret[SECRET_LEN]; /* master secret */
  22039. word32 timestamp; /* born on */
  22040. word16 haveEMS; /* have extended master secret */
  22041. #ifdef WOLFSSL_TLS13
  22042. word32 ageAdd; /* Obfuscation of age */
  22043. word16 namedGroup; /* Named group used */
  22044. #ifndef WOLFSSL_TLS13_DRAFT_18
  22045. TicketNonce ticketNonce; /* Ticket nonce */
  22046. #endif
  22047. #ifdef WOLFSSL_EARLY_DATA
  22048. word32 maxEarlyDataSz; /* Max size of early data */
  22049. #endif
  22050. #endif
  22051. } InternalTicket;
  22052. /* fit within SESSION_TICKET_LEN */
  22053. typedef struct ExternalTicket {
  22054. byte key_name[WOLFSSL_TICKET_NAME_SZ]; /* key context name */
  22055. byte iv[WOLFSSL_TICKET_IV_SZ]; /* this ticket's iv */
  22056. byte enc_len[LENGTH_SZ]; /* encrypted length */
  22057. byte enc_ticket[WOLFSSL_TICKET_ENC_SZ]; /* encrypted internal ticket */
  22058. byte mac[WOLFSSL_TICKET_MAC_SZ]; /* total mac */
  22059. /* !! if add to structure, add to TICKET_FIXED_SZ !! */
  22060. } ExternalTicket;
  22061. /* create a new session ticket, 0 on success */
  22062. int CreateTicket(WOLFSSL* ssl)
  22063. {
  22064. InternalTicket it;
  22065. ExternalTicket* et = (ExternalTicket*)ssl->session.ticket;
  22066. int encLen;
  22067. int ret;
  22068. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  22069. XMEMSET(&it, 0, sizeof(it));
  22070. /* build internal */
  22071. it.pv.major = ssl->version.major;
  22072. it.pv.minor = ssl->version.minor;
  22073. it.suite[0] = ssl->options.cipherSuite0;
  22074. it.suite[1] = ssl->options.cipherSuite;
  22075. #ifdef WOLFSSL_EARLY_DATA
  22076. it.maxEarlyDataSz = ssl->options.maxEarlyDataSz;
  22077. #endif
  22078. if (!ssl->options.tls1_3) {
  22079. XMEMCPY(it.msecret, ssl->arrays->masterSecret, SECRET_LEN);
  22080. c32toa(LowResTimer(), (byte*)&it.timestamp);
  22081. it.haveEMS = ssl->options.haveEMS;
  22082. }
  22083. else {
  22084. #ifdef WOLFSSL_TLS13
  22085. /* Client adds to ticket age to obfuscate. */
  22086. ret = wc_RNG_GenerateBlock(ssl->rng, (byte*)&it.ageAdd,
  22087. sizeof(it.ageAdd));
  22088. if (ret != 0)
  22089. return BAD_TICKET_ENCRYPT;
  22090. ssl->session.ticketAdd = it.ageAdd;
  22091. it.namedGroup = ssl->session.namedGroup;
  22092. it.timestamp = TimeNowInMilliseconds();
  22093. /* Resumption master secret. */
  22094. XMEMCPY(it.msecret, ssl->session.masterSecret, SECRET_LEN);
  22095. #ifndef WOLFSSL_TLS13_DRAFT_18
  22096. XMEMCPY(&it.ticketNonce, &ssl->session.ticketNonce,
  22097. sizeof(TicketNonce));
  22098. #endif
  22099. #endif
  22100. }
  22101. /* build external */
  22102. XMEMCPY(et->enc_ticket, &it, sizeof(InternalTicket));
  22103. /* encrypt */
  22104. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  22105. if (ssl->ctx->ticketEncCb == NULL) {
  22106. ret = WOLFSSL_TICKET_RET_FATAL;
  22107. }
  22108. else {
  22109. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac, 1,
  22110. et->enc_ticket, sizeof(InternalTicket),
  22111. &encLen, ssl->ctx->ticketEncCtx);
  22112. }
  22113. if (ret == WOLFSSL_TICKET_RET_OK) {
  22114. if (encLen < (int)sizeof(InternalTicket) ||
  22115. encLen > WOLFSSL_TICKET_ENC_SZ) {
  22116. WOLFSSL_MSG("Bad user ticket encrypt size");
  22117. return BAD_TICKET_KEY_CB_SZ;
  22118. }
  22119. /* sanity checks on encrypt callback */
  22120. /* internal ticket can't be the same if encrypted */
  22121. if (XMEMCMP(et->enc_ticket, &it, sizeof(InternalTicket)) == 0) {
  22122. WOLFSSL_MSG("User ticket encrypt didn't encrypt");
  22123. return BAD_TICKET_ENCRYPT;
  22124. }
  22125. XMEMSET(zeros, 0, sizeof(zeros));
  22126. /* name */
  22127. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  22128. WOLFSSL_MSG("User ticket encrypt didn't set name");
  22129. return BAD_TICKET_ENCRYPT;
  22130. }
  22131. /* iv */
  22132. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  22133. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  22134. return BAD_TICKET_ENCRYPT;
  22135. }
  22136. /* mac */
  22137. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  22138. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  22139. return BAD_TICKET_ENCRYPT;
  22140. }
  22141. /* set size */
  22142. c16toa((word16)encLen, et->enc_len);
  22143. ssl->session.ticketLen = (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  22144. if (encLen < WOLFSSL_TICKET_ENC_SZ) {
  22145. /* move mac up since whole enc buffer not used */
  22146. XMEMMOVE(et->enc_ticket +encLen, et->mac,WOLFSSL_TICKET_MAC_SZ);
  22147. }
  22148. }
  22149. return ret;
  22150. }
  22151. /* Parse ticket sent by client, returns callback return value */
  22152. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  22153. {
  22154. ExternalTicket* et;
  22155. InternalTicket* it;
  22156. int ret;
  22157. int outLen;
  22158. word16 inLen;
  22159. WOLFSSL_START(WC_FUNC_TICKET_DO);
  22160. WOLFSSL_ENTER("DoClientTicket");
  22161. if (len > SESSION_TICKET_LEN ||
  22162. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  22163. return BAD_TICKET_MSG_SZ;
  22164. }
  22165. et = (ExternalTicket*)input;
  22166. it = (InternalTicket*)et->enc_ticket;
  22167. /* decrypt */
  22168. ato16(et->enc_len, &inLen);
  22169. if (inLen > (word16)(len - WOLFSSL_TICKET_FIXED_SZ)) {
  22170. return BAD_TICKET_MSG_SZ;
  22171. }
  22172. outLen = inLen; /* may be reduced by user padding */
  22173. if (ssl->ctx->ticketEncCb == NULL) {
  22174. ret = WOLFSSL_TICKET_RET_FATAL;
  22175. }
  22176. else {
  22177. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv,
  22178. et->enc_ticket + inLen, 0,
  22179. et->enc_ticket, inLen, &outLen,
  22180. ssl->ctx->ticketEncCtx);
  22181. }
  22182. if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) return ret;
  22183. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  22184. WOLFSSL_MSG("Bad user ticket decrypt len");
  22185. return BAD_TICKET_KEY_CB_SZ;
  22186. }
  22187. /* get master secret */
  22188. if (ret == WOLFSSL_TICKET_RET_OK || ret == WOLFSSL_TICKET_RET_CREATE) {
  22189. if (ssl->version.minor < it->pv.minor) {
  22190. WOLFSSL_MSG("Ticket has greater version");
  22191. return VERSION_ERROR;
  22192. }
  22193. else if (ssl->version.minor > it->pv.minor) {
  22194. if (!ssl->options.downgrade) {
  22195. WOLFSSL_MSG("Ticket has lesser version");
  22196. return VERSION_ERROR;
  22197. }
  22198. WOLFSSL_MSG("Downgrading protocol due to ticket");
  22199. if (it->pv.minor < ssl->options.minDowngrade)
  22200. return VERSION_ERROR;
  22201. ssl->version.minor = it->pv.minor;
  22202. }
  22203. if (!IsAtLeastTLSv1_3(ssl->version)) {
  22204. XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN);
  22205. /* Copy the haveExtendedMasterSecret property from the ticket to
  22206. * the saved session, so the property may be checked later. */
  22207. ssl->session.haveEMS = it->haveEMS;
  22208. #ifndef NO_RESUME_SUITE_CHECK
  22209. ssl->session.cipherSuite0 = it->suite[0];
  22210. ssl->session.cipherSuite = it->suite[1];
  22211. #endif
  22212. }
  22213. else {
  22214. #ifdef WOLFSSL_TLS13
  22215. /* Restore information to renegotiate. */
  22216. ssl->session.ticketSeen = it->timestamp;
  22217. ssl->session.ticketAdd = it->ageAdd;
  22218. ssl->session.cipherSuite0 = it->suite[0];
  22219. ssl->session.cipherSuite = it->suite[1];
  22220. #ifdef WOLFSSL_EARLY_DATA
  22221. ssl->session.maxEarlyDataSz = it->maxEarlyDataSz;
  22222. #endif
  22223. /* Resumption master secret. */
  22224. XMEMCPY(ssl->session.masterSecret, it->msecret, SECRET_LEN);
  22225. #ifndef WOLFSSL_TLS13_DRAFT_18
  22226. XMEMCPY(&ssl->session.ticketNonce, &it->ticketNonce,
  22227. sizeof(TicketNonce));
  22228. #endif
  22229. ssl->session.namedGroup = it->namedGroup;
  22230. #endif
  22231. }
  22232. }
  22233. WOLFSSL_LEAVE("DoClientTicket", ret);
  22234. WOLFSSL_END(WC_FUNC_TICKET_DO);
  22235. return ret;
  22236. }
  22237. /* send Session Ticket */
  22238. int SendTicket(WOLFSSL* ssl)
  22239. {
  22240. byte* output;
  22241. int ret;
  22242. int sendSz;
  22243. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  22244. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22245. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  22246. WOLFSSL_ENTER("SendTicket");
  22247. if (ssl->options.createTicket) {
  22248. ret = CreateTicket(ssl);
  22249. if (ret != 0) return ret;
  22250. }
  22251. length += ssl->session.ticketLen;
  22252. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  22253. if (!ssl->options.dtls) {
  22254. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  22255. sendSz += MAX_MSG_EXTRA;
  22256. }
  22257. else {
  22258. #ifdef WOLFSSL_DTLS
  22259. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22260. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22261. #endif
  22262. }
  22263. /* check for available size */
  22264. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  22265. return ret;
  22266. /* get output buffer */
  22267. output = ssl->buffers.outputBuffer.buffer +
  22268. ssl->buffers.outputBuffer.length;
  22269. AddHeaders(output, length, session_ticket, ssl);
  22270. /* hint */
  22271. c32toa(ssl->ctx->ticketHint, output + idx);
  22272. idx += SESSION_HINT_SZ;
  22273. /* length */
  22274. c16toa(ssl->session.ticketLen, output + idx);
  22275. idx += LENGTH_SZ;
  22276. /* ticket */
  22277. XMEMCPY(output + idx, ssl->session.ticket, ssl->session.ticketLen);
  22278. idx += ssl->session.ticketLen;
  22279. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  22280. byte* input;
  22281. int inputSz = idx - RECORD_HEADER_SZ; /* build msg adds rec hdr */
  22282. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22283. if (input == NULL)
  22284. return MEMORY_E;
  22285. XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
  22286. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  22287. handshake, 1, 0, 0);
  22288. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22289. if (sendSz < 0)
  22290. return sendSz;
  22291. }
  22292. else {
  22293. #ifdef WOLFSSL_DTLS
  22294. if (ssl->options.dtls) {
  22295. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
  22296. return ret;
  22297. DtlsSEQIncrement(ssl, CUR_ORDER);
  22298. }
  22299. #endif
  22300. ret = HashOutput(ssl, output, sendSz, 0);
  22301. if (ret != 0)
  22302. return ret;
  22303. }
  22304. ssl->buffers.outputBuffer.length += sendSz;
  22305. ret = SendBuffered(ssl);
  22306. WOLFSSL_LEAVE("SendTicket", ret);
  22307. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  22308. return ret;
  22309. }
  22310. #endif /* HAVE_SESSION_TICKET */
  22311. #ifndef WOLFSSL_NO_TLS12
  22312. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  22313. defined(HAVE_SERVER_RENEGOTIATION_INFO) && \
  22314. !defined(WOLFSSL_NO_SERVER)
  22315. /* handle generation of server's hello_request (0) */
  22316. int SendHelloRequest(WOLFSSL* ssl)
  22317. {
  22318. byte* output;
  22319. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22320. int ret;
  22321. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  22322. WOLFSSL_ENTER("SendHelloRequest");
  22323. if (IsEncryptionOn(ssl, 1))
  22324. sendSz += MAX_MSG_EXTRA;
  22325. /* check for available size */
  22326. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  22327. return ret;
  22328. /* get output buffer */
  22329. output = ssl->buffers.outputBuffer.buffer +
  22330. ssl->buffers.outputBuffer.length;
  22331. AddHeaders(output, 0, hello_request, ssl);
  22332. if (IsEncryptionOn(ssl, 1)) {
  22333. byte* input;
  22334. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  22335. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22336. if (input == NULL)
  22337. return MEMORY_E;
  22338. XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
  22339. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  22340. handshake, 0, 0, 0);
  22341. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22342. if (sendSz < 0)
  22343. return sendSz;
  22344. }
  22345. ssl->buffers.outputBuffer.length += sendSz;
  22346. ret = SendBuffered(ssl);
  22347. WOLFSSL_LEAVE("SendHelloRequest", ret);
  22348. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  22349. return ret;
  22350. }
  22351. #endif /* HAVE_SECURE_RENEGOTIATION && HAVE_SERVER_RENEGOTIATION_INFO */
  22352. #ifdef WOLFSSL_DTLS
  22353. /* handle generation of DTLS hello_verify_request (3) */
  22354. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  22355. const byte* cookie, byte cookieSz)
  22356. {
  22357. byte* output;
  22358. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  22359. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  22360. int sendSz = length + idx;
  22361. int ret;
  22362. /* check for available size */
  22363. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  22364. return ret;
  22365. /* get output buffer */
  22366. output = ssl->buffers.outputBuffer.buffer +
  22367. ssl->buffers.outputBuffer.length;
  22368. /* Hello Verify Request should use the same sequence number as the
  22369. * Client Hello. */
  22370. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  22371. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  22372. AddHeaders(output, length, hello_verify_request, ssl);
  22373. #ifdef OPENSSL_EXTRA
  22374. output[idx++] = DTLS_MAJOR;
  22375. output[idx++] = DTLS_MINOR;
  22376. #else
  22377. output[idx++] = ssl->version.major;
  22378. output[idx++] = ssl->version.minor;
  22379. #endif
  22380. output[idx++] = cookieSz;
  22381. if (cookie == NULL || cookieSz == 0)
  22382. return COOKIE_ERROR;
  22383. XMEMCPY(output + idx, cookie, cookieSz);
  22384. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  22385. if (ssl->hsInfoOn)
  22386. AddPacketName(ssl, "HelloVerifyRequest");
  22387. if (ssl->toInfoOn)
  22388. AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  22389. sendSz, WRITE_PROTO, ssl->heap);
  22390. #endif
  22391. ssl->buffers.outputBuffer.length += sendSz;
  22392. return SendBuffered(ssl);
  22393. }
  22394. #endif /* WOLFSSL_DTLS */
  22395. typedef struct DckeArgs {
  22396. byte* output; /* not allocated */
  22397. word32 length;
  22398. word32 idx;
  22399. word32 begin;
  22400. word32 sigSz;
  22401. #ifndef NO_RSA
  22402. int lastErr;
  22403. #endif
  22404. } DckeArgs;
  22405. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  22406. {
  22407. DckeArgs* args = (DckeArgs*)pArgs;
  22408. (void)ssl;
  22409. (void)args;
  22410. }
  22411. /* handle processing client_key_exchange (16) */
  22412. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  22413. word32 size)
  22414. {
  22415. int ret;
  22416. #ifdef WOLFSSL_ASYNC_CRYPT
  22417. DckeArgs* args = (DckeArgs*)ssl->async.args;
  22418. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  22419. (void)sizeof(args_test);
  22420. #else
  22421. DckeArgs args[1];
  22422. #endif
  22423. (void)size;
  22424. (void)input;
  22425. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  22426. WOLFSSL_ENTER("DoClientKeyExchange");
  22427. #ifdef WOLFSSL_ASYNC_CRYPT
  22428. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  22429. if (ret != WC_NOT_PENDING_E) {
  22430. /* Check for error */
  22431. if (ret < 0)
  22432. goto exit_dcke;
  22433. }
  22434. else
  22435. #endif /* WOLFSSL_ASYNC_CRYPT */
  22436. {
  22437. /* Reset state */
  22438. ret = 0;
  22439. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  22440. XMEMSET(args, 0, sizeof(DckeArgs));
  22441. args->idx = *inOutIdx;
  22442. args->begin = *inOutIdx;
  22443. #ifdef WOLFSSL_ASYNC_CRYPT
  22444. ssl->async.freeArgs = FreeDckeArgs;
  22445. #endif
  22446. }
  22447. /* Do Client Key Exchange State Machine */
  22448. switch(ssl->options.asyncState)
  22449. {
  22450. case TLS_ASYNC_BEGIN:
  22451. {
  22452. /* Sanity checks */
  22453. if (ssl->options.side != WOLFSSL_SERVER_END) {
  22454. WOLFSSL_MSG("Client received client keyexchange, attack?");
  22455. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  22456. ERROR_OUT(WOLFSSL_FATAL_ERROR, exit_dcke);
  22457. }
  22458. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  22459. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  22460. SendAlert(ssl, alert_fatal, unexpected_message);
  22461. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  22462. }
  22463. #ifndef NO_CERTS
  22464. if (ssl->options.verifyPeer && ssl->options.failNoCert) {
  22465. if (!ssl->options.havePeerCert) {
  22466. WOLFSSL_MSG("client didn't present peer cert");
  22467. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  22468. }
  22469. }
  22470. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  22471. if (!ssl->options.havePeerCert &&
  22472. !ssl->options.usingPSK_cipher) {
  22473. WOLFSSL_MSG("client didn't present peer cert");
  22474. return NO_PEER_CERT;
  22475. }
  22476. }
  22477. #endif /* !NO_CERTS */
  22478. #if defined(WOLFSSL_CALLBACKS)
  22479. if (ssl->hsInfoOn) {
  22480. AddPacketName(ssl, "ClientKeyExchange");
  22481. }
  22482. if (ssl->toInfoOn) {
  22483. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  22484. }
  22485. #endif
  22486. if (ssl->arrays->preMasterSecret == NULL) {
  22487. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  22488. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  22489. ssl->heap, DYNAMIC_TYPE_SECRET);
  22490. if (ssl->arrays->preMasterSecret == NULL) {
  22491. ERROR_OUT(MEMORY_E, exit_dcke);
  22492. }
  22493. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  22494. }
  22495. switch (ssl->specs.kea) {
  22496. #ifndef NO_RSA
  22497. case rsa_kea:
  22498. {
  22499. break;
  22500. } /* rsa_kea */
  22501. #endif /* !NO_RSA */
  22502. #ifndef NO_PSK
  22503. case psk_kea:
  22504. {
  22505. /* sanity check that PSK server callback has been set */
  22506. if (ssl->options.server_psk_cb == NULL) {
  22507. WOLFSSL_MSG("No server PSK callback set");
  22508. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  22509. }
  22510. break;
  22511. }
  22512. #endif /* !NO_PSK */
  22513. #ifdef HAVE_NTRU
  22514. case ntru_kea:
  22515. {
  22516. /* make sure private key exists */
  22517. if (ssl->buffers.key == NULL ||
  22518. ssl->buffers.key->buffer == NULL) {
  22519. ERROR_OUT(NO_PRIVATE_KEY, exit_dcke);
  22520. }
  22521. break;
  22522. }
  22523. #endif /* HAVE_NTRU */
  22524. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  22525. case ecc_diffie_hellman_kea:
  22526. {
  22527. break;
  22528. }
  22529. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  22530. #ifndef NO_DH
  22531. case diffie_hellman_kea:
  22532. {
  22533. break;
  22534. }
  22535. #endif /* !NO_DH */
  22536. #if !defined(NO_DH) && !defined(NO_PSK)
  22537. case dhe_psk_kea:
  22538. {
  22539. /* sanity check that PSK server callback has been set */
  22540. if (ssl->options.server_psk_cb == NULL) {
  22541. WOLFSSL_MSG("No server PSK callback set");
  22542. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  22543. }
  22544. break;
  22545. }
  22546. #endif /* !NO_DH && !NO_PSK */
  22547. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  22548. !defined(NO_PSK)
  22549. case ecdhe_psk_kea:
  22550. {
  22551. /* sanity check that PSK server callback has been set */
  22552. if (ssl->options.server_psk_cb == NULL) {
  22553. WOLFSSL_MSG("No server PSK callback set");
  22554. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  22555. }
  22556. break;
  22557. }
  22558. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  22559. default:
  22560. WOLFSSL_MSG("Bad kea type");
  22561. ret = BAD_KEA_TYPE_E;
  22562. } /* switch (ssl->specs.kea) */
  22563. /* Check for error */
  22564. if (ret != 0) {
  22565. goto exit_dcke;
  22566. }
  22567. /* Advance state and proceed */
  22568. ssl->options.asyncState = TLS_ASYNC_BUILD;
  22569. } /* TLS_ASYNC_BEGIN */
  22570. FALL_THROUGH;
  22571. case TLS_ASYNC_BUILD:
  22572. {
  22573. switch (ssl->specs.kea) {
  22574. #ifndef NO_RSA
  22575. case rsa_kea:
  22576. {
  22577. word16 keySz;
  22578. ssl->buffers.keyType = rsa_sa_algo;
  22579. ret = DecodePrivateKey(ssl, &keySz);
  22580. if (ret != 0) {
  22581. goto exit_dcke;
  22582. }
  22583. args->length = (word32)keySz;
  22584. ssl->arrays->preMasterSz = SECRET_LEN;
  22585. if (ssl->options.tls) {
  22586. word16 check;
  22587. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  22588. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22589. }
  22590. ato16(input + args->idx, &check);
  22591. args->idx += OPAQUE16_LEN;
  22592. if ((word32)check != args->length) {
  22593. WOLFSSL_MSG("RSA explicit size doesn't match");
  22594. #ifdef WOLFSSL_EXTRA_ALERTS
  22595. SendAlert(ssl, alert_fatal, bad_record_mac);
  22596. #endif
  22597. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  22598. }
  22599. }
  22600. if ((args->idx - args->begin) + args->length > size) {
  22601. WOLFSSL_MSG("RSA message too big");
  22602. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22603. }
  22604. /* pre-load PreMasterSecret with RNG data */
  22605. ret = wc_RNG_GenerateBlock(ssl->rng,
  22606. &ssl->arrays->preMasterSecret[VERSION_SZ],
  22607. SECRET_LEN - VERSION_SZ);
  22608. if (ret != 0) {
  22609. goto exit_dcke;
  22610. }
  22611. args->output = NULL;
  22612. break;
  22613. } /* rsa_kea */
  22614. #endif /* !NO_RSA */
  22615. #ifndef NO_PSK
  22616. case psk_kea:
  22617. {
  22618. byte* pms = ssl->arrays->preMasterSecret;
  22619. word16 ci_sz;
  22620. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  22621. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22622. }
  22623. ato16(input + args->idx, &ci_sz);
  22624. args->idx += OPAQUE16_LEN;
  22625. if (ci_sz > MAX_PSK_ID_LEN) {
  22626. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  22627. }
  22628. if ((args->idx - args->begin) + ci_sz > size) {
  22629. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22630. }
  22631. XMEMCPY(ssl->arrays->client_identity,
  22632. input + args->idx, ci_sz);
  22633. args->idx += ci_sz;
  22634. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  22635. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  22636. ssl->arrays->client_identity, ssl->arrays->psk_key,
  22637. MAX_PSK_KEY_LEN);
  22638. if (ssl->arrays->psk_keySz == 0 ||
  22639. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  22640. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  22641. }
  22642. /* make psk pre master secret */
  22643. /* length of key + length 0s + length of key + key */
  22644. c16toa((word16) ssl->arrays->psk_keySz, pms);
  22645. pms += OPAQUE16_LEN;
  22646. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  22647. pms += ssl->arrays->psk_keySz;
  22648. c16toa((word16) ssl->arrays->psk_keySz, pms);
  22649. pms += OPAQUE16_LEN;
  22650. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  22651. ssl->arrays->preMasterSz =
  22652. (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
  22653. break;
  22654. }
  22655. #endif /* !NO_PSK */
  22656. #ifdef HAVE_NTRU
  22657. case ntru_kea:
  22658. {
  22659. word16 cipherLen;
  22660. word16 plainLen = ENCRYPT_LEN;
  22661. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  22662. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22663. }
  22664. ato16(input + args->idx, &cipherLen);
  22665. args->idx += OPAQUE16_LEN;
  22666. if (cipherLen > MAX_NTRU_ENCRYPT_SZ) {
  22667. ERROR_OUT(NTRU_KEY_ERROR, exit_dcke);
  22668. }
  22669. if ((args->idx - args->begin) + cipherLen > size) {
  22670. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22671. }
  22672. if (NTRU_OK != ntru_crypto_ntru_decrypt(
  22673. (word16) ssl->buffers.key->length,
  22674. ssl->buffers.key->buffer, cipherLen,
  22675. input + args->idx, &plainLen,
  22676. ssl->arrays->preMasterSecret)) {
  22677. ERROR_OUT(NTRU_DECRYPT_ERROR, exit_dcke);
  22678. }
  22679. if (plainLen != SECRET_LEN) {
  22680. ERROR_OUT(NTRU_DECRYPT_ERROR, exit_dcke);
  22681. }
  22682. args->idx += cipherLen;
  22683. ssl->arrays->preMasterSz = plainLen;
  22684. break;
  22685. }
  22686. #endif /* HAVE_NTRU */
  22687. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  22688. case ecc_diffie_hellman_kea:
  22689. {
  22690. #ifdef HAVE_ECC
  22691. ecc_key* private_key = ssl->eccTempKey;
  22692. /* handle static private key */
  22693. if (ssl->specs.static_ecdh &&
  22694. ssl->ecdhCurveOID != ECC_X25519_OID) {
  22695. word16 keySz;
  22696. ssl->buffers.keyType = ecc_dsa_sa_algo;
  22697. ret = DecodePrivateKey(ssl, &keySz);
  22698. if (ret != 0) {
  22699. goto exit_dcke;
  22700. }
  22701. private_key = (ecc_key*)ssl->hsKey;
  22702. }
  22703. #endif
  22704. /* import peer ECC key */
  22705. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  22706. #ifdef WOLFSSL_EXTRA_ALERTS
  22707. SendAlert(ssl, alert_fatal, decode_error);
  22708. #endif
  22709. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22710. }
  22711. args->length = input[args->idx++];
  22712. if ((args->idx - args->begin) + args->length > size) {
  22713. #ifdef WOLFSSL_EXTRA_ALERTS
  22714. SendAlert(ssl, alert_fatal, decode_error);
  22715. #endif
  22716. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22717. }
  22718. #ifdef HAVE_CURVE25519
  22719. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22720. #ifdef HAVE_PK_CALLBACKS
  22721. /* if callback then use it for shared secret */
  22722. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  22723. break;
  22724. }
  22725. #endif
  22726. if (ssl->peerX25519Key == NULL) {
  22727. /* alloc/init on demand */
  22728. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  22729. (void**)&ssl->peerX25519Key);
  22730. if (ret != 0) {
  22731. goto exit_dcke;
  22732. }
  22733. } else if (ssl->peerX25519KeyPresent) {
  22734. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  22735. ssl->peerX25519Key);
  22736. ssl->peerX25519KeyPresent = 0;
  22737. if (ret != 0) {
  22738. goto exit_dcke;
  22739. }
  22740. }
  22741. if (wc_curve25519_import_public_ex(
  22742. input + args->idx, args->length,
  22743. ssl->peerX25519Key,
  22744. EC25519_LITTLE_ENDIAN)) {
  22745. #ifdef WOLFSSL_EXTRA_ALERTS
  22746. SendAlert(ssl, alert_fatal, illegal_parameter);
  22747. #endif
  22748. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  22749. }
  22750. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  22751. ssl->peerX25519KeyPresent = 1;
  22752. break;
  22753. }
  22754. #endif
  22755. #ifdef HAVE_ECC
  22756. #ifdef HAVE_PK_CALLBACKS
  22757. /* if callback then use it for shared secret */
  22758. if (ssl->ctx->EccSharedSecretCb != NULL) {
  22759. break;
  22760. }
  22761. #endif
  22762. if (!ssl->specs.static_ecdh &&
  22763. ssl->eccTempKeyPresent == 0) {
  22764. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  22765. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  22766. }
  22767. if (ssl->peerEccKey == NULL) {
  22768. /* alloc/init on demand */
  22769. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  22770. (void**)&ssl->peerEccKey);
  22771. if (ret != 0) {
  22772. goto exit_dcke;
  22773. }
  22774. } else if (ssl->peerEccKeyPresent) {
  22775. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  22776. ssl->peerEccKey);
  22777. ssl->peerEccKeyPresent = 0;
  22778. if (ret != 0) {
  22779. goto exit_dcke;
  22780. }
  22781. }
  22782. if (wc_ecc_import_x963_ex(input + args->idx, args->length,
  22783. ssl->peerEccKey, private_key->dp->id)) {
  22784. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  22785. }
  22786. ssl->arrays->preMasterSz = private_key->dp->size;
  22787. ssl->peerEccKeyPresent = 1;
  22788. #endif /* HAVE_ECC */
  22789. break;
  22790. }
  22791. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  22792. #ifndef NO_DH
  22793. case diffie_hellman_kea:
  22794. {
  22795. word16 clientPubSz;
  22796. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  22797. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22798. }
  22799. ato16(input + args->idx, &clientPubSz);
  22800. args->idx += OPAQUE16_LEN;
  22801. if ((args->idx - args->begin) + clientPubSz > size) {
  22802. #ifdef WOLFSSL_EXTRA_ALERTS
  22803. SendAlert(ssl, alert_fatal, decode_error);
  22804. #endif
  22805. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22806. }
  22807. args->sigSz = clientPubSz;
  22808. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  22809. (void**)&ssl->buffers.serverDH_Key);
  22810. if (ret != 0) {
  22811. goto exit_dcke;
  22812. }
  22813. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  22814. ssl->buffers.serverDH_P.buffer,
  22815. ssl->buffers.serverDH_P.length,
  22816. ssl->buffers.serverDH_G.buffer,
  22817. ssl->buffers.serverDH_G.length);
  22818. /* set the max agree result size */
  22819. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  22820. break;
  22821. }
  22822. #endif /* !NO_DH */
  22823. #if !defined(NO_DH) && !defined(NO_PSK)
  22824. case dhe_psk_kea:
  22825. {
  22826. word16 clientSz;
  22827. /* Read in the PSK hint */
  22828. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  22829. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22830. }
  22831. ato16(input + args->idx, &clientSz);
  22832. args->idx += OPAQUE16_LEN;
  22833. if (clientSz > MAX_PSK_ID_LEN) {
  22834. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  22835. }
  22836. if ((args->idx - args->begin) + clientSz > size) {
  22837. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22838. }
  22839. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  22840. clientSz);
  22841. args->idx += clientSz;
  22842. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  22843. /* Read in the DHE business */
  22844. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  22845. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22846. }
  22847. ato16(input + args->idx, &clientSz);
  22848. args->idx += OPAQUE16_LEN;
  22849. if ((args->idx - args->begin) + clientSz > size) {
  22850. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22851. }
  22852. args->sigSz = clientSz;
  22853. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  22854. (void**)&ssl->buffers.serverDH_Key);
  22855. if (ret != 0) {
  22856. goto exit_dcke;
  22857. }
  22858. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  22859. ssl->buffers.serverDH_P.buffer,
  22860. ssl->buffers.serverDH_P.length,
  22861. ssl->buffers.serverDH_G.buffer,
  22862. ssl->buffers.serverDH_G.length);
  22863. break;
  22864. }
  22865. #endif /* !NO_DH && !NO_PSK */
  22866. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  22867. !defined(NO_PSK)
  22868. case ecdhe_psk_kea:
  22869. {
  22870. word16 clientSz;
  22871. /* Read in the PSK hint */
  22872. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  22873. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22874. }
  22875. ato16(input + args->idx, &clientSz);
  22876. args->idx += OPAQUE16_LEN;
  22877. if (clientSz > MAX_PSK_ID_LEN) {
  22878. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  22879. }
  22880. if ((args->idx - args->begin) + clientSz > size) {
  22881. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22882. }
  22883. XMEMCPY(ssl->arrays->client_identity,
  22884. input + args->idx, clientSz);
  22885. args->idx += clientSz;
  22886. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  22887. /* import peer ECC key */
  22888. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  22889. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22890. }
  22891. args->length = input[args->idx++];
  22892. if ((args->idx - args->begin) + args->length > size) {
  22893. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  22894. }
  22895. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  22896. #ifdef HAVE_CURVE25519
  22897. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22898. #ifdef HAVE_PK_CALLBACKS
  22899. /* if callback then use it for shared secret */
  22900. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  22901. break;
  22902. }
  22903. #endif
  22904. if (ssl->eccTempKeyPresent == 0) {
  22905. WOLFSSL_MSG(
  22906. "X25519 ephemeral key not made correctly");
  22907. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  22908. }
  22909. if (ssl->peerX25519Key == NULL) {
  22910. /* alloc/init on demand */
  22911. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  22912. (void**)&ssl->peerX25519Key);
  22913. if (ret != 0) {
  22914. goto exit_dcke;
  22915. }
  22916. } else if (ssl->peerX25519KeyPresent) {
  22917. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  22918. ssl->peerX25519Key);
  22919. ssl->peerX25519KeyPresent = 0;
  22920. if (ret != 0) {
  22921. goto exit_dcke;
  22922. }
  22923. }
  22924. if ((ret = wc_curve25519_check_public(
  22925. input + args->idx, args->length,
  22926. EC25519_LITTLE_ENDIAN)) != 0) {
  22927. #ifdef WOLFSSL_EXTRA_ALERTS
  22928. if (ret == BUFFER_E)
  22929. SendAlert(ssl, alert_fatal, decode_error);
  22930. else if (ret == ECC_OUT_OF_RANGE_E)
  22931. SendAlert(ssl, alert_fatal, bad_record_mac);
  22932. else {
  22933. SendAlert(ssl, alert_fatal,
  22934. illegal_parameter);
  22935. }
  22936. #endif
  22937. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  22938. }
  22939. if (wc_curve25519_import_public_ex(
  22940. input + args->idx, args->length,
  22941. ssl->peerX25519Key,
  22942. EC25519_LITTLE_ENDIAN)) {
  22943. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  22944. }
  22945. ssl->peerX25519KeyPresent = 1;
  22946. break;
  22947. }
  22948. #endif
  22949. #ifdef HAVE_PK_CALLBACKS
  22950. /* if callback then use it for shared secret */
  22951. if (ssl->ctx->EccSharedSecretCb != NULL) {
  22952. break;
  22953. }
  22954. #endif
  22955. if (ssl->eccTempKeyPresent == 0) {
  22956. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  22957. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  22958. }
  22959. if (ssl->peerEccKey == NULL) {
  22960. /* alloc/init on demand */
  22961. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  22962. (void**)&ssl->peerEccKey);
  22963. if (ret != 0) {
  22964. goto exit_dcke;
  22965. }
  22966. }
  22967. else if (ssl->peerEccKeyPresent) {
  22968. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  22969. ssl->peerEccKey);
  22970. ssl->peerEccKeyPresent = 0;
  22971. if (ret != 0) {
  22972. goto exit_dcke;
  22973. }
  22974. }
  22975. if (wc_ecc_import_x963_ex(input + args->idx, args->length,
  22976. ssl->peerEccKey, ssl->eccTempKey->dp->id)) {
  22977. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  22978. }
  22979. ssl->peerEccKeyPresent = 1;
  22980. break;
  22981. }
  22982. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  22983. default:
  22984. ret = BAD_KEA_TYPE_E;
  22985. } /* switch (ssl->specs.kea) */
  22986. /* Check for error */
  22987. if (ret != 0) {
  22988. goto exit_dcke;
  22989. }
  22990. /* Advance state and proceed */
  22991. ssl->options.asyncState = TLS_ASYNC_DO;
  22992. } /* TLS_ASYNC_BUILD */
  22993. FALL_THROUGH;
  22994. case TLS_ASYNC_DO:
  22995. {
  22996. switch (ssl->specs.kea) {
  22997. #ifndef NO_RSA
  22998. case rsa_kea:
  22999. {
  23000. RsaKey* key = (RsaKey*)ssl->hsKey;
  23001. ret = RsaDec(ssl,
  23002. input + args->idx,
  23003. args->length,
  23004. &args->output,
  23005. &args->sigSz,
  23006. key,
  23007. #ifdef HAVE_PK_CALLBACKS
  23008. ssl->buffers.key
  23009. #else
  23010. NULL
  23011. #endif
  23012. );
  23013. /* Errors that can occur here that should be
  23014. * indistinguishable:
  23015. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  23016. */
  23017. #ifdef WOLFSSL_ASYNC_CRYPT
  23018. if (ret == WC_PENDING_E)
  23019. goto exit_dcke;
  23020. #endif
  23021. if (ret == BAD_FUNC_ARG)
  23022. goto exit_dcke;
  23023. args->lastErr = ret - (SECRET_LEN - args->sigSz);
  23024. ret = 0;
  23025. break;
  23026. } /* rsa_kea */
  23027. #endif /* !NO_RSA */
  23028. #ifndef NO_PSK
  23029. case psk_kea:
  23030. {
  23031. break;
  23032. }
  23033. #endif /* !NO_PSK */
  23034. #ifdef HAVE_NTRU
  23035. case ntru_kea:
  23036. {
  23037. break;
  23038. }
  23039. #endif /* HAVE_NTRU */
  23040. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  23041. case ecc_diffie_hellman_kea:
  23042. {
  23043. void* private_key = ssl->eccTempKey;
  23044. (void)private_key;
  23045. #ifdef HAVE_CURVE25519
  23046. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  23047. ret = X25519SharedSecret(ssl,
  23048. (curve25519_key*)private_key,
  23049. ssl->peerX25519Key,
  23050. input + args->idx, &args->length,
  23051. ssl->arrays->preMasterSecret,
  23052. &ssl->arrays->preMasterSz,
  23053. WOLFSSL_SERVER_END
  23054. );
  23055. break;
  23056. }
  23057. #endif
  23058. #ifdef HAVE_ECC
  23059. if (ssl->specs.static_ecdh) {
  23060. private_key = ssl->hsKey;
  23061. }
  23062. /* Generate shared secret */
  23063. ret = EccSharedSecret(ssl,
  23064. (ecc_key*)private_key, ssl->peerEccKey,
  23065. input + args->idx, &args->length,
  23066. ssl->arrays->preMasterSecret,
  23067. &ssl->arrays->preMasterSz,
  23068. WOLFSSL_SERVER_END
  23069. );
  23070. #ifdef WOLFSSL_ASYNC_CRYPT
  23071. if (ret != WC_PENDING_E)
  23072. #endif
  23073. {
  23074. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  23075. (void**)&ssl->peerEccKey);
  23076. ssl->peerEccKeyPresent = 0;
  23077. }
  23078. #endif
  23079. break;
  23080. }
  23081. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  23082. #ifndef NO_DH
  23083. case diffie_hellman_kea:
  23084. {
  23085. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  23086. ssl->buffers.serverDH_Priv.buffer,
  23087. ssl->buffers.serverDH_Priv.length,
  23088. input + args->idx,
  23089. (word16)args->sigSz,
  23090. ssl->arrays->preMasterSecret,
  23091. &ssl->arrays->preMasterSz);
  23092. break;
  23093. }
  23094. #endif /* !NO_DH */
  23095. #if !defined(NO_DH) && !defined(NO_PSK)
  23096. case dhe_psk_kea:
  23097. {
  23098. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  23099. ssl->buffers.serverDH_Priv.buffer,
  23100. ssl->buffers.serverDH_Priv.length,
  23101. input + args->idx,
  23102. (word16)args->sigSz,
  23103. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  23104. &ssl->arrays->preMasterSz);
  23105. break;
  23106. }
  23107. #endif /* !NO_DH && !NO_PSK */
  23108. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  23109. !defined(NO_PSK)
  23110. case ecdhe_psk_kea:
  23111. {
  23112. #ifdef HAVE_CURVE25519
  23113. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  23114. ret = X25519SharedSecret(ssl,
  23115. (curve25519_key*)ssl->eccTempKey,
  23116. ssl->peerX25519Key,
  23117. input + args->idx, &args->length,
  23118. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  23119. &args->sigSz,
  23120. WOLFSSL_SERVER_END
  23121. );
  23122. #ifdef WOLFSSL_ASYNC_CRYPT
  23123. if (ret != WC_PENDING_E)
  23124. #endif
  23125. {
  23126. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  23127. (void**)&ssl->peerX25519Key);
  23128. ssl->peerX25519KeyPresent = 0;
  23129. }
  23130. break;
  23131. }
  23132. #endif
  23133. /* Generate shared secret */
  23134. ret = EccSharedSecret(ssl,
  23135. ssl->eccTempKey, ssl->peerEccKey,
  23136. input + args->idx, &args->length,
  23137. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  23138. &args->sigSz,
  23139. WOLFSSL_SERVER_END
  23140. );
  23141. if (!ssl->specs.static_ecdh
  23142. #ifdef WOLFSSL_ASYNC_CRYPT
  23143. && ret != WC_PENDING_E
  23144. #endif
  23145. ) {
  23146. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  23147. (void**)&ssl->peerEccKey);
  23148. ssl->peerEccKeyPresent = 0;
  23149. }
  23150. break;
  23151. }
  23152. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  23153. default:
  23154. ret = BAD_KEA_TYPE_E;
  23155. } /* switch (ssl->specs.kea) */
  23156. /* Check for error */
  23157. if (ret != 0) {
  23158. goto exit_dcke;
  23159. }
  23160. /* Advance state and proceed */
  23161. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  23162. } /* TLS_ASYNC_DO */
  23163. FALL_THROUGH;
  23164. case TLS_ASYNC_VERIFY:
  23165. {
  23166. switch (ssl->specs.kea) {
  23167. #ifndef NO_RSA
  23168. case rsa_kea:
  23169. {
  23170. byte mask;
  23171. int i;
  23172. /* Add the signature length to idx */
  23173. args->idx += args->length;
  23174. #ifdef DEBUG_WOLFSSL
  23175. /* check version (debug warning message only) */
  23176. if (args->output != NULL) {
  23177. if (args->output[0] != ssl->chVersion.major ||
  23178. args->output[1] != ssl->chVersion.minor) {
  23179. WOLFSSL_MSG("preMasterSecret version mismatch");
  23180. }
  23181. }
  23182. #endif
  23183. /* RFC5246 7.4.7.1:
  23184. * Treat incorrectly formatted message blocks and/or
  23185. * mismatched version numbers in a manner
  23186. * indistinguishable from correctly formatted RSA blocks
  23187. */
  23188. ret = args->lastErr;
  23189. args->lastErr = 0; /* reset */
  23190. /* On error 'ret' will be negative - top bit set */
  23191. mask = (ret >> ((sizeof(ret) * 8) - 1)) - 1;
  23192. /* build PreMasterSecret */
  23193. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  23194. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  23195. if (args->output != NULL) {
  23196. /* Use random secret on error */
  23197. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  23198. ssl->arrays->preMasterSecret[i] =
  23199. ctMaskSel(mask, args->output[i],
  23200. ssl->arrays->preMasterSecret[i]);
  23201. }
  23202. }
  23203. /* preMasterSecret has RNG and version set
  23204. * return proper length and ignore error
  23205. * error will be caught as decryption error
  23206. */
  23207. args->sigSz = SECRET_LEN;
  23208. ret = 0;
  23209. break;
  23210. } /* rsa_kea */
  23211. #endif /* !NO_RSA */
  23212. #ifndef NO_PSK
  23213. case psk_kea:
  23214. {
  23215. break;
  23216. }
  23217. #endif /* !NO_PSK */
  23218. #ifdef HAVE_NTRU
  23219. case ntru_kea:
  23220. {
  23221. break;
  23222. }
  23223. #endif /* HAVE_NTRU */
  23224. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
  23225. case ecc_diffie_hellman_kea:
  23226. {
  23227. /* skip past the imported peer key */
  23228. args->idx += args->length;
  23229. break;
  23230. }
  23231. #endif /* HAVE_ECC || HAVE_CURVE25519 */
  23232. #ifndef NO_DH
  23233. case diffie_hellman_kea:
  23234. {
  23235. args->idx += (word16)args->sigSz;
  23236. break;
  23237. }
  23238. #endif /* !NO_DH */
  23239. #if !defined(NO_DH) && !defined(NO_PSK)
  23240. case dhe_psk_kea:
  23241. {
  23242. byte* pms = ssl->arrays->preMasterSecret;
  23243. word16 clientSz = (word16)args->sigSz;
  23244. args->idx += clientSz;
  23245. c16toa((word16)ssl->arrays->preMasterSz, pms);
  23246. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  23247. pms += ssl->arrays->preMasterSz;
  23248. /* Use the PSK hint to look up the PSK and add it to the
  23249. * preMasterSecret here. */
  23250. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  23251. ssl->arrays->client_identity, ssl->arrays->psk_key,
  23252. MAX_PSK_KEY_LEN);
  23253. if (ssl->arrays->psk_keySz == 0 ||
  23254. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  23255. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  23256. }
  23257. c16toa((word16) ssl->arrays->psk_keySz, pms);
  23258. pms += OPAQUE16_LEN;
  23259. XMEMCPY(pms, ssl->arrays->psk_key,
  23260. ssl->arrays->psk_keySz);
  23261. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
  23262. OPAQUE16_LEN;
  23263. break;
  23264. }
  23265. #endif /* !NO_DH && !NO_PSK */
  23266. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  23267. !defined(NO_PSK)
  23268. case ecdhe_psk_kea:
  23269. {
  23270. byte* pms = ssl->arrays->preMasterSecret;
  23271. word16 clientSz = (word16)args->sigSz;
  23272. /* skip past the imported peer key */
  23273. args->idx += args->length;
  23274. /* Add preMasterSecret */
  23275. c16toa(clientSz, pms);
  23276. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  23277. pms += ssl->arrays->preMasterSz;
  23278. /* Use the PSK hint to look up the PSK and add it to the
  23279. * preMasterSecret here. */
  23280. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  23281. ssl->arrays->client_identity, ssl->arrays->psk_key,
  23282. MAX_PSK_KEY_LEN);
  23283. if (ssl->arrays->psk_keySz == 0 ||
  23284. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  23285. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  23286. }
  23287. c16toa((word16) ssl->arrays->psk_keySz, pms);
  23288. pms += OPAQUE16_LEN;
  23289. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  23290. ssl->arrays->preMasterSz +=
  23291. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  23292. break;
  23293. }
  23294. #endif /* (HAVE_ECC || HAVE_CURVE25519) && !NO_PSK */
  23295. default:
  23296. ret = BAD_KEA_TYPE_E;
  23297. } /* switch (ssl->specs.kea) */
  23298. /* Check for error */
  23299. if (ret != 0) {
  23300. goto exit_dcke;
  23301. }
  23302. /* Advance state and proceed */
  23303. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  23304. } /* TLS_ASYNC_VERIFY */
  23305. FALL_THROUGH;
  23306. case TLS_ASYNC_FINALIZE:
  23307. {
  23308. if (IsEncryptionOn(ssl, 0)) {
  23309. args->idx += ssl->keys.padSz;
  23310. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  23311. if (ssl->options.encThenMac)
  23312. args->idx += MacSize(ssl);
  23313. #endif
  23314. }
  23315. #ifdef HAVE_QSH
  23316. word16 name;
  23317. if (ssl->options.haveQSH) {
  23318. /* extension name */
  23319. ato16(input + args->idx, &name);
  23320. args->idx += OPAQUE16_LEN;
  23321. if (name == TLSX_QUANTUM_SAFE_HYBRID) {
  23322. int qshSz;
  23323. /* if qshSz is larger than 0 it is the
  23324. length of buffer used */
  23325. if ((qshSz = TLSX_QSHCipher_Parse(ssl,
  23326. input + args->idx,
  23327. size - args->idx + args->begin, 1)) < 0) {
  23328. ERROR_OUT(qshSz, exit_dcke);
  23329. }
  23330. args->idx += qshSz;
  23331. }
  23332. else {
  23333. /* unknown extension sent client ignored handshake */
  23334. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  23335. }
  23336. }
  23337. #endif /* HAVE_QSH */
  23338. ret = MakeMasterSecret(ssl);
  23339. /* Check for error */
  23340. if (ret != 0) {
  23341. goto exit_dcke;
  23342. }
  23343. /* Advance state and proceed */
  23344. ssl->options.asyncState = TLS_ASYNC_END;
  23345. } /* TLS_ASYNC_FINALIZE */
  23346. FALL_THROUGH;
  23347. case TLS_ASYNC_END:
  23348. {
  23349. /* Set final index */
  23350. *inOutIdx = args->idx;
  23351. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  23352. #ifndef NO_CERTS
  23353. if (ssl->options.verifyPeer) {
  23354. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  23355. }
  23356. #endif
  23357. break;
  23358. } /* TLS_ASYNC_END */
  23359. default:
  23360. ret = INPUT_CASE_ERROR;
  23361. } /* switch(ssl->options.asyncState) */
  23362. exit_dcke:
  23363. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  23364. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  23365. #ifdef WOLFSSL_ASYNC_CRYPT
  23366. /* Handle async operation */
  23367. if (ret == WC_PENDING_E) {
  23368. /* Mark message as not received so it can process again */
  23369. ssl->msgsReceived.got_client_key_exchange = 0;
  23370. return ret;
  23371. }
  23372. #endif /* WOLFSSL_ASYNC_CRYPT */
  23373. /* Cleanup PMS */
  23374. if (ssl->arrays->preMasterSecret != NULL) {
  23375. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  23376. }
  23377. ssl->arrays->preMasterSz = 0;
  23378. /* Final cleanup */
  23379. FreeDckeArgs(ssl, args);
  23380. FreeKeyExchange(ssl);
  23381. return ret;
  23382. }
  23383. #endif /* !WOLFSSL_NO_TLS12 */
  23384. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  23385. defined(WOLFSSL_HAPROXY)
  23386. int SNI_Callback(WOLFSSL* ssl)
  23387. {
  23388. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  23389. * when SNI is received. Call it now if exists */
  23390. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  23391. WOLFSSL_MSG("Calling custom sni callback");
  23392. if(ssl->ctx->sniRecvCb(ssl, NULL, ssl->ctx->sniRecvCbArg)
  23393. == alert_fatal) {
  23394. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  23395. SendAlert(ssl, alert_fatal, unrecognized_name);
  23396. return FATAL_ERROR;
  23397. }
  23398. }
  23399. return 0;
  23400. }
  23401. #endif /* OPENSSL_ALL || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  23402. #endif /* NO_WOLFSSL_SERVER */
  23403. #ifdef WOLFSSL_ASYNC_CRYPT
  23404. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  23405. {
  23406. int ret = 0;
  23407. WC_ASYNC_DEV* asyncDev;
  23408. WOLF_EVENT* event;
  23409. if (ssl == NULL) {
  23410. return BAD_FUNC_ARG;
  23411. }
  23412. /* check for pending async */
  23413. asyncDev = ssl->async.dev;
  23414. if (asyncDev) {
  23415. /* grab event pointer */
  23416. event = &asyncDev->event;
  23417. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  23418. if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) {
  23419. /* advance key share state if doesn't need called again */
  23420. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  23421. (*state)++;
  23422. }
  23423. /* clear event */
  23424. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  23425. /* clear async dev */
  23426. ssl->async.dev = NULL;
  23427. }
  23428. }
  23429. else {
  23430. ret = WC_NOT_PENDING_E;
  23431. }
  23432. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  23433. return ret;
  23434. }
  23435. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  23436. {
  23437. int ret;
  23438. WOLF_EVENT* event;
  23439. if (ssl == NULL || asyncDev == NULL) {
  23440. return BAD_FUNC_ARG;
  23441. }
  23442. /* grab event pointer */
  23443. event = &asyncDev->event;
  23444. /* init event */
  23445. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  23446. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  23447. return ret;
  23448. }
  23449. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  23450. {
  23451. int ret;
  23452. WOLF_EVENT* event;
  23453. if (ssl == NULL || asyncDev == NULL) {
  23454. return BAD_FUNC_ARG;
  23455. }
  23456. /* grab event pointer */
  23457. event = &asyncDev->event;
  23458. /* store reference to active async operation */
  23459. ssl->async.dev = asyncDev;
  23460. /* place event into queue */
  23461. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  23462. /* success means return WC_PENDING_E */
  23463. if (ret == 0) {
  23464. ret = WC_PENDING_E;
  23465. }
  23466. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  23467. return ret;
  23468. }
  23469. #endif /* WOLFSSL_ASYNC_CRYPT */
  23470. /* return the max record size */
  23471. int wolfSSL_GetMaxRecordSize(WOLFSSL* ssl, int maxFragment)
  23472. {
  23473. (void) ssl; /* Avoid compiler warnings */
  23474. if (maxFragment > MAX_RECORD_SIZE) {
  23475. maxFragment = MAX_RECORD_SIZE;
  23476. }
  23477. #ifdef HAVE_MAX_FRAGMENT
  23478. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  23479. maxFragment = ssl->max_fragment;
  23480. }
  23481. #endif /* HAVE_MAX_FRAGMENT */
  23482. #ifdef WOLFSSL_DTLS
  23483. if ((ssl->options.dtls) && (maxFragment > MAX_UDP_SIZE)) {
  23484. maxFragment = MAX_UDP_SIZE;
  23485. }
  23486. #endif
  23487. return maxFragment;
  23488. }
  23489. #undef ERROR_OUT
  23490. #endif /* WOLFCRYPT_ONLY */