tls13.c 484 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833
  1. /* tls13.c
  2. *
  3. * Copyright (C) 2006-2023 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. /*
  22. * BUILD_GCM
  23. * Enables AES-GCM ciphersuites.
  24. * HAVE_AESCCM
  25. * Enables AES-CCM ciphersuites.
  26. * HAVE_SESSION_TICKET
  27. * Enables session tickets - required for TLS 1.3 resumption.
  28. * NO_PSK
  29. * Do not enable Pre-Shared Keys.
  30. * HAVE_KEYING_MATERIAL
  31. * Enables exporting keying material based on section 7.5 of RFC 8446.
  32. * WOLFSSL_ASYNC_CRYPT
  33. * Enables the use of asynchronous cryptographic operations.
  34. * This is available for ciphers and certificates.
  35. * HAVE_CHACHA && HAVE_POLY1305
  36. * Enables use of CHACHA20-POLY1305 ciphersuites.
  37. * WOLFSSL_DEBUG_TLS
  38. * Writes out details of TLS 1.3 protocol including handshake message buffers
  39. * and key generation input and output.
  40. * WOLFSSL_EARLY_DATA
  41. * Allow 0-RTT Handshake using Early Data extensions and handshake message
  42. * WOLFSSL_EARLY_DATA_GROUP
  43. * Group EarlyData message with ClientHello when sending
  44. * WOLFSSL_NO_SERVER_GROUPS_EXT
  45. * Do not send the server's groups in an extension when the server's top
  46. * preference is not in client's list.
  47. * WOLFSSL_POST_HANDSHAKE_AUTH
  48. * Allow TLS v1.3 code to perform post-handshake authentication of the
  49. * client.
  50. * WOLFSSL_SEND_HRR_COOKIE
  51. * Send a cookie in hello_retry_request message to enable stateless tracking
  52. * of ClientHello replies.
  53. * WOLFSSL_TLS13
  54. * Enable TLS 1.3 protocol implementation.
  55. * WOLFSSL_TLS13_MIDDLEBOX_COMPAT
  56. * Enable middlebox compatibility in the TLS 1.3 handshake.
  57. * This includes sending ChangeCipherSpec before encrypted messages and
  58. * including a session id.
  59. * WOLFSSL_TLS13_SHA512
  60. * Allow generation of SHA-512 digests in handshake - no ciphersuite
  61. * requires SHA-512 at this time.
  62. * WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
  63. * Allow a NewSessionTicket message to be sent by server before Client's
  64. * Finished message.
  65. * See TLS v1.3 specification, Section 4.6.1, Paragraph 4 (Note).
  66. * WOLFSSL_PSK_ONE_ID
  67. * When only one PSK ID is used and only one call to the PSK callback can
  68. * be made per connect.
  69. * You cannot use wc_psk_client_cs_callback type callback on client.
  70. * WOLFSSL_PRIORITIZE_PSK
  71. * During a handshake, prioritize PSK order instead of ciphersuite order.
  72. * WOLFSSL_CHECK_ALERT_ON_ERR
  73. * Check for alerts during the handshake in the event of an error.
  74. * WOLFSSL_NO_CLIENT_CERT_ERROR
  75. * Requires client to set a client certificate
  76. * WOLFSSL_PSK_MULTI_ID_PER_CS
  77. * When multiple PSK identities are available for the same cipher suite.
  78. * Sets the first byte of the client identity to the count of identities
  79. * that have been seen so far for the cipher suite.
  80. * WOLFSSL_CHECK_SIG_FAULTS
  81. * Verifies the ECC signature after signing in case of faults in the
  82. * calculation of the signature. Useful when signature fault injection is a
  83. * possible attack.
  84. * WOLFSSL_32BIT_MILLI_TIME
  85. * Function TimeNowInMilliseconds() returns an unsigned 32-bit value.
  86. * Default behavior is to return a signed 64-bit value.
  87. */
  88. #ifdef HAVE_CONFIG_H
  89. #include <config.h>
  90. #endif
  91. #include <wolfssl/wolfcrypt/settings.h>
  92. #ifdef WOLFSSL_TLS13
  93. #ifdef HAVE_SESSION_TICKET
  94. #include <wolfssl/wolfcrypt/wc_port.h>
  95. #endif
  96. #ifndef WOLFCRYPT_ONLY
  97. #ifdef HAVE_ERRNO_H
  98. #include <errno.h>
  99. #endif
  100. #if defined(__MACH__) || defined(__FreeBSD__) || \
  101. defined(__INCLUDE_NUTTX_CONFIG_H) || defined(WOLFSSL_RIOT_OS)
  102. #include <sys/time.h>
  103. #endif /* __MACH__ || __FreeBSD__ ||
  104. __INCLUDE_NUTTX_CONFIG_H || WOLFSSL_RIOT_OS */
  105. #include <wolfssl/internal.h>
  106. #include <wolfssl/error-ssl.h>
  107. #include <wolfssl/wolfcrypt/asn.h>
  108. #include <wolfssl/wolfcrypt/dh.h>
  109. #include <wolfssl/wolfcrypt/kdf.h>
  110. #include <wolfssl/wolfcrypt/signature.h>
  111. #ifdef NO_INLINE
  112. #include <wolfssl/wolfcrypt/misc.h>
  113. #else
  114. #define WOLFSSL_MISC_INCLUDED
  115. #include <wolfcrypt/src/misc.c>
  116. #endif
  117. #ifdef __sun
  118. #include <sys/filio.h>
  119. #endif
  120. #ifndef TRUE
  121. #define TRUE 1
  122. #endif
  123. #ifndef FALSE
  124. #define FALSE 0
  125. #endif
  126. #ifndef HAVE_AEAD
  127. #ifndef _MSC_VER
  128. #error "The build option HAVE_AEAD is required for TLS 1.3"
  129. #else
  130. #pragma \
  131. message("error: The build option HAVE_AEAD is required for TLS 1.3")
  132. #endif
  133. #endif
  134. #ifndef HAVE_HKDF
  135. #ifndef _MSC_VER
  136. #error "The build option HAVE_HKDF is required for TLS 1.3"
  137. #else
  138. #pragma message("error: The build option HAVE_HKDF is required for TLS 1.3")
  139. #endif
  140. #endif
  141. #ifndef HAVE_TLS_EXTENSIONS
  142. #ifndef _MSC_VER
  143. #error "The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3"
  144. #else
  145. #pragma message("error: The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3")
  146. #endif
  147. #endif
  148. /* Set ret to error value and jump to label.
  149. *
  150. * err The error value to set.
  151. * eLabel The label to jump to.
  152. */
  153. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  154. /* Size of the TLS v1.3 label use when deriving keys. */
  155. #define TLS13_PROTOCOL_LABEL_SZ 6
  156. /* The protocol label for TLS v1.3. */
  157. static const byte tls13ProtocolLabel[TLS13_PROTOCOL_LABEL_SZ + 1] = "tls13 ";
  158. #ifdef WOLFSSL_DTLS13
  159. #define DTLS13_PROTOCOL_LABEL_SZ 6
  160. static const byte dtls13ProtocolLabel[DTLS13_PROTOCOL_LABEL_SZ + 1] = "dtls13";
  161. #endif /* WOLFSSL_DTLS13 */
  162. #if defined(HAVE_ECH)
  163. #define ECH_ACCEPT_CONFIRMATION_SZ 8
  164. #define ECH_ACCEPT_CONFIRMATION_LABEL_SZ 23
  165. static const byte
  166. echAcceptConfirmationLabel[ECH_ACCEPT_CONFIRMATION_LABEL_SZ + 1] =
  167. "ech accept confirmation";
  168. #endif
  169. #ifndef NO_CERTS
  170. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  171. defined(HAVE_ED448) || defined(HAVE_PQC)
  172. static WC_INLINE int GetMsgHash(WOLFSSL* ssl, byte* hash);
  173. #endif
  174. #endif
  175. /* Expand data using HMAC, salt and label and info.
  176. * TLS v1.3 defines this function. Use callback if available. */
  177. static int Tls13HKDFExpandLabel(WOLFSSL* ssl, byte* okm, word32 okmLen,
  178. const byte* prk, word32 prkLen,
  179. const byte* protocol, word32 protocolLen,
  180. const byte* label, word32 labelLen,
  181. const byte* info, word32 infoLen,
  182. int digest)
  183. {
  184. int ret = NOT_COMPILED_IN;
  185. #if defined(HAVE_PK_CALLBACKS)
  186. if (ssl->ctx && ssl->ctx->HKDFExpandLabelCb) {
  187. ret = ssl->ctx->HKDFExpandLabelCb(okm, okmLen, prk, prkLen,
  188. protocol, protocolLen,
  189. label, labelLen,
  190. info, infoLen, digest,
  191. WOLFSSL_CLIENT_END /* ignored */);
  192. }
  193. if (ret != NOT_COMPILED_IN)
  194. return ret;
  195. #endif
  196. (void)ssl;
  197. PRIVATE_KEY_UNLOCK();
  198. #if !defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))
  199. ret = wc_Tls13_HKDF_Expand_Label_ex(okm, okmLen, prk, prkLen,
  200. protocol, protocolLen,
  201. label, labelLen,
  202. info, infoLen, digest,
  203. ssl->heap, ssl->devId);
  204. #else
  205. ret = wc_Tls13_HKDF_Expand_Label(okm, okmLen, prk, prkLen,
  206. protocol, protocolLen,
  207. label, labelLen,
  208. info, infoLen, digest);
  209. #endif
  210. PRIVATE_KEY_LOCK();
  211. return ret;
  212. }
  213. /* Same as above, but pass in the side we are expanding for:
  214. * side: either WOLFSSL_CLIENT_END or WOLFSSL_SERVER_END.
  215. */
  216. static int Tls13HKDFExpandKeyLabel(WOLFSSL* ssl, byte* okm, word32 okmLen,
  217. const byte* prk, word32 prkLen,
  218. const byte* protocol, word32 protocolLen,
  219. const byte* label, word32 labelLen,
  220. const byte* info, word32 infoLen,
  221. int digest, int side)
  222. {
  223. int ret;
  224. #if defined(HAVE_PK_CALLBACKS)
  225. ret = NOT_COMPILED_IN;
  226. if (ssl->ctx && ssl->ctx->HKDFExpandLabelCb) {
  227. ret = ssl->ctx->HKDFExpandLabelCb(okm, okmLen, prk, prkLen,
  228. protocol, protocolLen,
  229. label, labelLen,
  230. info, infoLen,
  231. digest, side);
  232. }
  233. if (ret != NOT_COMPILED_IN)
  234. return ret;
  235. #endif
  236. #if !defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))
  237. ret = wc_Tls13_HKDF_Expand_Label_ex(okm, okmLen, prk, prkLen,
  238. protocol, protocolLen,
  239. label, labelLen,
  240. info, infoLen, digest,
  241. ssl->heap, ssl->devId);
  242. #elif defined(HAVE_FIPS) && defined(wc_Tls13_HKDF_Expand_Label)
  243. ret = wc_Tls13_HKDF_Expand_Label_fips(okm, okmLen, prk, prkLen,
  244. protocol, protocolLen,
  245. label, labelLen,
  246. info, infoLen, digest);
  247. #else
  248. ret = wc_Tls13_HKDF_Expand_Label(okm, okmLen, prk, prkLen,
  249. protocol, protocolLen,
  250. label, labelLen,
  251. info, infoLen, digest);
  252. #endif
  253. (void)ssl;
  254. (void)side;
  255. return ret;
  256. }
  257. /* Derive a key from a message.
  258. *
  259. * ssl The SSL/TLS object.
  260. * output The buffer to hold the derived key.
  261. * outputLen The length of the derived key.
  262. * secret The secret used to derive the key (HMAC secret).
  263. * label The label used to distinguish the context.
  264. * labelLen The length of the label.
  265. * msg The message data to derive key from.
  266. * msgLen The length of the message data to derive key from.
  267. * hashAlgo The hash algorithm to use in the HMAC.
  268. * returns 0 on success, otherwise failure.
  269. */
  270. static int DeriveKeyMsg(WOLFSSL* ssl, byte* output, int outputLen,
  271. const byte* secret, const byte* label, word32 labelLen,
  272. byte* msg, int msgLen, int hashAlgo)
  273. {
  274. byte hash[WC_MAX_DIGEST_SIZE];
  275. Digest digest;
  276. word32 hashSz = 0;
  277. const byte* protocol;
  278. word32 protocolLen;
  279. int digestAlg = -1;
  280. int ret = BAD_FUNC_ARG;
  281. switch (hashAlgo) {
  282. #ifndef NO_WOLFSSL_SHA256
  283. case sha256_mac:
  284. ret = wc_InitSha256_ex(&digest.sha256, ssl->heap, ssl->devId);
  285. if (ret == 0) {
  286. ret = wc_Sha256Update(&digest.sha256, msg, msgLen);
  287. if (ret == 0)
  288. ret = wc_Sha256Final(&digest.sha256, hash);
  289. wc_Sha256Free(&digest.sha256);
  290. }
  291. hashSz = WC_SHA256_DIGEST_SIZE;
  292. digestAlg = WC_SHA256;
  293. break;
  294. #endif
  295. #ifdef WOLFSSL_SHA384
  296. case sha384_mac:
  297. ret = wc_InitSha384_ex(&digest.sha384, ssl->heap, ssl->devId);
  298. if (ret == 0) {
  299. ret = wc_Sha384Update(&digest.sha384, msg, msgLen);
  300. if (ret == 0)
  301. ret = wc_Sha384Final(&digest.sha384, hash);
  302. wc_Sha384Free(&digest.sha384);
  303. }
  304. hashSz = WC_SHA384_DIGEST_SIZE;
  305. digestAlg = WC_SHA384;
  306. break;
  307. #endif
  308. #ifdef WOLFSSL_TLS13_SHA512
  309. case sha512_mac:
  310. ret = wc_InitSha512_ex(&digest.sha512, ssl->heap, ssl->devId);
  311. if (ret == 0) {
  312. ret = wc_Sha512Update(&digest.sha512, msg, msgLen);
  313. if (ret == 0)
  314. ret = wc_Sha512Final(&digest.sha512, hash);
  315. wc_Sha512Free(&digest.sha512);
  316. }
  317. hashSz = WC_SHA512_DIGEST_SIZE;
  318. digestAlg = WC_SHA512;
  319. break;
  320. #endif
  321. #ifdef WOLFSSL_SM3
  322. case sm3_mac:
  323. ret = wc_InitSm3(&digest.sm3, ssl->heap, ssl->devId);
  324. if (ret == 0) {
  325. ret = wc_Sm3Update(&digest.sm3, msg, msgLen);
  326. if (ret == 0)
  327. ret = wc_Sm3Final(&digest.sm3, hash);
  328. wc_Sm3Free(&digest.sm3);
  329. }
  330. hashSz = WC_SM3_DIGEST_SIZE;
  331. digestAlg = WC_SM3;
  332. break;
  333. #endif
  334. default:
  335. digestAlg = -1;
  336. break;
  337. }
  338. if (digestAlg < 0)
  339. return HASH_TYPE_E;
  340. if (ret != 0)
  341. return ret;
  342. switch (ssl->version.minor) {
  343. case TLSv1_3_MINOR:
  344. protocol = tls13ProtocolLabel;
  345. protocolLen = TLS13_PROTOCOL_LABEL_SZ;
  346. break;
  347. #ifdef WOLFSSL_DTLS13
  348. case DTLSv1_3_MINOR:
  349. if (!ssl->options.dtls)
  350. return VERSION_ERROR;
  351. protocol = dtls13ProtocolLabel;
  352. protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
  353. break;
  354. #endif /* WOLFSSL_DTLS13 */
  355. default:
  356. return VERSION_ERROR;
  357. }
  358. if (outputLen == -1)
  359. outputLen = hashSz;
  360. ret = Tls13HKDFExpandLabel(ssl, output, outputLen, secret, hashSz,
  361. protocol, protocolLen, label, labelLen,
  362. hash, hashSz, digestAlg);
  363. return ret;
  364. }
  365. /* Derive a key.
  366. *
  367. * ssl The SSL/TLS object.
  368. * output The buffer to hold the derived key.
  369. * outputLen The length of the derived key.
  370. * secret The secret used to derive the key (HMAC secret).
  371. * label The label used to distinguish the context.
  372. * labelLen The length of the label.
  373. * hashAlgo The hash algorithm to use in the HMAC.
  374. * includeMsgs Whether to include a hash of the handshake messages so far.
  375. * side The side that we are deriving the secret for.
  376. * returns 0 on success, otherwise failure.
  377. */
  378. int Tls13DeriveKey(WOLFSSL* ssl, byte* output, int outputLen,
  379. const byte* secret, const byte* label, word32 labelLen,
  380. int hashAlgo, int includeMsgs, int side)
  381. {
  382. int ret = 0;
  383. byte hash[WC_MAX_DIGEST_SIZE];
  384. word32 hashSz = 0;
  385. word32 hashOutSz = 0;
  386. const byte* protocol;
  387. word32 protocolLen;
  388. int digestAlg = 0;
  389. switch (hashAlgo) {
  390. #ifndef NO_SHA256
  391. case sha256_mac:
  392. hashSz = WC_SHA256_DIGEST_SIZE;
  393. digestAlg = WC_SHA256;
  394. if (includeMsgs)
  395. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
  396. break;
  397. #endif
  398. #ifdef WOLFSSL_SHA384
  399. case sha384_mac:
  400. hashSz = WC_SHA384_DIGEST_SIZE;
  401. digestAlg = WC_SHA384;
  402. if (includeMsgs)
  403. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
  404. break;
  405. #endif
  406. #ifdef WOLFSSL_TLS13_SHA512
  407. case sha512_mac:
  408. hashSz = WC_SHA512_DIGEST_SIZE;
  409. digestAlg = WC_SHA512;
  410. if (includeMsgs)
  411. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512, hash);
  412. break;
  413. #endif
  414. #ifdef WOLFSSL_SM3
  415. case sm3_mac:
  416. hashSz = WC_SM3_DIGEST_SIZE;
  417. digestAlg = WC_SM3;
  418. if (includeMsgs)
  419. ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
  420. break;
  421. #endif
  422. default:
  423. ret = HASH_TYPE_E;
  424. break;
  425. }
  426. if (ret != 0)
  427. return ret;
  428. protocol = tls13ProtocolLabel;
  429. protocolLen = TLS13_PROTOCOL_LABEL_SZ;
  430. #ifdef WOLFSSL_DTLS13
  431. if (ssl->options.dtls) {
  432. protocol = dtls13ProtocolLabel;
  433. protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
  434. }
  435. #endif /* WOLFSSL_DTLS13 */
  436. if (outputLen == -1) {
  437. outputLen = hashSz;
  438. }
  439. if (includeMsgs) {
  440. hashOutSz = hashSz;
  441. }
  442. else {
  443. /* Appease static analyzers by making sure hash is cleared, since it is
  444. * passed into expand key label where older wc_Tls13_HKDF_Expand_Label
  445. * will unconditionally try to call a memcpy on it, however length will
  446. * always be 0. */
  447. XMEMSET(hash, 0, sizeof(hash));
  448. hashOutSz = 0;
  449. }
  450. PRIVATE_KEY_UNLOCK();
  451. ret = Tls13HKDFExpandKeyLabel(ssl, output, outputLen, secret, hashSz,
  452. protocol, protocolLen, label, labelLen,
  453. hash, hashOutSz, digestAlg, side);
  454. PRIVATE_KEY_LOCK();
  455. #ifdef WOLFSSL_CHECK_MEM_ZERO
  456. wc_MemZero_Add("TLS 1.3 derived key", output, outputLen);
  457. #endif
  458. return ret;
  459. }
  460. /* Convert TLS mac ID to a hash algorithm ID
  461. *
  462. * mac Mac ID to convert
  463. * returns hash ID on success, or the NONE type.
  464. */
  465. static WC_INLINE int mac2hash(int mac)
  466. {
  467. int hash;
  468. switch (mac) {
  469. #ifndef NO_SHA256
  470. case sha256_mac:
  471. hash = WC_SHA256;
  472. break;
  473. #endif
  474. #ifdef WOLFSSL_SHA384
  475. case sha384_mac:
  476. hash = WC_SHA384;
  477. break;
  478. #endif
  479. #ifdef WOLFSSL_TLS13_SHA512
  480. case sha512_mac:
  481. hash = WC_SHA512;
  482. break;
  483. #endif
  484. #ifdef WOLFSSL_SM3
  485. case sm3_mac:
  486. hash = WC_SM3;
  487. break;
  488. #endif
  489. default:
  490. hash = WC_HASH_TYPE_NONE;
  491. }
  492. return hash;
  493. }
  494. #ifndef NO_PSK
  495. /* The length of the binder key label. */
  496. #define BINDER_KEY_LABEL_SZ 10
  497. /* The binder key label. */
  498. static const byte binderKeyLabel[BINDER_KEY_LABEL_SZ + 1] =
  499. "ext binder";
  500. /* Derive the binder key.
  501. *
  502. * ssl The SSL/TLS object.
  503. * key The derived key.
  504. * returns 0 on success, otherwise failure.
  505. */
  506. static int DeriveBinderKey(WOLFSSL* ssl, byte* key)
  507. {
  508. WOLFSSL_MSG("Derive Binder Key");
  509. if (ssl == NULL || ssl->arrays == NULL) {
  510. return BAD_FUNC_ARG;
  511. }
  512. return DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
  513. binderKeyLabel, BINDER_KEY_LABEL_SZ,
  514. NULL, 0, ssl->specs.mac_algorithm);
  515. }
  516. #endif /* !NO_PSK */
  517. #if defined(HAVE_SESSION_TICKET) && \
  518. (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
  519. /* The length of the binder key resume label. */
  520. #define BINDER_KEY_RESUME_LABEL_SZ 10
  521. /* The binder key resume label. */
  522. static const byte binderKeyResumeLabel[BINDER_KEY_RESUME_LABEL_SZ + 1] =
  523. "res binder";
  524. /* Derive the binder resumption key.
  525. *
  526. * ssl The SSL/TLS object.
  527. * key The derived key.
  528. * returns 0 on success, otherwise failure.
  529. */
  530. static int DeriveBinderKeyResume(WOLFSSL* ssl, byte* key)
  531. {
  532. WOLFSSL_MSG("Derive Binder Key - Resumption");
  533. if (ssl == NULL || ssl->arrays == NULL) {
  534. return BAD_FUNC_ARG;
  535. }
  536. return DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
  537. binderKeyResumeLabel, BINDER_KEY_RESUME_LABEL_SZ,
  538. NULL, 0, ssl->specs.mac_algorithm);
  539. }
  540. #endif /* HAVE_SESSION_TICKET && (!NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER) */
  541. #ifdef WOLFSSL_EARLY_DATA
  542. /* The length of the early traffic label. */
  543. #define EARLY_TRAFFIC_LABEL_SZ 11
  544. /* The early traffic label. */
  545. static const byte earlyTrafficLabel[EARLY_TRAFFIC_LABEL_SZ + 1] =
  546. "c e traffic";
  547. /* Derive the early traffic key.
  548. *
  549. * ssl The SSL/TLS object.
  550. * key The derived key.
  551. * side The side that we are deriving the secret for.
  552. * returns 0 on success, otherwise failure.
  553. */
  554. static int DeriveEarlyTrafficSecret(WOLFSSL* ssl, byte* key, int side)
  555. {
  556. int ret;
  557. WOLFSSL_MSG("Derive Early Traffic Secret");
  558. if (ssl == NULL || ssl->arrays == NULL) {
  559. return BAD_FUNC_ARG;
  560. }
  561. #if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
  562. /* If this is called from a sniffer session with keylog file support,
  563. * obtain the appropriate secret from the callback */
  564. if (ssl->snifferSecretCb != NULL) {
  565. return ssl->snifferSecretCb(ssl->arrays->clientRandom,
  566. SNIFFER_SECRET_CLIENT_EARLY_TRAFFIC_SECRET,
  567. key);
  568. }
  569. #endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
  570. ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->secret,
  571. earlyTrafficLabel, EARLY_TRAFFIC_LABEL_SZ,
  572. ssl->specs.mac_algorithm, 1, side);
  573. #ifdef HAVE_SECRET_CALLBACK
  574. if (ret == 0 && ssl->tls13SecretCb != NULL) {
  575. ret = ssl->tls13SecretCb(ssl, CLIENT_EARLY_TRAFFIC_SECRET, key,
  576. ssl->specs.hash_size, ssl->tls13SecretCtx);
  577. if (ret != 0) {
  578. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  579. return TLS13_SECRET_CB_E;
  580. }
  581. }
  582. #ifdef OPENSSL_EXTRA
  583. if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
  584. ret = ssl->tls13KeyLogCb(ssl, CLIENT_EARLY_TRAFFIC_SECRET, key,
  585. ssl->specs.hash_size, NULL);
  586. if (ret != 0) {
  587. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  588. return TLS13_SECRET_CB_E;
  589. }
  590. }
  591. #endif /* OPENSSL_EXTRA */
  592. #endif /* HAVE_SECRET_CALLBACK */
  593. return ret;
  594. }
  595. #endif
  596. /* The length of the client handshake label. */
  597. #define CLIENT_HANDSHAKE_LABEL_SZ 12
  598. /* The client handshake label. */
  599. static const byte clientHandshakeLabel[CLIENT_HANDSHAKE_LABEL_SZ + 1] =
  600. "c hs traffic";
  601. /* Derive the client handshake key.
  602. *
  603. * ssl The SSL/TLS object.
  604. * key The derived key.
  605. * returns 0 on success, otherwise failure.
  606. */
  607. static int DeriveClientHandshakeSecret(WOLFSSL* ssl, byte* key)
  608. {
  609. int ret;
  610. WOLFSSL_MSG("Derive Client Handshake Secret");
  611. if (ssl == NULL || ssl->arrays == NULL) {
  612. return BAD_FUNC_ARG;
  613. }
  614. #if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
  615. /* If this is called from a sniffer session with keylog file support,
  616. * obtain the appropriate secret from the callback */
  617. if (ssl->snifferSecretCb != NULL) {
  618. return ssl->snifferSecretCb(ssl->arrays->clientRandom,
  619. SNIFFER_SECRET_CLIENT_HANDSHAKE_TRAFFIC_SECRET,
  620. key);
  621. }
  622. #endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
  623. ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->preMasterSecret,
  624. clientHandshakeLabel, CLIENT_HANDSHAKE_LABEL_SZ,
  625. ssl->specs.mac_algorithm, 1, WOLFSSL_CLIENT_END);
  626. #ifdef HAVE_SECRET_CALLBACK
  627. if (ret == 0 && ssl->tls13SecretCb != NULL) {
  628. ret = ssl->tls13SecretCb(ssl, CLIENT_HANDSHAKE_TRAFFIC_SECRET, key,
  629. ssl->specs.hash_size, ssl->tls13SecretCtx);
  630. if (ret != 0) {
  631. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  632. return TLS13_SECRET_CB_E;
  633. }
  634. }
  635. #ifdef OPENSSL_EXTRA
  636. if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
  637. ret = ssl->tls13KeyLogCb(ssl, CLIENT_HANDSHAKE_TRAFFIC_SECRET, key,
  638. ssl->specs.hash_size, NULL);
  639. if (ret != 0) {
  640. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  641. return TLS13_SECRET_CB_E;
  642. }
  643. }
  644. #endif /* OPENSSL_EXTRA */
  645. #endif /* HAVE_SECRET_CALLBACK */
  646. return ret;
  647. }
  648. /* The length of the server handshake label. */
  649. #define SERVER_HANDSHAKE_LABEL_SZ 12
  650. /* The server handshake label. */
  651. static const byte serverHandshakeLabel[SERVER_HANDSHAKE_LABEL_SZ + 1] =
  652. "s hs traffic";
  653. /* Derive the server handshake key.
  654. *
  655. * ssl The SSL/TLS object.
  656. * key The derived key.
  657. * returns 0 on success, otherwise failure.
  658. */
  659. static int DeriveServerHandshakeSecret(WOLFSSL* ssl, byte* key)
  660. {
  661. int ret;
  662. WOLFSSL_MSG("Derive Server Handshake Secret");
  663. if (ssl == NULL || ssl->arrays == NULL) {
  664. return BAD_FUNC_ARG;
  665. }
  666. #if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
  667. /* If this is called from a sniffer session with keylog file support,
  668. * obtain the appropriate secret from the callback */
  669. if (ssl->snifferSecretCb != NULL) {
  670. return ssl->snifferSecretCb(ssl->arrays->clientRandom,
  671. SNIFFER_SECRET_SERVER_HANDSHAKE_TRAFFIC_SECRET,
  672. key);
  673. }
  674. #endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
  675. ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->preMasterSecret,
  676. serverHandshakeLabel, SERVER_HANDSHAKE_LABEL_SZ,
  677. ssl->specs.mac_algorithm, 1, WOLFSSL_SERVER_END);
  678. #ifdef HAVE_SECRET_CALLBACK
  679. if (ret == 0 && ssl->tls13SecretCb != NULL) {
  680. ret = ssl->tls13SecretCb(ssl, SERVER_HANDSHAKE_TRAFFIC_SECRET, key,
  681. ssl->specs.hash_size, ssl->tls13SecretCtx);
  682. if (ret != 0) {
  683. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  684. return TLS13_SECRET_CB_E;
  685. }
  686. }
  687. #ifdef OPENSSL_EXTRA
  688. if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
  689. ret = ssl->tls13KeyLogCb(ssl, SERVER_HANDSHAKE_TRAFFIC_SECRET, key,
  690. ssl->specs.hash_size, NULL);
  691. if (ret != 0) {
  692. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  693. return TLS13_SECRET_CB_E;
  694. }
  695. }
  696. #endif /* OPENSSL_EXTRA */
  697. #endif /* HAVE_SECRET_CALLBACK */
  698. return ret;
  699. }
  700. /* The length of the client application traffic label. */
  701. #define CLIENT_APP_LABEL_SZ 12
  702. /* The client application traffic label. */
  703. static const byte clientAppLabel[CLIENT_APP_LABEL_SZ + 1] =
  704. "c ap traffic";
  705. /* Derive the client application traffic key.
  706. *
  707. * ssl The SSL/TLS object.
  708. * key The derived key.
  709. * returns 0 on success, otherwise failure.
  710. */
  711. static int DeriveClientTrafficSecret(WOLFSSL* ssl, byte* key)
  712. {
  713. int ret;
  714. WOLFSSL_MSG("Derive Client Traffic Secret");
  715. if (ssl == NULL || ssl->arrays == NULL) {
  716. return BAD_FUNC_ARG;
  717. }
  718. #if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
  719. /* If this is called from a sniffer session with keylog file support,
  720. * obtain the appropriate secret from the callback */
  721. if (ssl->snifferSecretCb != NULL) {
  722. return ssl->snifferSecretCb(ssl->arrays->clientRandom,
  723. SNIFFER_SECRET_CLIENT_TRAFFIC_SECRET,
  724. key);
  725. }
  726. #endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
  727. ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
  728. clientAppLabel, CLIENT_APP_LABEL_SZ,
  729. ssl->specs.mac_algorithm, 1, WOLFSSL_CLIENT_END);
  730. #ifdef HAVE_SECRET_CALLBACK
  731. if (ret == 0 && ssl->tls13SecretCb != NULL) {
  732. ret = ssl->tls13SecretCb(ssl, CLIENT_TRAFFIC_SECRET, key,
  733. ssl->specs.hash_size, ssl->tls13SecretCtx);
  734. if (ret != 0) {
  735. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  736. return TLS13_SECRET_CB_E;
  737. }
  738. }
  739. #ifdef OPENSSL_EXTRA
  740. if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
  741. ret = ssl->tls13KeyLogCb(ssl, CLIENT_TRAFFIC_SECRET, key,
  742. ssl->specs.hash_size, NULL);
  743. if (ret != 0) {
  744. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  745. return TLS13_SECRET_CB_E;
  746. }
  747. }
  748. #endif /* OPENSSL_EXTRA */
  749. #endif /* HAVE_SECRET_CALLBACK */
  750. return ret;
  751. }
  752. /* The length of the server application traffic label. */
  753. #define SERVER_APP_LABEL_SZ 12
  754. /* The server application traffic label. */
  755. static const byte serverAppLabel[SERVER_APP_LABEL_SZ + 1] =
  756. "s ap traffic";
  757. /* Derive the server application traffic key.
  758. *
  759. * ssl The SSL/TLS object.
  760. * key The derived key.
  761. * returns 0 on success, otherwise failure.
  762. */
  763. static int DeriveServerTrafficSecret(WOLFSSL* ssl, byte* key)
  764. {
  765. int ret;
  766. WOLFSSL_MSG("Derive Server Traffic Secret");
  767. if (ssl == NULL || ssl->arrays == NULL) {
  768. return BAD_FUNC_ARG;
  769. }
  770. #if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
  771. /* If this is called from a sniffer session with keylog file support,
  772. * obtain the appropriate secret from the callback */
  773. if (ssl->snifferSecretCb != NULL) {
  774. return ssl->snifferSecretCb(ssl->arrays->clientRandom,
  775. SNIFFER_SECRET_SERVER_TRAFFIC_SECRET,
  776. key);
  777. }
  778. #endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
  779. ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
  780. serverAppLabel, SERVER_APP_LABEL_SZ,
  781. ssl->specs.mac_algorithm, 1, WOLFSSL_SERVER_END);
  782. #ifdef HAVE_SECRET_CALLBACK
  783. if (ret == 0 && ssl->tls13SecretCb != NULL) {
  784. ret = ssl->tls13SecretCb(ssl, SERVER_TRAFFIC_SECRET, key,
  785. ssl->specs.hash_size, ssl->tls13SecretCtx);
  786. if (ret != 0) {
  787. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  788. return TLS13_SECRET_CB_E;
  789. }
  790. }
  791. #ifdef OPENSSL_EXTRA
  792. if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
  793. ret = ssl->tls13KeyLogCb(ssl, SERVER_TRAFFIC_SECRET, key,
  794. ssl->specs.hash_size, NULL);
  795. if (ret != 0) {
  796. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  797. return TLS13_SECRET_CB_E;
  798. }
  799. }
  800. #endif /* OPENSSL_EXTRA */
  801. #endif /* HAVE_SECRET_CALLBACK */
  802. return ret;
  803. }
  804. #ifdef HAVE_KEYING_MATERIAL
  805. /* The length of the exporter master secret label. */
  806. #define EXPORTER_MASTER_LABEL_SZ 10
  807. /* The exporter master secret label. */
  808. static const byte exporterMasterLabel[EXPORTER_MASTER_LABEL_SZ + 1] =
  809. "exp master";
  810. /* Derive the exporter secret.
  811. *
  812. * ssl The SSL/TLS object.
  813. * key The derived key.
  814. * returns 0 on success, otherwise failure.
  815. */
  816. static int DeriveExporterSecret(WOLFSSL* ssl, byte* key)
  817. {
  818. int ret;
  819. WOLFSSL_ENTER("Derive Exporter Secret");
  820. if (ssl == NULL || ssl->arrays == NULL) {
  821. return BAD_FUNC_ARG;
  822. }
  823. ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
  824. exporterMasterLabel, EXPORTER_MASTER_LABEL_SZ,
  825. ssl->specs.mac_algorithm, 1, 0 /* Unused */);
  826. #ifdef HAVE_SECRET_CALLBACK
  827. if (ret == 0 && ssl->tls13SecretCb != NULL) {
  828. ret = ssl->tls13SecretCb(ssl, EXPORTER_SECRET, key,
  829. ssl->specs.hash_size, ssl->tls13SecretCtx);
  830. if (ret != 0) {
  831. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  832. return TLS13_SECRET_CB_E;
  833. }
  834. }
  835. #ifdef OPENSSL_EXTRA
  836. if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
  837. ret = ssl->tls13KeyLogCb(ssl, EXPORTER_SECRET, key,
  838. ssl->specs.hash_size, NULL);
  839. if (ret != 0) {
  840. WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
  841. return TLS13_SECRET_CB_E;
  842. }
  843. }
  844. #endif /* OPENSSL_EXTRA */
  845. #endif /* HAVE_SECRET_CALLBACK */
  846. return ret;
  847. }
  848. /* The length of the exporter label. */
  849. #define EXPORTER_LABEL_SZ 8
  850. /* The exporter label. */
  851. static const byte exporterLabel[EXPORTER_LABEL_SZ + 1] =
  852. "exporter";
  853. /* Hash("") */
  854. #ifndef NO_SHA256
  855. static const byte emptySHA256Hash[] = {
  856. 0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC, 0x1C, 0x14, 0x9A, 0xFB, 0xF4, 0xC8,
  857. 0x99, 0x6F, 0xB9, 0x24, 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C,
  858. 0xA4, 0x95, 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55
  859. };
  860. #endif
  861. #ifdef WOLFSSL_SHA384
  862. static const byte emptySHA384Hash[] = {
  863. 0x38, 0xB0, 0x60, 0xA7, 0x51, 0xAC, 0x96, 0x38, 0x4C, 0xD9, 0x32, 0x7E,
  864. 0xB1, 0xB1, 0xE3, 0x6A, 0x21, 0xFD, 0xB7, 0x11, 0x14, 0xBE, 0x07, 0x43,
  865. 0x4C, 0x0C, 0xC7, 0xBF, 0x63, 0xF6, 0xE1, 0xDA, 0x27, 0x4E, 0xDE, 0xBF,
  866. 0xE7, 0x6F, 0x65, 0xFB, 0xD5, 0x1A, 0xD2, 0xF1, 0x48, 0x98, 0xB9, 0x5B
  867. };
  868. #endif
  869. #ifdef WOLFSSL_TLS13_SHA512
  870. static const byte emptySHA512Hash[] = {
  871. 0xCF, 0x83, 0xE1, 0x35, 0x7E, 0xEF, 0xB8, 0xBD, 0xF1, 0x54, 0x28, 0x50,
  872. 0xD6, 0x6D, 0x80, 0x07, 0xD6, 0x20, 0xE4, 0x05, 0x0B, 0x57, 0x15, 0xDC,
  873. 0x83, 0xF4, 0xA9, 0x21, 0xD3, 0x6C, 0xE9, 0xCE, 0x47, 0xD0, 0xD1, 0x3C,
  874. 0x5D, 0x85, 0xF2, 0xB0, 0xFF, 0x83, 0x18, 0xD2, 0x87, 0x7E, 0xEC, 0x2F,
  875. 0x63, 0xB9, 0x31, 0xBD, 0x47, 0x41, 0x7A, 0x81, 0xA5, 0x38, 0x32, 0x7A,
  876. 0xF9, 0x27, 0xDA, 0x3E
  877. };
  878. #endif
  879. /**
  880. * Implement section 7.5 of RFC 8446
  881. * @return 0 on success
  882. * <0 on failure
  883. */
  884. int Tls13_Exporter(WOLFSSL* ssl, unsigned char *out, size_t outLen,
  885. const char *label, size_t labelLen,
  886. const unsigned char *context, size_t contextLen)
  887. {
  888. int ret;
  889. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  890. int hashLen = 0;
  891. byte hashOut[WC_MAX_DIGEST_SIZE];
  892. const byte* emptyHash = NULL;
  893. byte firstExpand[WC_MAX_DIGEST_SIZE];
  894. const byte* protocol = tls13ProtocolLabel;
  895. word32 protocolLen = TLS13_PROTOCOL_LABEL_SZ;
  896. if (ssl->options.dtls && ssl->version.minor != DTLSv1_3_MINOR)
  897. return VERSION_ERROR;
  898. if (!ssl->options.dtls && ssl->version.minor != TLSv1_3_MINOR)
  899. return VERSION_ERROR;
  900. #ifdef WOLFSSL_DTLS13
  901. if (ssl->options.dtls) {
  902. protocol = dtls13ProtocolLabel;
  903. protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
  904. }
  905. #endif /* WOLFSSL_DTLS13 */
  906. switch (ssl->specs.mac_algorithm) {
  907. #ifndef NO_SHA256
  908. case sha256_mac:
  909. hashType = WC_HASH_TYPE_SHA256;
  910. hashLen = WC_SHA256_DIGEST_SIZE;
  911. emptyHash = emptySHA256Hash;
  912. break;
  913. #endif
  914. #ifdef WOLFSSL_SHA384
  915. case sha384_mac:
  916. hashType = WC_HASH_TYPE_SHA384;
  917. hashLen = WC_SHA384_DIGEST_SIZE;
  918. emptyHash = emptySHA384Hash;
  919. break;
  920. #endif
  921. #ifdef WOLFSSL_TLS13_SHA512
  922. case sha512_mac:
  923. hashType = WC_HASH_TYPE_SHA512;
  924. hashLen = WC_SHA512_DIGEST_SIZE;
  925. emptyHash = emptySHA512Hash;
  926. break;
  927. #endif
  928. }
  929. /* Derive-Secret(Secret, label, "") */
  930. ret = Tls13HKDFExpandLabel(ssl, firstExpand, hashLen,
  931. ssl->arrays->exporterSecret, hashLen,
  932. protocol, protocolLen, (byte*)label, (word32)labelLen,
  933. emptyHash, hashLen, hashType);
  934. if (ret != 0)
  935. return ret;
  936. /* Hash(context_value) */
  937. ret = wc_Hash(hashType, context, (word32)contextLen, hashOut, WC_MAX_DIGEST_SIZE);
  938. if (ret != 0)
  939. return ret;
  940. ret = Tls13HKDFExpandLabel(ssl, out, (word32)outLen, firstExpand, hashLen,
  941. protocol, protocolLen, exporterLabel, EXPORTER_LABEL_SZ,
  942. hashOut, hashLen, hashType);
  943. return ret;
  944. }
  945. #endif
  946. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  947. /* The length of the resumption master secret label. */
  948. #define RESUME_MASTER_LABEL_SZ 10
  949. /* The resumption master secret label. */
  950. static const byte resumeMasterLabel[RESUME_MASTER_LABEL_SZ + 1] =
  951. "res master";
  952. /* Derive the resumption secret.
  953. *
  954. * ssl The SSL/TLS object.
  955. * key The derived key.
  956. * returns 0 on success, otherwise failure.
  957. */
  958. int DeriveResumptionSecret(WOLFSSL* ssl, byte* key)
  959. {
  960. byte* masterSecret;
  961. WOLFSSL_MSG("Derive Resumption Secret");
  962. if (ssl == NULL) {
  963. return BAD_FUNC_ARG;
  964. }
  965. if (ssl->arrays != NULL) {
  966. masterSecret = ssl->arrays->masterSecret;
  967. }
  968. else {
  969. masterSecret = ssl->session->masterSecret;
  970. }
  971. return Tls13DeriveKey(ssl, key, -1, masterSecret, resumeMasterLabel,
  972. RESUME_MASTER_LABEL_SZ, ssl->specs.mac_algorithm, 1,
  973. 0 /* Unused */);
  974. }
  975. #endif
  976. /* Length of the finished label. */
  977. #define FINISHED_LABEL_SZ 8
  978. /* Finished label for generating finished key. */
  979. static const byte finishedLabel[FINISHED_LABEL_SZ+1] = "finished";
  980. /* Derive the finished secret.
  981. *
  982. * ssl The SSL/TLS object.
  983. * key The key to use with the HMAC.
  984. * secret The derived secret.
  985. * side The side that we are deriving the secret for.
  986. * returns 0 on success, otherwise failure.
  987. */
  988. static int DeriveFinishedSecret(WOLFSSL* ssl, byte* key, byte* secret,
  989. int side)
  990. {
  991. WOLFSSL_MSG("Derive Finished Secret");
  992. return Tls13DeriveKey(ssl, secret, -1, key, finishedLabel,
  993. FINISHED_LABEL_SZ, ssl->specs.mac_algorithm, 0,
  994. side);
  995. }
  996. /* The length of the application traffic label. */
  997. #define APP_TRAFFIC_LABEL_SZ 11
  998. /* The application traffic label. */
  999. static const byte appTrafficLabel[APP_TRAFFIC_LABEL_SZ + 1] =
  1000. "traffic upd";
  1001. /* Update the traffic secret.
  1002. *
  1003. * ssl The SSL/TLS object.
  1004. * secret The previous secret and derived secret.
  1005. * side The side that we are deriving the secret for.
  1006. * returns 0 on success, otherwise failure.
  1007. */
  1008. static int DeriveTrafficSecret(WOLFSSL* ssl, byte* secret, int side)
  1009. {
  1010. WOLFSSL_MSG("Derive New Application Traffic Secret");
  1011. return Tls13DeriveKey(ssl, secret, -1, secret,
  1012. appTrafficLabel, APP_TRAFFIC_LABEL_SZ,
  1013. ssl->specs.mac_algorithm, 0, side);
  1014. }
  1015. static int Tls13_HKDF_Extract(WOLFSSL *ssl, byte* prk, const byte* salt,
  1016. int saltLen, byte* ikm, int ikmLen, int digest)
  1017. {
  1018. int ret;
  1019. #ifdef HAVE_PK_CALLBACKS
  1020. void *cb_ctx = ssl->HkdfExtractCtx;
  1021. CallbackHKDFExtract cb = ssl->ctx->HkdfExtractCb;
  1022. if (cb != NULL) {
  1023. ret = cb(prk, salt, saltLen, ikm, ikmLen, digest, cb_ctx);
  1024. }
  1025. else
  1026. #endif
  1027. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  1028. if ((int)ssl->arrays->psk_keySz < 0) {
  1029. ret = PSK_KEY_ERROR;
  1030. }
  1031. else
  1032. #endif
  1033. {
  1034. #if !defined(HAVE_FIPS) || \
  1035. (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))
  1036. ret = wc_Tls13_HKDF_Extract_ex(prk, salt, saltLen, ikm, ikmLen, digest,
  1037. ssl->heap, ssl->devId);
  1038. #else
  1039. ret = wc_Tls13_HKDF_Extract(prk, salt, saltLen, ikm, ikmLen, digest);
  1040. (void)ssl;
  1041. #endif
  1042. }
  1043. return ret;
  1044. }
  1045. /* Derive the early secret using HKDF Extract.
  1046. *
  1047. * ssl The SSL/TLS object.
  1048. */
  1049. int DeriveEarlySecret(WOLFSSL* ssl)
  1050. {
  1051. int ret;
  1052. WOLFSSL_MSG("Derive Early Secret");
  1053. if (ssl == NULL || ssl->arrays == NULL) {
  1054. return BAD_FUNC_ARG;
  1055. }
  1056. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  1057. ret = tsip_Tls13DeriveEarlySecret(ssl);
  1058. if (ret != CRYPTOCB_UNAVAILABLE)
  1059. return ret;
  1060. #endif
  1061. PRIVATE_KEY_UNLOCK();
  1062. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  1063. ret = Tls13_HKDF_Extract(ssl, ssl->arrays->secret, NULL, 0,
  1064. ssl->arrays->psk_key, ssl->arrays->psk_keySz,
  1065. mac2hash(ssl->specs.mac_algorithm));
  1066. #else
  1067. ret = Tls13_HKDF_Extract(ssl, ssl->arrays->secret, NULL, 0,
  1068. ssl->arrays->masterSecret, 0, mac2hash(ssl->specs.mac_algorithm));
  1069. #endif
  1070. PRIVATE_KEY_LOCK();
  1071. return ret;
  1072. }
  1073. /* The length of the derived label. */
  1074. #define DERIVED_LABEL_SZ 7
  1075. /* The derived label. */
  1076. static const byte derivedLabel[DERIVED_LABEL_SZ + 1] =
  1077. "derived";
  1078. /* Derive the handshake secret using HKDF Extract.
  1079. *
  1080. * ssl The SSL/TLS object.
  1081. */
  1082. int DeriveHandshakeSecret(WOLFSSL* ssl)
  1083. {
  1084. byte key[WC_MAX_DIGEST_SIZE];
  1085. int ret;
  1086. WOLFSSL_MSG("Derive Handshake Secret");
  1087. if (ssl == NULL || ssl->arrays == NULL) {
  1088. return BAD_FUNC_ARG;
  1089. }
  1090. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  1091. ret = tsip_Tls13DeriveHandshakeSecret(ssl);
  1092. if (ret != CRYPTOCB_UNAVAILABLE)
  1093. return ret;
  1094. #endif
  1095. ret = DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
  1096. derivedLabel, DERIVED_LABEL_SZ,
  1097. NULL, 0, ssl->specs.mac_algorithm);
  1098. if (ret != 0)
  1099. return ret;
  1100. PRIVATE_KEY_UNLOCK();
  1101. ret = Tls13_HKDF_Extract(ssl, ssl->arrays->preMasterSecret,
  1102. key, ssl->specs.hash_size,
  1103. ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
  1104. mac2hash(ssl->specs.mac_algorithm));
  1105. PRIVATE_KEY_LOCK();
  1106. return ret;
  1107. }
  1108. /* Derive the master secret using HKDF Extract.
  1109. *
  1110. * ssl The SSL/TLS object.
  1111. */
  1112. int DeriveMasterSecret(WOLFSSL* ssl)
  1113. {
  1114. byte key[WC_MAX_DIGEST_SIZE];
  1115. int ret;
  1116. WOLFSSL_MSG("Derive Master Secret");
  1117. if (ssl == NULL || ssl->arrays == NULL) {
  1118. return BAD_FUNC_ARG;
  1119. }
  1120. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  1121. ret = tsip_Tls13DeriveMasterSecret(ssl);
  1122. if (ret != CRYPTOCB_UNAVAILABLE)
  1123. return ret;
  1124. #endif
  1125. ret = DeriveKeyMsg(ssl, key, -1, ssl->arrays->preMasterSecret,
  1126. derivedLabel, DERIVED_LABEL_SZ,
  1127. NULL, 0, ssl->specs.mac_algorithm);
  1128. if (ret != 0)
  1129. return ret;
  1130. PRIVATE_KEY_UNLOCK();
  1131. ret = Tls13_HKDF_Extract(ssl, ssl->arrays->masterSecret,
  1132. key, ssl->specs.hash_size,
  1133. ssl->arrays->masterSecret, 0, mac2hash(ssl->specs.mac_algorithm));
  1134. PRIVATE_KEY_LOCK();
  1135. #ifdef HAVE_KEYING_MATERIAL
  1136. if (ret != 0)
  1137. return ret;
  1138. /* Calculate exporter secret only when saving arrays */
  1139. if (ssl->options.saveArrays)
  1140. ret = DeriveExporterSecret(ssl, ssl->arrays->exporterSecret);
  1141. #endif
  1142. return ret;
  1143. }
  1144. #if defined(HAVE_SESSION_TICKET)
  1145. /* Length of the resumption label. */
  1146. #define RESUMPTION_LABEL_SZ 10
  1147. /* Resumption label for generating PSK associated with the ticket. */
  1148. static const byte resumptionLabel[RESUMPTION_LABEL_SZ+1] = "resumption";
  1149. /* Derive the PSK associated with the ticket.
  1150. *
  1151. * ssl The SSL/TLS object.
  1152. * nonce The nonce to derive with.
  1153. * nonceLen The length of the nonce to derive with.
  1154. * secret The derived secret.
  1155. * returns 0 on success, otherwise failure.
  1156. */
  1157. int DeriveResumptionPSK(WOLFSSL* ssl, byte* nonce, byte nonceLen, byte* secret)
  1158. {
  1159. int digestAlg;
  1160. /* Only one protocol version defined at this time. */
  1161. const byte* protocol = tls13ProtocolLabel;
  1162. word32 protocolLen = TLS13_PROTOCOL_LABEL_SZ;
  1163. int ret;
  1164. WOLFSSL_MSG("Derive Resumption PSK");
  1165. #ifdef WOLFSSL_DTLS13
  1166. if (ssl->options.dtls) {
  1167. protocol = dtls13ProtocolLabel;
  1168. protocolLen = DTLS13_PROTOCOL_LABEL_SZ;
  1169. }
  1170. #endif /* WOLFSSL_DTLS13 */
  1171. switch (ssl->specs.mac_algorithm) {
  1172. #ifndef NO_SHA256
  1173. case sha256_mac:
  1174. digestAlg = WC_SHA256;
  1175. break;
  1176. #endif
  1177. #ifdef WOLFSSL_SHA384
  1178. case sha384_mac:
  1179. digestAlg = WC_SHA384;
  1180. break;
  1181. #endif
  1182. #ifdef WOLFSSL_TLS13_SHA512
  1183. case sha512_mac:
  1184. digestAlg = WC_SHA512;
  1185. break;
  1186. #endif
  1187. #ifdef WOLFSSL_SM3
  1188. case sm3_mac:
  1189. digestAlg = WC_SM3;
  1190. break;
  1191. #endif
  1192. default:
  1193. return BAD_FUNC_ARG;
  1194. }
  1195. #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  1196. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  1197. PRIVATE_KEY_UNLOCK();
  1198. ret = wc_Tls13_HKDF_Expand_Label_Alloc(secret, ssl->specs.hash_size,
  1199. ssl->session->masterSecret, ssl->specs.hash_size, protocol, protocolLen,
  1200. resumptionLabel, RESUMPTION_LABEL_SZ, nonce, nonceLen, digestAlg,
  1201. ssl->heap);
  1202. PRIVATE_KEY_LOCK();
  1203. #else
  1204. ret = Tls13HKDFExpandLabel(ssl, secret, ssl->specs.hash_size,
  1205. ssl->session->masterSecret, ssl->specs.hash_size,
  1206. protocol, protocolLen, resumptionLabel,
  1207. RESUMPTION_LABEL_SZ, nonce, nonceLen, digestAlg);
  1208. #endif /* !defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3) */
  1209. return ret;
  1210. }
  1211. #endif /* HAVE_SESSION_TICKET */
  1212. /* Calculate the HMAC of message data to this point.
  1213. *
  1214. * ssl The SSL/TLS object.
  1215. * key The HMAC key.
  1216. * hash The hash result - verify data.
  1217. * returns length of verify data generated.
  1218. */
  1219. static int BuildTls13HandshakeHmac(WOLFSSL* ssl, byte* key, byte* hash,
  1220. word32* pHashSz)
  1221. {
  1222. #ifdef WOLFSSL_SMALL_STACK
  1223. Hmac* verifyHmac;
  1224. #else
  1225. Hmac verifyHmac[1];
  1226. #endif
  1227. int hashType = WC_SHA256;
  1228. int hashSz = WC_SHA256_DIGEST_SIZE;
  1229. int ret = BAD_FUNC_ARG;
  1230. if (ssl == NULL || key == NULL || hash == NULL) {
  1231. return BAD_FUNC_ARG;
  1232. }
  1233. /* Get the hash of the previous handshake messages. */
  1234. switch (ssl->specs.mac_algorithm) {
  1235. #ifndef NO_SHA256
  1236. case sha256_mac:
  1237. hashType = WC_SHA256;
  1238. hashSz = WC_SHA256_DIGEST_SIZE;
  1239. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
  1240. break;
  1241. #endif /* !NO_SHA256 */
  1242. #ifdef WOLFSSL_SHA384
  1243. case sha384_mac:
  1244. hashType = WC_SHA384;
  1245. hashSz = WC_SHA384_DIGEST_SIZE;
  1246. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
  1247. break;
  1248. #endif /* WOLFSSL_SHA384 */
  1249. #ifdef WOLFSSL_TLS13_SHA512
  1250. case sha512_mac:
  1251. hashType = WC_SHA512;
  1252. hashSz = WC_SHA512_DIGEST_SIZE;
  1253. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512, hash);
  1254. break;
  1255. #endif /* WOLFSSL_TLS13_SHA512 */
  1256. #ifdef WOLFSSL_SM3
  1257. case sm3_mac:
  1258. hashType = WC_SM3;
  1259. hashSz = WC_SM3_DIGEST_SIZE;
  1260. ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
  1261. break;
  1262. #endif /* WOLFSSL_SM3 */
  1263. default:
  1264. break;
  1265. }
  1266. if (ret != 0)
  1267. return ret;
  1268. #ifdef WOLFSSL_DEBUG_TLS
  1269. WOLFSSL_MSG(" Key");
  1270. WOLFSSL_BUFFER(key, ssl->specs.hash_size);
  1271. WOLFSSL_MSG(" Msg Hash");
  1272. WOLFSSL_BUFFER(hash, hashSz);
  1273. #endif
  1274. #ifdef WOLFSSL_SMALL_STACK
  1275. verifyHmac = (Hmac*)XMALLOC(sizeof(Hmac), NULL, DYNAMIC_TYPE_HMAC);
  1276. if (verifyHmac == NULL) {
  1277. return MEMORY_E;
  1278. }
  1279. #endif
  1280. /* Calculate the verify data. */
  1281. ret = wc_HmacInit(verifyHmac, ssl->heap, ssl->devId);
  1282. if (ret == 0) {
  1283. ret = wc_HmacSetKey(verifyHmac, hashType, key, ssl->specs.hash_size);
  1284. if (ret == 0)
  1285. ret = wc_HmacUpdate(verifyHmac, hash, hashSz);
  1286. if (ret == 0)
  1287. ret = wc_HmacFinal(verifyHmac, hash);
  1288. wc_HmacFree(verifyHmac);
  1289. }
  1290. #ifdef WOLFSSL_SMALL_STACK
  1291. XFREE(verifyHmac, NULL, DYNAMIC_TYPE_HMAC);
  1292. #endif
  1293. #ifdef WOLFSSL_DEBUG_TLS
  1294. WOLFSSL_MSG(" Hash");
  1295. WOLFSSL_BUFFER(hash, hashSz);
  1296. #endif
  1297. if (pHashSz)
  1298. *pHashSz = hashSz;
  1299. return ret;
  1300. }
  1301. /* The length of the label to use when deriving keys. */
  1302. #define WRITE_KEY_LABEL_SZ 3
  1303. /* The length of the label to use when deriving IVs. */
  1304. #define WRITE_IV_LABEL_SZ 2
  1305. /* The label to use when deriving keys. */
  1306. static const byte writeKeyLabel[WRITE_KEY_LABEL_SZ+1] = "key";
  1307. /* The label to use when deriving IVs. */
  1308. static const byte writeIVLabel[WRITE_IV_LABEL_SZ+1] = "iv";
  1309. /* Derive the keys and IVs for TLS v1.3.
  1310. *
  1311. * ssl The SSL/TLS object.
  1312. * secret early_data_key when deriving the key and IV for encrypting early
  1313. * data application data and end_of_early_data messages.
  1314. * handshake_key when deriving keys and IVs for encrypting handshake
  1315. * messages.
  1316. * traffic_key when deriving first keys and IVs for encrypting
  1317. * traffic messages.
  1318. * update_traffic_key when deriving next keys and IVs for encrypting
  1319. * traffic messages.
  1320. * side ENCRYPT_SIDE_ONLY when only encryption secret needs to be derived.
  1321. * DECRYPT_SIDE_ONLY when only decryption secret needs to be derived.
  1322. * ENCRYPT_AND_DECRYPT_SIDE when both secret needs to be derived.
  1323. * store 1 indicates to derive the keys and IVs from derived secret and
  1324. * store ready for provisioning.
  1325. * returns 0 on success, otherwise failure.
  1326. */
  1327. int DeriveTls13Keys(WOLFSSL* ssl, int secret, int side, int store)
  1328. {
  1329. int ret = BAD_FUNC_ARG; /* Assume failure */
  1330. int i = 0;
  1331. #ifdef WOLFSSL_SMALL_STACK
  1332. byte* key_dig;
  1333. #else
  1334. byte key_dig[MAX_PRF_DIG];
  1335. #endif
  1336. int provision;
  1337. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  1338. ret = tsip_Tls13DeriveKeys(ssl, secret, side);
  1339. if (ret != CRYPTOCB_UNAVAILABLE) {
  1340. return ret;
  1341. }
  1342. ret = BAD_FUNC_ARG; /* Assume failure */
  1343. #endif
  1344. #ifdef WOLFSSL_SMALL_STACK
  1345. key_dig = (byte*)XMALLOC(MAX_PRF_DIG, ssl->heap, DYNAMIC_TYPE_DIGEST);
  1346. if (key_dig == NULL)
  1347. return MEMORY_E;
  1348. #endif
  1349. if (side == ENCRYPT_AND_DECRYPT_SIDE) {
  1350. provision = PROVISION_CLIENT_SERVER;
  1351. }
  1352. else {
  1353. provision = ((ssl->options.side != WOLFSSL_CLIENT_END) ^
  1354. (side == ENCRYPT_SIDE_ONLY)) ? PROVISION_CLIENT :
  1355. PROVISION_SERVER;
  1356. }
  1357. /* Derive the appropriate secret to use in the HKDF. */
  1358. switch (secret) {
  1359. #ifdef WOLFSSL_EARLY_DATA
  1360. case early_data_key:
  1361. ret = DeriveEarlyTrafficSecret(ssl, ssl->clientSecret,
  1362. WOLFSSL_CLIENT_END);
  1363. if (ret != 0)
  1364. goto end;
  1365. break;
  1366. #endif
  1367. case handshake_key:
  1368. if (provision & PROVISION_CLIENT) {
  1369. ret = DeriveClientHandshakeSecret(ssl,
  1370. ssl->clientSecret);
  1371. if (ret != 0)
  1372. goto end;
  1373. }
  1374. if (provision & PROVISION_SERVER) {
  1375. ret = DeriveServerHandshakeSecret(ssl,
  1376. ssl->serverSecret);
  1377. if (ret != 0)
  1378. goto end;
  1379. }
  1380. break;
  1381. case traffic_key:
  1382. if (provision & PROVISION_CLIENT) {
  1383. ret = DeriveClientTrafficSecret(ssl, ssl->clientSecret);
  1384. if (ret != 0)
  1385. goto end;
  1386. }
  1387. if (provision & PROVISION_SERVER) {
  1388. ret = DeriveServerTrafficSecret(ssl, ssl->serverSecret);
  1389. if (ret != 0)
  1390. goto end;
  1391. }
  1392. break;
  1393. case update_traffic_key:
  1394. if (provision & PROVISION_CLIENT) {
  1395. ret = DeriveTrafficSecret(ssl, ssl->clientSecret,
  1396. WOLFSSL_CLIENT_END);
  1397. if (ret != 0)
  1398. goto end;
  1399. }
  1400. if (provision & PROVISION_SERVER) {
  1401. ret = DeriveTrafficSecret(ssl, ssl->serverSecret,
  1402. WOLFSSL_SERVER_END);
  1403. if (ret != 0)
  1404. goto end;
  1405. }
  1406. break;
  1407. default:
  1408. break;
  1409. }
  1410. #ifdef WOLFSSL_QUIC
  1411. if (WOLFSSL_IS_QUIC(ssl)) {
  1412. ret = wolfSSL_quic_forward_secrets(ssl, secret, side);
  1413. if (ret != 0)
  1414. goto end;
  1415. }
  1416. #endif /* WOLFSSL_QUIC */
  1417. if (!store)
  1418. goto end;
  1419. /* Key data = client key | server key | client IV | server IV */
  1420. if (provision & PROVISION_CLIENT) {
  1421. /* Derive the client key. */
  1422. WOLFSSL_MSG("Derive Client Key");
  1423. ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.key_size,
  1424. ssl->clientSecret, writeKeyLabel,
  1425. WRITE_KEY_LABEL_SZ, ssl->specs.mac_algorithm, 0,
  1426. WOLFSSL_CLIENT_END);
  1427. if (ret != 0)
  1428. goto end;
  1429. i += ssl->specs.key_size;
  1430. }
  1431. if (provision & PROVISION_SERVER) {
  1432. /* Derive the server key. */
  1433. WOLFSSL_MSG("Derive Server Key");
  1434. ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.key_size,
  1435. ssl->serverSecret, writeKeyLabel,
  1436. WRITE_KEY_LABEL_SZ, ssl->specs.mac_algorithm, 0,
  1437. WOLFSSL_SERVER_END);
  1438. if (ret != 0)
  1439. goto end;
  1440. i += ssl->specs.key_size;
  1441. }
  1442. if (provision & PROVISION_CLIENT) {
  1443. /* Derive the client IV. */
  1444. WOLFSSL_MSG("Derive Client IV");
  1445. ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.iv_size,
  1446. ssl->clientSecret, writeIVLabel,
  1447. WRITE_IV_LABEL_SZ, ssl->specs.mac_algorithm, 0,
  1448. WOLFSSL_CLIENT_END);
  1449. if (ret != 0)
  1450. goto end;
  1451. i += ssl->specs.iv_size;
  1452. }
  1453. if (provision & PROVISION_SERVER) {
  1454. /* Derive the server IV. */
  1455. WOLFSSL_MSG("Derive Server IV");
  1456. ret = Tls13DeriveKey(ssl, &key_dig[i], ssl->specs.iv_size,
  1457. ssl->serverSecret, writeIVLabel,
  1458. WRITE_IV_LABEL_SZ, ssl->specs.mac_algorithm, 0,
  1459. WOLFSSL_SERVER_END);
  1460. if (ret != 0)
  1461. goto end;
  1462. i += ssl->specs.iv_size;
  1463. }
  1464. /* Store keys and IVs but don't activate them. */
  1465. ret = StoreKeys(ssl, key_dig, provision);
  1466. #ifdef WOLFSSL_DTLS13
  1467. if (ret != 0)
  1468. goto end;
  1469. if (ssl->options.dtls) {
  1470. ret = Dtls13DeriveSnKeys(ssl, provision);
  1471. if (ret != 0)
  1472. return ret;
  1473. }
  1474. #endif /* WOLFSSL_DTLS13 */
  1475. end:
  1476. ForceZero(key_dig, i);
  1477. #ifdef WOLFSSL_SMALL_STACK
  1478. XFREE(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
  1479. #elif defined(WOLFSSL_CHECK_MEM_ZERO)
  1480. wc_MemZero_Check(key_dig, MAX_PRF_DIG);
  1481. #endif
  1482. if (ret != 0) {
  1483. WOLFSSL_ERROR_VERBOSE(ret);
  1484. }
  1485. return ret;
  1486. }
  1487. #if (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  1488. #ifdef WOLFSSL_32BIT_MILLI_TIME
  1489. #ifndef NO_ASN_TIME
  1490. #if defined(USER_TICKS)
  1491. #if 0
  1492. word32 TimeNowInMilliseconds(void)
  1493. {
  1494. /*
  1495. write your own clock tick function if don't want gettimeofday()
  1496. needs millisecond accuracy but doesn't have to correlated to EPOCH
  1497. */
  1498. }
  1499. #endif
  1500. #elif defined(TIME_OVERRIDES)
  1501. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  1502. word32 TimeNowInMilliseconds(void)
  1503. {
  1504. return (word32) wc_Time(0) * 1000;
  1505. }
  1506. #else
  1507. #ifndef HAVE_TIME_T_TYPE
  1508. typedef long time_t;
  1509. #endif
  1510. extern time_t XTIME(time_t * timer);
  1511. /* The time in milliseconds.
  1512. * Used for tickets to represent difference between when first seen and when
  1513. * sending.
  1514. *
  1515. * returns the time in milliseconds as a 32-bit value.
  1516. */
  1517. word32 TimeNowInMilliseconds(void)
  1518. {
  1519. return (word32) XTIME(0) * 1000;
  1520. }
  1521. #endif
  1522. #elif defined(XTIME_MS)
  1523. word32 TimeNowInMilliseconds(void)
  1524. {
  1525. return (word32)XTIME_MS(0);
  1526. }
  1527. #elif defined(USE_WINDOWS_API)
  1528. /* The time in milliseconds.
  1529. * Used for tickets to represent difference between when first seen and when
  1530. * sending.
  1531. *
  1532. * returns the time in milliseconds as a 32-bit value.
  1533. */
  1534. word32 TimeNowInMilliseconds(void)
  1535. {
  1536. static int init = 0;
  1537. static LARGE_INTEGER freq;
  1538. LARGE_INTEGER count;
  1539. if (!init) {
  1540. QueryPerformanceFrequency(&freq);
  1541. init = 1;
  1542. }
  1543. QueryPerformanceCounter(&count);
  1544. return (word32)(count.QuadPart / (freq.QuadPart / 1000));
  1545. }
  1546. #elif defined(HAVE_RTP_SYS)
  1547. #include "rtptime.h"
  1548. /* The time in milliseconds.
  1549. * Used for tickets to represent difference between when first seen and when
  1550. * sending.
  1551. *
  1552. * returns the time in milliseconds as a 32-bit value.
  1553. */
  1554. word32 TimeNowInMilliseconds(void)
  1555. {
  1556. return (word32)rtp_get_system_sec() * 1000;
  1557. }
  1558. #elif defined(WOLFSSL_DEOS)
  1559. word32 TimeNowInMilliseconds(void)
  1560. {
  1561. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  1562. word32 *systemTickPtr = systemTickPointer();
  1563. return (word32) (*systemTickPtr/systemTickTimeInHz) * 1000;
  1564. }
  1565. #elif defined(MICRIUM)
  1566. /* The time in milliseconds.
  1567. * Used for tickets to represent difference between when first seen and when
  1568. * sending.
  1569. *
  1570. * returns the time in milliseconds as a 32-bit value.
  1571. */
  1572. word32 TimeNowInMilliseconds(void)
  1573. {
  1574. OS_TICK ticks = 0;
  1575. OS_ERR err;
  1576. ticks = OSTimeGet(&err);
  1577. return (word32) (ticks / OSCfg_TickRate_Hz) * 1000;
  1578. }
  1579. #elif defined(MICROCHIP_TCPIP_V5)
  1580. /* The time in milliseconds.
  1581. * Used for tickets to represent difference between when first seen and when
  1582. * sending.
  1583. *
  1584. * returns the time in milliseconds as a 32-bit value.
  1585. */
  1586. word32 TimeNowInMilliseconds(void)
  1587. {
  1588. return (word32) (TickGet() / (TICKS_PER_SECOND / 1000));
  1589. }
  1590. #elif defined(MICROCHIP_TCPIP)
  1591. #if defined(MICROCHIP_MPLAB_HARMONY)
  1592. #include <system/tmr/sys_tmr.h>
  1593. /* The time in milliseconds.
  1594. * Used for tickets to represent difference between when first seen and when
  1595. * sending.
  1596. *
  1597. * returns the time in milliseconds as a 32-bit value.
  1598. */
  1599. word32 TimeNowInMilliseconds(void)
  1600. {
  1601. return (word32)(SYS_TMR_TickCountGet() /
  1602. (SYS_TMR_TickCounterFrequencyGet() / 1000));
  1603. }
  1604. #else
  1605. /* The time in milliseconds.
  1606. * Used for tickets to represent difference between when first seen and when
  1607. * sending.
  1608. *
  1609. * returns the time in milliseconds as a 32-bit value.
  1610. */
  1611. word32 TimeNowInMilliseconds(void)
  1612. {
  1613. return (word32)(SYS_TICK_Get() / (SYS_TICK_TicksPerSecondGet() / 1000));
  1614. }
  1615. #endif
  1616. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  1617. /* The time in milliseconds.
  1618. * Used for tickets to represent difference between when first seen and when
  1619. * sending.
  1620. *
  1621. * returns the time in milliseconds as a 32-bit value.
  1622. */
  1623. word32 TimeNowInMilliseconds(void)
  1624. {
  1625. TIME_STRUCT mqxTime;
  1626. _time_get_elapsed(&mqxTime);
  1627. return (word32) mqxTime.SECONDS * 1000;
  1628. }
  1629. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  1630. #include "include/task.h"
  1631. /* The time in milliseconds.
  1632. * Used for tickets to represent difference between when first seen and when
  1633. * sending.
  1634. *
  1635. * returns the time in milliseconds as a 32-bit value.
  1636. */
  1637. word32 TimeNowInMilliseconds(void)
  1638. {
  1639. return (unsigned int)(((float)xTaskGetTickCount()) /
  1640. (configTICK_RATE_HZ / 1000));
  1641. }
  1642. #elif defined(FREESCALE_KSDK_BM)
  1643. #include "lwip/sys.h" /* lwIP */
  1644. /* The time in milliseconds.
  1645. * Used for tickets to represent difference between when first seen and when
  1646. * sending.
  1647. *
  1648. * returns the time in milliseconds as a 32-bit value.
  1649. */
  1650. word32 TimeNowInMilliseconds(void)
  1651. {
  1652. return sys_now();
  1653. }
  1654. #elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2)
  1655. word32 TimeNowInMilliseconds(void)
  1656. {
  1657. return (word32)osKernelGetTickCount();
  1658. }
  1659. #elif defined(WOLFSSL_TIRTOS)
  1660. /* The time in milliseconds.
  1661. * Used for tickets to represent difference between when first seen and when
  1662. * sending.
  1663. *
  1664. * returns the time in milliseconds as a 32-bit value.
  1665. */
  1666. word32 TimeNowInMilliseconds(void)
  1667. {
  1668. return (word32) Seconds_get() * 1000;
  1669. }
  1670. #elif defined(WOLFSSL_UTASKER)
  1671. /* The time in milliseconds.
  1672. * Used for tickets to represent difference between when first seen and when
  1673. * sending.
  1674. *
  1675. * returns the time in milliseconds as a 32-bit value.
  1676. */
  1677. word32 TimeNowInMilliseconds(void)
  1678. {
  1679. return (word32)(uTaskerSystemTick / (TICK_RESOLUTION / 1000));
  1680. }
  1681. #elif defined(WOLFSSL_LINUXKM)
  1682. word32 TimeNowInMilliseconds(void)
  1683. {
  1684. s64 t;
  1685. #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
  1686. struct timespec ts;
  1687. getnstimeofday(&ts);
  1688. t = ts.tv_sec * (s64)1000;
  1689. t += ts.tv_nsec / (s64)1000000;
  1690. #else
  1691. struct timespec64 ts;
  1692. #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
  1693. ts = current_kernel_time64();
  1694. #else
  1695. ktime_get_coarse_real_ts64(&ts);
  1696. #endif
  1697. t = ts.tv_sec * 1000L;
  1698. t += ts.tv_nsec / 1000000L;
  1699. #endif
  1700. return (word32)t;
  1701. }
  1702. #elif defined(WOLFSSL_QNX_CAAM)
  1703. word32 TimeNowInMilliseconds(void)
  1704. {
  1705. struct timespec now;
  1706. clock_gettime(CLOCK_REALTIME, &now);
  1707. return (word32)(now.tv_sec * 1000 + now.tv_nsec / 1000000);
  1708. }
  1709. #elif defined(FUSION_RTOS)
  1710. /* The time in milliseconds.
  1711. * Used for tickets to represent difference between when first seen and when
  1712. * sending.
  1713. *
  1714. * returns the time in milliseconds as a 32-bit value.
  1715. */
  1716. word32 TimeNowInMilliseconds(void)
  1717. {
  1718. struct timeval now;
  1719. if (FCL_GETTIMEOFDAY(&now, 0) < 0)
  1720. return 0;
  1721. /* Convert to milliseconds number. */
  1722. return (word32)(now.tv_sec * 1000 + now.tv_usec / 1000);
  1723. }
  1724. #elif defined(WOLFSSL_ZEPHYR)
  1725. word32 TimeNowInMilliseconds(void)
  1726. {
  1727. int64_t t;
  1728. #if defined(CONFIG_ARCH_POSIX)
  1729. k_cpu_idle();
  1730. #endif
  1731. t = k_uptime_get(); /* returns current uptime in milliseconds */
  1732. return (word32)t;
  1733. }
  1734. #else
  1735. /* The time in milliseconds.
  1736. * Used for tickets to represent difference between when first seen and when
  1737. * sending.
  1738. *
  1739. * returns the time in milliseconds as a 32-bit value.
  1740. */
  1741. word32 TimeNowInMilliseconds(void)
  1742. {
  1743. struct timeval now;
  1744. if (gettimeofday(&now, 0) < 0)
  1745. return 0;
  1746. /* Convert to milliseconds number. */
  1747. return (word32)(now.tv_sec * 1000 + now.tv_usec / 1000);
  1748. }
  1749. #endif
  1750. #else
  1751. /* user must supply time in milliseconds function:
  1752. * word32 TimeNowInMilliseconds(void);
  1753. * The response is milliseconds elapsed
  1754. */
  1755. #endif /* !NO_ASN_TIME */
  1756. #else
  1757. #ifndef NO_ASN_TIME
  1758. #if defined(USER_TICKS)
  1759. #if 0
  1760. sword64 TimeNowInMilliseconds(void)
  1761. {
  1762. /*
  1763. write your own clock tick function if don't want gettimeofday()
  1764. needs millisecond accuracy but doesn't have to correlated to EPOCH
  1765. */
  1766. }
  1767. #endif
  1768. #elif defined(TIME_OVERRIDES)
  1769. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  1770. sword64 TimeNowInMilliseconds(void)
  1771. {
  1772. return (sword64) wc_Time(0) * 1000;
  1773. }
  1774. #else
  1775. #ifndef HAVE_TIME_T_TYPE
  1776. typedef long time_t;
  1777. #endif
  1778. extern time_t XTIME(time_t * timer);
  1779. /* The time in milliseconds.
  1780. * Used for tickets to represent difference between when first seen and when
  1781. * sending.
  1782. *
  1783. * returns the time in milliseconds as a 32-bit value.
  1784. */
  1785. sword64 TimeNowInMilliseconds(void)
  1786. {
  1787. return (sword64) XTIME(0) * 1000;
  1788. }
  1789. #endif
  1790. #elif defined(XTIME_MS)
  1791. sword64 TimeNowInMilliseconds(void)
  1792. {
  1793. return (sword64)XTIME_MS(0);
  1794. }
  1795. #elif defined(USE_WINDOWS_API)
  1796. /* The time in milliseconds.
  1797. * Used for tickets to represent difference between when first seen and when
  1798. * sending.
  1799. *
  1800. * returns the time in milliseconds as a 64-bit value.
  1801. */
  1802. sword64 TimeNowInMilliseconds(void)
  1803. {
  1804. static int init = 0;
  1805. static LARGE_INTEGER freq;
  1806. LARGE_INTEGER count;
  1807. if (!init) {
  1808. QueryPerformanceFrequency(&freq);
  1809. init = 1;
  1810. }
  1811. QueryPerformanceCounter(&count);
  1812. return (sword64)(count.QuadPart / (freq.QuadPart / 1000));
  1813. }
  1814. #elif defined(HAVE_RTP_SYS)
  1815. #include "rtptime.h"
  1816. /* The time in milliseconds.
  1817. * Used for tickets to represent difference between when first seen and when
  1818. * sending.
  1819. *
  1820. * returns the time in milliseconds as a 64-bit value.
  1821. */
  1822. sword64 TimeNowInMilliseconds(void)
  1823. {
  1824. return (sword64)rtp_get_system_sec() * 1000;
  1825. }
  1826. #elif defined(WOLFSSL_DEOS)
  1827. sword64 TimeNowInMilliseconds(void)
  1828. {
  1829. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  1830. word32 *systemTickPtr = systemTickPointer();
  1831. return (sword64) (*systemTickPtr/systemTickTimeInHz) * 1000;
  1832. }
  1833. #elif defined(MICRIUM)
  1834. /* The time in milliseconds.
  1835. * Used for tickets to represent difference between when first seen and when
  1836. * sending.
  1837. *
  1838. * returns the time in milliseconds as a 64-bit value.
  1839. */
  1840. sword64 TimeNowInMilliseconds(void)
  1841. {
  1842. OS_TICK ticks = 0;
  1843. OS_ERR err;
  1844. ticks = OSTimeGet(&err);
  1845. return (sword64) (ticks / OSCfg_TickRate_Hz) * 1000;
  1846. }
  1847. #elif defined(MICROCHIP_TCPIP_V5)
  1848. /* The time in milliseconds.
  1849. * Used for tickets to represent difference between when first seen and when
  1850. * sending.
  1851. *
  1852. * returns the time in milliseconds as a 64-bit value.
  1853. */
  1854. sword64 TimeNowInMilliseconds(void)
  1855. {
  1856. return (sword64) (TickGet() / (TICKS_PER_SECOND / 1000));
  1857. }
  1858. #elif defined(MICROCHIP_TCPIP)
  1859. #if defined(MICROCHIP_MPLAB_HARMONY)
  1860. #include <system/tmr/sys_tmr.h>
  1861. /* The time in milliseconds.
  1862. * Used for tickets to represent difference between when first seen and when
  1863. * sending.
  1864. *
  1865. * returns the time in milliseconds as a 64-bit value.
  1866. */
  1867. sword64 TimeNowInMilliseconds(void)
  1868. {
  1869. return (sword64)SYS_TMR_TickCountGet() /
  1870. (SYS_TMR_TickCounterFrequencyGet() / 1000);
  1871. }
  1872. #else
  1873. /* The time in milliseconds.
  1874. * Used for tickets to represent difference between when first seen and when
  1875. * sending.
  1876. *
  1877. * returns the time in milliseconds as a 64-bit value.
  1878. */
  1879. sword64 TimeNowInMilliseconds(void)
  1880. {
  1881. return (sword64)SYS_TICK_Get() / (SYS_TICK_TicksPerSecondGet() / 1000);
  1882. }
  1883. #endif
  1884. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  1885. /* The time in milliseconds.
  1886. * Used for tickets to represent difference between when first seen and when
  1887. * sending.
  1888. *
  1889. * returns the time in milliseconds as a 64-bit value.
  1890. */
  1891. sword64 TimeNowInMilliseconds(void)
  1892. {
  1893. TIME_STRUCT mqxTime;
  1894. _time_get_elapsed(&mqxTime);
  1895. return (sword64) mqxTime.SECONDS * 1000;
  1896. }
  1897. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  1898. #include "include/task.h"
  1899. /* The time in milliseconds.
  1900. * Used for tickets to represent difference between when first seen and when
  1901. * sending.
  1902. *
  1903. * returns the time in milliseconds as a 64-bit value.
  1904. */
  1905. sword64 TimeNowInMilliseconds(void)
  1906. {
  1907. return (sword64)xTaskGetTickCount() / (configTICK_RATE_HZ / 1000);
  1908. }
  1909. #elif defined(FREESCALE_KSDK_BM)
  1910. #include "lwip/sys.h" /* lwIP */
  1911. /* The time in milliseconds.
  1912. * Used for tickets to represent difference between when first seen and when
  1913. * sending.
  1914. *
  1915. * returns the time in milliseconds as a 64-bit value.
  1916. */
  1917. sword64 TimeNowInMilliseconds(void)
  1918. {
  1919. return sys_now();
  1920. }
  1921. #elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2)
  1922. sword64 TimeNowInMilliseconds(void)
  1923. {
  1924. return (sword64)osKernelGetTickCount();
  1925. }
  1926. #elif defined(WOLFSSL_TIRTOS)
  1927. /* The time in milliseconds.
  1928. * Used for tickets to represent difference between when first seen and when
  1929. * sending.
  1930. *
  1931. * returns the time in milliseconds as a 64-bit value.
  1932. */
  1933. sword64 TimeNowInMilliseconds(void)
  1934. {
  1935. return (sword64) Seconds_get() * 1000;
  1936. }
  1937. #elif defined(WOLFSSL_UTASKER)
  1938. /* The time in milliseconds.
  1939. * Used for tickets to represent difference between when first seen and when
  1940. * sending.
  1941. *
  1942. * returns the time in milliseconds as a 64-bit value.
  1943. */
  1944. sword64 TimeNowInMilliseconds(void)
  1945. {
  1946. return (sword64)(uTaskerSystemTick / (TICK_RESOLUTION / 1000));
  1947. }
  1948. #elif defined(WOLFSSL_LINUXKM)
  1949. sword64 TimeNowInMilliseconds(void)
  1950. {
  1951. s64 t;
  1952. #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
  1953. struct timespec ts;
  1954. getnstimeofday(&ts);
  1955. t = ts.tv_sec * (s64)1000;
  1956. t += ts.tv_nsec / (s64)1000000;
  1957. #else
  1958. struct timespec64 ts;
  1959. #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
  1960. ts = current_kernel_time64();
  1961. #else
  1962. ktime_get_coarse_real_ts64(&ts);
  1963. #endif
  1964. t = ts.tv_sec * 1000L;
  1965. t += ts.tv_nsec / 1000000L;
  1966. #endif
  1967. return (sword64)t;
  1968. }
  1969. #elif defined(WOLFSSL_QNX_CAAM)
  1970. sword64 TimeNowInMilliseconds(void)
  1971. {
  1972. struct timespec now;
  1973. clock_gettime(CLOCK_REALTIME, &now);
  1974. return (sword64)(now.tv_sec * 1000 + now.tv_nsec / 1000000);
  1975. }
  1976. #elif defined(FUSION_RTOS)
  1977. /* The time in milliseconds.
  1978. * Used for tickets to represent difference between when first seen and when
  1979. * sending.
  1980. *
  1981. * returns the time in milliseconds as a 64-bit value.
  1982. */
  1983. sword64 TimeNowInMilliseconds(void)
  1984. {
  1985. struct timeval now;
  1986. if (FCL_GETTIMEOFDAY(&now, 0) < 0)
  1987. return 0;
  1988. /* Convert to milliseconds number. */
  1989. return (sword64)now.tv_sec * 1000 + now.tv_usec / 1000;
  1990. }
  1991. #elif defined(WOLFSSL_ZEPHYR)
  1992. sword64 TimeNowInMilliseconds(void)
  1993. {
  1994. int64_t t;
  1995. #if defined(CONFIG_ARCH_POSIX)
  1996. k_cpu_idle();
  1997. #endif
  1998. t = k_uptime_get(); /* returns current uptime in milliseconds */
  1999. return (sword64)t;
  2000. }
  2001. #else
  2002. /* The time in milliseconds.
  2003. * Used for tickets to represent difference between when first seen and when
  2004. * sending.
  2005. *
  2006. * returns the time in milliseconds as a 64-bit value.
  2007. */
  2008. sword64 TimeNowInMilliseconds(void)
  2009. {
  2010. struct timeval now;
  2011. if (gettimeofday(&now, 0) < 0)
  2012. return 0;
  2013. /* Convert to milliseconds number. */
  2014. return (sword64)now.tv_sec * 1000 + now.tv_usec / 1000;
  2015. }
  2016. #endif
  2017. #else
  2018. /* user must supply time in milliseconds function:
  2019. * sword64 TimeNowInMilliseconds(void);
  2020. * The response is milliseconds elapsed
  2021. */
  2022. #endif /* !NO_ASN_TIME */
  2023. #endif /* WOLFSSL_32BIT_MILLI_TIME */
  2024. #endif /* HAVE_SESSION_TICKET || !NO_PSK */
  2025. /* Extract the handshake header information.
  2026. *
  2027. * ssl The SSL/TLS object.
  2028. * input The buffer holding the message data.
  2029. * inOutIdx On entry, the index into the buffer of the handshake data.
  2030. * On exit, the start of the handshake data.
  2031. * type Type of handshake message.
  2032. * size The length of the handshake message data.
  2033. * totalSz The total size of data in the buffer.
  2034. * returns BUFFER_E if there is not enough input data and 0 on success.
  2035. */
  2036. static int GetHandshakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  2037. byte* type, word32* size, word32 totalSz)
  2038. {
  2039. const byte* ptr = input + *inOutIdx;
  2040. (void)ssl;
  2041. *inOutIdx += HANDSHAKE_HEADER_SZ;
  2042. if (*inOutIdx > totalSz)
  2043. return BUFFER_E;
  2044. *type = ptr[0];
  2045. c24to32(&ptr[1], size);
  2046. return 0;
  2047. }
  2048. /* Add record layer header to message.
  2049. *
  2050. * output The buffer to write the record layer header into.
  2051. * length The length of the record data.
  2052. * type The type of record message.
  2053. * ssl The SSL/TLS object.
  2054. */
  2055. static void AddTls13RecordHeader(byte* output, word32 length, byte type,
  2056. WOLFSSL* ssl)
  2057. {
  2058. RecordLayerHeader* rl;
  2059. rl = (RecordLayerHeader*)output;
  2060. rl->type = type;
  2061. rl->pvMajor = ssl->version.major;
  2062. /* NOTE: May be TLSv1_MINOR when sending first ClientHello. */
  2063. rl->pvMinor = TLSv1_2_MINOR;
  2064. c16toa((word16)length, rl->length);
  2065. }
  2066. /* Add handshake header to message.
  2067. *
  2068. * output The buffer to write the handshake header into.
  2069. * length The length of the handshake data.
  2070. * fragOffset The offset of the fragment data. (DTLS)
  2071. * fragLength The length of the fragment data. (DTLS)
  2072. * type The type of handshake message.
  2073. * ssl The SSL/TLS object. (DTLS)
  2074. */
  2075. static void AddTls13HandShakeHeader(byte* output, word32 length,
  2076. word32 fragOffset, word32 fragLength,
  2077. byte type, WOLFSSL* ssl)
  2078. {
  2079. HandShakeHeader* hs;
  2080. (void)fragOffset;
  2081. (void)fragLength;
  2082. (void)ssl;
  2083. #ifdef WOLFSSL_DTLS13
  2084. /* message_hash type is used for a synthetic message that replaces the first
  2085. ClientHello in the hash transcript when using HelloRetryRequest. It will
  2086. never be transmitted and, as the DTLS-only fields must not be considered
  2087. when computing the hash transcript, we can avoid to use the DTLS
  2088. handshake header. */
  2089. if (ssl->options.dtls && type != message_hash) {
  2090. Dtls13HandshakeAddHeader(ssl, output, (enum HandShakeType)type, length);
  2091. return;
  2092. }
  2093. #endif /* WOLFSSL_DTLS13 */
  2094. /* handshake header */
  2095. hs = (HandShakeHeader*)output;
  2096. hs->type = type;
  2097. c32to24(length, hs->length);
  2098. }
  2099. /* Add both record layer and handshake header to message.
  2100. *
  2101. * output The buffer to write the headers into.
  2102. * length The length of the handshake data.
  2103. * type The type of record layer message.
  2104. * ssl The SSL/TLS object. (DTLS)
  2105. */
  2106. static void AddTls13Headers(byte* output, word32 length, byte type,
  2107. WOLFSSL* ssl)
  2108. {
  2109. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  2110. word32 outputAdj = RECORD_HEADER_SZ;
  2111. #ifdef WOLFSSL_DTLS13
  2112. if (ssl->options.dtls) {
  2113. Dtls13AddHeaders(output, length, (enum HandShakeType)type, ssl);
  2114. return;
  2115. }
  2116. #endif /* WOLFSSL_DTLS13 */
  2117. AddTls13RecordHeader(output, length + lengthAdj, handshake, ssl);
  2118. AddTls13HandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  2119. }
  2120. #if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) \
  2121. && !defined(NO_CERTS)
  2122. /* Add both record layer and fragment handshake header to message.
  2123. *
  2124. * output The buffer to write the headers into.
  2125. * fragOffset The offset of the fragment data. (DTLS)
  2126. * fragLength The length of the fragment data. (DTLS)
  2127. * length The length of the handshake data.
  2128. * type The type of record layer message.
  2129. * ssl The SSL/TLS object. (DTLS)
  2130. */
  2131. static void AddTls13FragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  2132. word32 length, byte type, WOLFSSL* ssl)
  2133. {
  2134. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  2135. word32 outputAdj = RECORD_HEADER_SZ;
  2136. (void)fragSz;
  2137. #ifdef WOLFSSL_DTLS13
  2138. /* we ignore fragmentation fields here because fragmentation logic for
  2139. DTLS1.3 is inside dtls13_handshake_send(). */
  2140. if (ssl->options.dtls) {
  2141. Dtls13AddHeaders(output, length, (enum HandShakeType)type, ssl);
  2142. return;
  2143. }
  2144. #endif /* WOLFSSL_DTLS13 */
  2145. AddTls13RecordHeader(output, fragSz + lengthAdj, handshake, ssl);
  2146. AddTls13HandShakeHeader(output + outputAdj, length, fragOffset, fragSz,
  2147. type, ssl);
  2148. }
  2149. #endif /* (!NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER) && !NO_CERTS */
  2150. /* Write the sequence number into the buffer.
  2151. * No DTLS v1.3 support.
  2152. *
  2153. * ssl The SSL/TLS object.
  2154. * verifyOrder Which set of sequence numbers to use.
  2155. * out The buffer to write into.
  2156. */
  2157. static WC_INLINE void WriteSEQTls13(WOLFSSL* ssl, int verifyOrder, byte* out)
  2158. {
  2159. word32 seq[2] = {0, 0};
  2160. if (ssl->options.dtls) {
  2161. #ifdef WOLFSSL_DTLS13
  2162. Dtls13GetSeq(ssl, verifyOrder, seq, 1);
  2163. #endif /* WOLFSSL_DTLS13 */
  2164. }
  2165. else if (verifyOrder == PEER_ORDER) {
  2166. seq[0] = ssl->keys.peer_sequence_number_hi;
  2167. seq[1] = ssl->keys.peer_sequence_number_lo++;
  2168. /* handle rollover */
  2169. if (seq[1] > ssl->keys.peer_sequence_number_lo)
  2170. ssl->keys.peer_sequence_number_hi++;
  2171. }
  2172. else {
  2173. seq[0] = ssl->keys.sequence_number_hi;
  2174. seq[1] = ssl->keys.sequence_number_lo++;
  2175. /* handle rollover */
  2176. if (seq[1] > ssl->keys.sequence_number_lo)
  2177. ssl->keys.sequence_number_hi++;
  2178. }
  2179. c32toa(seq[0], out);
  2180. c32toa(seq[1], out + OPAQUE32_LEN);
  2181. }
  2182. /* Build the nonce for TLS v1.3 encryption and decryption.
  2183. *
  2184. * ssl The SSL/TLS object.
  2185. * nonce The nonce data to use when encrypting or decrypting.
  2186. * iv The derived IV.
  2187. * order The side on which the message is to be or was sent.
  2188. */
  2189. static WC_INLINE void BuildTls13Nonce(WOLFSSL* ssl, byte* nonce, const byte* iv,
  2190. int order)
  2191. {
  2192. int i;
  2193. /* The nonce is the IV with the sequence XORed into the last bytes. */
  2194. WriteSEQTls13(ssl, order, nonce + AEAD_NONCE_SZ - SEQ_SZ);
  2195. for (i = 0; i < AEAD_NONCE_SZ - SEQ_SZ; i++)
  2196. nonce[i] = iv[i];
  2197. for (; i < AEAD_NONCE_SZ; i++)
  2198. nonce[i] ^= iv[i];
  2199. }
  2200. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  2201. /* Encrypt with ChaCha20 and create authentication tag with Poly1305.
  2202. *
  2203. * ssl The SSL/TLS object.
  2204. * output The buffer to write encrypted data and authentication tag into.
  2205. * May be the same pointer as input.
  2206. * input The data to encrypt.
  2207. * sz The number of bytes to encrypt.
  2208. * nonce The nonce to use with ChaCha20.
  2209. * aad The additional authentication data.
  2210. * aadSz The size of the addition authentication data.
  2211. * tag The authentication tag buffer.
  2212. * returns 0 on success, otherwise failure.
  2213. */
  2214. static int ChaCha20Poly1305_Encrypt(WOLFSSL* ssl, byte* output,
  2215. const byte* input, word16 sz, byte* nonce,
  2216. const byte* aad, word16 aadSz, byte* tag)
  2217. {
  2218. int ret = 0;
  2219. byte poly[CHACHA20_256_KEY_SIZE];
  2220. /* Poly1305 key is 256 bits of zero encrypted with ChaCha20. */
  2221. XMEMSET(poly, 0, sizeof(poly));
  2222. /* Set the nonce for ChaCha and get Poly1305 key. */
  2223. ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0);
  2224. if (ret != 0)
  2225. return ret;
  2226. /* Create Poly1305 key using ChaCha20 keystream. */
  2227. ret = wc_Chacha_Process(ssl->encrypt.chacha, poly, poly, sizeof(poly));
  2228. if (ret != 0)
  2229. return ret;
  2230. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2231. wc_MemZero_Add("ChaCha20Poly1305_Encrypt poly", poly, sizeof(poly));
  2232. #endif
  2233. ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1);
  2234. if (ret != 0)
  2235. return ret;
  2236. /* Encrypt the plain text. */
  2237. ret = wc_Chacha_Process(ssl->encrypt.chacha, output, input, sz);
  2238. if (ret != 0) {
  2239. ForceZero(poly, sizeof(poly));
  2240. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2241. wc_MemZero_Check(poly, sizeof(poly));
  2242. #endif
  2243. return ret;
  2244. }
  2245. /* Set key for Poly1305. */
  2246. ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly, sizeof(poly));
  2247. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  2248. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2249. wc_MemZero_Check(poly, sizeof(poly));
  2250. #endif
  2251. if (ret != 0)
  2252. return ret;
  2253. /* Add authentication code of encrypted data to end. */
  2254. ret = wc_Poly1305_MAC(ssl->auth.poly1305, aad, aadSz, output, sz, tag,
  2255. POLY1305_AUTH_SZ);
  2256. return ret;
  2257. }
  2258. #endif
  2259. #ifdef HAVE_NULL_CIPHER
  2260. /* Create authentication tag and copy data over input.
  2261. *
  2262. * ssl The SSL/TLS object.
  2263. * output The buffer to copy data into.
  2264. * May be the same pointer as input.
  2265. * input The data.
  2266. * sz The number of bytes of data.
  2267. * nonce The nonce to use with authentication.
  2268. * aad The additional authentication data.
  2269. * aadSz The size of the addition authentication data.
  2270. * tag The authentication tag buffer.
  2271. * returns 0 on success, otherwise failure.
  2272. */
  2273. static int Tls13IntegrityOnly_Encrypt(WOLFSSL* ssl, byte* output,
  2274. const byte* input, word16 sz,
  2275. const byte* nonce,
  2276. const byte* aad, word16 aadSz, byte* tag)
  2277. {
  2278. int ret;
  2279. /* HMAC: nonce | aad | input */
  2280. ret = wc_HmacUpdate(ssl->encrypt.hmac, nonce, HMAC_NONCE_SZ);
  2281. if (ret == 0)
  2282. ret = wc_HmacUpdate(ssl->encrypt.hmac, aad, aadSz);
  2283. if (ret == 0)
  2284. ret = wc_HmacUpdate(ssl->encrypt.hmac, input, sz);
  2285. if (ret == 0)
  2286. ret = wc_HmacFinal(ssl->encrypt.hmac, tag);
  2287. /* Copy the input to output if not the same buffer */
  2288. if (ret == 0 && output != input)
  2289. XMEMCPY(output, input, sz);
  2290. return ret;
  2291. }
  2292. #endif
  2293. /* Encrypt data for TLS v1.3.
  2294. *
  2295. * ssl The SSL/TLS object.
  2296. * output The buffer to write encrypted data and authentication tag into.
  2297. * May be the same pointer as input.
  2298. * input The record header and data to encrypt.
  2299. * sz The number of bytes to encrypt.
  2300. * aad The additional authentication data.
  2301. * aadSz The size of the addition authentication data.
  2302. * asyncOkay If non-zero can return WC_PENDING_E, otherwise blocks on crypto
  2303. * returns 0 on success, otherwise failure.
  2304. */
  2305. static int EncryptTls13(WOLFSSL* ssl, byte* output, const byte* input,
  2306. word16 sz, const byte* aad, word16 aadSz, int asyncOkay)
  2307. {
  2308. int ret = 0;
  2309. word16 dataSz = sz - ssl->specs.aead_mac_size;
  2310. word16 macSz = ssl->specs.aead_mac_size;
  2311. word32 nonceSz = 0;
  2312. #ifdef WOLFSSL_ASYNC_CRYPT
  2313. WC_ASYNC_DEV* asyncDev = NULL;
  2314. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  2315. #endif
  2316. WOLFSSL_ENTER("EncryptTls13");
  2317. (void)output;
  2318. (void)input;
  2319. (void)sz;
  2320. (void)dataSz;
  2321. (void)macSz;
  2322. (void)asyncOkay;
  2323. (void)nonceSz;
  2324. #ifdef WOLFSSL_ASYNC_CRYPT
  2325. if (ssl->error == WC_PENDING_E) {
  2326. ssl->error = 0; /* clear async */
  2327. }
  2328. #endif
  2329. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  2330. ret = tsip_Tls13AesEncrypt(ssl, output, input, dataSz);
  2331. if (ret != CRYPTOCB_UNAVAILABLE) {
  2332. if (ret > 0) {
  2333. ret = 0; /* tsip_Tls13AesEncrypt returns output size */
  2334. }
  2335. return ret;
  2336. }
  2337. ret = 0;
  2338. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  2339. switch (ssl->encrypt.state) {
  2340. case CIPHER_STATE_BEGIN:
  2341. {
  2342. #ifdef WOLFSSL_DEBUG_TLS
  2343. WOLFSSL_MSG("Data to encrypt");
  2344. WOLFSSL_BUFFER(input, dataSz);
  2345. WOLFSSL_MSG("Additional Authentication Data");
  2346. WOLFSSL_BUFFER(aad, aadSz);
  2347. #endif
  2348. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  2349. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  2350. XMEMCPY(ssl->encrypt.sanityCheck, input,
  2351. min(dataSz, sizeof(ssl->encrypt.sanityCheck)));
  2352. }
  2353. #endif
  2354. #ifdef CIPHER_NONCE
  2355. if (ssl->encrypt.nonce == NULL) {
  2356. ssl->encrypt.nonce = (byte*)XMALLOC(AEAD_NONCE_SZ,
  2357. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2358. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2359. if (ssl->encrypt.nonce != NULL) {
  2360. wc_MemZero_Add("EncryptTls13 nonce", ssl->encrypt.nonce,
  2361. AEAD_NONCE_SZ);
  2362. }
  2363. #endif
  2364. }
  2365. if (ssl->encrypt.nonce == NULL)
  2366. return MEMORY_E;
  2367. BuildTls13Nonce(ssl, ssl->encrypt.nonce, ssl->keys.aead_enc_imp_IV,
  2368. CUR_ORDER);
  2369. #endif
  2370. /* Advance state and proceed */
  2371. ssl->encrypt.state = CIPHER_STATE_DO;
  2372. }
  2373. FALL_THROUGH;
  2374. case CIPHER_STATE_DO:
  2375. {
  2376. switch (ssl->specs.bulk_cipher_algorithm) {
  2377. #ifdef BUILD_AESGCM
  2378. case wolfssl_aes_gcm:
  2379. #ifdef WOLFSSL_ASYNC_CRYPT
  2380. /* initialize event */
  2381. asyncDev = &ssl->encrypt.aes->asyncDev;
  2382. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  2383. if (ret != 0)
  2384. break;
  2385. #endif
  2386. nonceSz = AESGCM_NONCE_SZ;
  2387. #if defined(HAVE_PK_CALLBACKS)
  2388. ret = NOT_COMPILED_IN;
  2389. if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
  2390. ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 1,
  2391. output, input, dataSz,
  2392. ssl->encrypt.nonce, nonceSz,
  2393. output + dataSz, macSz,
  2394. aad, aadSz);
  2395. }
  2396. if (ret == NOT_COMPILED_IN)
  2397. #endif
  2398. {
  2399. #if ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  2400. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  2401. ret = wc_AesGcmEncrypt(ssl->encrypt.aes, output, input,
  2402. dataSz, ssl->encrypt.nonce, nonceSz,
  2403. output + dataSz, macSz, aad, aadSz);
  2404. #else
  2405. ret = wc_AesGcmSetExtIV(ssl->encrypt.aes,
  2406. ssl->encrypt.nonce, nonceSz);
  2407. if (ret == 0) {
  2408. ret = wc_AesGcmEncrypt_ex(ssl->encrypt.aes, output,
  2409. input, dataSz, ssl->encrypt.nonce, nonceSz,
  2410. output + dataSz, macSz, aad, aadSz);
  2411. }
  2412. #endif
  2413. }
  2414. break;
  2415. #endif
  2416. #ifdef HAVE_AESCCM
  2417. case wolfssl_aes_ccm:
  2418. #ifdef WOLFSSL_ASYNC_CRYPT
  2419. /* initialize event */
  2420. asyncDev = &ssl->encrypt.aes->asyncDev;
  2421. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  2422. if (ret != 0)
  2423. break;
  2424. #endif
  2425. nonceSz = AESCCM_NONCE_SZ;
  2426. #if defined(HAVE_PK_CALLBACKS)
  2427. ret = NOT_COMPILED_IN;
  2428. if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
  2429. ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 1,
  2430. output, input, dataSz,
  2431. ssl->encrypt.nonce, nonceSz,
  2432. output + dataSz, macSz,
  2433. aad, aadSz);
  2434. }
  2435. if (ret == NOT_COMPILED_IN)
  2436. #endif
  2437. {
  2438. #if ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  2439. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  2440. ret = wc_AesCcmEncrypt(ssl->encrypt.aes, output, input,
  2441. dataSz, ssl->encrypt.nonce, nonceSz,
  2442. output + dataSz, macSz, aad, aadSz);
  2443. #else
  2444. ret = wc_AesCcmSetNonce(ssl->encrypt.aes,
  2445. ssl->encrypt.nonce, nonceSz);
  2446. if (ret == 0) {
  2447. ret = wc_AesCcmEncrypt_ex(ssl->encrypt.aes, output,
  2448. input, dataSz, ssl->encrypt.nonce, nonceSz,
  2449. output + dataSz, macSz, aad, aadSz);
  2450. }
  2451. #endif
  2452. }
  2453. break;
  2454. #endif
  2455. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  2456. case wolfssl_chacha:
  2457. ret = ChaCha20Poly1305_Encrypt(ssl, output, input, dataSz,
  2458. ssl->encrypt.nonce, aad, aadSz, output + dataSz);
  2459. break;
  2460. #endif
  2461. #ifdef WOLFSSL_SM4_GCM
  2462. case wolfssl_sm4_gcm:
  2463. nonceSz = SM4_GCM_NONCE_SZ;
  2464. ret = wc_Sm4GcmEncrypt(ssl->encrypt.sm4, output, input,
  2465. dataSz, ssl->encrypt.nonce, nonceSz, output + dataSz,
  2466. macSz, aad, aadSz);
  2467. break;
  2468. #endif
  2469. #ifdef WOLFSSL_SM4_CCM
  2470. case wolfssl_sm4_ccm:
  2471. nonceSz = SM4_CCM_NONCE_SZ;
  2472. ret = wc_Sm4CcmEncrypt(ssl->encrypt.sm4, output, input,
  2473. dataSz, ssl->encrypt.nonce, nonceSz, output + dataSz,
  2474. macSz, aad, aadSz);
  2475. break;
  2476. #endif
  2477. #ifdef HAVE_NULL_CIPHER
  2478. case wolfssl_cipher_null:
  2479. ret = Tls13IntegrityOnly_Encrypt(ssl, output, input, dataSz,
  2480. ssl->encrypt.nonce, aad, aadSz, output + dataSz);
  2481. break;
  2482. #endif
  2483. default:
  2484. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  2485. return ENCRYPT_ERROR;
  2486. }
  2487. /* Advance state */
  2488. ssl->encrypt.state = CIPHER_STATE_END;
  2489. #ifdef WOLFSSL_ASYNC_CRYPT
  2490. if (ret == WC_PENDING_E) {
  2491. /* if async is not okay, then block */
  2492. if (!asyncOkay) {
  2493. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  2494. }
  2495. else {
  2496. /* If pending, then leave and return will resume below */
  2497. return wolfSSL_AsyncPush(ssl, asyncDev);
  2498. }
  2499. }
  2500. #endif
  2501. }
  2502. FALL_THROUGH;
  2503. case CIPHER_STATE_END:
  2504. {
  2505. #ifdef WOLFSSL_DEBUG_TLS
  2506. #ifdef CIPHER_NONCE
  2507. WOLFSSL_MSG("Nonce");
  2508. WOLFSSL_BUFFER(ssl->encrypt.nonce, ssl->specs.iv_size);
  2509. #endif
  2510. WOLFSSL_MSG("Encrypted data");
  2511. WOLFSSL_BUFFER(output, dataSz);
  2512. WOLFSSL_MSG("Authentication Tag");
  2513. WOLFSSL_BUFFER(output + dataSz, macSz);
  2514. #endif
  2515. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  2516. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null &&
  2517. XMEMCMP(output, ssl->encrypt.sanityCheck,
  2518. min(dataSz, sizeof(ssl->encrypt.sanityCheck))) == 0) {
  2519. WOLFSSL_MSG("EncryptTls13 sanity check failed! Glitch?");
  2520. return ENCRYPT_ERROR;
  2521. }
  2522. ForceZero(ssl->encrypt.sanityCheck,
  2523. sizeof(ssl->encrypt.sanityCheck));
  2524. #endif
  2525. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2526. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  2527. (output != input) && (ret == 0)) {
  2528. wc_MemZero_Add("TLS 1.3 Encrypt plaintext", input, sz);
  2529. }
  2530. #endif
  2531. #ifdef CIPHER_NONCE
  2532. ForceZero(ssl->encrypt.nonce, AEAD_NONCE_SZ);
  2533. #endif
  2534. break;
  2535. }
  2536. default:
  2537. break;
  2538. }
  2539. /* Reset state */
  2540. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  2541. return ret;
  2542. }
  2543. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  2544. /* Decrypt with ChaCha20 and check authentication tag with Poly1305.
  2545. *
  2546. * ssl The SSL/TLS object.
  2547. * output The buffer to write decrypted data into.
  2548. * May be the same pointer as input.
  2549. * input The data to decrypt.
  2550. * sz The number of bytes to decrypt.
  2551. * nonce The nonce to use with ChaCha20.
  2552. * aad The additional authentication data.
  2553. * aadSz The size of the addition authentication data.
  2554. * tagIn The authentication tag data from packet.
  2555. * returns 0 on success, otherwise failure.
  2556. */
  2557. static int ChaCha20Poly1305_Decrypt(WOLFSSL* ssl, byte* output,
  2558. const byte* input, word16 sz, byte* nonce,
  2559. const byte* aad, word16 aadSz,
  2560. const byte* tagIn)
  2561. {
  2562. int ret;
  2563. byte tag[POLY1305_AUTH_SZ];
  2564. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  2565. /* Poly1305 key is 256 bits of zero encrypted with ChaCha20. */
  2566. XMEMSET(poly, 0, sizeof(poly));
  2567. /* Set nonce and get Poly1305 key. */
  2568. ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0);
  2569. if (ret != 0)
  2570. return ret;
  2571. /* Use ChaCha20 keystream to get Poly1305 key for tag. */
  2572. ret = wc_Chacha_Process(ssl->decrypt.chacha, poly, poly, sizeof(poly));
  2573. if (ret != 0)
  2574. return ret;
  2575. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2576. wc_MemZero_Add("ChaCha20Poly1305_Decrypt poly", poly, sizeof(poly));
  2577. #endif
  2578. ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1);
  2579. if (ret != 0) {
  2580. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  2581. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2582. wc_MemZero_Check(poly, sizeof(poly));
  2583. #endif
  2584. return ret;
  2585. }
  2586. /* Set key for Poly1305. */
  2587. ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly, sizeof(poly));
  2588. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  2589. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2590. wc_MemZero_Check(poly, sizeof(poly));
  2591. #endif
  2592. if (ret != 0)
  2593. return ret;
  2594. /* Generate authentication tag for encrypted data. */
  2595. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, aad, aadSz, input, sz, tag,
  2596. sizeof(tag))) != 0) {
  2597. return ret;
  2598. }
  2599. /* Check tag sent along with packet. */
  2600. if (ConstantCompare(tagIn, tag, POLY1305_AUTH_SZ) != 0) {
  2601. WOLFSSL_MSG("MAC did not match");
  2602. return VERIFY_MAC_ERROR;
  2603. }
  2604. /* If the tag was good decrypt message. */
  2605. ret = wc_Chacha_Process(ssl->decrypt.chacha, output, input, sz);
  2606. return ret;
  2607. }
  2608. #endif
  2609. #ifdef HAVE_NULL_CIPHER
  2610. /* Check HMAC tag and copy over input.
  2611. *
  2612. * ssl The SSL/TLS object.
  2613. * output The buffer to copy data into.
  2614. * May be the same pointer as input.
  2615. * input The data.
  2616. * sz The number of bytes of data.
  2617. * nonce The nonce to use with authentication.
  2618. * aad The additional authentication data.
  2619. * aadSz The size of the addition authentication data.
  2620. * tagIn The authentication tag data from packet.
  2621. * returns 0 on success, otherwise failure.
  2622. */
  2623. static int Tls13IntegrityOnly_Decrypt(WOLFSSL* ssl, byte* output,
  2624. const byte* input, word16 sz,
  2625. const byte* nonce,
  2626. const byte* aad, word16 aadSz,
  2627. const byte* tagIn)
  2628. {
  2629. int ret;
  2630. byte hmac[WC_MAX_DIGEST_SIZE];
  2631. /* HMAC: nonce | aad | input */
  2632. ret = wc_HmacUpdate(ssl->decrypt.hmac, nonce, HMAC_NONCE_SZ);
  2633. if (ret == 0)
  2634. ret = wc_HmacUpdate(ssl->decrypt.hmac, aad, aadSz);
  2635. if (ret == 0)
  2636. ret = wc_HmacUpdate(ssl->decrypt.hmac, input, sz);
  2637. if (ret == 0)
  2638. ret = wc_HmacFinal(ssl->decrypt.hmac, hmac);
  2639. /* Check authentication tag matches */
  2640. if (ret == 0 && ConstantCompare(tagIn, hmac, ssl->specs.hash_size) != 0)
  2641. ret = DECRYPT_ERROR;
  2642. /* Copy the input to output if not the same buffer */
  2643. if (ret == 0 && output != input)
  2644. XMEMCPY(output, input, sz);
  2645. return ret;
  2646. }
  2647. #endif
  2648. /* Decrypt data for TLS v1.3.
  2649. *
  2650. * ssl The SSL/TLS object.
  2651. * output The buffer to write decrypted data into.
  2652. * May be the same pointer as input.
  2653. * input The data to decrypt and authentication tag.
  2654. * sz The length of the encrypted data plus authentication tag.
  2655. * aad The additional authentication data.
  2656. * aadSz The size of the addition authentication data.
  2657. * returns 0 on success, otherwise failure.
  2658. */
  2659. int DecryptTls13(WOLFSSL* ssl, byte* output, const byte* input, word16 sz,
  2660. const byte* aad, word16 aadSz)
  2661. {
  2662. int ret = 0;
  2663. word16 dataSz = sz - ssl->specs.aead_mac_size;
  2664. word16 macSz = ssl->specs.aead_mac_size;
  2665. word32 nonceSz = 0;
  2666. WOLFSSL_ENTER("DecryptTls13");
  2667. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  2668. ret = tsip_Tls13AesDecrypt(ssl, output, input, sz);
  2669. if (ret != CRYPTOCB_UNAVAILABLE) {
  2670. #ifndef WOLFSSL_EARLY_DATA
  2671. if (ret < 0) {
  2672. ret = VERIFY_MAC_ERROR;
  2673. WOLFSSL_ERROR_VERBOSE(ret);
  2674. }
  2675. #endif
  2676. return ret;
  2677. }
  2678. #endif
  2679. #ifdef WOLFSSL_ASYNC_CRYPT
  2680. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  2681. if (ret != WC_NO_PENDING_E) {
  2682. /* check for still pending */
  2683. if (ret == WC_PENDING_E)
  2684. return ret;
  2685. ssl->error = 0; /* clear async */
  2686. /* let failures through so CIPHER_STATE_END logic is run */
  2687. }
  2688. else
  2689. #endif
  2690. {
  2691. /* Reset state */
  2692. ret = 0;
  2693. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  2694. }
  2695. (void)output;
  2696. (void)input;
  2697. (void)sz;
  2698. (void)dataSz;
  2699. (void)macSz;
  2700. (void)nonceSz;
  2701. switch (ssl->decrypt.state) {
  2702. case CIPHER_STATE_BEGIN:
  2703. {
  2704. #ifdef WOLFSSL_DEBUG_TLS
  2705. WOLFSSL_MSG("Data to decrypt");
  2706. WOLFSSL_BUFFER(input, dataSz);
  2707. WOLFSSL_MSG("Additional Authentication Data");
  2708. WOLFSSL_BUFFER(aad, aadSz);
  2709. WOLFSSL_MSG("Authentication tag");
  2710. WOLFSSL_BUFFER(input + dataSz, macSz);
  2711. #endif
  2712. #ifdef CIPHER_NONCE
  2713. if (ssl->decrypt.nonce == NULL) {
  2714. ssl->decrypt.nonce = (byte*)XMALLOC(AEAD_NONCE_SZ,
  2715. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2716. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2717. if (ssl->decrypt.nonce != NULL) {
  2718. wc_MemZero_Add("DecryptTls13 nonce", ssl->decrypt.nonce,
  2719. AEAD_NONCE_SZ);
  2720. }
  2721. #endif
  2722. }
  2723. if (ssl->decrypt.nonce == NULL)
  2724. return MEMORY_E;
  2725. BuildTls13Nonce(ssl, ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  2726. PEER_ORDER);
  2727. #endif
  2728. /* Advance state and proceed */
  2729. ssl->decrypt.state = CIPHER_STATE_DO;
  2730. }
  2731. FALL_THROUGH;
  2732. case CIPHER_STATE_DO:
  2733. {
  2734. switch (ssl->specs.bulk_cipher_algorithm) {
  2735. #ifdef BUILD_AESGCM
  2736. case wolfssl_aes_gcm:
  2737. #ifdef WOLFSSL_ASYNC_CRYPT
  2738. /* initialize event */
  2739. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  2740. WC_ASYNC_FLAG_NONE);
  2741. if (ret != 0)
  2742. break;
  2743. #endif
  2744. nonceSz = AESGCM_NONCE_SZ;
  2745. #if defined(HAVE_PK_CALLBACKS)
  2746. ret = NOT_COMPILED_IN;
  2747. if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
  2748. ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 0,
  2749. output, input, dataSz,
  2750. ssl->decrypt.nonce, nonceSz,
  2751. (byte *)(input + dataSz), macSz,
  2752. aad, aadSz);
  2753. }
  2754. if (ret == NOT_COMPILED_IN)
  2755. #endif
  2756. {
  2757. ret = wc_AesGcmDecrypt(ssl->decrypt.aes, output, input,
  2758. dataSz, ssl->decrypt.nonce, nonceSz,
  2759. input + dataSz, macSz, aad, aadSz);
  2760. #ifdef WOLFSSL_ASYNC_CRYPT
  2761. if (ret == WC_PENDING_E) {
  2762. ret = wolfSSL_AsyncPush(ssl,
  2763. &ssl->decrypt.aes->asyncDev);
  2764. }
  2765. #endif
  2766. }
  2767. break;
  2768. #endif
  2769. #ifdef HAVE_AESCCM
  2770. case wolfssl_aes_ccm:
  2771. #ifdef WOLFSSL_ASYNC_CRYPT
  2772. /* initialize event */
  2773. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  2774. WC_ASYNC_FLAG_NONE);
  2775. if (ret != 0)
  2776. break;
  2777. #endif
  2778. nonceSz = AESCCM_NONCE_SZ;
  2779. #if defined(HAVE_PK_CALLBACKS)
  2780. ret = NOT_COMPILED_IN;
  2781. if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
  2782. ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 0,
  2783. output, input, dataSz,
  2784. ssl->decrypt.nonce, nonceSz,
  2785. (byte *)(input + dataSz), macSz,
  2786. aad, aadSz);
  2787. }
  2788. if (ret == NOT_COMPILED_IN)
  2789. #endif
  2790. {
  2791. ret = wc_AesCcmDecrypt(ssl->decrypt.aes, output, input,
  2792. dataSz, ssl->decrypt.nonce, nonceSz,
  2793. input + dataSz, macSz, aad, aadSz);
  2794. #ifdef WOLFSSL_ASYNC_CRYPT
  2795. if (ret == WC_PENDING_E) {
  2796. ret = wolfSSL_AsyncPush(ssl,
  2797. &ssl->decrypt.aes->asyncDev);
  2798. }
  2799. #endif
  2800. }
  2801. break;
  2802. #endif
  2803. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  2804. case wolfssl_chacha:
  2805. ret = ChaCha20Poly1305_Decrypt(ssl, output, input, dataSz,
  2806. ssl->decrypt.nonce, aad, aadSz, input + dataSz);
  2807. break;
  2808. #endif
  2809. #ifdef WOLFSSL_SM4_GCM
  2810. case wolfssl_sm4_gcm:
  2811. nonceSz = SM4_GCM_NONCE_SZ;
  2812. ret = wc_Sm4GcmDecrypt(ssl->decrypt.sm4, output, input,
  2813. dataSz, ssl->decrypt.nonce, nonceSz, output + dataSz,
  2814. macSz, aad, aadSz);
  2815. break;
  2816. #endif
  2817. #ifdef WOLFSSL_SM4_CCM
  2818. case wolfssl_sm4_ccm:
  2819. nonceSz = SM4_CCM_NONCE_SZ;
  2820. ret = wc_Sm4CcmDecrypt(ssl->decrypt.sm4, output, input,
  2821. dataSz, ssl->decrypt.nonce, nonceSz, output + dataSz,
  2822. macSz, aad, aadSz);
  2823. break;
  2824. #endif
  2825. #ifdef HAVE_NULL_CIPHER
  2826. case wolfssl_cipher_null:
  2827. ret = Tls13IntegrityOnly_Decrypt(ssl, output, input, dataSz,
  2828. ssl->decrypt.nonce, aad, aadSz, input + dataSz);
  2829. break;
  2830. #endif
  2831. default:
  2832. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  2833. return DECRYPT_ERROR;
  2834. }
  2835. /* Advance state */
  2836. ssl->decrypt.state = CIPHER_STATE_END;
  2837. #ifdef WOLFSSL_ASYNC_CRYPT
  2838. /* If pending, leave now */
  2839. if (ret == WC_PENDING_E) {
  2840. return ret;
  2841. }
  2842. #endif
  2843. }
  2844. FALL_THROUGH;
  2845. case CIPHER_STATE_END:
  2846. {
  2847. #ifdef WOLFSSL_DEBUG_TLS
  2848. #ifdef CIPHER_NONCE
  2849. WOLFSSL_MSG("Nonce");
  2850. WOLFSSL_BUFFER(ssl->decrypt.nonce, ssl->specs.iv_size);
  2851. #endif
  2852. WOLFSSL_MSG("Decrypted data");
  2853. WOLFSSL_BUFFER(output, dataSz);
  2854. #endif
  2855. #ifdef WOLFSSL_CHECK_MEM_ZERO
  2856. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  2857. (ret == 0)) {
  2858. wc_MemZero_Add("TLS 1.3 Decrypted data", output, sz);
  2859. }
  2860. #endif
  2861. #ifdef CIPHER_NONCE
  2862. ForceZero(ssl->decrypt.nonce, AEAD_NONCE_SZ);
  2863. #endif
  2864. break;
  2865. }
  2866. default:
  2867. break;
  2868. }
  2869. if (ret < 0) {
  2870. WOLFSSL_ERROR_VERBOSE(ret);
  2871. }
  2872. return ret;
  2873. }
  2874. /* Persistable BuildTls13Message arguments */
  2875. typedef struct BuildMsg13Args {
  2876. word32 sz;
  2877. word32 idx;
  2878. word32 headerSz;
  2879. word16 size;
  2880. } BuildMsg13Args;
  2881. static void FreeBuildMsg13Args(WOLFSSL* ssl, void* pArgs)
  2882. {
  2883. BuildMsg13Args* args = (BuildMsg13Args*)pArgs;
  2884. (void)ssl;
  2885. (void)args;
  2886. /* no allocations in BuildTls13Message */
  2887. }
  2888. /* Build SSL Message, encrypted.
  2889. * TLS v1.3 encryption is AEAD only.
  2890. *
  2891. * ssl The SSL/TLS object.
  2892. * output The buffer to write record message to.
  2893. * outSz Size of the buffer being written into.
  2894. * input The record data to encrypt (excluding record header).
  2895. * inSz The size of the record data.
  2896. * type The recorder header content type.
  2897. * hashOutput Whether to hash the unencrypted record data.
  2898. * sizeOnly Only want the size of the record message.
  2899. * asyncOkay If non-zero can return WC_PENDING_E, otherwise blocks on crypto
  2900. * returns the size of the encrypted record message or negative value on error.
  2901. */
  2902. int BuildTls13Message(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  2903. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay)
  2904. {
  2905. int ret;
  2906. BuildMsg13Args* args;
  2907. BuildMsg13Args lcl_args;
  2908. WOLFSSL_ENTER("BuildTls13Message");
  2909. #ifdef WOLFSSL_ASYNC_CRYPT
  2910. ret = WC_NO_PENDING_E;
  2911. if (asyncOkay) {
  2912. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  2913. if (ssl->async == NULL) {
  2914. ssl->async = (struct WOLFSSL_ASYNC*)
  2915. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  2916. DYNAMIC_TYPE_ASYNC);
  2917. if (ssl->async == NULL)
  2918. return MEMORY_E;
  2919. }
  2920. args = (BuildMsg13Args*)ssl->async->args;
  2921. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  2922. if (ret != WC_NO_PENDING_E) {
  2923. /* Check for error */
  2924. if (ret < 0)
  2925. goto exit_buildmsg;
  2926. }
  2927. }
  2928. else
  2929. #endif
  2930. {
  2931. args = &lcl_args;
  2932. }
  2933. /* Reset state */
  2934. #ifdef WOLFSSL_ASYNC_CRYPT
  2935. if (ret == WC_NO_PENDING_E)
  2936. #endif
  2937. {
  2938. ret = 0;
  2939. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  2940. XMEMSET(args, 0, sizeof(BuildMsg13Args));
  2941. args->headerSz = RECORD_HEADER_SZ;
  2942. #ifdef WOLFSSL_DTLS13
  2943. if (ssl->options.dtls)
  2944. args->headerSz = Dtls13GetRlHeaderLength(ssl, 1);
  2945. #endif /* WOLFSSL_DTLS13 */
  2946. args->sz = args->headerSz + inSz;
  2947. args->idx = args->headerSz;
  2948. #ifdef WOLFSSL_ASYNC_CRYPT
  2949. if (asyncOkay)
  2950. ssl->async->freeArgs = FreeBuildMsg13Args;
  2951. #endif
  2952. }
  2953. switch (ssl->options.buildMsgState) {
  2954. case BUILD_MSG_BEGIN:
  2955. {
  2956. /* catch mistaken sizeOnly parameter */
  2957. if (sizeOnly) {
  2958. if (output || input) {
  2959. WOLFSSL_MSG("BuildTls13Message with sizeOnly "
  2960. "doesn't need input or output");
  2961. return BAD_FUNC_ARG;
  2962. }
  2963. }
  2964. else if (output == NULL || input == NULL) {
  2965. return BAD_FUNC_ARG;
  2966. }
  2967. /* Record layer content type at the end of record data. */
  2968. args->sz++;
  2969. /* Authentication data at the end. */
  2970. args->sz += ssl->specs.aead_mac_size;
  2971. if (sizeOnly)
  2972. return args->sz;
  2973. if (args->sz > (word32)outSz) {
  2974. WOLFSSL_MSG("Oops, want to write past output buffer size");
  2975. return BUFFER_E;
  2976. }
  2977. /* Record data length. */
  2978. args->size = (word16)(args->sz - args->headerSz);
  2979. /* Write/update the record header with the new size.
  2980. * Always have the content type as application data for encrypted
  2981. * messages in TLS v1.3.
  2982. */
  2983. if (ssl->options.dtls) {
  2984. #ifdef WOLFSSL_DTLS13
  2985. Dtls13RlAddCiphertextHeader(ssl, output, args->size);
  2986. #endif /* WOLFSSL_DTLS13 */
  2987. }
  2988. else {
  2989. AddTls13RecordHeader(output, args->size, application_data, ssl);
  2990. }
  2991. /* TLS v1.3 can do in place encryption. */
  2992. if (input != output + args->idx)
  2993. XMEMCPY(output + args->idx, input, inSz);
  2994. args->idx += inSz;
  2995. ssl->options.buildMsgState = BUILD_MSG_HASH;
  2996. }
  2997. FALL_THROUGH;
  2998. case BUILD_MSG_HASH:
  2999. {
  3000. if (hashOutput) {
  3001. ret = HashOutput(ssl, output, args->headerSz + inSz, 0);
  3002. if (ret != 0)
  3003. goto exit_buildmsg;
  3004. }
  3005. /* The real record content type goes at the end of the data. */
  3006. output[args->idx++] = (byte)type;
  3007. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  3008. }
  3009. FALL_THROUGH;
  3010. case BUILD_MSG_ENCRYPT:
  3011. {
  3012. #ifdef WOLFSSL_QUIC
  3013. if (WOLFSSL_IS_QUIC(ssl)) {
  3014. /* QUIC does not use encryption of the TLS Record Layer.
  3015. * Return the original length + added headers
  3016. * and restore it in the record header. */
  3017. AddTls13RecordHeader(output, inSz, type, ssl);
  3018. ret = args->headerSz + inSz;
  3019. goto exit_buildmsg;
  3020. }
  3021. #endif
  3022. #ifdef ATOMIC_USER
  3023. if (ssl->ctx->MacEncryptCb) {
  3024. /* User Record Layer Callback handling */
  3025. byte* mac = output + args->idx;
  3026. output += args->headerSz;
  3027. ret = ssl->ctx->MacEncryptCb(ssl, mac, output, inSz, type, 0,
  3028. output, output, args->size, ssl->MacEncryptCtx);
  3029. }
  3030. else
  3031. #endif
  3032. {
  3033. const byte* aad = output;
  3034. output += args->headerSz;
  3035. ret = EncryptTls13(ssl, output, output, args->size, aad,
  3036. (word16)args->headerSz, asyncOkay);
  3037. if (ret != 0) {
  3038. #ifdef WOLFSSL_ASYNC_CRYPT
  3039. if (ret != WC_PENDING_E)
  3040. #endif
  3041. {
  3042. /* Zeroize plaintext. */
  3043. ForceZero(output, args->size);
  3044. }
  3045. }
  3046. #ifdef WOLFSSL_DTLS13
  3047. if (ret == 0 && ssl->options.dtls) {
  3048. /* AAD points to the header. Reuse the variable */
  3049. ret = Dtls13EncryptRecordNumber(ssl, (byte*)aad, (word16)args->sz);
  3050. }
  3051. #endif /* WOLFSSL_DTLS13 */
  3052. }
  3053. break;
  3054. }
  3055. default:
  3056. break;
  3057. }
  3058. exit_buildmsg:
  3059. WOLFSSL_LEAVE("BuildTls13Message", ret);
  3060. #ifdef WOLFSSL_ASYNC_CRYPT
  3061. if (ret == WC_PENDING_E) {
  3062. return ret;
  3063. }
  3064. #endif
  3065. /* make sure build message state is reset */
  3066. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  3067. /* return sz on success */
  3068. if (ret == 0) {
  3069. ret = args->sz;
  3070. }
  3071. else {
  3072. WOLFSSL_ERROR_VERBOSE(ret);
  3073. }
  3074. /* Final cleanup */
  3075. #ifdef WOLFSSL_ASYNC_CRYPT
  3076. if (asyncOkay)
  3077. FreeAsyncCtx(ssl, 0);
  3078. else
  3079. #endif
  3080. FreeBuildMsg13Args(ssl, args);
  3081. return ret;
  3082. }
  3083. #if !defined(NO_WOLFSSL_CLIENT) || (!defined(NO_WOLFSSL_SERVER) && \
  3084. (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) && \
  3085. (defined(WOLFSSL_PSK_ONE_ID) || defined(WOLFSSL_PRIORITIZE_PSK)))
  3086. /* Find the cipher suite in the suites set in the SSL.
  3087. *
  3088. * ssl SSL/TLS object.
  3089. * suite Cipher suite to look for.
  3090. * returns 1 when suite is found in SSL/TLS object's list and 0 otherwise.
  3091. */
  3092. int FindSuiteSSL(const WOLFSSL* ssl, byte* suite)
  3093. {
  3094. word16 i;
  3095. const Suites* suites = WOLFSSL_SUITES(ssl);
  3096. for (i = 0; i < suites->suiteSz; i += 2) {
  3097. if (suites->suites[i+0] == suite[0] &&
  3098. suites->suites[i+1] == suite[1]) {
  3099. return 1;
  3100. }
  3101. }
  3102. return 0;
  3103. }
  3104. #endif
  3105. #ifndef NO_PSK
  3106. /* Get the MAC algorithm for the TLS 1.3 cipher suite.
  3107. *
  3108. * @param [in] suite.
  3109. * @return A value from wc_MACAlgorithm enumeration.
  3110. */
  3111. byte SuiteMac(const byte* suite)
  3112. {
  3113. byte mac = no_mac;
  3114. if (suite[0] == TLS13_BYTE) {
  3115. switch (suite[1]) {
  3116. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  3117. case TLS_AES_128_GCM_SHA256:
  3118. mac = sha256_mac;
  3119. break;
  3120. #endif
  3121. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  3122. case TLS_CHACHA20_POLY1305_SHA256:
  3123. mac = sha256_mac;
  3124. break;
  3125. #endif
  3126. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  3127. case TLS_AES_128_CCM_SHA256:
  3128. mac = sha256_mac;
  3129. break;
  3130. #endif
  3131. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  3132. case TLS_AES_128_CCM_8_SHA256:
  3133. mac = sha256_mac;
  3134. break;
  3135. #endif
  3136. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  3137. case TLS_AES_256_GCM_SHA384:
  3138. mac = sha384_mac;
  3139. break;
  3140. #endif
  3141. default:
  3142. break;
  3143. }
  3144. }
  3145. #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
  3146. defined(WOLFSSL_SM3)
  3147. else if (suite[0] == CIPHER_BYTE) {
  3148. switch (suite[1]) {
  3149. #ifdef BUILD_TLS_SM4_GCM_SM3
  3150. case TLS_SM4_GCM_SM3:
  3151. mac = sm3_mac;
  3152. break;
  3153. #endif
  3154. #ifdef BUILD_TLS_SM4_CCM_SM3
  3155. case TLS_SM4_CCM_SM3:
  3156. mac = sm3_mac;
  3157. break;
  3158. #endif
  3159. default:
  3160. break;
  3161. }
  3162. }
  3163. #endif
  3164. #ifdef HAVE_NULL_CIPHER
  3165. else if (suite[0] == ECC_BYTE) {
  3166. switch (suite[1]) {
  3167. #ifdef BUILD_TLS_SHA256_SHA256
  3168. case TLS_SHA256_SHA256:
  3169. mac = sha256_mac;
  3170. break;
  3171. #endif
  3172. #ifdef BUILD_TLS_SHA384_SHA384
  3173. case TLS_SHA384_SHA384:
  3174. mac = sha384_mac;
  3175. break;
  3176. #endif
  3177. default:
  3178. break;
  3179. }
  3180. }
  3181. #endif
  3182. return mac;
  3183. }
  3184. #endif
  3185. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  3186. /* Create Cookie extension using the hash of the first ClientHello.
  3187. *
  3188. * ssl SSL/TLS object.
  3189. * hash The hash data.
  3190. * hashSz The size of the hash data in bytes.
  3191. * returns 0 on success, otherwise failure.
  3192. */
  3193. int CreateCookieExt(const WOLFSSL* ssl, byte* hash, word16 hashSz,
  3194. TLSX** exts, byte cipherSuite0, byte cipherSuite)
  3195. {
  3196. int ret;
  3197. byte mac[WC_MAX_DIGEST_SIZE] = {0};
  3198. Hmac cookieHmac;
  3199. byte cookieType = 0;
  3200. byte macSz = 0;
  3201. byte cookie[OPAQUE8_LEN + WC_MAX_DIGEST_SIZE + OPAQUE16_LEN * 2];
  3202. TLSX* ext;
  3203. word16 cookieSz = 0;
  3204. if (hash == NULL || hashSz == 0) {
  3205. return BAD_FUNC_ARG;
  3206. }
  3207. if (ssl->buffers.tls13CookieSecret.buffer == NULL ||
  3208. ssl->buffers.tls13CookieSecret.length == 0) {
  3209. WOLFSSL_MSG("Missing DTLS 1.3 cookie secret");
  3210. return COOKIE_ERROR;
  3211. }
  3212. /* Cookie Data = Hash Len | Hash | CS | KeyShare Group */
  3213. cookie[cookieSz++] = (byte)hashSz;
  3214. XMEMCPY(cookie + cookieSz, hash, hashSz);
  3215. cookieSz += hashSz;
  3216. cookie[cookieSz++] = cipherSuite0;
  3217. cookie[cookieSz++] = cipherSuite;
  3218. if ((ext = TLSX_Find(*exts, TLSX_KEY_SHARE)) != NULL) {
  3219. KeyShareEntry* kse = (KeyShareEntry*)ext->data;
  3220. if (kse == NULL) {
  3221. WOLFSSL_MSG("KeyShareEntry can't be empty when negotiating "
  3222. "parameters");
  3223. return BAD_STATE_E;
  3224. }
  3225. c16toa(kse->group, cookie + cookieSz);
  3226. cookieSz += OPAQUE16_LEN;
  3227. }
  3228. #if !defined(NO_SHA) && defined(NO_SHA256)
  3229. cookieType = SHA;
  3230. macSz = WC_SHA_DIGEST_SIZE;
  3231. #endif /* NO_SHA */
  3232. #ifndef NO_SHA256
  3233. cookieType = WC_SHA256;
  3234. macSz = WC_SHA256_DIGEST_SIZE;
  3235. #endif /* NO_SHA256 */
  3236. ret = wc_HmacInit(&cookieHmac, ssl->heap, INVALID_DEVID);
  3237. if (ret == 0) {
  3238. ret = wc_HmacSetKey(&cookieHmac, cookieType,
  3239. ssl->buffers.tls13CookieSecret.buffer,
  3240. ssl->buffers.tls13CookieSecret.length);
  3241. }
  3242. if (ret == 0)
  3243. ret = wc_HmacUpdate(&cookieHmac, cookie, cookieSz);
  3244. #ifdef WOLFSSL_DTLS13
  3245. /* Tie cookie to peer address */
  3246. if (ret == 0) {
  3247. if (ssl->options.dtls && ssl->buffers.dtlsCtx.peer.sz > 0) {
  3248. ret = wc_HmacUpdate(&cookieHmac,
  3249. (byte*)ssl->buffers.dtlsCtx.peer.sa,
  3250. ssl->buffers.dtlsCtx.peer.sz);
  3251. }
  3252. }
  3253. #endif
  3254. if (ret == 0)
  3255. ret = wc_HmacFinal(&cookieHmac, mac);
  3256. wc_HmacFree(&cookieHmac);
  3257. if (ret != 0)
  3258. return ret;
  3259. /* The cookie data is the hash and the integrity check. */
  3260. return TLSX_Cookie_Use(ssl, cookie, cookieSz, mac, macSz, 1, exts);
  3261. }
  3262. #endif
  3263. #ifdef WOLFSSL_DTLS13
  3264. #define HRR_MAX_HS_HEADER_SZ DTLS_HANDSHAKE_HEADER_SZ
  3265. #else
  3266. #define HRR_MAX_HS_HEADER_SZ HANDSHAKE_HEADER_SZ
  3267. #endif /* WOLFSSL_DTLS13 */
  3268. static int CreateCookie(const WOLFSSL* ssl, byte** hash, byte* hashSz,
  3269. Hashes* hashes, TLSX** exts)
  3270. {
  3271. int ret = 0;
  3272. (void)exts;
  3273. *hash = NULL;
  3274. switch (ssl->specs.mac_algorithm) {
  3275. #ifndef NO_SHA256
  3276. case sha256_mac:
  3277. *hash = hashes->sha256;
  3278. break;
  3279. #endif
  3280. #ifdef WOLFSSL_SHA384
  3281. case sha384_mac:
  3282. *hash = hashes->sha384;
  3283. break;
  3284. #endif
  3285. #ifdef WOLFSSL_TLS13_SHA512
  3286. case sha512_mac:
  3287. *hash = hashes->sha512;
  3288. break;
  3289. #endif
  3290. #ifdef WOLFSSL_SM3
  3291. case sm3_mac:
  3292. *hash = hashes->sm3;
  3293. break;
  3294. #endif
  3295. }
  3296. *hashSz = ssl->specs.hash_size;
  3297. /* check hash */
  3298. if (*hash == NULL && *hashSz > 0)
  3299. return BAD_FUNC_ARG;
  3300. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  3301. if (ssl->options.sendCookie && ssl->options.side == WOLFSSL_SERVER_END)
  3302. ret = CreateCookieExt(ssl, *hash, *hashSz, exts,
  3303. ssl->options.cipherSuite0, ssl->options.cipherSuite);
  3304. #endif
  3305. return ret;
  3306. }
  3307. /* Restart the handshake hash with a hash of the previous messages.
  3308. *
  3309. * ssl The SSL/TLS object.
  3310. * returns 0 on success, otherwise failure.
  3311. */
  3312. int RestartHandshakeHash(WOLFSSL* ssl)
  3313. {
  3314. int ret;
  3315. byte header[HANDSHAKE_HEADER_SZ] = {0};
  3316. Hashes hashes;
  3317. byte* hash = NULL;
  3318. byte hashSz = 0;
  3319. ret = BuildCertHashes(ssl, &hashes);
  3320. if (ret != 0)
  3321. return ret;
  3322. ret = CreateCookie(ssl, &hash, &hashSz, &hashes, &ssl->extensions);
  3323. if (ret != 0)
  3324. return ret;
  3325. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  3326. if (ssl->options.sendCookie && ssl->options.side == WOLFSSL_SERVER_END)
  3327. return 0;
  3328. #endif
  3329. AddTls13HandShakeHeader(header, hashSz, 0, 0, message_hash, ssl);
  3330. #ifdef WOLFSSL_DEBUG_TLS
  3331. WOLFSSL_MSG("Restart Hash");
  3332. WOLFSSL_BUFFER(hash, hashSz);
  3333. #endif
  3334. ret = InitHandshakeHashes(ssl);
  3335. if (ret != 0)
  3336. return ret;
  3337. ret = HashRaw(ssl, header, sizeof(header));
  3338. if (ret != 0)
  3339. return ret;
  3340. return HashRaw(ssl, hash, hashSz);
  3341. }
  3342. #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)
  3343. /* The value in the random field of a ServerHello to indicate
  3344. * HelloRetryRequest.
  3345. */
  3346. static byte helloRetryRequestRandom[] = {
  3347. 0xCF, 0x21, 0xAD, 0x74, 0xE5, 0x9A, 0x61, 0x11,
  3348. 0xBE, 0x1D, 0x8C, 0x02, 0x1E, 0x65, 0xB8, 0x91,
  3349. 0xC2, 0xA2, 0x11, 0x16, 0x7A, 0xBB, 0x8C, 0x5E,
  3350. 0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C
  3351. };
  3352. #endif
  3353. #ifndef NO_WOLFSSL_CLIENT
  3354. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  3355. #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_PSK_ONE_ID) && \
  3356. !defined(NO_PSK)
  3357. /**
  3358. * convert mac algorithm to WOLFSSL_EVP_MD
  3359. * @param mac_alg mac algorithm
  3360. * @return const WOLFSSL_EVP_MD on successful, otherwise NULL
  3361. */
  3362. static const WOLFSSL_EVP_MD* ssl_handshake_md(const byte mac_alg)
  3363. {
  3364. switch(mac_alg) {
  3365. case no_mac:
  3366. #ifndef NO_MD5
  3367. case md5_mac:
  3368. return wolfSSL_EVP_md5();
  3369. #endif
  3370. #ifndef NO_SHA
  3371. case sha_mac:
  3372. return wolfSSL_EVP_sha1();
  3373. #endif
  3374. #ifdef WOLFSSL_SHA224
  3375. case sha224_mac:
  3376. return wolfSSL_EVP_sha224();
  3377. #endif
  3378. case sha256_mac:
  3379. return wolfSSL_EVP_sha256();
  3380. #ifdef WOLFSSL_SHA384
  3381. case sha384_mac:
  3382. return wolfSSL_EVP_sha384();
  3383. #endif
  3384. #ifdef WOLFSSL_SHA512
  3385. case sha512_mac:
  3386. return wolfSSL_EVP_sha512();
  3387. #endif
  3388. case rmd_mac:
  3389. case blake2b_mac:
  3390. WOLFSSL_MSG("no suitable EVP_MD");
  3391. return NULL;
  3392. default:
  3393. WOLFSSL_MSG("Unknown mac algorithm");
  3394. return NULL;
  3395. }
  3396. }
  3397. #endif
  3398. /* Setup pre-shared key based on the details in the extension data.
  3399. *
  3400. * ssl SSL/TLS object.
  3401. * psk Pre-shared key extension data.
  3402. * clientHello Whether called from client_hello construction.
  3403. * returns 0 on success, PSK_KEY_ERROR when the client PSK callback fails and
  3404. * other negative value on failure.
  3405. */
  3406. static int SetupPskKey(WOLFSSL* ssl, PreSharedKey* psk, int clientHello)
  3407. {
  3408. #if defined(HAVE_SESSION_TICKET) || !defined(WOLFSSL_PSK_ONE_ID)
  3409. int ret;
  3410. #endif
  3411. byte suite[2];
  3412. if (psk == NULL)
  3413. return BAD_FUNC_ARG;
  3414. if (!HaveUniqueSessionObj(ssl)) {
  3415. WOLFSSL_MSG("Unable to have unique session object");
  3416. WOLFSSL_ERROR_VERBOSE(MEMORY_ERROR);
  3417. return MEMORY_ERROR;
  3418. }
  3419. suite[0] = ssl->options.cipherSuite0;
  3420. suite[1] = ssl->options.cipherSuite;
  3421. #ifdef HAVE_SESSION_TICKET
  3422. if (psk->resumption) {
  3423. if (clientHello) {
  3424. suite[0] = psk->cipherSuite0;
  3425. suite[1] = psk->cipherSuite;
  3426. /* Ensure cipher suite is supported or changed suite to one with
  3427. * the same MAC algorithm. */
  3428. if (!FindSuiteSSL(ssl, suite)) {
  3429. WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
  3430. return PSK_KEY_ERROR;
  3431. }
  3432. ssl->options.cipherSuite0 = suite[0];
  3433. ssl->options.cipherSuite = suite[1];
  3434. /* Setting mac for binder and keys for deriving EarlyData. */
  3435. ret = SetCipherSpecs(ssl);
  3436. if (ret != 0)
  3437. return ret;
  3438. }
  3439. #ifdef WOLFSSL_EARLY_DATA
  3440. if (ssl->session->maxEarlyDataSz == 0)
  3441. ssl->earlyData = no_early_data;
  3442. #endif
  3443. /* Resumption PSK is master secret. */
  3444. ssl->arrays->psk_keySz = ssl->specs.hash_size;
  3445. if ((ret = DeriveResumptionPSK(ssl, ssl->session->ticketNonce.data,
  3446. ssl->session->ticketNonce.len, ssl->arrays->psk_key)) != 0) {
  3447. return ret;
  3448. }
  3449. if (!clientHello) {
  3450. /* CLIENT: using secret in ticket for peer authentication. */
  3451. ssl->options.peerAuthGood = 1;
  3452. }
  3453. }
  3454. #endif
  3455. #ifndef NO_PSK
  3456. if (!psk->resumption) {
  3457. /* Get the pre-shared key. */
  3458. #ifndef WOLFSSL_PSK_ONE_ID
  3459. const char* cipherName = NULL;
  3460. #ifdef OPENSSL_EXTRA
  3461. WOLFSSL_SESSION* psksession = NULL;
  3462. #endif
  3463. /* Set the client identity to use. */
  3464. XMEMSET(ssl->arrays->client_identity, 0,
  3465. sizeof(ssl->arrays->client_identity));
  3466. XMEMCPY(ssl->arrays->client_identity, psk->identity, psk->identityLen);
  3467. #ifdef WOLFSSL_DEBUG_TLS
  3468. WOLFSSL_MSG("PSK cipher suite:");
  3469. WOLFSSL_MSG(GetCipherNameInternal(psk->cipherSuite0, psk->cipherSuite));
  3470. #endif
  3471. /* Get the pre-shared key. */
  3472. #ifdef OPENSSL_EXTRA
  3473. if (ssl->options.session_psk_cb != NULL) {
  3474. const unsigned char* id = NULL;
  3475. size_t idlen = 0;
  3476. const WOLFSSL_EVP_MD* handshake_md = NULL;
  3477. if (ssl->msgsReceived.got_hello_retry_request >= 1) {
  3478. handshake_md = ssl_handshake_md(ssl->specs.mac_algorithm);
  3479. }
  3480. /* OpenSSL compatible callback that gets cached session. */
  3481. if (ssl->options.session_psk_cb(ssl, handshake_md, &id, &idlen,
  3482. &psksession) == 0) {
  3483. wolfSSL_FreeSession(ssl->ctx, psksession);
  3484. WOLFSSL_MSG("psk session callback failed");
  3485. return PSK_KEY_ERROR;
  3486. }
  3487. if (psksession != NULL) {
  3488. if (idlen > MAX_PSK_KEY_LEN) {
  3489. wolfSSL_FreeSession(ssl->ctx, psksession);
  3490. WOLFSSL_MSG("psk key length is too long");
  3491. WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
  3492. return PSK_KEY_ERROR;
  3493. }
  3494. ssl->arrays->psk_keySz = (word32)idlen;
  3495. XMEMCPY(ssl->arrays->psk_key, id, idlen);
  3496. suite[0] = psksession->cipherSuite0;
  3497. suite[1] = psksession->cipherSuite;
  3498. /* Not needed anymore. */
  3499. wolfSSL_FreeSession(ssl->ctx, psksession);
  3500. /* Leave pointer not NULL to indicate success with callback. */
  3501. }
  3502. }
  3503. if (psksession != NULL) {
  3504. /* Don't try other callbacks - we have an answer. */
  3505. }
  3506. else
  3507. #endif /* OPENSSL_EXTRA */
  3508. if (ssl->options.client_psk_cs_cb != NULL) {
  3509. #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
  3510. ssl->arrays->client_identity[0] = 0;
  3511. #endif
  3512. /* Lookup key again for next identity. */
  3513. ssl->arrays->psk_keySz = ssl->options.client_psk_cs_cb(
  3514. ssl, ssl->arrays->server_hint,
  3515. ssl->arrays->client_identity, MAX_PSK_ID_LEN,
  3516. ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
  3517. GetCipherNameInternal(psk->cipherSuite0, psk->cipherSuite));
  3518. if (clientHello) {
  3519. /* Use PSK cipher suite. */
  3520. ssl->options.cipherSuite0 = psk->cipherSuite0;
  3521. ssl->options.cipherSuite = psk->cipherSuite;
  3522. }
  3523. else {
  3524. byte pskCS[2];
  3525. pskCS[0] = psk->cipherSuite0;
  3526. pskCS[1] = psk->cipherSuite;
  3527. /* Ensure PSK and negotiated cipher suites have same hash. */
  3528. if (SuiteMac(pskCS) != SuiteMac(suite)) {
  3529. WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
  3530. return PSK_KEY_ERROR;
  3531. }
  3532. /* Negotiated cipher suite is to be used - update PSK. */
  3533. psk->cipherSuite0 = suite[0];
  3534. psk->cipherSuite = suite[1];
  3535. }
  3536. }
  3537. else if (ssl->options.client_psk_tls13_cb != NULL) {
  3538. byte cipherSuite0;
  3539. byte cipherSuite;
  3540. int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
  3541. ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(ssl,
  3542. ssl->arrays->server_hint, ssl->arrays->client_identity,
  3543. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
  3544. &cipherName);
  3545. if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
  3546. &cipherSuite, &cipherSuiteFlags) != 0) {
  3547. WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
  3548. return PSK_KEY_ERROR;
  3549. }
  3550. ssl->options.cipherSuite0 = cipherSuite0;
  3551. ssl->options.cipherSuite = cipherSuite;
  3552. (void)cipherSuiteFlags;
  3553. }
  3554. else {
  3555. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  3556. ssl->arrays->server_hint, ssl->arrays->client_identity,
  3557. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  3558. ssl->options.cipherSuite0 = TLS13_BYTE;
  3559. ssl->options.cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
  3560. }
  3561. if (ssl->arrays->psk_keySz == 0 ||
  3562. (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
  3563. (int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
  3564. WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
  3565. return PSK_KEY_ERROR;
  3566. }
  3567. ret = SetCipherSpecs(ssl);
  3568. if (ret != 0)
  3569. return ret;
  3570. #else
  3571. /* PSK information loaded during setting of default TLS extensions. */
  3572. #endif /* !WOLFSSL_PSK_ONE_ID */
  3573. if (!clientHello && (psk->cipherSuite0 != suite[0] ||
  3574. psk->cipherSuite != suite[1])) {
  3575. WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
  3576. return PSK_KEY_ERROR;
  3577. }
  3578. if (!clientHello) {
  3579. /* CLIENT: using PSK for peer authentication. */
  3580. ssl->options.peerAuthGood = 1;
  3581. }
  3582. }
  3583. #endif
  3584. if (ssl->options.noPskDheKe) {
  3585. ssl->arrays->preMasterSz = 0;
  3586. }
  3587. /* Derive the early secret using the PSK. */
  3588. return DeriveEarlySecret(ssl);
  3589. }
  3590. /* Derive and write the binders into the ClientHello in space left when
  3591. * writing the Pre-Shared Key extension.
  3592. *
  3593. * ssl The SSL/TLS object.
  3594. * output The buffer containing the ClientHello.
  3595. * idx The index at the end of the completed ClientHello.
  3596. * returns 0 on success and otherwise failure.
  3597. */
  3598. static int WritePSKBinders(WOLFSSL* ssl, byte* output, word32 idx)
  3599. {
  3600. int ret;
  3601. TLSX* ext;
  3602. PreSharedKey* current;
  3603. byte binderKey[WC_MAX_DIGEST_SIZE];
  3604. word16 len;
  3605. WOLFSSL_ENTER("WritePSKBinders");
  3606. ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  3607. if (ext == NULL)
  3608. return SANITY_MSG_E;
  3609. /* Get the size of the binders to determine where to write binders. */
  3610. ret = TLSX_PreSharedKey_GetSizeBinders((PreSharedKey*)ext->data,
  3611. client_hello, &len);
  3612. if (ret < 0)
  3613. return ret;
  3614. idx -= len;
  3615. /* Hash truncated ClientHello - up to binders. */
  3616. #ifdef WOLFSSL_DTLS13
  3617. if (ssl->options.dtls)
  3618. ret = Dtls13HashHandshake(ssl, output + Dtls13GetRlHeaderLength(ssl, 0),
  3619. idx - Dtls13GetRlHeaderLength(ssl, 0));
  3620. else
  3621. #endif /* WOLFSSL_DTLS13 */
  3622. ret = HashOutput(ssl, output, idx, 0);
  3623. if (ret != 0)
  3624. return ret;
  3625. current = (PreSharedKey*)ext->data;
  3626. #ifdef WOLFSSL_CHECK_MEM_ZERO
  3627. if (current != NULL) {
  3628. wc_MemZero_Add("WritePSKBinders binderKey", binderKey,
  3629. sizeof(binderKey));
  3630. }
  3631. #endif
  3632. /* Calculate the binder for each identity based on previous handshake data.
  3633. */
  3634. while (current != NULL) {
  3635. if ((ret = SetupPskKey(ssl, current, 1)) != 0)
  3636. break;
  3637. #ifdef HAVE_SESSION_TICKET
  3638. if (current->resumption)
  3639. ret = DeriveBinderKeyResume(ssl, binderKey);
  3640. #endif
  3641. #ifndef NO_PSK
  3642. if (!current->resumption)
  3643. ret = DeriveBinderKey(ssl, binderKey);
  3644. #endif
  3645. if (ret != 0)
  3646. break;
  3647. /* Derive the Finished message secret. */
  3648. ret = DeriveFinishedSecret(ssl, binderKey,
  3649. ssl->keys.client_write_MAC_secret,
  3650. 0 /* neither end */);
  3651. if (ret != 0)
  3652. break;
  3653. /* Build the HMAC of the handshake message data = binder. */
  3654. ret = BuildTls13HandshakeHmac(ssl, ssl->keys.client_write_MAC_secret,
  3655. current->binder, &current->binderLen);
  3656. if (ret != 0)
  3657. break;
  3658. current = current->next;
  3659. }
  3660. ForceZero(binderKey, sizeof(binderKey));
  3661. #ifdef WOLFSSL_CHECK_MEM_ZERO
  3662. wc_MemZero_Check(binderKey, sizeof(binderKey));
  3663. #endif
  3664. if (ret != 0)
  3665. return ret;
  3666. /* Data entered into extension, now write to message. */
  3667. ret = TLSX_PreSharedKey_WriteBinders((PreSharedKey*)ext->data, output + idx,
  3668. client_hello, &len);
  3669. if (ret < 0)
  3670. return ret;
  3671. /* Hash binders to complete the hash of the ClientHello. */
  3672. ret = HashRaw(ssl, output + idx, len);
  3673. if (ret < 0)
  3674. return ret;
  3675. #ifdef WOLFSSL_EARLY_DATA
  3676. if (ssl->earlyData != no_early_data) {
  3677. if ((ret = SetupPskKey(ssl, (PreSharedKey*)ext->data, 1)) != 0)
  3678. return ret;
  3679. /* Derive early data encryption key. */
  3680. ret = DeriveTls13Keys(ssl, early_data_key, ENCRYPT_SIDE_ONLY, 1);
  3681. if (ret != 0)
  3682. return ret;
  3683. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  3684. return ret;
  3685. #ifdef WOLFSSL_DTLS13
  3686. if (ssl->options.dtls) {
  3687. ret = Dtls13NewEpoch(
  3688. ssl, w64From32(0x0, DTLS13_EPOCH_EARLYDATA), ENCRYPT_SIDE_ONLY);
  3689. if (ret != 0)
  3690. return ret;
  3691. }
  3692. #endif /* WOLFSSL_DTLS13 */
  3693. }
  3694. #endif
  3695. WOLFSSL_LEAVE("WritePSKBinders", ret);
  3696. return ret;
  3697. }
  3698. #endif
  3699. #if defined(HAVE_ECH)
  3700. /* returns the index of the first supported cipher suite, -1 if none */
  3701. int EchConfigGetSupportedCipherSuite(WOLFSSL_EchConfig* config)
  3702. {
  3703. int i, j, supported = 0;
  3704. for (i = 0; i < config->numCipherSuites; i++) {
  3705. supported = 0;
  3706. for (j = 0; j < HPKE_SUPPORTED_KDF_LEN; j++) {
  3707. if (config->cipherSuites[i].kdfId == hpkeSupportedKdf[j])
  3708. break;
  3709. }
  3710. if (j < HPKE_SUPPORTED_KDF_LEN)
  3711. for (j = 0; j < HPKE_SUPPORTED_AEAD_LEN; j++) {
  3712. if (config->cipherSuites[i].aeadId == hpkeSupportedAead[j]) {
  3713. supported = 1;
  3714. break;
  3715. }
  3716. }
  3717. if (supported)
  3718. return i;
  3719. }
  3720. return -1;
  3721. }
  3722. /* returns status after we hash the ech inner */
  3723. static int EchHashHelloInner(WOLFSSL* ssl, WOLFSSL_ECH* ech)
  3724. {
  3725. int ret;
  3726. HS_Hashes* tmpHashes;
  3727. byte falseHeader[HANDSHAKE_HEADER_SZ];
  3728. if (ssl == NULL || ech == NULL)
  3729. return BAD_FUNC_ARG;
  3730. /* switch hsHashes to the ech version */
  3731. InitHandshakeHashesAndCopy(ssl, ssl->hsHashes, &ssl->hsHashesEch);
  3732. /* swap hsHashes so the regular hash functions work */
  3733. tmpHashes = ssl->hsHashes;
  3734. ssl->hsHashes = ssl->hsHashesEch;
  3735. /* do the handshake header then the body */
  3736. AddTls13HandShakeHeader(falseHeader,
  3737. ech->innerClientHelloLen - ech->paddingLen - ech->hpke->Nt, 0, 0,
  3738. client_hello, ssl);
  3739. ret = HashRaw(ssl, falseHeader, HANDSHAKE_HEADER_SZ);
  3740. /* hash the body */
  3741. if (ret == 0) {
  3742. ret = HashRaw(ssl, ech->innerClientHello,
  3743. ech->innerClientHelloLen - ech->paddingLen - ech->hpke->Nt);
  3744. }
  3745. /* swap hsHashes back */
  3746. ssl->hsHashes = tmpHashes;
  3747. return ret;
  3748. }
  3749. #endif
  3750. static void GetTls13SessionId(WOLFSSL* ssl, byte* output, word32* idx)
  3751. {
  3752. if (ssl->session->sessionIDSz > 0) {
  3753. /* Session resumption for old versions of protocol. */
  3754. if (ssl->session->sessionIDSz <= ID_LEN) {
  3755. if (output != NULL)
  3756. output[*idx] = ssl->session->sessionIDSz;
  3757. (*idx)++;
  3758. if (output != NULL) {
  3759. XMEMCPY(output + *idx, ssl->session->sessionID,
  3760. ssl->session->sessionIDSz);
  3761. }
  3762. *idx += ssl->session->sessionIDSz;
  3763. }
  3764. else {
  3765. /* Invalid session ID length. Reset it. */
  3766. ssl->session->sessionIDSz = 0;
  3767. if (output != NULL)
  3768. output[*idx] = 0;
  3769. (*idx)++;
  3770. }
  3771. }
  3772. else {
  3773. #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
  3774. if (ssl->options.tls13MiddleBoxCompat) {
  3775. if (output != NULL)
  3776. output[*idx] = ID_LEN;
  3777. (*idx)++;
  3778. if (output != NULL)
  3779. XMEMCPY(output + *idx, ssl->arrays->clientRandom, ID_LEN);
  3780. *idx += ID_LEN;
  3781. }
  3782. else
  3783. #endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */
  3784. {
  3785. /* TLS v1.3 does not use session id - 0 length. */
  3786. if (output != NULL)
  3787. output[*idx] = 0;
  3788. (*idx)++;
  3789. }
  3790. }
  3791. }
  3792. /* handle generation of TLS 1.3 client_hello (1) */
  3793. /* Send a ClientHello message to the server.
  3794. * Include the information required to start a handshake with servers using
  3795. * protocol versions less than TLS v1.3.
  3796. * Only a client will send this message.
  3797. *
  3798. * ssl The SSL/TLS object.
  3799. * returns 0 on success and otherwise failure.
  3800. */
  3801. typedef struct Sch13Args {
  3802. byte* output;
  3803. word32 idx;
  3804. int sendSz;
  3805. word32 length;
  3806. #if defined(HAVE_ECH)
  3807. int clientRandomOffset;
  3808. int preXLength;
  3809. WOLFSSL_ECH* ech;
  3810. #endif
  3811. } Sch13Args;
  3812. int SendTls13ClientHello(WOLFSSL* ssl)
  3813. {
  3814. int ret;
  3815. #ifdef WOLFSSL_ASYNC_CRYPT
  3816. Sch13Args* args = NULL;
  3817. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  3818. #else
  3819. Sch13Args args[1];
  3820. #endif
  3821. byte major, tls12minor;
  3822. const Suites* suites;
  3823. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  3824. WOLFSSL_ENTER("SendTls13ClientHello");
  3825. if (ssl == NULL) {
  3826. return BAD_FUNC_ARG;
  3827. }
  3828. ssl->options.buildingMsg = 1;
  3829. major = SSLv3_MAJOR;
  3830. tls12minor = TLSv1_2_MINOR;
  3831. #ifdef WOLFSSL_DTLS13
  3832. if (ssl->options.dtls) {
  3833. major = DTLS_MAJOR;
  3834. tls12minor = DTLSv1_2_MINOR;
  3835. }
  3836. #endif /* WOLFSSL_DTLS */
  3837. #ifdef HAVE_SESSION_TICKET
  3838. if (ssl->options.resuming &&
  3839. (ssl->session->version.major != ssl->version.major ||
  3840. ssl->session->version.minor != ssl->version.minor)) {
  3841. #ifndef WOLFSSL_NO_TLS12
  3842. if (ssl->session->version.major == ssl->version.major &&
  3843. ssl->session->version.minor < ssl->version.minor) {
  3844. /* Cannot resume with a different protocol version. */
  3845. ssl->options.resuming = 0;
  3846. ssl->version.major = ssl->session->version.major;
  3847. ssl->version.minor = ssl->session->version.minor;
  3848. return SendClientHello(ssl);
  3849. }
  3850. else
  3851. #endif
  3852. {
  3853. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  3854. return VERSION_ERROR;
  3855. }
  3856. }
  3857. #endif
  3858. suites = WOLFSSL_SUITES(ssl);
  3859. if (suites == NULL) {
  3860. WOLFSSL_MSG("Bad suites pointer in SendTls13ClientHello");
  3861. return SUITES_ERROR;
  3862. }
  3863. #ifdef WOLFSSL_ASYNC_CRYPT
  3864. if (ssl->async == NULL) {
  3865. ssl->async = (struct WOLFSSL_ASYNC*)
  3866. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  3867. DYNAMIC_TYPE_ASYNC);
  3868. if (ssl->async == NULL)
  3869. return MEMORY_E;
  3870. ssl->async->freeArgs = NULL;
  3871. }
  3872. args = (Sch13Args*)ssl->async->args;
  3873. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  3874. if (ret != WC_NO_PENDING_E) {
  3875. /* Check for error */
  3876. if (ret < 0)
  3877. return ret;
  3878. }
  3879. else
  3880. #endif
  3881. {
  3882. /* Reset state */
  3883. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  3884. XMEMSET(args, 0, sizeof(Sch13Args));
  3885. }
  3886. switch (ssl->options.asyncState) {
  3887. case TLS_ASYNC_BEGIN:
  3888. {
  3889. word32 sessIdSz = 0;
  3890. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  3891. #ifdef WOLFSSL_DTLS13
  3892. if (ssl->options.dtls)
  3893. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  3894. #endif /* WOLFSSL_DTLS13 */
  3895. /* Version | Random | Cipher Suites | Compression */
  3896. args->length = VERSION_SZ + RAN_LEN + suites->suiteSz +
  3897. SUITE_LEN + COMP_LEN + ENUM_LEN;
  3898. #ifdef WOLFSSL_QUIC
  3899. if (WOLFSSL_IS_QUIC(ssl)) {
  3900. /* RFC 9001 ch. 8.4 sessionID in ClientHello MUST be 0 length */
  3901. ssl->session->sessionIDSz = 0;
  3902. ssl->options.tls13MiddleBoxCompat = 0;
  3903. }
  3904. #endif
  3905. GetTls13SessionId(ssl, NULL, &sessIdSz);
  3906. args->length += (word16)sessIdSz;
  3907. #ifdef WOLFSSL_DTLS13
  3908. if (ssl->options.dtls) {
  3909. /* legacy_cookie_id len */
  3910. args->length += ENUM_LEN;
  3911. /* server sent us an HelloVerifyRequest and we allow downgrade */
  3912. if (ssl->arrays->cookieSz > 0 && ssl->options.downgrade)
  3913. args->length += ssl->arrays->cookieSz;
  3914. }
  3915. #endif /* WOLFSSL_DTLS13 */
  3916. /* Advance state and proceed */
  3917. ssl->options.asyncState = TLS_ASYNC_BUILD;
  3918. } /* case TLS_ASYNC_BEGIN */
  3919. FALL_THROUGH;
  3920. case TLS_ASYNC_BUILD:
  3921. case TLS_ASYNC_DO:
  3922. {
  3923. /* Auto populate extensions supported unless user defined. */
  3924. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  3925. return ret;
  3926. /* Advance state and proceed */
  3927. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  3928. } /* case TLS_ASYNC_BUILD */
  3929. FALL_THROUGH;
  3930. case TLS_ASYNC_FINALIZE:
  3931. {
  3932. #ifdef WOLFSSL_EARLY_DATA
  3933. #ifndef NO_PSK
  3934. if (!ssl->options.resuming &&
  3935. ssl->options.client_psk_tls13_cb == NULL &&
  3936. ssl->options.client_psk_cb == NULL)
  3937. #else
  3938. if (!ssl->options.resuming)
  3939. #endif
  3940. ssl->earlyData = no_early_data;
  3941. if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
  3942. ssl->earlyData = no_early_data;
  3943. if (ssl->earlyData == no_early_data)
  3944. TLSX_Remove(&ssl->extensions, TLSX_EARLY_DATA, ssl->heap);
  3945. if (ssl->earlyData != no_early_data &&
  3946. (ret = TLSX_EarlyData_Use(ssl, 0, 0)) < 0) {
  3947. return ret;
  3948. }
  3949. #endif
  3950. #ifdef WOLFSSL_QUIC
  3951. if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version)) {
  3952. ret = wolfSSL_quic_add_transport_extensions(ssl, client_hello);
  3953. if (ret != 0)
  3954. return ret;
  3955. }
  3956. #endif
  3957. /* find length of outer and inner */
  3958. #if defined(HAVE_ECH)
  3959. if (ssl->options.useEch == 1) {
  3960. TLSX* echX = TLSX_Find(ssl->extensions, TLSX_ECH);
  3961. if (echX == NULL)
  3962. return -1;
  3963. args->ech = (WOLFSSL_ECH*)echX->data;
  3964. if (args->ech == NULL)
  3965. return -1;
  3966. /* set the type to inner */
  3967. args->ech->type = ECH_TYPE_INNER;
  3968. args->preXLength = args->length;
  3969. /* get size for inner */
  3970. ret = TLSX_GetRequestSize(ssl, client_hello, &args->length);
  3971. if (ret != 0)
  3972. return ret;
  3973. /* set the type to outer */
  3974. args->ech->type = 0;
  3975. /* set innerClientHelloLen to ClientHelloInner + padding + tag */
  3976. args->ech->paddingLen = 31 - ((args->length - 1) % 32);
  3977. args->ech->innerClientHelloLen = args->length +
  3978. args->ech->paddingLen + args->ech->hpke->Nt;
  3979. /* set the length back to before we computed ClientHelloInner size */
  3980. args->length = args->preXLength;
  3981. }
  3982. #endif
  3983. {
  3984. #ifdef WOLFSSL_DTLS_CH_FRAG
  3985. word16 maxFrag = wolfSSL_GetMaxFragSize(ssl, MAX_RECORD_SIZE);
  3986. word16 lenWithoutExts = args->length;
  3987. #endif
  3988. /* Include length of TLS extensions. */
  3989. ret = TLSX_GetRequestSize(ssl, client_hello, &args->length);
  3990. if (ret != 0)
  3991. return ret;
  3992. #ifdef WOLFSSL_DTLS_CH_FRAG
  3993. if (ssl->options.dtls && args->length > maxFrag &&
  3994. TLSX_Find(ssl->extensions, TLSX_COOKIE) == NULL) {
  3995. /* Try again with an empty key share if we would be fragmenting
  3996. * without a cookie */
  3997. ret = TLSX_KeyShare_Empty(ssl);
  3998. if (ret != 0)
  3999. return ret;
  4000. args->length = lenWithoutExts;
  4001. ret = TLSX_GetRequestSize(ssl, client_hello, &args->length);
  4002. if (ret != 0)
  4003. return ret;
  4004. if (args->length > maxFrag) {
  4005. WOLFSSL_MSG("Can't fit first CH in one fragment.");
  4006. return BUFFER_ERROR;
  4007. }
  4008. WOLFSSL_MSG("Sending empty key share so we don't fragment CH1");
  4009. }
  4010. #endif
  4011. }
  4012. /* Total message size. */
  4013. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  4014. #ifdef WOLFSSL_DTLS13
  4015. if (ssl->options.dtls)
  4016. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  4017. #endif /* WOLFSSL_DTLS13 */
  4018. /* Check buffers are big enough and grow if needed. */
  4019. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0)
  4020. return ret;
  4021. /* Get position in output buffer to write new message to. */
  4022. args->output = GetOutputBuffer(ssl);
  4023. /* Put the record and handshake headers on. */
  4024. AddTls13Headers(args->output, args->length, client_hello, ssl);
  4025. /* Protocol version - negotiation now in extension: supported_versions. */
  4026. args->output[args->idx++] = major;
  4027. args->output[args->idx++] = tls12minor;
  4028. /* Keep for downgrade. */
  4029. ssl->chVersion = ssl->version;
  4030. if (ssl->arrays == NULL) {
  4031. return BAD_FUNC_ARG;
  4032. }
  4033. /* Client Random */
  4034. if (ssl->options.connectState == CONNECT_BEGIN) {
  4035. ret = wc_RNG_GenerateBlock(ssl->rng, args->output + args->idx, RAN_LEN);
  4036. if (ret != 0)
  4037. return ret;
  4038. /* Store random for possible second ClientHello. */
  4039. XMEMCPY(ssl->arrays->clientRandom, args->output + args->idx, RAN_LEN);
  4040. }
  4041. else
  4042. XMEMCPY(args->output + args->idx, ssl->arrays->clientRandom, RAN_LEN);
  4043. #if defined(HAVE_ECH)
  4044. args->clientRandomOffset = args->idx;
  4045. #endif
  4046. args->idx += RAN_LEN;
  4047. GetTls13SessionId(ssl, args->output, &args->idx);
  4048. #ifdef WOLFSSL_DTLS13
  4049. if (ssl->options.dtls) {
  4050. args->output[args->idx++] = ssl->arrays->cookieSz;
  4051. if (ssl->arrays->cookieSz > 0) {
  4052. /* We have a cookie saved, so the server sent us an
  4053. * HelloVerifyRequest, it means it is a v1.2 server */
  4054. if (!ssl->options.downgrade)
  4055. return VERSION_ERROR;
  4056. XMEMCPY(args->output + args->idx, ssl->arrays->cookie,
  4057. ssl->arrays->cookieSz);
  4058. args->idx += ssl->arrays->cookieSz;
  4059. }
  4060. }
  4061. #endif /* WOLFSSL_DTLS13 */
  4062. /* Cipher suites */
  4063. c16toa(suites->suiteSz, args->output + args->idx);
  4064. args->idx += OPAQUE16_LEN;
  4065. XMEMCPY(args->output + args->idx, &suites->suites,
  4066. suites->suiteSz);
  4067. args->idx += suites->suiteSz;
  4068. #ifdef WOLFSSL_DEBUG_TLS
  4069. {
  4070. int ii;
  4071. WOLFSSL_MSG("Ciphers:");
  4072. for (ii = 0 ; ii < suites->suiteSz; ii += 2) {
  4073. WOLFSSL_MSG(GetCipherNameInternal(suites->suites[ii+0],
  4074. suites->suites[ii+1]));
  4075. }
  4076. }
  4077. #endif
  4078. /* Compression not supported in TLS v1.3. */
  4079. args->output[args->idx++] = COMP_LEN;
  4080. args->output[args->idx++] = NO_COMPRESSION;
  4081. #if defined(HAVE_ECH)
  4082. /* write inner then outer */
  4083. if (ssl->options.useEch == 1) {
  4084. /* set the type to inner */
  4085. args->ech->type = ECH_TYPE_INNER;
  4086. /* allocate the inner */
  4087. args->ech->innerClientHello =
  4088. (byte*)XMALLOC(args->ech->innerClientHelloLen - args->ech->hpke->Nt,
  4089. ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  4090. if (args->ech->innerClientHello == NULL)
  4091. return MEMORY_E;
  4092. /* set the padding bytes to 0 */
  4093. XMEMSET(args->ech->innerClientHello + args->ech->innerClientHelloLen -
  4094. args->ech->hpke->Nt - args->ech->paddingLen, 0,
  4095. args->ech->paddingLen);
  4096. /* copy the client hello to the ech innerClientHello, exclude record */
  4097. /* and handshake headers */
  4098. XMEMCPY(args->ech->innerClientHello,
  4099. args->output + RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ,
  4100. args->idx - (RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ));
  4101. /* copy the client random to inner */
  4102. XMEMCPY(ssl->arrays->clientRandomInner, ssl->arrays->clientRandom,
  4103. RAN_LEN);
  4104. /* change the outer client random */
  4105. ret = wc_RNG_GenerateBlock(ssl->rng, args->output +
  4106. args->clientRandomOffset, RAN_LEN);
  4107. if (ret != 0)
  4108. return ret;
  4109. /* copy the new client random */
  4110. XMEMCPY(ssl->arrays->clientRandom, args->output +
  4111. args->clientRandomOffset, RAN_LEN);
  4112. /* write the extensions for inner */
  4113. args->length = 0;
  4114. ret = TLSX_WriteRequest(ssl, args->ech->innerClientHello + args->idx -
  4115. (RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ), client_hello,
  4116. &args->length);
  4117. if (ret != 0)
  4118. return ret;
  4119. /* set the type to outer */
  4120. args->ech->type = 0;
  4121. }
  4122. #endif
  4123. /* Write out extensions for a request. */
  4124. args->length = 0;
  4125. ret = TLSX_WriteRequest(ssl, args->output + args->idx, client_hello,
  4126. &args->length);
  4127. if (ret != 0)
  4128. return ret;
  4129. args->idx += args->length;
  4130. #if defined(HAVE_ECH)
  4131. /* encrypt and pack the ech innerClientHello */
  4132. if (ssl->options.useEch == 1) {
  4133. ret = TLSX_FinalizeEch(args->ech,
  4134. args->output + RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ,
  4135. args->sendSz - (RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ));
  4136. if (ret != 0)
  4137. return ret;
  4138. }
  4139. #endif
  4140. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  4141. /* Resumption has a specific set of extensions and binder is calculated
  4142. * for each identity.
  4143. */
  4144. if (TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY)) {
  4145. ret = WritePSKBinders(ssl, args->output, args->idx);
  4146. }
  4147. else
  4148. #endif
  4149. {
  4150. #ifdef WOLFSSL_DTLS13
  4151. if (ssl->options.dtls)
  4152. ret = Dtls13HashHandshake(ssl,
  4153. args->output + Dtls13GetRlHeaderLength(ssl, 0),
  4154. (word16)args->idx - Dtls13GetRlHeaderLength(ssl, 0));
  4155. else
  4156. #endif /* WOLFSSL_DTLS13 */
  4157. {
  4158. #if defined(HAVE_ECH)
  4159. /* compute the inner hash */
  4160. if (ssl->options.useEch == 1) {
  4161. ret = EchHashHelloInner(ssl, args->ech);
  4162. }
  4163. #endif
  4164. /* compute the outer hash */
  4165. if (ret == 0)
  4166. ret = HashOutput(ssl, args->output, args->idx, 0);
  4167. }
  4168. }
  4169. if (ret != 0)
  4170. return ret;
  4171. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  4172. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  4173. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  4174. if (ssl->toInfoOn) {
  4175. ret = AddPacketInfo(ssl, "ClientHello", handshake, args->output,
  4176. args->sendSz, WRITE_PROTO, 0, ssl->heap);
  4177. if (ret != 0)
  4178. return ret;
  4179. }
  4180. #endif
  4181. ssl->options.buildingMsg = 0;
  4182. #ifdef WOLFSSL_DTLS13
  4183. if (ssl->options.dtls) {
  4184. ret = Dtls13HandshakeSend(ssl, args->output, (word16)args->sendSz,
  4185. (word16)args->idx, client_hello, 0);
  4186. break;
  4187. }
  4188. #endif /* WOLFSSL_DTLS13 */
  4189. ssl->buffers.outputBuffer.length += args->sendSz;
  4190. /* Advance state and proceed */
  4191. ssl->options.asyncState = TLS_ASYNC_END;
  4192. }
  4193. /* case TLS_ASYNC_BUILD */
  4194. FALL_THROUGH;
  4195. case TLS_ASYNC_END:
  4196. {
  4197. #ifdef WOLFSSL_EARLY_DATA_GROUP
  4198. /* QUIC needs to forward records at their encryption level
  4199. * and is therefore unable to group here */
  4200. if (ssl->earlyData == no_early_data || WOLFSSL_IS_QUIC(ssl))
  4201. #endif
  4202. ret = SendBuffered(ssl);
  4203. break;
  4204. }
  4205. default:
  4206. ret = INPUT_CASE_ERROR;
  4207. } /* switch (ssl->options.asyncState) */
  4208. #ifdef WOLFSSL_ASYNC_CRYPT
  4209. if (ret == 0)
  4210. FreeAsyncCtx(ssl, 0);
  4211. #endif
  4212. WOLFSSL_LEAVE("SendTls13ClientHello", ret);
  4213. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  4214. return ret;
  4215. }
  4216. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_CLIENT)
  4217. static int Dtls13ClientDoDowngrade(WOLFSSL* ssl)
  4218. {
  4219. int ret;
  4220. if (ssl->dtls13ClientHello == NULL)
  4221. return BAD_STATE_E;
  4222. /* v1.3 and v1.2 hash messages to compute the transcript hash. When we are
  4223. * using DTLSv1.3 we hash the first clientHello following v1.3 but the
  4224. * server can negotiate a lower version. So we need to re-hash the
  4225. * clientHello to adhere to DTLS <= v1.2 rules. */
  4226. ret = InitHandshakeHashes(ssl);
  4227. if (ret != 0)
  4228. return ret;
  4229. ret = HashRaw(ssl, ssl->dtls13ClientHello, ssl->dtls13ClientHelloSz);
  4230. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  4231. ssl->dtls13ClientHello = NULL;
  4232. ssl->dtls13ClientHelloSz = 0;
  4233. ssl->keys.dtls_sequence_number_hi =
  4234. (word16)w64GetHigh32(ssl->dtls13EncryptEpoch->nextSeqNumber);
  4235. ssl->keys.dtls_sequence_number_lo =
  4236. w64GetLow32(ssl->dtls13EncryptEpoch->nextSeqNumber);
  4237. return ret;
  4238. }
  4239. #endif /* WOLFSSL_DTLS13 && !WOLFSSL_NO_CLIENT*/
  4240. #if defined(HAVE_ECH)
  4241. /* check if the server accepted ech or not */
  4242. static int EchCheckAcceptance(WOLFSSL* ssl, const byte* input,
  4243. int serverRandomOffset, int helloSz)
  4244. {
  4245. int ret = 0;
  4246. int digestType = 0;
  4247. int digestSize = 0;
  4248. HS_Hashes* tmpHashes;
  4249. HS_Hashes* acceptHashes;
  4250. byte zeros[WC_MAX_DIGEST_SIZE];
  4251. byte transcriptEchConf[WC_MAX_DIGEST_SIZE];
  4252. byte expandLabelPrk[WC_MAX_DIGEST_SIZE];
  4253. byte acceptConfirmation[ECH_ACCEPT_CONFIRMATION_SZ];
  4254. XMEMSET(zeros, 0, sizeof(zeros));
  4255. XMEMSET(transcriptEchConf, 0, sizeof(transcriptEchConf));
  4256. XMEMSET(expandLabelPrk, 0, sizeof(expandLabelPrk));
  4257. XMEMSET(acceptConfirmation, 0, sizeof(acceptConfirmation));
  4258. /* copy ech hashes to accept */
  4259. ret = InitHandshakeHashesAndCopy(ssl, ssl->hsHashesEch, &acceptHashes);
  4260. /* swap hsHashes to acceptHashes */
  4261. tmpHashes = ssl->hsHashes;
  4262. ssl->hsHashes = acceptHashes;
  4263. /* hash up to the last 8 bytes */
  4264. if (ret == 0)
  4265. ret = HashRaw(ssl, input, serverRandomOffset + RAN_LEN -
  4266. ECH_ACCEPT_CONFIRMATION_SZ);
  4267. /* hash 8 zeros */
  4268. if (ret == 0)
  4269. ret = HashRaw(ssl, zeros, ECH_ACCEPT_CONFIRMATION_SZ);
  4270. /* hash the rest of the hello */
  4271. if (ret == 0) {
  4272. ret = HashRaw(ssl, input + serverRandomOffset + RAN_LEN,
  4273. helloSz + HANDSHAKE_HEADER_SZ - (serverRandomOffset + RAN_LEN));
  4274. }
  4275. /* get the modified transcript hash */
  4276. if (ret == 0)
  4277. ret = GetMsgHash(ssl, transcriptEchConf);
  4278. if (ret > 0)
  4279. ret = 0;
  4280. /* pick the right type and size based on mac_algorithm */
  4281. if (ret == 0) {
  4282. switch (ssl->specs.mac_algorithm) {
  4283. #ifndef NO_SHA256
  4284. case sha256_mac:
  4285. digestType = WC_SHA256;
  4286. digestSize = WC_SHA256_DIGEST_SIZE;
  4287. break;
  4288. #endif /* !NO_SHA256 */
  4289. #ifdef WOLFSSL_SHA384
  4290. case sha384_mac:
  4291. digestType = WC_SHA384;
  4292. digestSize = WC_SHA384_DIGEST_SIZE;
  4293. break;
  4294. #endif /* WOLFSSL_SHA384 */
  4295. #ifdef WOLFSSL_TLS13_SHA512
  4296. case sha512_mac:
  4297. digestType = WC_SHA512;
  4298. digestSize = WC_SHA512_DIGEST_SIZE;
  4299. break;
  4300. #endif /* WOLFSSL_TLS13_SHA512 */
  4301. #ifdef WOLFSSL_SM3
  4302. case sm3_mac:
  4303. digestType = WC_SM3;
  4304. digestSize = WC_SM3_DIGEST_SIZE;
  4305. break;
  4306. #endif /* WOLFSSL_SM3 */
  4307. default:
  4308. ret = -1;
  4309. break;
  4310. }
  4311. }
  4312. /* extract clientRandomInner with a key of all zeros */
  4313. if (ret == 0) {
  4314. PRIVATE_KEY_UNLOCK();
  4315. #if !defined(HAVE_FIPS) || \
  4316. (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))
  4317. ret = wc_HKDF_Extract_ex(digestType, zeros, digestSize,
  4318. ssl->arrays->clientRandomInner, RAN_LEN, expandLabelPrk,
  4319. ssl->heap, ssl->devId);
  4320. #else
  4321. ret = wc_HKDF_Extract(digestType, zeros, digestSize,
  4322. ssl->arrays->clientRandomInner, RAN_LEN, expandLabelPrk);
  4323. #endif
  4324. PRIVATE_KEY_LOCK();
  4325. }
  4326. /* tls expand with the confirmation label */
  4327. if (ret == 0) {
  4328. PRIVATE_KEY_UNLOCK();
  4329. ret = Tls13HKDFExpandKeyLabel(ssl,
  4330. acceptConfirmation, ECH_ACCEPT_CONFIRMATION_SZ,
  4331. expandLabelPrk, digestSize,
  4332. tls13ProtocolLabel, TLS13_PROTOCOL_LABEL_SZ,
  4333. echAcceptConfirmationLabel, ECH_ACCEPT_CONFIRMATION_LABEL_SZ,
  4334. transcriptEchConf, digestSize, digestType, WOLFSSL_SERVER_END);
  4335. PRIVATE_KEY_LOCK();
  4336. }
  4337. if (ret == 0) {
  4338. /* last 8 bytes should match our expand output */
  4339. ret = XMEMCMP(acceptConfirmation,
  4340. ssl->arrays->serverRandom + RAN_LEN - ECH_ACCEPT_CONFIRMATION_SZ,
  4341. ECH_ACCEPT_CONFIRMATION_SZ);
  4342. /* ech accepted */
  4343. if (ret == 0) {
  4344. /* use the inner random for client random */
  4345. XMEMCPY(ssl->arrays->clientRandom, ssl->arrays->clientRandomInner,
  4346. RAN_LEN);
  4347. /* switch back to original hsHashes to free */
  4348. ssl->hsHashes = tmpHashes;
  4349. /* set the final hsHashes to the ech hashes */
  4350. tmpHashes = ssl->hsHashesEch;
  4351. }
  4352. /* ech rejected */
  4353. else {
  4354. /* switch to hsHashesEch to free */
  4355. ssl->hsHashes = ssl->hsHashesEch;
  4356. }
  4357. /* free hsHashes */
  4358. FreeHandshakeHashes(ssl);
  4359. /* set hsHashesEch to NULL to avoid double free */
  4360. ssl->hsHashesEch = NULL;
  4361. /* continue with outer if we failed to verify ech was accepted */
  4362. ret = 0;
  4363. }
  4364. /* switch to acceptHashes */
  4365. ssl->hsHashes = acceptHashes;
  4366. /* free acceptHashes */
  4367. FreeHandshakeHashes(ssl);
  4368. /* swap to tmp, will ech if accepted, hsHashes if rejected */
  4369. ssl->hsHashes = tmpHashes;
  4370. return ret;
  4371. }
  4372. /* replace the last 8 bytes of the server random with the ech acceptance
  4373. * parameter, return status */
  4374. static int EchWriteAcceptance(WOLFSSL* ssl, byte* output,
  4375. int serverRandomOffset, int helloSz)
  4376. {
  4377. int ret = 0;
  4378. int digestType = 0;
  4379. int digestSize = 0;
  4380. HS_Hashes* tmpHashes = NULL;
  4381. HS_Hashes* acceptHashes = NULL;
  4382. byte zeros[WC_MAX_DIGEST_SIZE];
  4383. byte transcriptEchConf[WC_MAX_DIGEST_SIZE];
  4384. byte expandLabelPrk[WC_MAX_DIGEST_SIZE];
  4385. XMEMSET(zeros, 0, sizeof(zeros));
  4386. XMEMSET(transcriptEchConf, 0, sizeof(transcriptEchConf));
  4387. XMEMSET(expandLabelPrk, 0, sizeof(expandLabelPrk));
  4388. /* copy ech hashes to accept */
  4389. ret = InitHandshakeHashesAndCopy(ssl, ssl->hsHashes, &acceptHashes);
  4390. /* swap hsHashes to acceptHashes */
  4391. tmpHashes = ssl->hsHashes;
  4392. ssl->hsHashes = acceptHashes;
  4393. /* hash up to the last 8 bytes */
  4394. if (ret == 0)
  4395. ret = HashRaw(ssl, output, serverRandomOffset + RAN_LEN -
  4396. ECH_ACCEPT_CONFIRMATION_SZ);
  4397. /* hash 8 zeros */
  4398. if (ret == 0)
  4399. ret = HashRaw(ssl, zeros, ECH_ACCEPT_CONFIRMATION_SZ);
  4400. /* hash the rest of the hello */
  4401. if (ret == 0)
  4402. ret = HashRaw(ssl, output + serverRandomOffset + RAN_LEN,
  4403. helloSz - (serverRandomOffset + RAN_LEN));
  4404. /* get the modified transcript hash */
  4405. if (ret == 0)
  4406. ret = GetMsgHash(ssl, transcriptEchConf);
  4407. if (ret > 0)
  4408. ret = 0;
  4409. /* pick the right type and size based on mac_algorithm */
  4410. if (ret == 0)
  4411. switch (ssl->specs.mac_algorithm) {
  4412. #ifndef NO_SHA256
  4413. case sha256_mac:
  4414. digestType = WC_SHA256;
  4415. digestSize = WC_SHA256_DIGEST_SIZE;
  4416. break;
  4417. #endif /* !NO_SHA256 */
  4418. #ifdef WOLFSSL_SHA384
  4419. case sha384_mac:
  4420. digestType = WC_SHA384;
  4421. digestSize = WC_SHA384_DIGEST_SIZE;
  4422. break;
  4423. #endif /* WOLFSSL_SHA384 */
  4424. #ifdef WOLFSSL_TLS13_SHA512
  4425. case sha512_mac:
  4426. digestType = WC_SHA512;
  4427. digestSize = WC_SHA512_DIGEST_SIZE;
  4428. break;
  4429. #endif /* WOLFSSL_TLS13_SHA512 */
  4430. #ifdef WOLFSSL_SM3
  4431. case sm3_mac:
  4432. digestType = WC_SM3;
  4433. digestSize = WC_SM3_DIGEST_SIZE;
  4434. break;
  4435. #endif /* WOLFSSL_SM3 */
  4436. default:
  4437. ret = -1;
  4438. break;
  4439. }
  4440. /* extract clientRandom with a key of all zeros */
  4441. if (ret == 0) {
  4442. PRIVATE_KEY_UNLOCK();
  4443. #if !defined(HAVE_FIPS) || \
  4444. (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))
  4445. ret = wc_HKDF_Extract_ex(digestType, zeros, digestSize,
  4446. ssl->arrays->clientRandom, RAN_LEN, expandLabelPrk,
  4447. ssl->heap, ssl->devId);
  4448. #else
  4449. ret = wc_HKDF_Extract(digestType, zeros, digestSize,
  4450. ssl->arrays->clientRandom, RAN_LEN, expandLabelPrk);
  4451. #endif
  4452. PRIVATE_KEY_LOCK();
  4453. }
  4454. /* tls expand with the confirmation label */
  4455. if (ret == 0) {
  4456. PRIVATE_KEY_UNLOCK();
  4457. ret = Tls13HKDFExpandKeyLabel(ssl,
  4458. output + serverRandomOffset + RAN_LEN - ECH_ACCEPT_CONFIRMATION_SZ,
  4459. ECH_ACCEPT_CONFIRMATION_SZ,
  4460. expandLabelPrk, digestSize,
  4461. tls13ProtocolLabel, TLS13_PROTOCOL_LABEL_SZ,
  4462. echAcceptConfirmationLabel, ECH_ACCEPT_CONFIRMATION_LABEL_SZ,
  4463. transcriptEchConf, digestSize, digestType, WOLFSSL_SERVER_END);
  4464. PRIVATE_KEY_LOCK();
  4465. }
  4466. if (ret == 0)
  4467. XMEMCPY(ssl->arrays->serverRandom, output + serverRandomOffset,
  4468. RAN_LEN);
  4469. /* free acceptHashes */
  4470. FreeHandshakeHashes(ssl);
  4471. ssl->hsHashes = tmpHashes;
  4472. return ret;
  4473. }
  4474. #endif
  4475. /* handle processing of TLS 1.3 server_hello (2) and hello_retry_request (6) */
  4476. /* Handle the ServerHello message from the server.
  4477. * Only a client will receive this message.
  4478. *
  4479. * ssl The SSL/TLS object.
  4480. * input The message buffer.
  4481. * inOutIdx On entry, the index into the message buffer of ServerHello.
  4482. * On exit, the index of byte after the ServerHello message.
  4483. * helloSz The length of the current handshake message.
  4484. * returns 0 on success and otherwise failure.
  4485. */
  4486. typedef struct Dsh13Args {
  4487. ProtocolVersion pv;
  4488. word32 idx;
  4489. word32 begin;
  4490. const byte* sessId;
  4491. word16 totalExtSz;
  4492. byte sessIdSz;
  4493. byte extMsgType;
  4494. #if defined(HAVE_ECH)
  4495. int serverRandomOffset;
  4496. #endif
  4497. } Dsh13Args;
  4498. int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  4499. word32 helloSz, byte* extMsgType)
  4500. {
  4501. int ret;
  4502. byte suite[2];
  4503. byte tls12minor;
  4504. #ifdef WOLFSSL_ASYNC_CRYPT
  4505. Dsh13Args* args = NULL;
  4506. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  4507. #else
  4508. Dsh13Args args[1];
  4509. #endif
  4510. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  4511. WOLFSSL_ENTER("DoTls13ServerHello");
  4512. tls12minor = TLSv1_2_MINOR;
  4513. #ifdef WOLFSSL_DTLS13
  4514. if (ssl->options.dtls)
  4515. tls12minor = DTLSv1_2_MINOR;
  4516. #endif /* WOLFSSL_DTLS13 */
  4517. if (ssl == NULL || ssl->arrays == NULL)
  4518. return BAD_FUNC_ARG;
  4519. #ifdef WOLFSSL_ASYNC_CRYPT
  4520. if (ssl->async == NULL) {
  4521. ssl->async = (struct WOLFSSL_ASYNC*)
  4522. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  4523. DYNAMIC_TYPE_ASYNC);
  4524. if (ssl->async == NULL)
  4525. return MEMORY_E;
  4526. ssl->async->freeArgs = NULL;
  4527. }
  4528. args = (Dsh13Args*)ssl->async->args;
  4529. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  4530. if (ret != WC_NO_PENDING_E) {
  4531. /* Check for error */
  4532. if (ret < 0) {
  4533. if (ret == WC_PENDING_E) {
  4534. /* Mark message as not received so it can process again */
  4535. ssl->msgsReceived.got_server_hello = 0;
  4536. }
  4537. return ret;
  4538. }
  4539. }
  4540. else
  4541. #endif
  4542. {
  4543. /* Reset state */
  4544. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  4545. XMEMSET(args, 0, sizeof(Dsh13Args));
  4546. }
  4547. switch (ssl->options.asyncState) {
  4548. case TLS_ASYNC_BEGIN:
  4549. {
  4550. byte b;
  4551. #ifdef WOLFSSL_CALLBACKS
  4552. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  4553. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  4554. #endif
  4555. /* Protocol version length check. */
  4556. if (helloSz < OPAQUE16_LEN)
  4557. return BUFFER_ERROR;
  4558. args->idx = *inOutIdx;
  4559. args->begin = args->idx;
  4560. /* Protocol version */
  4561. XMEMCPY(&args->pv, input + args->idx, OPAQUE16_LEN);
  4562. args->idx += OPAQUE16_LEN;
  4563. #ifdef WOLFSSL_DTLS
  4564. if (ssl->options.dtls &&
  4565. (args->pv.major != DTLS_MAJOR || args->pv.minor == DTLS_BOGUS_MINOR))
  4566. return VERSION_ERROR;
  4567. #endif /* WOLFSSL_DTLS */
  4568. #ifndef WOLFSSL_NO_TLS12
  4569. {
  4570. byte wantDowngrade;
  4571. wantDowngrade = args->pv.major == ssl->version.major &&
  4572. args->pv.minor < TLSv1_2_MINOR;
  4573. #ifdef WOLFSSL_DTLS13
  4574. if (ssl->options.dtls)
  4575. wantDowngrade = args->pv.major == ssl->version.major &&
  4576. args->pv.minor > DTLSv1_2_MINOR;
  4577. #endif /* WOLFSSL_DTLS13 */
  4578. if (wantDowngrade && ssl->options.downgrade) {
  4579. /* Force client hello version 1.2 to work for static RSA. */
  4580. ssl->chVersion.minor = TLSv1_2_MINOR;
  4581. ssl->version.minor = TLSv1_2_MINOR;
  4582. #ifdef WOLFSSL_DTLS13
  4583. if (ssl->options.dtls) {
  4584. ssl->chVersion.minor = DTLSv1_2_MINOR;
  4585. ssl->version.minor = DTLSv1_2_MINOR;
  4586. ret = Dtls13ClientDoDowngrade(ssl);
  4587. if (ret != 0)
  4588. return ret;
  4589. }
  4590. #endif /* WOLFSSL_DTLS13 */
  4591. return DoServerHello(ssl, input, inOutIdx, helloSz);
  4592. }
  4593. }
  4594. #endif
  4595. if (args->pv.major != ssl->version.major ||
  4596. args->pv.minor != tls12minor) {
  4597. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  4598. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  4599. return VERSION_ERROR;
  4600. }
  4601. /* Random and session id length check */
  4602. if ((args->idx - args->begin) + RAN_LEN + ENUM_LEN > helloSz)
  4603. return BUFFER_ERROR;
  4604. /* Check if hello retry request */
  4605. if (XMEMCMP(input + args->idx, helloRetryRequestRandom, RAN_LEN) == 0) {
  4606. WOLFSSL_MSG("HelloRetryRequest format");
  4607. *extMsgType = hello_retry_request;
  4608. if (ssl->msgsReceived.got_hello_verify_request) {
  4609. WOLFSSL_MSG("Received HelloRetryRequest after a "
  4610. "HelloVerifyRequest");
  4611. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  4612. return VERSION_ERROR;
  4613. }
  4614. /* A HelloRetryRequest comes in as an ServerHello for MiddleBox compat.
  4615. * Found message to be a HelloRetryRequest.
  4616. * Don't allow more than one HelloRetryRequest or ServerHello.
  4617. */
  4618. if (ssl->msgsReceived.got_hello_retry_request) {
  4619. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  4620. return DUPLICATE_MSG_E;
  4621. }
  4622. }
  4623. args->extMsgType = *extMsgType;
  4624. /* Server random - keep for debugging. */
  4625. XMEMCPY(ssl->arrays->serverRandom, input + args->idx, RAN_LEN);
  4626. #if defined(HAVE_ECH)
  4627. args->serverRandomOffset = args->idx;
  4628. #endif
  4629. args->idx += RAN_LEN;
  4630. /* Session id */
  4631. args->sessIdSz = input[args->idx++];
  4632. if ((args->idx - args->begin) + args->sessIdSz > helloSz)
  4633. return BUFFER_ERROR;
  4634. args->sessId = input + args->idx;
  4635. args->idx += args->sessIdSz;
  4636. ssl->options.haveSessionId = 1;
  4637. /* Ciphersuite and compression check */
  4638. if ((args->idx - args->begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  4639. return BUFFER_ERROR;
  4640. /* Set the cipher suite from the message. */
  4641. ssl->options.cipherSuite0 = input[args->idx++];
  4642. ssl->options.cipherSuite = input[args->idx++];
  4643. #ifdef WOLFSSL_DEBUG_TLS
  4644. WOLFSSL_MSG("Chosen cipher suite:");
  4645. WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
  4646. ssl->options.cipherSuite));
  4647. #endif
  4648. /* Compression */
  4649. b = input[args->idx++];
  4650. if (b != 0) {
  4651. WOLFSSL_MSG("Must be no compression types in list");
  4652. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  4653. return INVALID_PARAMETER;
  4654. }
  4655. if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz) {
  4656. if (!ssl->options.downgrade)
  4657. return BUFFER_ERROR;
  4658. #ifndef WOLFSSL_NO_TLS12
  4659. /* Force client hello version 1.2 to work for static RSA. */
  4660. ssl->chVersion.minor = TLSv1_2_MINOR;
  4661. ssl->version.minor = TLSv1_2_MINOR;
  4662. #ifdef WOLFSSL_DTLS13
  4663. if (ssl->options.dtls) {
  4664. ssl->chVersion.minor = DTLSv1_2_MINOR;
  4665. ssl->version.minor = DTLSv1_2_MINOR;
  4666. ret = Dtls13ClientDoDowngrade(ssl);
  4667. if (ret != 0)
  4668. return ret;
  4669. }
  4670. #endif /* WOLFSSL_DTLS13 */
  4671. #endif
  4672. ssl->options.haveEMS = 0;
  4673. if (args->pv.minor < ssl->options.minDowngrade) {
  4674. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  4675. return VERSION_ERROR;
  4676. }
  4677. #ifndef WOLFSSL_NO_TLS12
  4678. return DoServerHello(ssl, input, inOutIdx, helloSz);
  4679. #else
  4680. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  4681. return VERSION_ERROR;
  4682. #endif
  4683. }
  4684. if ((args->idx - args->begin) < helloSz) {
  4685. int foundVersion;
  4686. /* Get extension length and length check. */
  4687. if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz)
  4688. return BUFFER_ERROR;
  4689. ato16(&input[args->idx], &args->totalExtSz);
  4690. args->idx += OPAQUE16_LEN;
  4691. if ((args->idx - args->begin) + args->totalExtSz > helloSz)
  4692. return BUFFER_ERROR;
  4693. /* Need to negotiate version first. */
  4694. if ((ret = TLSX_ParseVersion(ssl, input + args->idx,
  4695. args->totalExtSz, *extMsgType, &foundVersion))) {
  4696. return ret;
  4697. }
  4698. if (!foundVersion) {
  4699. if (!ssl->options.downgrade) {
  4700. WOLFSSL_MSG("Server trying to downgrade to version less than "
  4701. "TLS v1.3");
  4702. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  4703. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  4704. return VERSION_ERROR;
  4705. }
  4706. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
  4707. defined(WOLFSSL_WPAS_SMALL)
  4708. /* Check if client has disabled TLS 1.2 */
  4709. if (args->pv.minor == TLSv1_2_MINOR &&
  4710. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  4711. WOLFSSL_MSG("\tOption set to not allow TLSv1.2");
  4712. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  4713. return VERSION_ERROR;
  4714. }
  4715. #endif
  4716. if (!ssl->options.dtls &&
  4717. args->pv.minor < ssl->options.minDowngrade) {
  4718. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  4719. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  4720. return VERSION_ERROR;
  4721. }
  4722. if (ssl->options.dtls &&
  4723. args->pv.minor > ssl->options.minDowngrade) {
  4724. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  4725. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  4726. return VERSION_ERROR;
  4727. }
  4728. ssl->version.minor = args->pv.minor;
  4729. ssl->options.tls1_3 = 0;
  4730. #ifdef WOLFSSL_DTLS13
  4731. if (ssl->options.dtls) {
  4732. ret = Dtls13ClientDoDowngrade(ssl);
  4733. if (ret != 0)
  4734. return ret;
  4735. }
  4736. #endif /* WOLFSSL_DTLS13 */
  4737. }
  4738. }
  4739. #ifdef WOLFSSL_DTLS13
  4740. /* we are sure that version is >= v1.3 now, we can get rid of buffered
  4741. * ClientHello that was buffered to re-compute the hash in case of
  4742. * downgrade */
  4743. if (ssl->options.dtls && ssl->dtls13ClientHello != NULL) {
  4744. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  4745. ssl->dtls13ClientHello = NULL;
  4746. ssl->dtls13ClientHelloSz = 0;
  4747. }
  4748. #endif /* WOLFSSL_DTLS13 */
  4749. /* Advance state and proceed */
  4750. ssl->options.asyncState = TLS_ASYNC_BUILD;
  4751. } /* case TLS_ASYNC_BEGIN */
  4752. FALL_THROUGH;
  4753. case TLS_ASYNC_BUILD:
  4754. case TLS_ASYNC_DO:
  4755. {
  4756. /* restore message type */
  4757. *extMsgType = args->extMsgType;
  4758. if (args->totalExtSz > 0) {
  4759. /* Parse and handle extensions. */
  4760. ret = TLSX_Parse(ssl, input + args->idx, args->totalExtSz,
  4761. *extMsgType, NULL);
  4762. if (ret != 0) {
  4763. #ifdef WOLFSSL_ASYNC_CRYPT
  4764. /* Handle async operation */
  4765. if (ret == WC_PENDING_E) {
  4766. /* Mark message as not received so it can process again */
  4767. ssl->msgsReceived.got_server_hello = 0;
  4768. }
  4769. #endif
  4770. return ret;
  4771. }
  4772. if (*extMsgType == hello_retry_request) {
  4773. /* Update counts to reflect change of message type. */
  4774. ssl->msgsReceived.got_hello_retry_request = 1;
  4775. ssl->msgsReceived.got_server_hello = 0;
  4776. }
  4777. args->idx += args->totalExtSz;
  4778. }
  4779. #ifdef WOLFSSL_DTLS_CID
  4780. if (ssl->options.useDtlsCID && *extMsgType == server_hello)
  4781. DtlsCIDOnExtensionsParsed(ssl);
  4782. #endif /* WOLFSSL_DTLS_CID */
  4783. *inOutIdx = args->idx;
  4784. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  4785. #ifdef HAVE_SECRET_CALLBACK
  4786. if (ssl->sessionSecretCb != NULL
  4787. #ifdef HAVE_SESSION_TICKET
  4788. && ssl->session->ticketLen > 0
  4789. #endif
  4790. ) {
  4791. int secretSz = SECRET_LEN;
  4792. ret = ssl->sessionSecretCb(ssl, ssl->session->masterSecret,
  4793. &secretSz, ssl->sessionSecretCtx);
  4794. if (ret != 0 || secretSz != SECRET_LEN) {
  4795. WOLFSSL_ERROR_VERBOSE(SESSION_SECRET_CB_E);
  4796. return SESSION_SECRET_CB_E;
  4797. }
  4798. }
  4799. #endif /* HAVE_SECRET_CALLBACK */
  4800. /* Version only negotiated in extensions for TLS v1.3.
  4801. * Only now do we know how to deal with session id.
  4802. */
  4803. if (!IsAtLeastTLSv1_3(ssl->version)) {
  4804. #ifndef WOLFSSL_NO_TLS12
  4805. ssl->arrays->sessionIDSz = args->sessIdSz;
  4806. if (ssl->arrays->sessionIDSz > ID_LEN) {
  4807. WOLFSSL_MSG("Invalid session ID size");
  4808. ssl->arrays->sessionIDSz = 0;
  4809. return BUFFER_ERROR;
  4810. }
  4811. else if (ssl->arrays->sessionIDSz) {
  4812. XMEMCPY(ssl->arrays->sessionID, args->sessId,
  4813. ssl->arrays->sessionIDSz);
  4814. ssl->options.haveSessionId = 1;
  4815. }
  4816. /* Force client hello version 1.2 to work for static RSA. */
  4817. if (ssl->options.dtls)
  4818. ssl->chVersion.minor = DTLSv1_2_MINOR;
  4819. else
  4820. ssl->chVersion.minor = TLSv1_2_MINOR;
  4821. /* Complete TLS v1.2 processing of ServerHello. */
  4822. ret = CompleteServerHello(ssl);
  4823. #else
  4824. WOLFSSL_MSG("Client using higher version, fatal error");
  4825. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  4826. ret = VERSION_ERROR;
  4827. #endif
  4828. WOLFSSL_LEAVE("DoTls13ServerHello", ret);
  4829. return ret;
  4830. }
  4831. /* Advance state and proceed */
  4832. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  4833. } /* case TLS_ASYNC_BUILD || TLS_ASYNC_DO */
  4834. FALL_THROUGH;
  4835. case TLS_ASYNC_FINALIZE:
  4836. {
  4837. #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
  4838. if (ssl->options.tls13MiddleBoxCompat) {
  4839. if (args->sessIdSz == 0) {
  4840. WOLFSSL_MSG("args->sessIdSz == 0");
  4841. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  4842. return INVALID_PARAMETER;
  4843. }
  4844. if (ssl->session->sessionIDSz != 0) {
  4845. if (ssl->session->sessionIDSz != args->sessIdSz ||
  4846. XMEMCMP(ssl->session->sessionID, args->sessId,
  4847. args->sessIdSz) != 0) {
  4848. WOLFSSL_MSG("session id doesn't match");
  4849. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  4850. return INVALID_PARAMETER;
  4851. }
  4852. }
  4853. else if (XMEMCMP(ssl->arrays->clientRandom, args->sessId,
  4854. args->sessIdSz) != 0) {
  4855. WOLFSSL_MSG("session id doesn't match client random");
  4856. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  4857. return INVALID_PARAMETER;
  4858. }
  4859. }
  4860. else
  4861. #endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */
  4862. #ifdef WOLFSSL_QUIC
  4863. if (WOLFSSL_IS_QUIC(ssl)) {
  4864. if (args->sessIdSz != 0) {
  4865. WOLFSSL_MSG("args->sessIdSz != 0");
  4866. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  4867. return INVALID_PARAMETER;
  4868. }
  4869. }
  4870. else
  4871. #endif /* WOLFSSL_QUIC */
  4872. if (args->sessIdSz != ssl->session->sessionIDSz || (args->sessIdSz > 0 &&
  4873. XMEMCMP(ssl->session->sessionID, args->sessId, args->sessIdSz) != 0))
  4874. {
  4875. WOLFSSL_MSG("Server sent different session id");
  4876. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  4877. return INVALID_PARAMETER;
  4878. }
  4879. ret = SetCipherSpecs(ssl);
  4880. if (ret != 0)
  4881. return ret;
  4882. #if defined(HAVE_ECH)
  4883. /* check for acceptConfirmation and HashInput with 8 0 bytes */
  4884. if (ssl->options.useEch == 1) {
  4885. ret = EchCheckAcceptance(ssl, input, args->serverRandomOffset, helloSz);
  4886. if (ret != 0)
  4887. return ret;
  4888. }
  4889. #endif
  4890. #ifdef HAVE_NULL_CIPHER
  4891. if (ssl->options.cipherSuite0 == ECC_BYTE &&
  4892. (ssl->options.cipherSuite == TLS_SHA256_SHA256 ||
  4893. ssl->options.cipherSuite == TLS_SHA384_SHA384)) {
  4894. ;
  4895. }
  4896. else
  4897. #endif
  4898. #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM3)
  4899. if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
  4900. ssl->options.cipherSuite == TLS_SM4_GCM_SM3) {
  4901. ; /* Do nothing. */
  4902. }
  4903. else
  4904. #endif
  4905. #if defined(WOLFSSL_SM4_CCM) && defined(WOLFSSL_SM3)
  4906. if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
  4907. ssl->options.cipherSuite == TLS_SM4_CCM_SM3) {
  4908. ; /* Do nothing. */
  4909. }
  4910. else
  4911. #endif
  4912. /* Check that the negotiated ciphersuite matches protocol version. */
  4913. if (ssl->options.cipherSuite0 != TLS13_BYTE) {
  4914. WOLFSSL_MSG("Server sent non-TLS13 cipher suite in TLS 1.3 packet");
  4915. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  4916. return INVALID_PARAMETER;
  4917. }
  4918. suite[0] = ssl->options.cipherSuite0;
  4919. suite[1] = ssl->options.cipherSuite;
  4920. if (!FindSuiteSSL(ssl, suite)) {
  4921. WOLFSSL_MSG("Cipher suite not supported on client");
  4922. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  4923. return MATCH_SUITE_ERROR;
  4924. }
  4925. if (*extMsgType == server_hello) {
  4926. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  4927. PreSharedKey* psk = NULL;
  4928. TLSX* ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  4929. if (ext != NULL)
  4930. psk = (PreSharedKey*)ext->data;
  4931. while (psk != NULL && !psk->chosen)
  4932. psk = psk->next;
  4933. if (psk == NULL) {
  4934. ssl->options.resuming = 0;
  4935. ssl->arrays->psk_keySz = 0;
  4936. XMEMSET(ssl->arrays->psk_key, 0, MAX_PSK_KEY_LEN);
  4937. }
  4938. else {
  4939. if ((ret = SetupPskKey(ssl, psk, 0)) != 0)
  4940. return ret;
  4941. ssl->options.pskNegotiated = 1;
  4942. }
  4943. #endif
  4944. /* sanity check on PSK / KSE */
  4945. if (
  4946. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  4947. ssl->options.pskNegotiated == 0 &&
  4948. #endif
  4949. ssl->session->namedGroup == 0) {
  4950. return EXT_MISSING;
  4951. }
  4952. ssl->keys.encryptionOn = 1;
  4953. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  4954. }
  4955. else {
  4956. ssl->options.tls1_3 = 1;
  4957. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  4958. ret = RestartHandshakeHash(ssl);
  4959. }
  4960. break;
  4961. } /* case TLS_ASYNC_FINALIZE */
  4962. default:
  4963. ret = INPUT_CASE_ERROR;
  4964. } /* switch (ssl->options.asyncState) */
  4965. #ifdef WOLFSSL_ASYNC_CRYPT
  4966. if (ret == 0)
  4967. FreeAsyncCtx(ssl, 0);
  4968. #endif
  4969. WOLFSSL_LEAVE("DoTls13ServerHello", ret);
  4970. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  4971. return ret;
  4972. }
  4973. /* handle processing TLS 1.3 encrypted_extensions (8) */
  4974. /* Parse and handle an EncryptedExtensions message.
  4975. * Only a client will receive this message.
  4976. *
  4977. * ssl The SSL/TLS object.
  4978. * input The message buffer.
  4979. * inOutIdx On entry, the index into the message buffer of
  4980. * EncryptedExtensions.
  4981. * On exit, the index of byte after the EncryptedExtensions
  4982. * message.
  4983. * totalSz The length of the current handshake message.
  4984. * returns 0 on success and otherwise failure.
  4985. */
  4986. static int DoTls13EncryptedExtensions(WOLFSSL* ssl, const byte* input,
  4987. word32* inOutIdx, word32 totalSz)
  4988. {
  4989. int ret;
  4990. word32 begin = *inOutIdx;
  4991. word32 i = begin;
  4992. word16 totalExtSz;
  4993. WOLFSSL_START(WC_FUNC_ENCRYPTED_EXTENSIONS_DO);
  4994. WOLFSSL_ENTER("DoTls13EncryptedExtensions");
  4995. #ifdef WOLFSSL_CALLBACKS
  4996. if (ssl->hsInfoOn) AddPacketName(ssl, "EncryptedExtensions");
  4997. if (ssl->toInfoOn) AddLateName("EncryptedExtensions", &ssl->timeoutInfo);
  4998. #endif
  4999. /* Length field of extension data. */
  5000. if (totalSz < OPAQUE16_LEN)
  5001. return BUFFER_ERROR;
  5002. ato16(&input[i], &totalExtSz);
  5003. i += OPAQUE16_LEN;
  5004. /* Extension data. */
  5005. if (i - begin + totalExtSz > totalSz)
  5006. return BUFFER_ERROR;
  5007. if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, encrypted_extensions,
  5008. NULL))) {
  5009. return ret;
  5010. }
  5011. /* Move index to byte after message. */
  5012. *inOutIdx = i + totalExtSz;
  5013. /* Always encrypted. */
  5014. *inOutIdx += ssl->keys.padSz;
  5015. #ifdef WOLFSSL_EARLY_DATA
  5016. if (ssl->earlyData != no_early_data) {
  5017. TLSX* ext = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
  5018. if (ext == NULL || !ext->val)
  5019. ssl->earlyData = no_early_data;
  5020. }
  5021. #endif
  5022. #ifdef WOLFSSL_EARLY_DATA
  5023. if (ssl->earlyData == no_early_data) {
  5024. ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY);
  5025. if (ret != 0)
  5026. return ret;
  5027. }
  5028. #endif
  5029. ssl->options.serverState = SERVER_ENCRYPTED_EXTENSIONS_COMPLETE;
  5030. WOLFSSL_LEAVE("DoTls13EncryptedExtensions", ret);
  5031. WOLFSSL_END(WC_FUNC_ENCRYPTED_EXTENSIONS_DO);
  5032. return ret;
  5033. }
  5034. #ifndef NO_CERTS
  5035. /* handle processing TLS v1.3 certificate_request (13) */
  5036. /* Handle a TLS v1.3 CertificateRequest message.
  5037. * This message is always encrypted.
  5038. * Only a client will receive this message.
  5039. *
  5040. * ssl The SSL/TLS object.
  5041. * input The message buffer.
  5042. * inOutIdx On entry, the index into the message buffer of CertificateRequest.
  5043. * On exit, the index of byte after the CertificateRequest message.
  5044. * size The length of the current handshake message.
  5045. * returns 0 on success and otherwise failure.
  5046. */
  5047. static int DoTls13CertificateRequest(WOLFSSL* ssl, const byte* input,
  5048. word32* inOutIdx, word32 size)
  5049. {
  5050. word16 len;
  5051. word32 begin = *inOutIdx;
  5052. int ret = 0;
  5053. Suites peerSuites;
  5054. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  5055. CertReqCtx* certReqCtx;
  5056. #endif
  5057. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  5058. WOLFSSL_ENTER("DoTls13CertificateRequest");
  5059. XMEMSET(&peerSuites, 0, sizeof(Suites));
  5060. #ifdef WOLFSSL_CALLBACKS
  5061. if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateRequest");
  5062. if (ssl->toInfoOn) AddLateName("CertificateRequest", &ssl->timeoutInfo);
  5063. #endif
  5064. #ifdef OPENSSL_EXTRA
  5065. if ((ret = CertSetupCbWrapper(ssl)) != 0)
  5066. return ret;
  5067. #endif
  5068. if (OPAQUE8_LEN > size)
  5069. return BUFFER_ERROR;
  5070. /* Length of the request context. */
  5071. len = input[(*inOutIdx)++];
  5072. if ((*inOutIdx - begin) + len > size)
  5073. return BUFFER_ERROR;
  5074. if (ssl->options.connectState < FINISHED_DONE && len > 0)
  5075. return BUFFER_ERROR;
  5076. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  5077. /* CertReqCtx has one byte at end for context value.
  5078. * Increase size to handle other implementations sending more than one byte.
  5079. * That is, allocate extra space, over one byte, to hold the context value.
  5080. */
  5081. certReqCtx = (CertReqCtx*)XMALLOC(sizeof(CertReqCtx) + len - 1, ssl->heap,
  5082. DYNAMIC_TYPE_TMP_BUFFER);
  5083. if (certReqCtx == NULL)
  5084. return MEMORY_E;
  5085. certReqCtx->next = ssl->certReqCtx;
  5086. certReqCtx->len = len;
  5087. XMEMCPY(&certReqCtx->ctx, input + *inOutIdx, len);
  5088. ssl->certReqCtx = certReqCtx;
  5089. #endif
  5090. *inOutIdx += len;
  5091. /* TODO: Add support for more extensions:
  5092. * signed_certificate_timestamp, certificate_authorities, oid_filters.
  5093. */
  5094. /* Certificate extensions */
  5095. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  5096. return BUFFER_ERROR;
  5097. ato16(input + *inOutIdx, &len);
  5098. *inOutIdx += OPAQUE16_LEN;
  5099. if ((*inOutIdx - begin) + len > size)
  5100. return BUFFER_ERROR;
  5101. if (len == 0)
  5102. return INVALID_PARAMETER;
  5103. if ((ret = TLSX_Parse(ssl, input + *inOutIdx, len, certificate_request,
  5104. &peerSuites))) {
  5105. return ret;
  5106. }
  5107. *inOutIdx += len;
  5108. if ((ssl->buffers.certificate && ssl->buffers.certificate->buffer &&
  5109. ((ssl->buffers.key && ssl->buffers.key->buffer)
  5110. #ifdef HAVE_PK_CALLBACKS
  5111. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  5112. #endif
  5113. ))
  5114. #ifdef OPENSSL_EXTRA
  5115. || ssl->ctx->certSetupCb != NULL
  5116. #endif
  5117. ) {
  5118. if (PickHashSigAlgo(ssl, peerSuites.hashSigAlgo,
  5119. peerSuites.hashSigAlgoSz) != 0) {
  5120. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  5121. return INVALID_PARAMETER;
  5122. }
  5123. ssl->options.sendVerify = SEND_CERT;
  5124. }
  5125. else {
  5126. #ifndef WOLFSSL_NO_CLIENT_CERT_ERROR
  5127. ssl->options.sendVerify = SEND_BLANK_CERT;
  5128. #else
  5129. WOLFSSL_MSG("Certificate required but none set on client");
  5130. SendAlert(ssl, alert_fatal, illegal_parameter);
  5131. WOLFSSL_ERROR_VERBOSE(NO_CERT_ERROR);
  5132. return NO_CERT_ERROR;
  5133. #endif
  5134. }
  5135. /* This message is always encrypted so add encryption padding. */
  5136. *inOutIdx += ssl->keys.padSz;
  5137. WOLFSSL_LEAVE("DoTls13CertificateRequest", ret);
  5138. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  5139. return ret;
  5140. }
  5141. #endif /* !NO_CERTS */
  5142. #endif /* !NO_WOLFSSL_CLIENT */
  5143. #ifndef NO_WOLFSSL_SERVER
  5144. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  5145. /* Refine list of supported cipher suites to those common to server and client.
  5146. *
  5147. * ssl SSL/TLS object.
  5148. * peerSuites The peer's advertised list of supported cipher suites.
  5149. */
  5150. static void RefineSuites(WOLFSSL* ssl, Suites* peerSuites)
  5151. {
  5152. byte suites[WOLFSSL_MAX_SUITE_SZ];
  5153. word16 suiteSz = 0;
  5154. word16 i;
  5155. word16 j;
  5156. if (AllocateSuites(ssl) != 0)
  5157. return;
  5158. XMEMSET(suites, 0, sizeof(suites));
  5159. if (!ssl->options.useClientOrder) {
  5160. /* Server order refining. */
  5161. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  5162. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  5163. if ((ssl->suites->suites[i+0] == peerSuites->suites[j+0]) &&
  5164. (ssl->suites->suites[i+1] == peerSuites->suites[j+1])) {
  5165. suites[suiteSz++] = peerSuites->suites[j+0];
  5166. suites[suiteSz++] = peerSuites->suites[j+1];
  5167. break;
  5168. }
  5169. }
  5170. if (suiteSz == WOLFSSL_MAX_SUITE_SZ)
  5171. break;
  5172. }
  5173. }
  5174. else {
  5175. /* Client order refining. */
  5176. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  5177. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  5178. if ((ssl->suites->suites[i+0] == peerSuites->suites[j+0]) &&
  5179. (ssl->suites->suites[i+1] == peerSuites->suites[j+1])) {
  5180. suites[suiteSz++] = peerSuites->suites[j+0];
  5181. suites[suiteSz++] = peerSuites->suites[j+1];
  5182. break;
  5183. }
  5184. }
  5185. if (suiteSz == WOLFSSL_MAX_SUITE_SZ)
  5186. break;
  5187. }
  5188. }
  5189. ssl->suites->suiteSz = suiteSz;
  5190. XMEMCPY(ssl->suites->suites, &suites, sizeof(suites));
  5191. #ifdef WOLFSSL_DEBUG_TLS
  5192. {
  5193. int ii;
  5194. WOLFSSL_MSG("Refined Ciphers:");
  5195. for (ii = 0 ; ii < ssl->suites->suiteSz; ii += 2) {
  5196. WOLFSSL_MSG(GetCipherNameInternal(ssl->suites->suites[ii+0],
  5197. ssl->suites->suites[ii+1]));
  5198. }
  5199. }
  5200. #endif
  5201. }
  5202. #ifndef NO_PSK
  5203. int FindPskSuite(const WOLFSSL* ssl, PreSharedKey* psk, byte* psk_key,
  5204. word32* psk_keySz, const byte* suite, int* found, byte* foundSuite)
  5205. {
  5206. const char* cipherName = NULL;
  5207. byte cipherSuite0 = TLS13_BYTE;
  5208. byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
  5209. int ret = 0;
  5210. *found = 0;
  5211. (void)suite;
  5212. if (ssl->options.server_psk_tls13_cb != NULL) {
  5213. *psk_keySz = ssl->options.server_psk_tls13_cb((WOLFSSL*)ssl,
  5214. (char*)psk->identity, psk_key, MAX_PSK_KEY_LEN, &cipherName);
  5215. if (*psk_keySz != 0) {
  5216. int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
  5217. *found = (GetCipherSuiteFromName(cipherName, &cipherSuite0,
  5218. &cipherSuite, &cipherSuiteFlags) == 0);
  5219. (void)cipherSuiteFlags;
  5220. }
  5221. }
  5222. if (*found == 0 && (ssl->options.server_psk_cb != NULL)) {
  5223. *psk_keySz = ssl->options.server_psk_cb((WOLFSSL*)ssl,
  5224. (char*)psk->identity, psk_key,
  5225. MAX_PSK_KEY_LEN);
  5226. *found = (*psk_keySz != 0);
  5227. }
  5228. if (*found) {
  5229. if (*psk_keySz > MAX_PSK_KEY_LEN &&
  5230. *((int*)psk_keySz) != USE_HW_PSK) {
  5231. WOLFSSL_MSG("Key len too long in FindPsk()");
  5232. ret = PSK_KEY_ERROR;
  5233. WOLFSSL_ERROR_VERBOSE(ret);
  5234. *found = 0;
  5235. }
  5236. if (ret == 0) {
  5237. #if !defined(WOLFSSL_PSK_ONE_ID) && !defined(WOLFSSL_PRIORITIZE_PSK)
  5238. /* Check whether PSK ciphersuite is in SSL. */
  5239. *found = (suite[0] == cipherSuite0) && (suite[1] == cipherSuite);
  5240. #else
  5241. (void)suite;
  5242. /* Check whether PSK ciphersuite is in SSL. */
  5243. {
  5244. byte s[2] = {
  5245. cipherSuite0,
  5246. cipherSuite,
  5247. };
  5248. *found = FindSuiteSSL(ssl, s);
  5249. }
  5250. #endif
  5251. }
  5252. }
  5253. if (*found && foundSuite != NULL) {
  5254. foundSuite[0] = cipherSuite0;
  5255. foundSuite[1] = cipherSuite;
  5256. }
  5257. return ret;
  5258. }
  5259. /* Attempt to find the PSK (not session ticket) that matches.
  5260. *
  5261. * @param [in, out] ssl The SSL/TLS object.
  5262. * @param [in] psk A pre-shared key from the extension.
  5263. * @param [out] suite Cipher suite to use with PSK.
  5264. * @param [out] err Error code.
  5265. * PSK_KEY_ERROR when key is too big or ticket age is
  5266. * invalid,
  5267. * UNSUPPORTED_SUITE on invalid suite.
  5268. * Other error when attempting to derive early secret.
  5269. * @return 1 when a match found - but check error code.
  5270. * @return 0 when no match found.
  5271. */
  5272. static int FindPsk(WOLFSSL* ssl, PreSharedKey* psk, const byte* suite, int* err)
  5273. {
  5274. int ret = 0;
  5275. int found = 0;
  5276. byte foundSuite[SUITE_LEN];
  5277. WOLFSSL_ENTER("FindPsk");
  5278. ret = FindPskSuite(ssl, psk, ssl->arrays->psk_key, &ssl->arrays->psk_keySz,
  5279. suite, &found, foundSuite);
  5280. if (ret == 0 && found) {
  5281. /* Default to ciphersuite if cb doesn't specify. */
  5282. ssl->options.resuming = 0;
  5283. /* Don't send certificate request when using PSK. */
  5284. ssl->options.verifyPeer = 0;
  5285. /* PSK age is always zero. */
  5286. if (psk->ticketAge != 0) {
  5287. ret = PSK_KEY_ERROR;
  5288. WOLFSSL_ERROR_VERBOSE(ret);
  5289. }
  5290. if (ret == 0) {
  5291. /* Set PSK ciphersuite into SSL. */
  5292. ssl->options.cipherSuite0 = foundSuite[0];
  5293. ssl->options.cipherSuite = foundSuite[1];
  5294. ret = SetCipherSpecs(ssl);
  5295. }
  5296. if (ret == 0) {
  5297. /* Derive the early secret using the PSK. */
  5298. ret = DeriveEarlySecret(ssl);
  5299. }
  5300. if (ret == 0) {
  5301. /* PSK negotiation has succeeded */
  5302. ssl->options.isPSK = 1;
  5303. /* SERVER: using PSK for peer authentication. */
  5304. ssl->options.peerAuthGood = 1;
  5305. }
  5306. }
  5307. *err = ret;
  5308. WOLFSSL_LEAVE("FindPsk", found);
  5309. WOLFSSL_LEAVE("FindPsk", ret);
  5310. return found;
  5311. }
  5312. #endif /* !NO_PSK */
  5313. /* Handle any Pre-Shared Key (PSK) extension.
  5314. * Find a PSK that supports the cipher suite passed in.
  5315. *
  5316. * ssl SSL/TLS object.
  5317. * suite Cipher suite to find PSK for.
  5318. * usingPSK 1=Indicates handshake is using Pre-Shared Keys (2=Ephemeral)
  5319. * first Set to 1 if first in extension
  5320. * returns 0 on success and otherwise failure.
  5321. */
  5322. static int DoPreSharedKeys(WOLFSSL* ssl, const byte* input, word32 inputSz,
  5323. const byte* suite, int* usingPSK, int* first)
  5324. {
  5325. int ret = 0;
  5326. TLSX* ext;
  5327. PreSharedKey* current;
  5328. byte binderKey[WC_MAX_DIGEST_SIZE];
  5329. byte binder[WC_MAX_DIGEST_SIZE];
  5330. word32 binderLen;
  5331. #ifdef NO_PSK
  5332. (void) suite; /* to avoid unused var warning when not used */
  5333. #endif
  5334. WOLFSSL_ENTER("DoPreSharedKeys");
  5335. (void)suite;
  5336. ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  5337. if (ext == NULL) {
  5338. WOLFSSL_MSG("No pre shared extension keys found");
  5339. return BAD_FUNC_ARG;
  5340. }
  5341. /* Look through all client's pre-shared keys for a match. */
  5342. for (current = (PreSharedKey*)ext->data; current != NULL;
  5343. current = current->next) {
  5344. #ifndef NO_PSK
  5345. if (current->identityLen > MAX_PSK_ID_LEN) {
  5346. return BUFFER_ERROR;
  5347. }
  5348. XMEMCPY(ssl->arrays->client_identity, current->identity,
  5349. current->identityLen);
  5350. ssl->arrays->client_identity[current->identityLen] = '\0';
  5351. #endif
  5352. #ifdef HAVE_SESSION_TICKET
  5353. /* Decode the identity. */
  5354. switch (current->decryptRet) {
  5355. case PSK_DECRYPT_NONE:
  5356. ret = DoClientTicket_ex(ssl, current, 1);
  5357. /* psk->sess may be set. Need to clean up later. */
  5358. break;
  5359. case PSK_DECRYPT_OK:
  5360. ret = WOLFSSL_TICKET_RET_OK;
  5361. break;
  5362. case PSK_DECRYPT_CREATE:
  5363. ret = WOLFSSL_TICKET_RET_CREATE;
  5364. break;
  5365. case PSK_DECRYPT_FAIL:
  5366. ret = WOLFSSL_TICKET_RET_REJECT;
  5367. break;
  5368. }
  5369. #ifdef WOLFSSL_ASYNC_CRYPT
  5370. if (ret == WC_PENDING_E)
  5371. return ret;
  5372. #endif
  5373. if (ret != WOLFSSL_TICKET_RET_OK && current->sess_free_cb != NULL) {
  5374. current->sess_free_cb(ssl, current->sess,
  5375. &current->sess_free_cb_ctx);
  5376. current->sess = NULL;
  5377. XMEMSET(&current->sess_free_cb_ctx, 0,
  5378. sizeof(psk_sess_free_cb_ctx));
  5379. }
  5380. if (ret == WOLFSSL_TICKET_RET_OK) {
  5381. ret = DoClientTicketCheck(ssl, current, ssl->timeout, suite);
  5382. if (ret == 0)
  5383. DoClientTicketFinalize(ssl, current->it, current->sess);
  5384. if (current->sess_free_cb != NULL) {
  5385. current->sess_free_cb(ssl, current->sess,
  5386. &current->sess_free_cb_ctx);
  5387. current->sess = NULL;
  5388. XMEMSET(&current->sess_free_cb_ctx, 0,
  5389. sizeof(psk_sess_free_cb_ctx));
  5390. }
  5391. if (ret != 0)
  5392. continue;
  5393. /* SERVER: using secret in session ticket for peer auth. */
  5394. ssl->options.peerAuthGood = 1;
  5395. #ifdef WOLFSSL_EARLY_DATA
  5396. ssl->options.maxEarlyDataSz = ssl->session->maxEarlyDataSz;
  5397. #endif
  5398. /* Use the same cipher suite as before and set up for use. */
  5399. ssl->options.cipherSuite0 = ssl->session->cipherSuite0;
  5400. ssl->options.cipherSuite = ssl->session->cipherSuite;
  5401. ret = SetCipherSpecs(ssl);
  5402. if (ret != 0)
  5403. return ret;
  5404. /* Resumption PSK is resumption master secret. */
  5405. ssl->arrays->psk_keySz = ssl->specs.hash_size;
  5406. if ((ret = DeriveResumptionPSK(ssl, ssl->session->ticketNonce.data,
  5407. ssl->session->ticketNonce.len, ssl->arrays->psk_key)) != 0) {
  5408. return ret;
  5409. }
  5410. /* Derive the early secret using the PSK. */
  5411. ret = DeriveEarlySecret(ssl);
  5412. if (ret != 0)
  5413. return ret;
  5414. /* Hash data up to binders for deriving binders in PSK extension. */
  5415. ret = HashInput(ssl, input, inputSz);
  5416. if (ret < 0)
  5417. return ret;
  5418. /* Derive the binder key to use with HMAC. */
  5419. ret = DeriveBinderKeyResume(ssl, binderKey);
  5420. if (ret != 0)
  5421. return ret;
  5422. }
  5423. else
  5424. #endif /* HAVE_SESSION_TICKET */
  5425. #ifndef NO_PSK
  5426. if (FindPsk(ssl, current, suite, &ret)) {
  5427. if (ret != 0)
  5428. return ret;
  5429. ret = HashInput(ssl, input, inputSz);
  5430. if (ret < 0)
  5431. return ret;
  5432. /* Derive the binder key to use with HMAC. */
  5433. ret = DeriveBinderKey(ssl, binderKey);
  5434. if (ret != 0)
  5435. return ret;
  5436. }
  5437. else
  5438. #endif
  5439. {
  5440. continue;
  5441. }
  5442. ssl->options.sendVerify = 0;
  5443. /* Derive the Finished message secret. */
  5444. ret = DeriveFinishedSecret(ssl, binderKey,
  5445. ssl->keys.client_write_MAC_secret,
  5446. 0 /* neither end */);
  5447. if (ret != 0)
  5448. return ret;
  5449. /* Derive the binder and compare with the one in the extension. */
  5450. ret = BuildTls13HandshakeHmac(ssl,
  5451. ssl->keys.client_write_MAC_secret, binder, &binderLen);
  5452. if (ret != 0)
  5453. return ret;
  5454. if (binderLen != current->binderLen ||
  5455. XMEMCMP(binder, current->binder, binderLen) != 0) {
  5456. WOLFSSL_ERROR_VERBOSE(BAD_BINDER);
  5457. return BAD_BINDER;
  5458. }
  5459. /* This PSK works, no need to try any more. */
  5460. current->chosen = 1;
  5461. ext->resp = 1;
  5462. break;
  5463. }
  5464. if (current == NULL) {
  5465. #ifdef WOLFSSL_PSK_ID_PROTECTION
  5466. #ifndef NO_CERTS
  5467. if (ssl->buffers.certChainCnt != 0)
  5468. return 0;
  5469. #endif
  5470. WOLFSSL_ERROR_VERBOSE(BAD_BINDER);
  5471. return BAD_BINDER;
  5472. #else
  5473. return 0;
  5474. #endif
  5475. }
  5476. *first = (current == ext->data);
  5477. *usingPSK = 1;
  5478. WOLFSSL_LEAVE("DoPreSharedKeys", ret);
  5479. return ret;
  5480. }
  5481. /* Handle any Pre-Shared Key (PSK) extension.
  5482. * Must do this in ClientHello as it requires a hash of the truncated message.
  5483. * Don't know size of binders until Pre-Shared Key extension has been parsed.
  5484. *
  5485. * ssl SSL/TLS object.
  5486. * input ClientHello message.
  5487. * helloSz Size of the ClientHello message (including binders if present).
  5488. * clSuites Client's cipher suite list.
  5489. * usingPSK Indicates handshake is using Pre-Shared Keys.
  5490. */
  5491. static int CheckPreSharedKeys(WOLFSSL* ssl, const byte* input, word32 helloSz,
  5492. Suites* clSuites, int* usingPSK)
  5493. {
  5494. int ret;
  5495. TLSX* ext;
  5496. word16 bindersLen;
  5497. int first = 0;
  5498. #ifndef WOLFSSL_PSK_ONE_ID
  5499. int i;
  5500. const Suites* suites;
  5501. #else
  5502. byte suite[2];
  5503. #endif
  5504. WOLFSSL_ENTER("CheckPreSharedKeys");
  5505. ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
  5506. if (ext == NULL) {
  5507. #ifdef WOLFSSL_EARLY_DATA
  5508. ssl->earlyData = no_early_data;
  5509. #endif
  5510. if (usingPSK)
  5511. *usingPSK = 0;
  5512. /* Hash data up to binders for deriving binders in PSK extension. */
  5513. ret = HashInput(ssl, input, helloSz);
  5514. return ret;
  5515. }
  5516. /* Extensions pushed on stack/list and PSK must be last. */
  5517. if (ssl->extensions != ext) {
  5518. WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
  5519. return PSK_KEY_ERROR;
  5520. }
  5521. /* Assume we are going to resume with a pre-shared key. */
  5522. ssl->options.resuming = 1;
  5523. /* Find the pre-shared key extension and calculate hash of truncated
  5524. * ClientHello for binders.
  5525. */
  5526. ret = TLSX_PreSharedKey_GetSizeBinders((PreSharedKey*)ext->data,
  5527. client_hello, &bindersLen);
  5528. if (ret < 0)
  5529. return ret;
  5530. /* Refine list for PSK processing. */
  5531. RefineSuites(ssl, clSuites);
  5532. #ifndef WOLFSSL_PSK_ONE_ID
  5533. if (usingPSK == NULL)
  5534. return BAD_FUNC_ARG;
  5535. /* set after refineSuites, to avoid taking a stale ptr to ctx->Suites */
  5536. suites = WOLFSSL_SUITES(ssl);
  5537. /* Server list has only common suites from refining in server or client
  5538. * order. */
  5539. for (i = 0; !(*usingPSK) && i < suites->suiteSz; i += 2) {
  5540. ret = DoPreSharedKeys(ssl, input, helloSz - bindersLen,
  5541. suites->suites + i, usingPSK, &first);
  5542. if (ret != 0) {
  5543. #ifdef HAVE_SESSION_TICKET
  5544. #ifdef WOLFSSL_ASYNC_CRYPT
  5545. if (ret != WC_PENDING_E)
  5546. #endif
  5547. CleanupClientTickets((PreSharedKey*)ext->data);
  5548. #endif
  5549. WOLFSSL_MSG_EX("DoPreSharedKeys: %d", ret);
  5550. return ret;
  5551. }
  5552. }
  5553. #ifdef HAVE_SESSION_TICKET
  5554. CleanupClientTickets((PreSharedKey*)ext->data);
  5555. #endif
  5556. #else
  5557. ret = DoPreSharedKeys(ssl, input, helloSz - bindersLen, suite, usingPSK,
  5558. &first);
  5559. if (ret != 0) {
  5560. WOLFSSL_MSG_EX("DoPreSharedKeys: %d", ret);
  5561. return ret;
  5562. }
  5563. #endif
  5564. if (*usingPSK) {
  5565. /* While verifying the selected PSK, we updated the
  5566. * handshake hash up to the binder bytes in the PSK extensions.
  5567. * Continuing, we need the rest of the ClientHello hashed as well.
  5568. */
  5569. ret = HashRaw(ssl, input + helloSz - bindersLen, bindersLen);
  5570. }
  5571. else {
  5572. /* No suitable PSK found, Hash the complete ClientHello,
  5573. * as caller expect it after we return */
  5574. ret = HashInput(ssl, input, helloSz);
  5575. }
  5576. if (ret != 0)
  5577. return ret;
  5578. if (*usingPSK != 0) {
  5579. word16 modes;
  5580. #ifdef WOLFSSL_EARLY_DATA
  5581. TLSX* extEarlyData;
  5582. extEarlyData = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
  5583. if (extEarlyData != NULL) {
  5584. /* Check if accepting early data and first PSK. */
  5585. if (ssl->earlyData != no_early_data && first) {
  5586. extEarlyData->resp = 1;
  5587. /* Derive early data decryption key. */
  5588. ret = DeriveTls13Keys(ssl, early_data_key, DECRYPT_SIDE_ONLY,
  5589. 1);
  5590. if (ret != 0)
  5591. return ret;
  5592. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  5593. return ret;
  5594. ssl->keys.encryptionOn = 1;
  5595. #ifdef WOLFSSL_DTLS13
  5596. if (ssl->options.dtls) {
  5597. ret = Dtls13NewEpoch(ssl,
  5598. w64From32(0x0, DTLS13_EPOCH_EARLYDATA),
  5599. DECRYPT_SIDE_ONLY);
  5600. if (ret != 0)
  5601. return ret;
  5602. }
  5603. #endif /* WOLFSSL_DTLS13 */
  5604. ssl->earlyData = process_early_data;
  5605. }
  5606. else
  5607. extEarlyData->resp = 0;
  5608. }
  5609. #endif
  5610. /* Get the PSK key exchange modes the client wants to negotiate. */
  5611. ext = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
  5612. if (ext == NULL) {
  5613. WOLFSSL_ERROR_VERBOSE(MISSING_HANDSHAKE_DATA);
  5614. return MISSING_HANDSHAKE_DATA;
  5615. }
  5616. modes = ext->val;
  5617. #ifdef HAVE_SUPPORTED_CURVES
  5618. ext = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  5619. /* Use (EC)DHE for forward-security if possible. */
  5620. if ((modes & (1 << PSK_DHE_KE)) != 0 && !ssl->options.noPskDheKe &&
  5621. ext != NULL) {
  5622. /* Only use named group used in last session. */
  5623. ssl->namedGroup = ssl->session->namedGroup;
  5624. *usingPSK = 2; /* generate new ephemeral key */
  5625. }
  5626. else if (ssl->options.onlyPskDheKe) {
  5627. return PSK_KEY_ERROR;
  5628. }
  5629. else
  5630. #endif
  5631. {
  5632. if ((modes & (1 << PSK_KE)) == 0) {
  5633. WOLFSSL_MSG("psk_ke mode does not allow key share");
  5634. WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
  5635. return PSK_KEY_ERROR;
  5636. }
  5637. ssl->options.noPskDheKe = 1;
  5638. ssl->arrays->preMasterSz = 0;
  5639. *usingPSK = 1;
  5640. }
  5641. }
  5642. #ifdef WOLFSSL_PSK_ID_PROTECTION
  5643. else {
  5644. #ifndef NO_CERTS
  5645. if (ssl->buffers.certChainCnt != 0)
  5646. return 0;
  5647. #endif
  5648. WOLFSSL_ERROR_VERBOSE(BAD_BINDER);
  5649. return BAD_BINDER;
  5650. }
  5651. #endif
  5652. WOLFSSL_LEAVE("CheckPreSharedKeys", ret);
  5653. return 0;
  5654. }
  5655. #endif /* HAVE_SESSION_TICKET || !NO_PSK */
  5656. #if defined(WOLFSSL_SEND_HRR_COOKIE)
  5657. /* Check that the Cookie data's integrity.
  5658. *
  5659. * ssl SSL/TLS object.
  5660. * cookie The cookie data - hash and MAC.
  5661. * cookieSz The length of the cookie data in bytes.
  5662. * returns Length of the hash on success, otherwise failure.
  5663. */
  5664. int TlsCheckCookie(const WOLFSSL* ssl, const byte* cookie, word16 cookieSz)
  5665. {
  5666. int ret;
  5667. byte mac[WC_MAX_DIGEST_SIZE] = {0};
  5668. Hmac cookieHmac;
  5669. byte cookieType = 0;
  5670. byte macSz = 0;
  5671. if (ssl->buffers.tls13CookieSecret.buffer == NULL ||
  5672. ssl->buffers.tls13CookieSecret.length == 0) {
  5673. WOLFSSL_MSG("Missing DTLS 1.3 cookie secret");
  5674. return COOKIE_ERROR;
  5675. }
  5676. #if !defined(NO_SHA) && defined(NO_SHA256)
  5677. cookieType = SHA;
  5678. macSz = WC_SHA_DIGEST_SIZE;
  5679. #endif /* NO_SHA */
  5680. #ifndef NO_SHA256
  5681. cookieType = WC_SHA256;
  5682. macSz = WC_SHA256_DIGEST_SIZE;
  5683. #endif /* NO_SHA256 */
  5684. if (cookieSz < ssl->specs.hash_size + macSz)
  5685. return HRR_COOKIE_ERROR;
  5686. cookieSz -= macSz;
  5687. ret = wc_HmacInit(&cookieHmac, ssl->heap, INVALID_DEVID);
  5688. if (ret == 0) {
  5689. ret = wc_HmacSetKey(&cookieHmac, cookieType,
  5690. ssl->buffers.tls13CookieSecret.buffer,
  5691. ssl->buffers.tls13CookieSecret.length);
  5692. }
  5693. if (ret == 0)
  5694. ret = wc_HmacUpdate(&cookieHmac, cookie, cookieSz);
  5695. #ifdef WOLFSSL_DTLS13
  5696. /* Tie cookie to peer address */
  5697. if (ret == 0) {
  5698. if (ssl->options.dtls && ssl->buffers.dtlsCtx.peer.sz > 0) {
  5699. ret = wc_HmacUpdate(&cookieHmac,
  5700. (byte*)ssl->buffers.dtlsCtx.peer.sa,
  5701. ssl->buffers.dtlsCtx.peer.sz);
  5702. }
  5703. }
  5704. #endif
  5705. if (ret == 0)
  5706. ret = wc_HmacFinal(&cookieHmac, mac);
  5707. wc_HmacFree(&cookieHmac);
  5708. if (ret != 0)
  5709. return ret;
  5710. if (ConstantCompare(cookie + cookieSz, mac, macSz) != 0) {
  5711. WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
  5712. return HRR_COOKIE_ERROR;
  5713. }
  5714. return cookieSz;
  5715. }
  5716. /* Length of the KeyShare Extension */
  5717. #define HRR_KEY_SHARE_SZ (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
  5718. /* Length of the Supported Versions Extension */
  5719. #define HRR_VERSIONS_SZ (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
  5720. /* Length of the Cookie Extension excluding cookie data */
  5721. #define HRR_COOKIE_HDR_SZ (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
  5722. /* PV | Random | Session Id | CipherSuite | Compression | Ext Len */
  5723. #define HRR_BODY_SZ (VERSION_SZ + RAN_LEN + ENUM_LEN + ID_LEN + \
  5724. SUITE_LEN + COMP_LEN + OPAQUE16_LEN)
  5725. /* HH | PV | CipherSuite | Ext Len | Key Share | Supported Version | Cookie */
  5726. #define MAX_HRR_SZ (HRR_MAX_HS_HEADER_SZ + \
  5727. HRR_BODY_SZ + \
  5728. HRR_KEY_SHARE_SZ + \
  5729. HRR_VERSIONS_SZ + \
  5730. HRR_COOKIE_HDR_SZ)
  5731. /* Restart the handshake hash from the cookie value.
  5732. *
  5733. * ssl SSL/TLS object.
  5734. * cookie Cookie data from client.
  5735. * returns 0 on success, otherwise failure.
  5736. */
  5737. static int RestartHandshakeHashWithCookie(WOLFSSL* ssl, Cookie* cookie)
  5738. {
  5739. byte header[HANDSHAKE_HEADER_SZ] = {0};
  5740. byte hrr[MAX_HRR_SZ] = {0};
  5741. int hrrIdx;
  5742. word32 idx;
  5743. byte hashSz;
  5744. byte* cookieData;
  5745. word16 cookieDataSz;
  5746. word16 length;
  5747. int keyShareExt = 0;
  5748. int ret;
  5749. ret = TlsCheckCookie(ssl, cookie->data, (byte)cookie->len);
  5750. if (ret < 0)
  5751. return ret;
  5752. cookieDataSz = (word16)ret;
  5753. hashSz = cookie->data[0];
  5754. cookieData = cookie->data;
  5755. idx = OPAQUE8_LEN;
  5756. /* Restart handshake hash with synthetic message hash. */
  5757. AddTls13HandShakeHeader(header, hashSz, 0, 0, message_hash, ssl);
  5758. if ((ret = InitHandshakeHashes(ssl)) != 0)
  5759. return ret;
  5760. if ((ret = HashRaw(ssl, header, sizeof(header))) != 0)
  5761. return ret;
  5762. #ifdef WOLFSSL_DEBUG_TLS
  5763. WOLFSSL_MSG("Restart Hash from Cookie");
  5764. WOLFSSL_BUFFER(cookieData + idx, hashSz);
  5765. #endif
  5766. if ((ret = HashRaw(ssl, cookieData + idx, hashSz)) != 0)
  5767. return ret;
  5768. /* Reconstruct the HelloRetryMessage for handshake hash. */
  5769. length = HRR_BODY_SZ - ID_LEN + ssl->session->sessionIDSz +
  5770. HRR_COOKIE_HDR_SZ + cookie->len;
  5771. length += HRR_VERSIONS_SZ;
  5772. /* HashSz (1 byte) + Hash (HashSz bytes) + CipherSuite (2 bytes) */
  5773. if (cookieDataSz > OPAQUE8_LEN + hashSz + OPAQUE16_LEN) {
  5774. keyShareExt = 1;
  5775. length += HRR_KEY_SHARE_SZ;
  5776. }
  5777. AddTls13HandShakeHeader(hrr, length, 0, 0, server_hello, ssl);
  5778. idx += hashSz;
  5779. hrrIdx = HANDSHAKE_HEADER_SZ;
  5780. #ifdef WOLFSSL_DTLS13
  5781. if (ssl->options.dtls)
  5782. hrrIdx += DTLS_HANDSHAKE_EXTRA;
  5783. #endif /* WOLFSSL_DTLS13 */
  5784. /* The negotiated protocol version. */
  5785. hrr[hrrIdx++] = ssl->version.major;
  5786. hrr[hrrIdx++] = ssl->options.dtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR;
  5787. /* HelloRetryRequest message has fixed value for random. */
  5788. XMEMCPY(hrr + hrrIdx, helloRetryRequestRandom, RAN_LEN);
  5789. hrrIdx += RAN_LEN;
  5790. hrr[hrrIdx++] = ssl->session->sessionIDSz;
  5791. if (ssl->session->sessionIDSz > 0) {
  5792. XMEMCPY(hrr + hrrIdx, ssl->session->sessionID, ssl->session->sessionIDSz);
  5793. hrrIdx += ssl->session->sessionIDSz;
  5794. }
  5795. /* Cipher Suite */
  5796. hrr[hrrIdx++] = cookieData[idx++];
  5797. hrr[hrrIdx++] = cookieData[idx++];
  5798. /* Compression not supported in TLS v1.3. */
  5799. hrr[hrrIdx++] = 0;
  5800. /* Extensions' length */
  5801. length -= HRR_BODY_SZ - ID_LEN + ssl->session->sessionIDSz;
  5802. c16toa(length, hrr + hrrIdx);
  5803. hrrIdx += 2;
  5804. /* Optional KeyShare Extension */
  5805. if (keyShareExt) {
  5806. c16toa(TLSX_KEY_SHARE, hrr + hrrIdx);
  5807. hrrIdx += 2;
  5808. c16toa(OPAQUE16_LEN, hrr + hrrIdx);
  5809. hrrIdx += 2;
  5810. hrr[hrrIdx++] = cookieData[idx++];
  5811. hrr[hrrIdx++] = cookieData[idx++];
  5812. }
  5813. c16toa(TLSX_SUPPORTED_VERSIONS, hrr + hrrIdx);
  5814. hrrIdx += 2;
  5815. c16toa(OPAQUE16_LEN, hrr + hrrIdx);
  5816. hrrIdx += 2;
  5817. #ifdef WOLFSSL_TLS13_DRAFT
  5818. hrr[hrrIdx++] = TLS_DRAFT_MAJOR;
  5819. hrr[hrrIdx++] = TLS_DRAFT_MINOR;
  5820. #else
  5821. hrr[hrrIdx++] = ssl->version.major;
  5822. hrr[hrrIdx++] = ssl->version.minor;
  5823. #endif
  5824. /* Mandatory Cookie Extension */
  5825. c16toa(TLSX_COOKIE, hrr + hrrIdx);
  5826. hrrIdx += 2;
  5827. c16toa(cookie->len + OPAQUE16_LEN, hrr + hrrIdx);
  5828. hrrIdx += 2;
  5829. c16toa(cookie->len, hrr + hrrIdx);
  5830. hrrIdx += 2;
  5831. #ifdef WOLFSSL_DEBUG_TLS
  5832. WOLFSSL_MSG("Reconstructed HelloRetryRequest");
  5833. WOLFSSL_BUFFER(hrr, hrrIdx);
  5834. WOLFSSL_MSG("Cookie");
  5835. WOLFSSL_BUFFER(cookieData, cookie->len);
  5836. #endif
  5837. #ifdef WOLFSSL_DTLS13
  5838. if (ssl->options.dtls) {
  5839. ret = Dtls13HashHandshake(ssl, hrr, (word16)hrrIdx);
  5840. }
  5841. else
  5842. #endif /* WOLFSSL_DTLS13 */
  5843. {
  5844. ret = HashRaw(ssl, hrr, hrrIdx);
  5845. }
  5846. if (ret != 0)
  5847. return ret;
  5848. return HashRaw(ssl, cookieData, cookie->len);
  5849. }
  5850. #endif
  5851. /* Do SupportedVersion extension for TLS v1.3+ otherwise it is not.
  5852. *
  5853. * ssl The SSL/TLS object.
  5854. * input The message buffer.
  5855. * i The index into the message buffer of ClientHello.
  5856. * helloSz The length of the current handshake message.
  5857. * returns 0 on success and otherwise failure.
  5858. */
  5859. static int DoTls13SupportedVersions(WOLFSSL* ssl, const byte* input, word32 i,
  5860. word32 helloSz, int* wantDowngrade)
  5861. {
  5862. int ret;
  5863. byte b;
  5864. word16 suiteSz;
  5865. word16 totalExtSz;
  5866. int foundVersion = 0;
  5867. /* Client random */
  5868. i += RAN_LEN;
  5869. /* Session id - not used in TLS v1.3 */
  5870. b = input[i++];
  5871. if (i + b > helloSz) {
  5872. return BUFFER_ERROR;
  5873. }
  5874. i += b;
  5875. #ifdef WOLFSSL_DTLS13
  5876. if (ssl->options.dtls) {
  5877. /* legacy_cookie - not used in DTLS v1.3 */
  5878. b = input[i++];
  5879. if (i + b > helloSz) {
  5880. return BUFFER_ERROR;
  5881. }
  5882. i += b;
  5883. }
  5884. #endif /* WOLFSSL_DTLS13 */
  5885. /* Cipher suites */
  5886. if (i + OPAQUE16_LEN > helloSz)
  5887. return BUFFER_ERROR;
  5888. ato16(input + i, &suiteSz);
  5889. i += OPAQUE16_LEN;
  5890. if (i + suiteSz + 1 > helloSz)
  5891. return BUFFER_ERROR;
  5892. i += suiteSz;
  5893. /* Compression */
  5894. b = input[i++];
  5895. if (i + b > helloSz)
  5896. return BUFFER_ERROR;
  5897. i += b;
  5898. /* TLS 1.3 must have extensions */
  5899. if (i < helloSz) {
  5900. if (i + OPAQUE16_LEN > helloSz)
  5901. return BUFFER_ERROR;
  5902. ato16(&input[i], &totalExtSz);
  5903. i += OPAQUE16_LEN;
  5904. if (totalExtSz != helloSz - i)
  5905. return BUFFER_ERROR;
  5906. /* Need to negotiate version first. */
  5907. if ((ret = TLSX_ParseVersion(ssl, input + i, totalExtSz, client_hello,
  5908. &foundVersion))) {
  5909. return ret;
  5910. }
  5911. }
  5912. *wantDowngrade = !foundVersion || !IsAtLeastTLSv1_3(ssl->version);
  5913. return 0;
  5914. }
  5915. /* Handle a ClientHello handshake message.
  5916. * If the protocol version in the message is not TLS v1.3 or higher, use
  5917. * DoClientHello()
  5918. * Only a server will receive this message.
  5919. *
  5920. * ssl The SSL/TLS object.
  5921. * input The message buffer.
  5922. * inOutIdx On entry, the index into the message buffer of ClientHello.
  5923. * On exit, the index of byte after the ClientHello message and
  5924. * padding.
  5925. * helloSz The length of the current handshake message.
  5926. * returns 0 on success and otherwise failure.
  5927. */
  5928. typedef struct Dch13Args {
  5929. ProtocolVersion pv;
  5930. Suites* clSuites;
  5931. word32 idx;
  5932. word32 begin;
  5933. int usingPSK;
  5934. } Dch13Args;
  5935. static void FreeDch13Args(WOLFSSL* ssl, void* pArgs)
  5936. {
  5937. Dch13Args* args = (Dch13Args*)pArgs;
  5938. (void)ssl;
  5939. if (args && args->clSuites) {
  5940. XFREE(args->clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
  5941. args->clSuites = NULL;
  5942. }
  5943. #ifdef OPENSSL_EXTRA
  5944. ssl->clSuites = NULL;
  5945. #endif
  5946. }
  5947. int DoTls13ClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  5948. word32 helloSz)
  5949. {
  5950. int ret;
  5951. #ifdef WOLFSSL_ASYNC_CRYPT
  5952. Dch13Args* args = NULL;
  5953. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  5954. #else
  5955. Dch13Args args[1];
  5956. #endif
  5957. #if defined(HAVE_ECH)
  5958. TLSX* echX = NULL;
  5959. #endif
  5960. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  5961. WOLFSSL_ENTER("DoTls13ClientHello");
  5962. #ifdef WOLFSSL_ASYNC_CRYPT
  5963. if (ssl->async == NULL) {
  5964. ssl->async = (struct WOLFSSL_ASYNC*)
  5965. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  5966. DYNAMIC_TYPE_ASYNC);
  5967. if (ssl->async == NULL)
  5968. ERROR_OUT(MEMORY_E, exit_dch);
  5969. }
  5970. args = (Dch13Args*)ssl->async->args;
  5971. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  5972. if (ret != WC_NO_PENDING_E) {
  5973. /* Check for error */
  5974. if (ret < 0) {
  5975. goto exit_dch;
  5976. }
  5977. }
  5978. else
  5979. #endif
  5980. {
  5981. /* Reset state */
  5982. ret = VERSION_ERROR;
  5983. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  5984. XMEMSET(args, 0, sizeof(Dch13Args));
  5985. #ifdef WOLFSSL_ASYNC_CRYPT
  5986. ssl->async->freeArgs = FreeDch13Args;
  5987. #endif
  5988. }
  5989. switch (ssl->options.asyncState) {
  5990. case TLS_ASYNC_BEGIN:
  5991. {
  5992. byte b;
  5993. byte sessIdSz;
  5994. int wantDowngrade = 0;
  5995. word16 totalExtSz = 0;
  5996. #ifdef WOLFSSL_CALLBACKS
  5997. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  5998. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  5999. #endif
  6000. /* do not change state in the SSL object before the next region of code
  6001. * to be able to statelessly compute a DTLS cookie */
  6002. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
  6003. /* Update the ssl->options.dtlsStateful setting `if` statement in
  6004. * wolfSSL_accept_TLSv13 when changing this one. */
  6005. if (IsDtlsNotSctpMode(ssl) && ssl->options.sendCookie &&
  6006. !ssl->options.dtlsStateful) {
  6007. DtlsSetSeqNumForReply(ssl);
  6008. ret = DoClientHelloStateless(ssl, input + *inOutIdx, helloSz, 0, NULL);
  6009. if (ret != 0 || !ssl->options.dtlsStateful) {
  6010. *inOutIdx += helloSz;
  6011. goto exit_dch;
  6012. }
  6013. if (ssl->chGoodCb != NULL) {
  6014. int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx);
  6015. if (cbret < 0) {
  6016. ssl->error = cbret;
  6017. WOLFSSL_MSG("ClientHello Good Cb don't continue error");
  6018. return WOLFSSL_FATAL_ERROR;
  6019. }
  6020. }
  6021. }
  6022. ssl->options.dtlsStateful = 1;
  6023. #endif /* WOLFSSL_DTLS */
  6024. args->idx = *inOutIdx;
  6025. args->begin = args->idx;
  6026. /* protocol version, random and session id length check */
  6027. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz) {
  6028. ERROR_OUT(BUFFER_ERROR, exit_dch);
  6029. }
  6030. /* Protocol version */
  6031. XMEMCPY(&args->pv, input + args->idx, OPAQUE16_LEN);
  6032. ssl->chVersion = args->pv; /* store */
  6033. args->idx += OPAQUE16_LEN;
  6034. /* this check pass for DTLS Major (0xff) */
  6035. if (args->pv.major < SSLv3_MAJOR) {
  6036. WOLFSSL_MSG("Legacy version field contains unsupported value");
  6037. ERROR_OUT(VERSION_ERROR, exit_dch);
  6038. }
  6039. #ifdef WOLFSSL_DTLS13
  6040. if (ssl->options.dtls &&
  6041. args->pv.major == DTLS_MAJOR && args->pv.minor > DTLSv1_2_MINOR) {
  6042. wantDowngrade = 1;
  6043. ssl->version.minor = args->pv.minor;
  6044. }
  6045. #endif /* WOLFSSL_DTLS13 */
  6046. if (!ssl->options.dtls) {
  6047. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  6048. if (args->pv.major > SSLv3_MAJOR || (args->pv.major == SSLv3_MAJOR &&
  6049. args->pv.minor >= TLSv1_3_MINOR)) {
  6050. args->pv.major = SSLv3_MAJOR;
  6051. args->pv.minor = TLSv1_2_MINOR;
  6052. wantDowngrade = 1;
  6053. ssl->version.minor = args->pv.minor;
  6054. }
  6055. /* Legacy version must be [ SSLv3_MAJOR, TLSv1_2_MINOR ] for TLS v1.3 */
  6056. else if (args->pv.major == SSLv3_MAJOR &&
  6057. args->pv.minor < TLSv1_2_MINOR) {
  6058. wantDowngrade = 1;
  6059. ssl->version.minor = args->pv.minor;
  6060. }
  6061. }
  6062. if (!wantDowngrade) {
  6063. ret = DoTls13SupportedVersions(ssl, input + args->begin,
  6064. args->idx - args->begin, helloSz, &wantDowngrade);
  6065. if (ret < 0)
  6066. goto exit_dch;
  6067. }
  6068. if (wantDowngrade) {
  6069. #ifndef WOLFSSL_NO_TLS12
  6070. byte realMinor;
  6071. if (!ssl->options.downgrade) {
  6072. WOLFSSL_MSG("Client trying to connect with lesser version than "
  6073. "TLS v1.3");
  6074. ERROR_OUT(VERSION_ERROR, exit_dch);
  6075. }
  6076. if ((!ssl->options.dtls
  6077. && args->pv.minor < ssl->options.minDowngrade) ||
  6078. (ssl->options.dtls && args->pv.minor > ssl->options.minDowngrade)) {
  6079. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  6080. ERROR_OUT(VERSION_ERROR, exit_dch);
  6081. }
  6082. realMinor = ssl->version.minor;
  6083. ssl->version.minor = args->pv.minor;
  6084. ret = HashInput(ssl, input + args->begin, helloSz);
  6085. ssl->version.minor = realMinor;
  6086. if (ret == 0) {
  6087. ret = DoClientHello(ssl, input, inOutIdx, helloSz);
  6088. }
  6089. goto exit_dch;
  6090. #else
  6091. WOLFSSL_MSG("Client trying to connect with lesser version than "
  6092. "TLS v1.3");
  6093. ERROR_OUT(VERSION_ERROR, exit_dch);
  6094. #endif
  6095. }
  6096. /* From here on we are a TLS 1.3 ClientHello. */
  6097. /* Client random */
  6098. XMEMCPY(ssl->arrays->clientRandom, input + args->idx, RAN_LEN);
  6099. args->idx += RAN_LEN;
  6100. #ifdef WOLFSSL_DEBUG_TLS
  6101. WOLFSSL_MSG("client random");
  6102. WOLFSSL_BUFFER(ssl->arrays->clientRandom, RAN_LEN);
  6103. #endif
  6104. sessIdSz = input[args->idx++];
  6105. #ifndef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
  6106. if (sessIdSz > ID_LEN)
  6107. #else
  6108. if (sessIdSz != ID_LEN && sessIdSz != 0)
  6109. #endif
  6110. {
  6111. ERROR_OUT(INVALID_PARAMETER, exit_dch);
  6112. }
  6113. if (sessIdSz + args->idx > helloSz)
  6114. ERROR_OUT(BUFFER_ERROR, exit_dch);
  6115. ssl->session->sessionIDSz = sessIdSz;
  6116. if (sessIdSz > 0)
  6117. XMEMCPY(ssl->session->sessionID, input + args->idx, sessIdSz);
  6118. args->idx += sessIdSz;
  6119. #ifdef WOLFSSL_DTLS13
  6120. /* legacy_cookie */
  6121. if (ssl->options.dtls) {
  6122. /* https://www.rfc-editor.org/rfc/rfc9147.html#section-5.3 */
  6123. byte cookieLen = input[args->idx++];
  6124. if (cookieLen != 0) {
  6125. ERROR_OUT(INVALID_PARAMETER, exit_dch);
  6126. }
  6127. }
  6128. #endif /* WOLFSSL_DTLS13 */
  6129. args->clSuites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  6130. DYNAMIC_TYPE_SUITES);
  6131. if (args->clSuites == NULL) {
  6132. ERROR_OUT(MEMORY_E, exit_dch);
  6133. }
  6134. /* Cipher suites */
  6135. if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz)
  6136. ERROR_OUT(BUFFER_ERROR, exit_dch);
  6137. ato16(&input[args->idx], &args->clSuites->suiteSz);
  6138. args->idx += OPAQUE16_LEN;
  6139. if ((args->clSuites->suiteSz % 2) != 0) {
  6140. ERROR_OUT(INVALID_PARAMETER, exit_dch);
  6141. }
  6142. /* suites and compression length check */
  6143. if ((args->idx - args->begin) + args->clSuites->suiteSz + OPAQUE8_LEN > helloSz)
  6144. ERROR_OUT(BUFFER_ERROR, exit_dch);
  6145. if (args->clSuites->suiteSz > WOLFSSL_MAX_SUITE_SZ)
  6146. ERROR_OUT(BUFFER_ERROR, exit_dch);
  6147. XMEMCPY(args->clSuites->suites, input + args->idx, args->clSuites->suiteSz);
  6148. args->idx += args->clSuites->suiteSz;
  6149. args->clSuites->hashSigAlgoSz = 0;
  6150. /* Compression */
  6151. b = input[args->idx++];
  6152. if ((args->idx - args->begin) + b > helloSz)
  6153. ERROR_OUT(BUFFER_ERROR, exit_dch);
  6154. if (b != COMP_LEN) {
  6155. WOLFSSL_MSG("Must be one compression type in list");
  6156. ERROR_OUT(INVALID_PARAMETER, exit_dch);
  6157. }
  6158. b = input[args->idx++];
  6159. if (b != NO_COMPRESSION) {
  6160. WOLFSSL_MSG("Must be no compression type in list");
  6161. ERROR_OUT(INVALID_PARAMETER, exit_dch);
  6162. }
  6163. /* Extensions */
  6164. if ((args->idx - args->begin) == helloSz)
  6165. ERROR_OUT(BUFFER_ERROR, exit_dch);
  6166. if ((args->idx - args->begin) + OPAQUE16_LEN > helloSz)
  6167. ERROR_OUT(BUFFER_ERROR, exit_dch);
  6168. ato16(&input[args->idx], &totalExtSz);
  6169. args->idx += OPAQUE16_LEN;
  6170. if ((args->idx - args->begin) + totalExtSz > helloSz)
  6171. ERROR_OUT(BUFFER_ERROR, exit_dch);
  6172. /* Auto populate extensions supported unless user defined. */
  6173. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  6174. goto exit_dch;
  6175. #if defined(HAVE_ECH)
  6176. if (ssl->ctx->echConfigs != NULL) {
  6177. /* save the start of the buffer so we can use it when parsing ech */
  6178. echX = TLSX_Find(ssl->extensions, TLSX_ECH);
  6179. if (echX == NULL)
  6180. return -1;
  6181. ((WOLFSSL_ECH*)echX->data)->aad = input + HANDSHAKE_HEADER_SZ;
  6182. ((WOLFSSL_ECH*)echX->data)->aadLen = helloSz;
  6183. }
  6184. #endif
  6185. /* Parse extensions */
  6186. if ((ret = TLSX_Parse(ssl, input + args->idx, totalExtSz, client_hello,
  6187. args->clSuites))) {
  6188. goto exit_dch;
  6189. }
  6190. #if defined(HAVE_ECH)
  6191. /* jump to the end to clean things up */
  6192. if (echX != NULL && ((WOLFSSL_ECH*)echX->data)->state == ECH_WRITE_NONE)
  6193. goto exit_dch;
  6194. #endif
  6195. #ifdef HAVE_SNI
  6196. if ((ret = SNI_Callback(ssl)) != 0)
  6197. goto exit_dch;
  6198. ssl->options.side = WOLFSSL_SERVER_END;
  6199. #endif
  6200. args->idx += totalExtSz;
  6201. ssl->options.haveSessionId = 1;
  6202. ssl->options.sendVerify = SEND_CERT;
  6203. #if defined(WOLFSSL_SEND_HRR_COOKIE)
  6204. ssl->options.cookieGood = 0;
  6205. if (ssl->options.sendCookie &&
  6206. (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE
  6207. #ifdef WOLFSSL_DTLS13
  6208. /* Always check for a valid cookie since we may have already
  6209. * sent a HRR but we reset the state. */
  6210. || ssl->options.dtls
  6211. #endif
  6212. )) {
  6213. TLSX* ext = TLSX_Find(ssl->extensions, TLSX_COOKIE);
  6214. if (ext != NULL) {
  6215. /* Ensure the cookie came from client and isn't the one in the
  6216. * response - HelloRetryRequest.
  6217. */
  6218. if (ext->resp == 0) {
  6219. ret = RestartHandshakeHashWithCookie(ssl, (Cookie*)ext->data);
  6220. if (ret != 0)
  6221. goto exit_dch;
  6222. /* Don't change state here as we may want to enter
  6223. * DoTls13ClientHello again. */
  6224. ssl->options.cookieGood = 1;
  6225. }
  6226. else {
  6227. ERROR_OUT(HRR_COOKIE_ERROR, exit_dch);
  6228. }
  6229. }
  6230. else {
  6231. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_DTLS13_NO_HRR_ON_RESUME)
  6232. /* Don't error out as we may be resuming. We confirm this later. */
  6233. if (!ssl->options.dtls)
  6234. #endif
  6235. ERROR_OUT(HRR_COOKIE_ERROR, exit_dch);
  6236. }
  6237. }
  6238. #endif
  6239. #if (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) && \
  6240. defined(HAVE_TLS_EXTENSIONS)
  6241. ret = CheckPreSharedKeys(ssl, input + args->begin, helloSz, args->clSuites,
  6242. &args->usingPSK);
  6243. if (ret != 0)
  6244. goto exit_dch;
  6245. #else
  6246. if ((ret = HashInput(ssl, input + args->begin, helloSz)) != 0)
  6247. goto exit_dch;
  6248. #endif
  6249. #if (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) && \
  6250. defined(HAVE_TLS_EXTENSIONS)
  6251. if (!args->usingPSK)
  6252. #endif
  6253. {
  6254. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6255. /* Not using PSK so don't require no KE. */
  6256. ssl->options.noPskDheKe = 0;
  6257. #endif
  6258. #ifndef NO_CERTS
  6259. if (TLSX_Find(ssl->extensions, TLSX_KEY_SHARE) == NULL) {
  6260. WOLFSSL_MSG("Client did not send a KeyShare extension");
  6261. ERROR_OUT(INCOMPLETE_DATA, exit_dch);
  6262. }
  6263. if (TLSX_Find(ssl->extensions, TLSX_SIGNATURE_ALGORITHMS) == NULL) {
  6264. WOLFSSL_MSG("Client did not send a SignatureAlgorithms extension");
  6265. ERROR_OUT(INCOMPLETE_DATA, exit_dch);
  6266. }
  6267. #else
  6268. ERROR_OUT(INVALID_PARAMETER, exit_dch);
  6269. #endif
  6270. }
  6271. #ifdef HAVE_ALPN
  6272. /* With PSK and all other things validated, it's time to
  6273. * select the ALPN protocol, if so requested */
  6274. if ((ret = ALPN_Select(ssl)) != 0)
  6275. goto exit_dch;
  6276. #endif
  6277. } /* case TLS_ASYNC_BEGIN */
  6278. FALL_THROUGH;
  6279. case TLS_ASYNC_BUILD:
  6280. /* Advance state and proceed */
  6281. ssl->options.asyncState = TLS_ASYNC_DO;
  6282. FALL_THROUGH;
  6283. case TLS_ASYNC_DO:
  6284. {
  6285. #ifdef OPENSSL_EXTRA
  6286. ssl->clSuites = args->clSuites;
  6287. if ((ret = CertSetupCbWrapper(ssl)) != 0)
  6288. goto exit_dch;
  6289. #endif
  6290. #ifndef NO_CERTS
  6291. if (!args->usingPSK) {
  6292. if ((ret = MatchSuite(ssl, args->clSuites)) < 0) {
  6293. #ifdef WOLFSSL_ASYNC_CRYPT
  6294. if (ret != WC_PENDING_E)
  6295. #endif
  6296. WOLFSSL_MSG("Unsupported cipher suite, ClientHello 1.3");
  6297. goto exit_dch;
  6298. }
  6299. }
  6300. #endif
  6301. #ifdef HAVE_SUPPORTED_CURVES
  6302. if (args->usingPSK == 2) {
  6303. /* Pick key share and Generate a new key if not present. */
  6304. int doHelloRetry = 0;
  6305. ret = TLSX_KeyShare_Establish(ssl, &doHelloRetry);
  6306. if (doHelloRetry) {
  6307. /* Make sure we don't send HRR twice */
  6308. if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
  6309. ERROR_OUT(INVALID_PARAMETER, exit_dch);
  6310. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  6311. if (ret != WC_PENDING_E)
  6312. ret = 0; /* for hello_retry return 0 */
  6313. }
  6314. if (ret != 0)
  6315. goto exit_dch;
  6316. }
  6317. #endif
  6318. /* Advance state and proceed */
  6319. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  6320. } /* case TLS_ASYNC_BUILD || TLS_ASYNC_DO */
  6321. FALL_THROUGH;
  6322. case TLS_ASYNC_VERIFY:
  6323. {
  6324. #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SUPPORTED_CURVES)
  6325. /* Check if the KeyShare calculations from the previous state are complete.
  6326. * wolfSSL_AsyncPop advances ssl->options.asyncState so we may end up here
  6327. * with a pending calculation. */
  6328. TLSX* extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
  6329. if (extension != NULL && extension->resp == 1) {
  6330. KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
  6331. if (serverKSE != NULL && serverKSE->lastRet == WC_PENDING_E) {
  6332. ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
  6333. if (ret != 0)
  6334. goto exit_dch;
  6335. }
  6336. }
  6337. #endif
  6338. /* Advance state and proceed */
  6339. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  6340. }
  6341. FALL_THROUGH;
  6342. case TLS_ASYNC_FINALIZE:
  6343. {
  6344. *inOutIdx = args->idx;
  6345. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  6346. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6347. ssl->options.pskNegotiated = (args->usingPSK != 0);
  6348. #endif
  6349. if (!args->usingPSK) {
  6350. #ifndef NO_CERTS
  6351. /* Check that the negotiated ciphersuite matches protocol version. */
  6352. #ifdef HAVE_NULL_CIPHER
  6353. if (ssl->options.cipherSuite0 == ECC_BYTE &&
  6354. (ssl->options.cipherSuite == TLS_SHA256_SHA256 ||
  6355. ssl->options.cipherSuite == TLS_SHA384_SHA384)) {
  6356. ;
  6357. }
  6358. else
  6359. #endif
  6360. #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM3)
  6361. if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
  6362. ssl->options.cipherSuite == TLS_SM4_GCM_SM3) {
  6363. ; /* Do nothing. */
  6364. }
  6365. else
  6366. #endif
  6367. #if defined(WOLFSSL_SM4_CCM) && defined(WOLFSSL_SM3)
  6368. if (ssl->options.cipherSuite0 == CIPHER_BYTE &&
  6369. ssl->options.cipherSuite == TLS_SM4_CCM_SM3) {
  6370. ; /* Do nothing. */
  6371. }
  6372. else
  6373. #endif
  6374. if (ssl->options.cipherSuite0 != TLS13_BYTE) {
  6375. WOLFSSL_MSG("Negotiated ciphersuite from lesser version than "
  6376. "TLS v1.3");
  6377. ERROR_OUT(MATCH_SUITE_ERROR, exit_dch);
  6378. }
  6379. #ifdef HAVE_SESSION_TICKET
  6380. if (ssl->options.resuming) {
  6381. ssl->options.resuming = 0;
  6382. ssl->arrays->psk_keySz = 0;
  6383. XMEMSET(ssl->arrays->psk_key, 0, ssl->specs.hash_size);
  6384. }
  6385. #endif
  6386. /* Derive early secret for handshake secret. */
  6387. if ((ret = DeriveEarlySecret(ssl)) != 0)
  6388. goto exit_dch;
  6389. #endif /* !NO_CERTS */
  6390. }
  6391. break;
  6392. } /* case TLS_ASYNC_FINALIZE */
  6393. default:
  6394. ret = INPUT_CASE_ERROR;
  6395. } /* switch (ssl->options.asyncState) */
  6396. #ifdef WOLFSSL_SEND_HRR_COOKIE
  6397. if (ret == 0 && ssl->options.sendCookie) {
  6398. if (ssl->options.cookieGood &&
  6399. ssl->options.acceptState == TLS13_ACCEPT_FIRST_REPLY_DONE) {
  6400. /* Processing second ClientHello. Clear HRR state. */
  6401. ssl->options.serverState = NULL_STATE;
  6402. }
  6403. if (ssl->options.cookieGood &&
  6404. ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
  6405. /* If we already verified the peer with a cookie then we can't
  6406. * do another HRR for cipher negotiation. Send alert and restart
  6407. * the entire handshake. */
  6408. ERROR_OUT(INVALID_PARAMETER, exit_dch);
  6409. }
  6410. #ifdef WOLFSSL_DTLS13
  6411. if (ssl->options.dtls &&
  6412. ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
  6413. /* Cookie and key share negotiation should be handled in
  6414. * DoClientHelloStateless. If we enter here then something went
  6415. * wrong in our logic. */
  6416. ERROR_OUT(BAD_HELLO, exit_dch);
  6417. }
  6418. #endif
  6419. /* Send a cookie */
  6420. if (!ssl->options.cookieGood &&
  6421. ssl->options.serverState != SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
  6422. #ifdef WOLFSSL_DTLS13
  6423. if (ssl->options.dtls) {
  6424. #ifdef WOLFSSL_DTLS13_NO_HRR_ON_RESUME
  6425. /* We can skip cookie on resumption */
  6426. if (!ssl->options.dtls || !ssl->options.dtls13NoHrrOnResume ||
  6427. !args->usingPSK)
  6428. #endif
  6429. ERROR_OUT(BAD_HELLO, exit_dch);
  6430. }
  6431. else
  6432. #endif
  6433. {
  6434. /* Need to remove the keyshare ext if we found a common group
  6435. * and are not doing curve negotiation. */
  6436. TLSX_Remove(&ssl->extensions, TLSX_KEY_SHARE, ssl->heap);
  6437. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  6438. }
  6439. }
  6440. }
  6441. #endif /* WOLFSSL_DTLS13 */
  6442. #ifdef WOLFSSL_DTLS_CID
  6443. /* do not modify CID state if we are sending an HRR */
  6444. if (ret == 0 && ssl->options.dtls && ssl->options.useDtlsCID &&
  6445. ssl->options.serverState != SERVER_HELLO_RETRY_REQUEST_COMPLETE)
  6446. DtlsCIDOnExtensionsParsed(ssl);
  6447. #endif /* WOLFSSL_DTLS_CID */
  6448. exit_dch:
  6449. WOLFSSL_LEAVE("DoTls13ClientHello", ret);
  6450. #ifdef WOLFSSL_ASYNC_CRYPT
  6451. if (ret == WC_PENDING_E) {
  6452. ssl->msgsReceived.got_client_hello = 0;
  6453. return ret;
  6454. }
  6455. #endif
  6456. FreeDch13Args(ssl, args);
  6457. #ifdef WOLFSSL_ASYNC_CRYPT
  6458. FreeAsyncCtx(ssl, 0);
  6459. #endif
  6460. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  6461. if (ret != 0) {
  6462. WOLFSSL_ERROR_VERBOSE(ret);
  6463. }
  6464. #if defined(HAVE_ECH)
  6465. if (ret == 0 && echX != NULL &&
  6466. ((WOLFSSL_ECH*)echX->data)->state == ECH_WRITE_NONE) {
  6467. /* add the header to the inner hello */
  6468. AddTls13HandShakeHeader(((WOLFSSL_ECH*)echX->data)->innerClientHello,
  6469. ((WOLFSSL_ECH*)echX->data)->innerClientHelloLen, 0, 0,
  6470. client_hello, ssl);
  6471. }
  6472. #endif
  6473. return ret;
  6474. }
  6475. /* Send TLS v1.3 ServerHello message to client.
  6476. * Only a server will send this message.
  6477. *
  6478. * ssl The SSL/TLS object.
  6479. * returns 0 on success, otherwise failure.
  6480. */
  6481. /* handle generation of TLS 1.3 server_hello (2) */
  6482. int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType)
  6483. {
  6484. int ret;
  6485. byte* output;
  6486. word16 length;
  6487. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  6488. int sendSz;
  6489. #if defined(HAVE_ECH)
  6490. TLSX* echX = NULL;
  6491. word32 serverRandomOffset;
  6492. #endif
  6493. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  6494. WOLFSSL_ENTER("SendTls13ServerHello");
  6495. /* When ssl->options.dtlsStateful is not set then cookie is calculated in
  6496. * dtls.c */
  6497. if (extMsgType == hello_retry_request
  6498. #ifdef WOLFSSL_DTLS13
  6499. && (!ssl->options.dtls || ssl->options.dtlsStateful)
  6500. #endif
  6501. ) {
  6502. WOLFSSL_MSG("wolfSSL Sending HelloRetryRequest");
  6503. if ((ret = RestartHandshakeHash(ssl)) < 0)
  6504. return ret;
  6505. }
  6506. ssl->options.buildingMsg = 1;
  6507. #ifdef WOLFSSL_DTLS13
  6508. if (ssl->options.dtls)
  6509. idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  6510. #endif /* WOLFSSL_DTLS13 */
  6511. /* Protocol version, server random, session id, cipher suite, compression
  6512. * and extensions.
  6513. */
  6514. length = VERSION_SZ + RAN_LEN + ENUM_LEN + ssl->session->sessionIDSz +
  6515. SUITE_LEN + COMP_LEN;
  6516. ret = TLSX_GetResponseSize(ssl, extMsgType, &length);
  6517. if (ret != 0)
  6518. return ret;
  6519. sendSz = idx + length;
  6520. /* Check buffers are big enough and grow if needed. */
  6521. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  6522. return ret;
  6523. /* Get position in output buffer to write new message to. */
  6524. output = GetOutputBuffer(ssl);
  6525. /* Put the record and handshake headers on. */
  6526. AddTls13Headers(output, length, server_hello, ssl);
  6527. /* The protocol version must be TLS v1.2 for middleboxes. */
  6528. output[idx++] = ssl->version.major;
  6529. output[idx++] = ssl->options.dtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR;
  6530. if (extMsgType == server_hello) {
  6531. /* Generate server random. */
  6532. if ((ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN)) != 0)
  6533. return ret;
  6534. }
  6535. else {
  6536. /* HelloRetryRequest message has fixed value for random. */
  6537. XMEMCPY(output + idx, helloRetryRequestRandom, RAN_LEN);
  6538. }
  6539. #if defined(HAVE_ECH)
  6540. serverRandomOffset = idx;
  6541. #endif
  6542. /* Store in SSL for debugging. */
  6543. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  6544. idx += RAN_LEN;
  6545. #ifdef WOLFSSL_DEBUG_TLS
  6546. WOLFSSL_MSG("Server random");
  6547. WOLFSSL_BUFFER(ssl->arrays->serverRandom, RAN_LEN);
  6548. #endif
  6549. output[idx++] = ssl->session->sessionIDSz;
  6550. if (ssl->session->sessionIDSz > 0) {
  6551. XMEMCPY(output + idx, ssl->session->sessionID, ssl->session->sessionIDSz);
  6552. idx += ssl->session->sessionIDSz;
  6553. }
  6554. /* Chosen cipher suite */
  6555. output[idx++] = ssl->options.cipherSuite0;
  6556. output[idx++] = ssl->options.cipherSuite;
  6557. #ifdef WOLFSSL_DEBUG_TLS
  6558. WOLFSSL_MSG("Chosen cipher suite:");
  6559. WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
  6560. ssl->options.cipherSuite));
  6561. #endif
  6562. /* Compression not supported in TLS v1.3. */
  6563. output[idx++] = 0;
  6564. /* Extensions */
  6565. ret = TLSX_WriteResponse(ssl, output + idx, extMsgType, NULL);
  6566. if (ret != 0)
  6567. return ret;
  6568. #ifdef WOLFSSL_SEND_HRR_COOKIE
  6569. if (ssl->options.sendCookie && extMsgType == hello_retry_request) {
  6570. /* Reset the hashes from here. We will be able to restart the hashes
  6571. * from the cookie in RestartHandshakeHashWithCookie */
  6572. #ifdef WOLFSSL_DTLS13
  6573. /* When ssl->options.dtlsStateful is not set then cookie is calculated
  6574. * in dtls.c */
  6575. if (ssl->options.dtls && !ssl->options.dtlsStateful)
  6576. ret = 0;
  6577. else
  6578. #endif
  6579. ret = InitHandshakeHashes(ssl);
  6580. }
  6581. else
  6582. #endif
  6583. {
  6584. #ifdef WOLFSSL_DTLS13
  6585. if (ssl->options.dtls) {
  6586. ret = Dtls13HashHandshake(
  6587. ssl,
  6588. output + Dtls13GetRlHeaderLength(ssl, 0) ,
  6589. (word16)sendSz - Dtls13GetRlHeaderLength(ssl, 0));
  6590. }
  6591. else
  6592. #endif /* WOLFSSL_DTLS13 */
  6593. {
  6594. #if defined(HAVE_ECH)
  6595. if (ssl->ctx->echConfigs != NULL) {
  6596. echX = TLSX_Find(ssl->extensions, TLSX_ECH);
  6597. if (echX == NULL)
  6598. return -1;
  6599. /* replace the last 8 bytes of server random with the accept */
  6600. if (((WOLFSSL_ECH*)echX->data)->state == ECH_PARSED_INTERNAL) {
  6601. ret = EchWriteAcceptance(ssl, output + RECORD_HEADER_SZ,
  6602. serverRandomOffset - RECORD_HEADER_SZ,
  6603. sendSz - RECORD_HEADER_SZ);
  6604. /* remove ech so we don't keep sending it in write */
  6605. TLSX_Remove(&ssl->extensions, TLSX_ECH, ssl->heap);
  6606. }
  6607. }
  6608. #endif
  6609. if (ret == 0)
  6610. ret = HashOutput(ssl, output, sendSz, 0);
  6611. }
  6612. }
  6613. if (ret != 0)
  6614. return ret;
  6615. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  6616. if (ssl->hsInfoOn)
  6617. AddPacketName(ssl, "ServerHello");
  6618. if (ssl->toInfoOn) {
  6619. ret = AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  6620. WRITE_PROTO, 0, ssl->heap);
  6621. if (ret != 0)
  6622. return ret;
  6623. }
  6624. #endif
  6625. if (extMsgType == server_hello)
  6626. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  6627. ssl->options.buildingMsg = 0;
  6628. #ifdef WOLFSSL_DTLS13
  6629. if (ssl->options.dtls) {
  6630. ret = Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)sendSz,
  6631. (enum HandShakeType)extMsgType, 0);
  6632. WOLFSSL_LEAVE("SendTls13ServerHello", ret);
  6633. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  6634. return ret;
  6635. }
  6636. #endif /* WOLFSSL_DTLS13 */
  6637. ssl->buffers.outputBuffer.length += sendSz;
  6638. if (!ssl->options.groupMessages || extMsgType != server_hello)
  6639. ret = SendBuffered(ssl);
  6640. WOLFSSL_LEAVE("SendTls13ServerHello", ret);
  6641. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  6642. return ret;
  6643. }
  6644. /* handle generation of TLS 1.3 encrypted_extensions (8) */
  6645. /* Send the rest of the extensions encrypted under the handshake key.
  6646. * This message is always encrypted in TLS v1.3.
  6647. * Only a server will send this message.
  6648. *
  6649. * ssl The SSL/TLS object.
  6650. * returns 0 on success, otherwise failure.
  6651. */
  6652. static int SendTls13EncryptedExtensions(WOLFSSL* ssl)
  6653. {
  6654. int ret;
  6655. byte* output;
  6656. word16 length = 0;
  6657. word32 idx;
  6658. int sendSz;
  6659. WOLFSSL_START(WC_FUNC_ENCRYPTED_EXTENSIONS_SEND);
  6660. WOLFSSL_ENTER("SendTls13EncryptedExtensions");
  6661. ssl->options.buildingMsg = 1;
  6662. ssl->keys.encryptionOn = 1;
  6663. #ifdef WOLFSSL_DTLS13
  6664. if (ssl->options.dtls) {
  6665. idx = Dtls13GetHeadersLength(ssl, encrypted_extensions);
  6666. }
  6667. else
  6668. #endif /* WOLFSSL_DTLS13 */
  6669. {
  6670. idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  6671. }
  6672. #if defined(HAVE_SUPPORTED_CURVES) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
  6673. if ((ret = TLSX_SupportedCurve_CheckPriority(ssl)) != 0)
  6674. return ret;
  6675. #endif
  6676. /* Derive the handshake secret now that we are at first message to be
  6677. * encrypted under the keys.
  6678. */
  6679. if ((ret = DeriveHandshakeSecret(ssl)) != 0)
  6680. return ret;
  6681. if ((ret = DeriveTls13Keys(ssl, handshake_key,
  6682. ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0)
  6683. return ret;
  6684. /* Setup encrypt/decrypt keys for following messages. */
  6685. #ifdef WOLFSSL_EARLY_DATA
  6686. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  6687. return ret;
  6688. if (ssl->earlyData != process_early_data) {
  6689. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  6690. return ret;
  6691. }
  6692. #else
  6693. if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) != 0)
  6694. return ret;
  6695. #endif
  6696. #ifdef WOLFSSL_QUIC
  6697. if (IsAtLeastTLSv1_3(ssl->version) && WOLFSSL_IS_QUIC(ssl)) {
  6698. ret = wolfSSL_quic_add_transport_extensions(ssl, encrypted_extensions);
  6699. if (ret != 0)
  6700. return ret;
  6701. }
  6702. #endif
  6703. #ifdef WOLFSSL_DTLS13
  6704. if (ssl->options.dtls) {
  6705. w64wrapper epochHandshake = w64From32(0, DTLS13_EPOCH_HANDSHAKE);
  6706. ssl->dtls13Epoch = epochHandshake;
  6707. ret = Dtls13NewEpoch(
  6708. ssl, epochHandshake, ENCRYPT_AND_DECRYPT_SIDE);
  6709. if (ret != 0)
  6710. return ret;
  6711. ret = Dtls13SetEpochKeys(
  6712. ssl, epochHandshake, ENCRYPT_AND_DECRYPT_SIDE);
  6713. if (ret != 0)
  6714. return ret;
  6715. }
  6716. #endif /* WOLFSSL_DTLS13 */
  6717. ret = TLSX_GetResponseSize(ssl, encrypted_extensions, &length);
  6718. if (ret != 0)
  6719. return ret;
  6720. sendSz = idx + length;
  6721. /* Encryption always on. */
  6722. sendSz += MAX_MSG_EXTRA;
  6723. /* Check buffers are big enough and grow if needed. */
  6724. ret = CheckAvailableSize(ssl, sendSz);
  6725. if (ret != 0)
  6726. return ret;
  6727. /* Get position in output buffer to write new message to. */
  6728. output = GetOutputBuffer(ssl);
  6729. /* Put the record and handshake headers on. */
  6730. AddTls13Headers(output, length, encrypted_extensions, ssl);
  6731. ret = TLSX_WriteResponse(ssl, output + idx, encrypted_extensions, NULL);
  6732. if (ret != 0)
  6733. return ret;
  6734. idx += length;
  6735. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  6736. if (ssl->hsInfoOn)
  6737. AddPacketName(ssl, "EncryptedExtensions");
  6738. if (ssl->toInfoOn) {
  6739. ret = AddPacketInfo(ssl, "EncryptedExtensions", handshake, output,
  6740. sendSz, WRITE_PROTO, 0, ssl->heap);
  6741. if (ret != 0)
  6742. return ret;
  6743. }
  6744. #endif
  6745. #ifdef WOLFSSL_DTLS13
  6746. if (ssl->options.dtls) {
  6747. ssl->options.buildingMsg = 0;
  6748. ret = Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)idx,
  6749. encrypted_extensions, 1);
  6750. if (ret == 0)
  6751. ssl->options.serverState = SERVER_ENCRYPTED_EXTENSIONS_COMPLETE;
  6752. WOLFSSL_LEAVE("SendTls13EncryptedExtensions", ret);
  6753. WOLFSSL_END(WC_FUNC_ENCRYPTED_EXTENSIONS_SEND);
  6754. return ret;
  6755. }
  6756. #endif /* WOLFSSL_DTLS13 */
  6757. /* This handshake message is always encrypted. */
  6758. sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ,
  6759. idx - RECORD_HEADER_SZ, handshake, 1, 0, 0);
  6760. if (sendSz < 0)
  6761. return sendSz;
  6762. ssl->buffers.outputBuffer.length += sendSz;
  6763. ssl->options.buildingMsg = 0;
  6764. ssl->options.serverState = SERVER_ENCRYPTED_EXTENSIONS_COMPLETE;
  6765. if (!ssl->options.groupMessages)
  6766. ret = SendBuffered(ssl);
  6767. WOLFSSL_LEAVE("SendTls13EncryptedExtensions", ret);
  6768. WOLFSSL_END(WC_FUNC_ENCRYPTED_EXTENSIONS_SEND);
  6769. return ret;
  6770. }
  6771. #ifndef NO_CERTS
  6772. /* handle generation TLS v1.3 certificate_request (13) */
  6773. /* Send the TLS v1.3 CertificateRequest message.
  6774. * This message is always encrypted in TLS v1.3.
  6775. * Only a server will send this message.
  6776. *
  6777. * ssl SSL/TLS object.
  6778. * reqCtx Request context.
  6779. * reqCtxLen Length of context. 0 when sending as part of handshake.
  6780. * returns 0 on success, otherwise failure.
  6781. */
  6782. static int SendTls13CertificateRequest(WOLFSSL* ssl, byte* reqCtx,
  6783. int reqCtxLen)
  6784. {
  6785. byte* output;
  6786. int ret;
  6787. int sendSz;
  6788. word32 i;
  6789. word32 reqSz;
  6790. word16 hashSigAlgoSz = 0;
  6791. SignatureAlgorithms* sa;
  6792. int haveSig = SIG_RSA | SIG_ECDSA | SIG_FALCON | SIG_DILITHIUM;
  6793. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  6794. haveSig |= SIG_SM2;
  6795. #endif
  6796. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  6797. WOLFSSL_ENTER("SendTls13CertificateRequest");
  6798. ssl->options.buildingMsg = 1;
  6799. if (ssl->options.side != WOLFSSL_SERVER_END)
  6800. return SIDE_ERROR;
  6801. /* Get the length of the hashSigAlgo buffer */
  6802. InitSuitesHashSigAlgo_ex2(NULL, haveSig, 1, ssl->buffers.keySz,
  6803. &hashSigAlgoSz);
  6804. sa = TLSX_SignatureAlgorithms_New(ssl, hashSigAlgoSz, ssl->heap);
  6805. if (sa == NULL)
  6806. return MEMORY_ERROR;
  6807. InitSuitesHashSigAlgo_ex2(sa->hashSigAlgo, haveSig, 1, ssl->buffers.keySz,
  6808. &hashSigAlgoSz);
  6809. ret = TLSX_Push(&ssl->extensions, TLSX_SIGNATURE_ALGORITHMS, sa, ssl->heap);
  6810. if (ret != 0) {
  6811. TLSX_SignatureAlgorithms_FreeAll(sa, ssl->heap);
  6812. return ret;
  6813. }
  6814. i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  6815. #ifdef WOLFSSL_DTLS13
  6816. if (ssl->options.dtls)
  6817. i = Dtls13GetRlHeaderLength(ssl, 1) + DTLS_HANDSHAKE_HEADER_SZ;
  6818. #endif /* WOLFSSL_DTLS13 */
  6819. reqSz = (word16)(OPAQUE8_LEN + reqCtxLen);
  6820. ret = TLSX_GetRequestSize(ssl, certificate_request, &reqSz);
  6821. if (ret != 0)
  6822. return ret;
  6823. sendSz = i + reqSz;
  6824. /* Always encrypted and make room for padding. */
  6825. sendSz += MAX_MSG_EXTRA;
  6826. /* Check buffers are big enough and grow if needed. */
  6827. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  6828. return ret;
  6829. /* Get position in output buffer to write new message to. */
  6830. output = GetOutputBuffer(ssl);
  6831. /* Put the record and handshake headers on. */
  6832. AddTls13Headers(output, reqSz, certificate_request, ssl);
  6833. /* Certificate request context. */
  6834. output[i++] = (byte)reqCtxLen;
  6835. if (reqCtxLen != 0) {
  6836. XMEMCPY(output + i, reqCtx, reqCtxLen);
  6837. i += reqCtxLen;
  6838. }
  6839. /* Certificate extensions. */
  6840. reqSz = 0;
  6841. ret = TLSX_WriteRequest(ssl, output + i, certificate_request, &reqSz);
  6842. if (ret != 0)
  6843. return ret;
  6844. i += reqSz;
  6845. #ifdef WOLFSSL_DTLS13
  6846. if (ssl->options.dtls) {
  6847. ssl->options.buildingMsg = 0;
  6848. ret =
  6849. Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)i,
  6850. certificate_request, 1);
  6851. WOLFSSL_LEAVE("SendTls13CertificateRequest", ret);
  6852. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  6853. return ret;
  6854. }
  6855. #endif /* WOLFSSL_DTLS13 */
  6856. /* Always encrypted. */
  6857. sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ,
  6858. i - RECORD_HEADER_SZ, handshake, 1, 0, 0);
  6859. if (sendSz < 0)
  6860. return sendSz;
  6861. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  6862. if (ssl->hsInfoOn)
  6863. AddPacketName(ssl, "CertificateRequest");
  6864. if (ssl->toInfoOn) {
  6865. ret = AddPacketInfo(ssl, "CertificateRequest", handshake, output,
  6866. sendSz, WRITE_PROTO, 0, ssl->heap);
  6867. if (ret != 0)
  6868. return ret;
  6869. }
  6870. #endif
  6871. ssl->buffers.outputBuffer.length += sendSz;
  6872. ssl->options.buildingMsg = 0;
  6873. if (!ssl->options.groupMessages)
  6874. ret = SendBuffered(ssl);
  6875. WOLFSSL_LEAVE("SendTls13CertificateRequest", ret);
  6876. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  6877. return ret;
  6878. }
  6879. #endif /* NO_CERTS */
  6880. #endif /* NO_WOLFSSL_SERVER */
  6881. #ifndef NO_CERTS
  6882. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  6883. defined(HAVE_ED448) || defined(HAVE_PQC)
  6884. /* Encode the signature algorithm into buffer.
  6885. *
  6886. * hashalgo The hash algorithm.
  6887. * hsType The signature type.
  6888. * output The buffer to encode into.
  6889. */
  6890. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  6891. {
  6892. switch (hsType) {
  6893. #ifdef HAVE_ECC
  6894. case ecc_dsa_sa_algo:
  6895. output[0] = hashAlgo;
  6896. output[1] = ecc_dsa_sa_algo;
  6897. break;
  6898. #endif
  6899. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  6900. case sm2_sa_algo:
  6901. output[0] = SM2_SA_MAJOR;
  6902. output[1] = SM2_SA_MINOR;
  6903. break;
  6904. #endif
  6905. #ifdef HAVE_ED25519
  6906. /* ED25519: 0x0807 */
  6907. case ed25519_sa_algo:
  6908. output[0] = ED25519_SA_MAJOR;
  6909. output[1] = ED25519_SA_MINOR;
  6910. (void)hashAlgo;
  6911. break;
  6912. #endif
  6913. #ifdef HAVE_ED448
  6914. /* ED448: 0x0808 */
  6915. case ed448_sa_algo:
  6916. output[0] = ED448_SA_MAJOR;
  6917. output[1] = ED448_SA_MINOR;
  6918. (void)hashAlgo;
  6919. break;
  6920. #endif
  6921. #ifndef NO_RSA
  6922. /* PSS signatures: 0x080[4-6] */
  6923. case rsa_pss_sa_algo:
  6924. output[0] = rsa_pss_sa_algo;
  6925. output[1] = hashAlgo;
  6926. break;
  6927. #endif
  6928. #ifdef HAVE_PQC
  6929. #ifdef HAVE_FALCON
  6930. case falcon_level1_sa_algo:
  6931. output[0] = FALCON_LEVEL1_SA_MAJOR;
  6932. output[1] = FALCON_LEVEL1_SA_MINOR;
  6933. break;
  6934. case falcon_level5_sa_algo:
  6935. output[0] = FALCON_LEVEL5_SA_MAJOR;
  6936. output[1] = FALCON_LEVEL5_SA_MINOR;
  6937. break;
  6938. #endif
  6939. #ifdef HAVE_DILITHIUM
  6940. case dilithium_level2_sa_algo:
  6941. output[0] = DILITHIUM_LEVEL2_SA_MAJOR;
  6942. output[1] = DILITHIUM_LEVEL2_SA_MINOR;
  6943. break;
  6944. case dilithium_level3_sa_algo:
  6945. output[0] = DILITHIUM_LEVEL3_SA_MAJOR;
  6946. output[1] = DILITHIUM_LEVEL3_SA_MINOR;
  6947. break;
  6948. case dilithium_level5_sa_algo:
  6949. output[0] = DILITHIUM_LEVEL5_SA_MAJOR;
  6950. output[1] = DILITHIUM_LEVEL5_SA_MINOR;
  6951. break;
  6952. #endif
  6953. #endif
  6954. default:
  6955. break;
  6956. }
  6957. }
  6958. #ifdef WOLFSSL_DUAL_ALG_CERTS
  6959. /* These match up with what the OQS team has defined. */
  6960. #define HYBRID_SA_MAJOR 0xFE
  6961. #define HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR 0xA1
  6962. #define HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR 0xA2
  6963. #define HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR 0xA4
  6964. #define HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR 0xA6
  6965. #define HYBRID_P256_FALCON_LEVEL1_SA_MINOR 0xAF
  6966. #define HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR 0xB0
  6967. #define HYBRID_P521_FALCON_LEVEL5_SA_MINOR 0xB2
  6968. /* Custom defined ones for PQC first */
  6969. #define HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR 0xD1
  6970. #define HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR 0xD2
  6971. #define HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR 0xD3
  6972. #define HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR 0xD4
  6973. #define HYBRID_FALCON_LEVEL1_P256_SA_MINOR 0xD5
  6974. #define HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR 0xD6
  6975. #define HYBRID_FALCON_LEVEL5_P521_SA_MINOR 0xD7
  6976. static void EncodeDualSigAlg(byte sigAlg, byte altSigAlg, byte* output)
  6977. {
  6978. /* Initialize output to error indicator. */
  6979. output[0] = 0x0;
  6980. output[1] = 0x0;
  6981. if (sigAlg == ecc_dsa_sa_algo && altSigAlg == dilithium_level2_sa_algo) {
  6982. output[1] = HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR;
  6983. }
  6984. else if (sigAlg == rsa_pss_sa_algo &&
  6985. altSigAlg == dilithium_level2_sa_algo) {
  6986. output[1] = HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR;
  6987. }
  6988. else if (sigAlg == ecc_dsa_sa_algo &&
  6989. altSigAlg == dilithium_level3_sa_algo) {
  6990. output[1] = HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR;
  6991. }
  6992. else if (sigAlg == ecc_dsa_sa_algo &&
  6993. altSigAlg == dilithium_level5_sa_algo) {
  6994. output[1] = HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR;
  6995. }
  6996. else if (sigAlg == ecc_dsa_sa_algo &&
  6997. altSigAlg == falcon_level1_sa_algo) {
  6998. output[1] = HYBRID_P256_FALCON_LEVEL1_SA_MINOR;
  6999. }
  7000. else if (sigAlg == rsa_pss_sa_algo &&
  7001. altSigAlg == falcon_level1_sa_algo) {
  7002. output[1] = HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR;
  7003. }
  7004. else if (sigAlg == ecc_dsa_sa_algo &&
  7005. altSigAlg == falcon_level5_sa_algo) {
  7006. output[1] = HYBRID_P521_FALCON_LEVEL5_SA_MINOR;
  7007. }
  7008. else if (sigAlg == dilithium_level2_sa_algo &&
  7009. altSigAlg == ecc_dsa_sa_algo) {
  7010. output[1] = HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR;
  7011. }
  7012. else if (sigAlg == dilithium_level2_sa_algo &&
  7013. altSigAlg == rsa_pss_sa_algo) {
  7014. output[1] = HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR;
  7015. }
  7016. else if (sigAlg == dilithium_level3_sa_algo &&
  7017. altSigAlg == ecc_dsa_sa_algo) {
  7018. output[1] = HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR;
  7019. }
  7020. else if (sigAlg == dilithium_level5_sa_algo &&
  7021. altSigAlg == ecc_dsa_sa_algo) {
  7022. output[1] = HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR;
  7023. }
  7024. else if (sigAlg == falcon_level1_sa_algo &&
  7025. altSigAlg == ecc_dsa_sa_algo) {
  7026. output[1] = HYBRID_FALCON_LEVEL1_P256_SA_MINOR;
  7027. }
  7028. else if (sigAlg == falcon_level1_sa_algo &&
  7029. altSigAlg == rsa_pss_sa_algo) {
  7030. output[1] = HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR;
  7031. }
  7032. else if (sigAlg == falcon_level5_sa_algo &&
  7033. altSigAlg == ecc_dsa_sa_algo) {
  7034. output[1] = HYBRID_FALCON_LEVEL5_P521_SA_MINOR;
  7035. }
  7036. if (output[1] != 0x0) {
  7037. output[0] = HYBRID_SA_MAJOR;
  7038. }
  7039. }
  7040. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  7041. /* Decode the signature algorithm.
  7042. *
  7043. * input The encoded signature algorithm.
  7044. * hashalgo The hash algorithm.
  7045. * hsType The signature type.
  7046. * returns INVALID_PARAMETER if not recognized and 0 otherwise.
  7047. */
  7048. static WC_INLINE int DecodeTls13SigAlg(byte* input, byte* hashAlgo,
  7049. byte* hsType)
  7050. {
  7051. int ret = 0;
  7052. switch (input[0]) {
  7053. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  7054. case SM2_SA_MAJOR:
  7055. if (input[1] == SM2_SA_MINOR) {
  7056. *hsType = sm2_sa_algo;
  7057. *hashAlgo = sm3_mac;
  7058. }
  7059. else
  7060. ret = INVALID_PARAMETER;
  7061. break;
  7062. #endif
  7063. case NEW_SA_MAJOR:
  7064. /* PSS signatures: 0x080[4-6] */
  7065. if (input[1] >= sha256_mac && input[1] <= sha512_mac) {
  7066. *hsType = input[0];
  7067. *hashAlgo = input[1];
  7068. }
  7069. #ifdef HAVE_ED25519
  7070. /* ED25519: 0x0807 */
  7071. else if (input[1] == ED25519_SA_MINOR) {
  7072. *hsType = ed25519_sa_algo;
  7073. /* Hash performed as part of sign/verify operation. */
  7074. *hashAlgo = sha512_mac;
  7075. }
  7076. #endif
  7077. #ifdef HAVE_ED448
  7078. /* ED448: 0x0808 */
  7079. else if (input[1] == ED448_SA_MINOR) {
  7080. *hsType = ed448_sa_algo;
  7081. /* Hash performed as part of sign/verify operation. */
  7082. *hashAlgo = sha512_mac;
  7083. }
  7084. #endif
  7085. else
  7086. ret = INVALID_PARAMETER;
  7087. break;
  7088. #ifdef HAVE_PQC
  7089. case PQC_SA_MAJOR:
  7090. #if defined(HAVE_FALCON)
  7091. if (input[1] == FALCON_LEVEL1_SA_MINOR) {
  7092. *hsType = falcon_level1_sa_algo;
  7093. /* Hash performed as part of sign/verify operation. */
  7094. *hashAlgo = sha512_mac;
  7095. } else if (input[1] == FALCON_LEVEL5_SA_MINOR) {
  7096. *hsType = falcon_level5_sa_algo;
  7097. /* Hash performed as part of sign/verify operation. */
  7098. *hashAlgo = sha512_mac;
  7099. }
  7100. else
  7101. #endif /* HAVE_FALCON */
  7102. #if defined(HAVE_DILITHIUM)
  7103. if (input[1] == DILITHIUM_LEVEL2_SA_MINOR) {
  7104. *hsType = dilithium_level2_sa_algo;
  7105. /* Hash performed as part of sign/verify operation. */
  7106. *hashAlgo = sha512_mac;
  7107. } else if (input[1] == DILITHIUM_LEVEL3_SA_MINOR) {
  7108. *hsType = dilithium_level3_sa_algo;
  7109. /* Hash performed as part of sign/verify operation. */
  7110. *hashAlgo = sha512_mac;
  7111. } else if (input[1] == DILITHIUM_LEVEL5_SA_MINOR) {
  7112. *hsType = dilithium_level5_sa_algo;
  7113. /* Hash performed as part of sign/verify operation. */
  7114. *hashAlgo = sha512_mac;
  7115. }
  7116. else
  7117. #endif /* HAVE_DILITHIUM */
  7118. {
  7119. ret = INVALID_PARAMETER;
  7120. }
  7121. break;
  7122. #endif
  7123. default:
  7124. *hashAlgo = input[0];
  7125. *hsType = input[1];
  7126. break;
  7127. }
  7128. return ret;
  7129. }
  7130. #ifdef WOLFSSL_DUAL_ALG_CERTS
  7131. /* Decode the hybrid signature algorithm.
  7132. *
  7133. * input The encoded signature algorithm.
  7134. * hashalgo The hash algorithm.
  7135. * hsType The signature type.
  7136. * returns INVALID_PARAMETER if not recognized and 0 otherwise.
  7137. */
  7138. static WC_INLINE int DecodeTls13HybridSigAlg(byte* input, byte* hashAlg,
  7139. byte *sigAlg, byte *altSigAlg)
  7140. {
  7141. if (input[0] != HYBRID_SA_MAJOR) {
  7142. return INVALID_PARAMETER;
  7143. }
  7144. if (input[1] == HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR) {
  7145. *sigAlg = ecc_dsa_sa_algo;
  7146. *hashAlg = sha256_mac;
  7147. *altSigAlg = dilithium_level2_sa_algo;
  7148. }
  7149. else if (input[1] == HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR) {
  7150. *sigAlg = rsa_pss_sa_algo;
  7151. *hashAlg = sha256_mac;
  7152. *altSigAlg = dilithium_level2_sa_algo;
  7153. }
  7154. else if (input[1] == HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR) {
  7155. *sigAlg = ecc_dsa_sa_algo;
  7156. *hashAlg = sha384_mac;
  7157. *altSigAlg = dilithium_level3_sa_algo;
  7158. }
  7159. else if (input[1] == HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR) {
  7160. *sigAlg = ecc_dsa_sa_algo;
  7161. *hashAlg = sha512_mac;
  7162. *altSigAlg = dilithium_level5_sa_algo;
  7163. }
  7164. else if (input[1] == HYBRID_P256_FALCON_LEVEL1_SA_MINOR) {
  7165. *sigAlg = ecc_dsa_sa_algo;
  7166. *hashAlg = sha256_mac;
  7167. *altSigAlg = falcon_level1_sa_algo;
  7168. }
  7169. else if (input[1] == HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR) {
  7170. *sigAlg = rsa_pss_sa_algo;
  7171. *hashAlg = sha256_mac;
  7172. *altSigAlg = falcon_level1_sa_algo;
  7173. }
  7174. else if (input[1] == HYBRID_P521_FALCON_LEVEL5_SA_MINOR) {
  7175. *sigAlg = ecc_dsa_sa_algo;
  7176. *hashAlg = sha512_mac;
  7177. *altSigAlg = falcon_level5_sa_algo;
  7178. }
  7179. else if (input[1] == HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR) {
  7180. *sigAlg = dilithium_level2_sa_algo;
  7181. *hashAlg = sha256_mac;
  7182. *altSigAlg = ecc_dsa_sa_algo;
  7183. }
  7184. else if (input[1] == HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR) {
  7185. *sigAlg = dilithium_level2_sa_algo;
  7186. *hashAlg = sha256_mac;
  7187. *altSigAlg = rsa_pss_sa_algo;
  7188. }
  7189. else if (input[1] == HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR) {
  7190. *sigAlg = dilithium_level3_sa_algo;
  7191. *hashAlg = sha384_mac;
  7192. *altSigAlg = ecc_dsa_sa_algo;
  7193. }
  7194. else if (input[1] == HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR) {
  7195. *sigAlg = dilithium_level5_sa_algo;
  7196. *hashAlg = sha512_mac;
  7197. *altSigAlg = ecc_dsa_sa_algo;
  7198. }
  7199. else if (input[1] == HYBRID_FALCON_LEVEL1_P256_SA_MINOR) {
  7200. *sigAlg = falcon_level1_sa_algo;
  7201. *hashAlg = sha256_mac;
  7202. *altSigAlg = ecc_dsa_sa_algo;
  7203. }
  7204. else if (input[1] == HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR) {
  7205. *sigAlg = falcon_level1_sa_algo;
  7206. *hashAlg = sha256_mac;
  7207. *altSigAlg = rsa_pss_sa_algo;
  7208. }
  7209. else if (input[1] == HYBRID_FALCON_LEVEL5_P521_SA_MINOR) {
  7210. *sigAlg = falcon_level5_sa_algo;
  7211. *hashAlg = sha512_mac;
  7212. *altSigAlg = ecc_dsa_sa_algo;
  7213. }
  7214. else {
  7215. return INVALID_PARAMETER;
  7216. }
  7217. return 0;
  7218. }
  7219. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  7220. /* Get the hash of the messages so far.
  7221. *
  7222. * ssl The SSL/TLS object.
  7223. * hash The buffer to write the hash to.
  7224. * returns the length of the hash.
  7225. */
  7226. static WC_INLINE int GetMsgHash(WOLFSSL* ssl, byte* hash)
  7227. {
  7228. int ret = 0;
  7229. switch (ssl->specs.mac_algorithm) {
  7230. #ifndef NO_SHA256
  7231. case sha256_mac:
  7232. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
  7233. if (ret == 0)
  7234. ret = WC_SHA256_DIGEST_SIZE;
  7235. break;
  7236. #endif /* !NO_SHA256 */
  7237. #ifdef WOLFSSL_SHA384
  7238. case sha384_mac:
  7239. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
  7240. if (ret == 0)
  7241. ret = WC_SHA384_DIGEST_SIZE;
  7242. break;
  7243. #endif /* WOLFSSL_SHA384 */
  7244. #ifdef WOLFSSL_TLS13_SHA512
  7245. case sha512_mac:
  7246. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512, hash);
  7247. if (ret == 0)
  7248. ret = WC_SHA512_DIGEST_SIZE;
  7249. break;
  7250. #endif /* WOLFSSL_TLS13_SHA512 */
  7251. #ifdef WOLFSSL_SM3
  7252. case sm3_mac:
  7253. ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
  7254. if (ret == 0)
  7255. ret = WC_SM3_DIGEST_SIZE;
  7256. break;
  7257. #endif /* WOLFSSL_SM3 */
  7258. default:
  7259. break;
  7260. }
  7261. return ret;
  7262. }
  7263. /* The server certificate verification label. */
  7264. static const byte serverCertVfyLabel[CERT_VFY_LABEL_SZ] =
  7265. "TLS 1.3, server CertificateVerify";
  7266. /* The client certificate verification label. */
  7267. static const byte clientCertVfyLabel[CERT_VFY_LABEL_SZ] =
  7268. "TLS 1.3, client CertificateVerify";
  7269. /* The prefix byte in the signature data. */
  7270. #define SIGNING_DATA_PREFIX_BYTE 0x20
  7271. /* Create the signature data for TLS v1.3 certificate verification.
  7272. *
  7273. * ssl The SSL/TLS object.
  7274. * sigData The signature data.
  7275. * sigDataSz The length of the signature data.
  7276. * check Indicates this is a check not create.
  7277. */
  7278. int CreateSigData(WOLFSSL* ssl, byte* sigData, word16* sigDataSz,
  7279. int check)
  7280. {
  7281. word16 idx;
  7282. int side = ssl->options.side;
  7283. int ret;
  7284. /* Signature Data = Prefix | Label | Handshake Hash */
  7285. XMEMSET(sigData, SIGNING_DATA_PREFIX_BYTE, SIGNING_DATA_PREFIX_SZ);
  7286. idx = SIGNING_DATA_PREFIX_SZ;
  7287. if ((side == WOLFSSL_SERVER_END && check) ||
  7288. (side == WOLFSSL_CLIENT_END && !check)) {
  7289. XMEMCPY(&sigData[idx], clientCertVfyLabel, CERT_VFY_LABEL_SZ);
  7290. }
  7291. if ((side == WOLFSSL_CLIENT_END && check) ||
  7292. (side == WOLFSSL_SERVER_END && !check)) {
  7293. XMEMCPY(&sigData[idx], serverCertVfyLabel, CERT_VFY_LABEL_SZ);
  7294. }
  7295. idx += CERT_VFY_LABEL_SZ;
  7296. ret = GetMsgHash(ssl, &sigData[idx]);
  7297. if (ret < 0)
  7298. return ret;
  7299. *sigDataSz = (word16)(idx + ret);
  7300. ret = 0;
  7301. return ret;
  7302. }
  7303. #ifndef NO_RSA
  7304. /* Encode the PKCS #1.5 RSA signature.
  7305. *
  7306. * sig The buffer to place the encoded signature into.
  7307. * sigData The data to be signed.
  7308. * sigDataSz The size of the data to be signed.
  7309. * hashAlgo The hash algorithm to use when signing.
  7310. * returns the length of the encoded signature or negative on error.
  7311. */
  7312. int CreateRSAEncodedSig(byte* sig, byte* sigData, int sigDataSz,
  7313. int sigAlgo, int hashAlgo)
  7314. {
  7315. Digest digest;
  7316. int hashSz = 0;
  7317. int ret = BAD_FUNC_ARG;
  7318. byte* hash;
  7319. (void)sigAlgo;
  7320. hash = sig;
  7321. /* Digest the signature data. */
  7322. switch (hashAlgo) {
  7323. #ifndef NO_WOLFSSL_SHA256
  7324. case sha256_mac:
  7325. ret = wc_InitSha256(&digest.sha256);
  7326. if (ret == 0) {
  7327. ret = wc_Sha256Update(&digest.sha256, sigData, sigDataSz);
  7328. if (ret == 0)
  7329. ret = wc_Sha256Final(&digest.sha256, hash);
  7330. wc_Sha256Free(&digest.sha256);
  7331. }
  7332. hashSz = WC_SHA256_DIGEST_SIZE;
  7333. break;
  7334. #endif
  7335. #ifdef WOLFSSL_SHA384
  7336. case sha384_mac:
  7337. ret = wc_InitSha384(&digest.sha384);
  7338. if (ret == 0) {
  7339. ret = wc_Sha384Update(&digest.sha384, sigData, sigDataSz);
  7340. if (ret == 0)
  7341. ret = wc_Sha384Final(&digest.sha384, hash);
  7342. wc_Sha384Free(&digest.sha384);
  7343. }
  7344. hashSz = WC_SHA384_DIGEST_SIZE;
  7345. break;
  7346. #endif
  7347. #ifdef WOLFSSL_SHA512
  7348. case sha512_mac:
  7349. ret = wc_InitSha512(&digest.sha512);
  7350. if (ret == 0) {
  7351. ret = wc_Sha512Update(&digest.sha512, sigData, sigDataSz);
  7352. if (ret == 0)
  7353. ret = wc_Sha512Final(&digest.sha512, hash);
  7354. wc_Sha512Free(&digest.sha512);
  7355. }
  7356. hashSz = WC_SHA512_DIGEST_SIZE;
  7357. break;
  7358. #endif
  7359. }
  7360. if (ret != 0)
  7361. return ret;
  7362. return hashSz;
  7363. }
  7364. #endif /* !NO_RSA */
  7365. #ifdef HAVE_ECC
  7366. /* Encode the ECC signature.
  7367. *
  7368. * sigData The data to be signed.
  7369. * sigDataSz The size of the data to be signed.
  7370. * hashAlgo The hash algorithm to use when signing.
  7371. * returns the length of the encoded signature or negative on error.
  7372. */
  7373. static int CreateECCEncodedSig(byte* sigData, int sigDataSz, int hashAlgo)
  7374. {
  7375. Digest digest;
  7376. int hashSz = 0;
  7377. int ret = BAD_FUNC_ARG;
  7378. /* Digest the signature data. */
  7379. switch (hashAlgo) {
  7380. #ifndef NO_WOLFSSL_SHA256
  7381. case sha256_mac:
  7382. ret = wc_InitSha256(&digest.sha256);
  7383. if (ret == 0) {
  7384. ret = wc_Sha256Update(&digest.sha256, sigData, sigDataSz);
  7385. if (ret == 0)
  7386. ret = wc_Sha256Final(&digest.sha256, sigData);
  7387. wc_Sha256Free(&digest.sha256);
  7388. }
  7389. hashSz = WC_SHA256_DIGEST_SIZE;
  7390. break;
  7391. #endif
  7392. #ifdef WOLFSSL_SHA384
  7393. case sha384_mac:
  7394. ret = wc_InitSha384(&digest.sha384);
  7395. if (ret == 0) {
  7396. ret = wc_Sha384Update(&digest.sha384, sigData, sigDataSz);
  7397. if (ret == 0)
  7398. ret = wc_Sha384Final(&digest.sha384, sigData);
  7399. wc_Sha384Free(&digest.sha384);
  7400. }
  7401. hashSz = WC_SHA384_DIGEST_SIZE;
  7402. break;
  7403. #endif
  7404. #ifdef WOLFSSL_SHA512
  7405. case sha512_mac:
  7406. ret = wc_InitSha512(&digest.sha512);
  7407. if (ret == 0) {
  7408. ret = wc_Sha512Update(&digest.sha512, sigData, sigDataSz);
  7409. if (ret == 0)
  7410. ret = wc_Sha512Final(&digest.sha512, sigData);
  7411. wc_Sha512Free(&digest.sha512);
  7412. }
  7413. hashSz = WC_SHA512_DIGEST_SIZE;
  7414. break;
  7415. #endif
  7416. default:
  7417. break;
  7418. }
  7419. if (ret != 0)
  7420. return ret;
  7421. return hashSz;
  7422. }
  7423. #endif /* HAVE_ECC */
  7424. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  7425. /* Check that the decrypted signature matches the encoded signature
  7426. * based on the digest of the signature data.
  7427. *
  7428. * ssl The SSL/TLS object.
  7429. * sigAlgo The signature algorithm used to generate signature.
  7430. * hashAlgo The hash algorithm used to generate signature.
  7431. * decSig The decrypted signature.
  7432. * decSigSz The size of the decrypted signature.
  7433. * returns 0 on success, otherwise failure.
  7434. */
  7435. static int CheckRSASignature(WOLFSSL* ssl, int sigAlgo, int hashAlgo,
  7436. byte* decSig, word32 decSigSz)
  7437. {
  7438. int ret = 0;
  7439. byte sigData[MAX_SIG_DATA_SZ];
  7440. word16 sigDataSz;
  7441. ret = CreateSigData(ssl, sigData, &sigDataSz, 1);
  7442. if (ret != 0)
  7443. return ret;
  7444. if (sigAlgo == rsa_pss_sa_algo) {
  7445. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  7446. word32 sigSz;
  7447. ret = ConvertHashPss(hashAlgo, &hashType, NULL);
  7448. if (ret < 0)
  7449. return ret;
  7450. /* PSS signature can be done in-place */
  7451. ret = CreateRSAEncodedSig(sigData, sigData, sigDataSz,
  7452. sigAlgo, hashAlgo);
  7453. if (ret < 0)
  7454. return ret;
  7455. sigSz = ret;
  7456. ret = wc_RsaPSS_CheckPadding(sigData, sigSz, decSig, decSigSz,
  7457. hashType);
  7458. }
  7459. return ret;
  7460. }
  7461. #endif /* !NO_RSA && WC_RSA_PSS */
  7462. #endif /* !NO_RSA || HAVE_ECC */
  7463. #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)
  7464. /* Get the next certificate from the list for writing into the TLS v1.3
  7465. * Certificate message.
  7466. *
  7467. * data The certificate list.
  7468. * length The length of the certificate data in the list.
  7469. * idx The index of the next certificate.
  7470. * returns the length of the certificate data. 0 indicates no more certificates
  7471. * in the list.
  7472. */
  7473. static word32 NextCert(byte* data, word32 length, word32* idx)
  7474. {
  7475. word32 len;
  7476. /* Is index at end of list. */
  7477. if (*idx == length)
  7478. return 0;
  7479. /* Length of the current ASN.1 encoded certificate. */
  7480. c24to32(data + *idx, &len);
  7481. /* Include the length field. */
  7482. len += 3;
  7483. /* Move index to next certificate and return the current certificate's
  7484. * length.
  7485. */
  7486. *idx += len;
  7487. return len;
  7488. }
  7489. /* Add certificate data and empty extension to output up to the fragment size.
  7490. *
  7491. * ssl SSL/TLS object.
  7492. * cert The certificate data to write out.
  7493. * len The length of the certificate data.
  7494. * extSz Length of the extension data with the certificate.
  7495. * idx The start of the certificate data to write out.
  7496. * fragSz The maximum size of this fragment.
  7497. * output The buffer to write to.
  7498. * returns the number of bytes written.
  7499. */
  7500. static word32 AddCertExt(WOLFSSL* ssl, byte* cert, word32 len, word16 extSz,
  7501. word32 idx, word32 fragSz, byte* output)
  7502. {
  7503. word32 i = 0;
  7504. word32 copySz = min(len - idx, fragSz);
  7505. if (idx < len) {
  7506. XMEMCPY(output, cert + idx, copySz);
  7507. i = copySz;
  7508. if (copySz == fragSz)
  7509. return i;
  7510. }
  7511. copySz = len + extSz - idx - i;
  7512. if (extSz == OPAQUE16_LEN) {
  7513. if (copySz <= fragSz) {
  7514. /* Empty extension */
  7515. output[i++] = 0;
  7516. output[i++] = 0;
  7517. }
  7518. }
  7519. else {
  7520. byte* certExts = ssl->buffers.certExts->buffer + idx + i - len;
  7521. /* Put out as much of the extensions' data as will fit in fragment. */
  7522. if (copySz > fragSz - i)
  7523. copySz = fragSz - i;
  7524. XMEMCPY(output + i, certExts, copySz);
  7525. i += copySz;
  7526. }
  7527. return i;
  7528. }
  7529. /* handle generation TLS v1.3 certificate (11) */
  7530. /* Send the certificate for this end and any CAs that help with validation.
  7531. * This message is always encrypted in TLS v1.3.
  7532. *
  7533. * ssl The SSL/TLS object.
  7534. * returns 0 on success, otherwise failure.
  7535. */
  7536. static int SendTls13Certificate(WOLFSSL* ssl)
  7537. {
  7538. int ret = 0;
  7539. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  7540. word16 extSz = 0;
  7541. word32 length, maxFragment;
  7542. word32 len = 0;
  7543. word32 idx = 0;
  7544. word32 offset = OPAQUE16_LEN;
  7545. byte* p = NULL;
  7546. byte certReqCtxLen = 0;
  7547. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  7548. byte* certReqCtx = NULL;
  7549. #endif
  7550. #ifdef OPENSSL_EXTRA
  7551. WOLFSSL_X509* x509 = NULL;
  7552. WOLFSSL_EVP_PKEY* pkey = NULL;
  7553. #endif
  7554. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  7555. WOLFSSL_ENTER("SendTls13Certificate");
  7556. ssl->options.buildingMsg = 1;
  7557. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  7558. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->certReqCtx != NULL) {
  7559. certReqCtxLen = ssl->certReqCtx->len;
  7560. certReqCtx = &ssl->certReqCtx->ctx;
  7561. }
  7562. #endif
  7563. #ifdef OPENSSL_EXTRA
  7564. /* call client cert callback if no cert has been loaded */
  7565. if ((ssl->ctx->CBClientCert != NULL) &&
  7566. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  7567. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  7568. if (ret == 1) {
  7569. if ((wolfSSL_CTX_use_certificate(ssl->ctx, x509) == WOLFSSL_SUCCESS) &&
  7570. (wolfSSL_CTX_use_PrivateKey(ssl->ctx, pkey) == WOLFSSL_SUCCESS)) {
  7571. ssl->options.sendVerify = SEND_CERT;
  7572. }
  7573. wolfSSL_X509_free(x509);
  7574. wolfSSL_EVP_PKEY_free(pkey);
  7575. }
  7576. }
  7577. #endif
  7578. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  7579. certSz = 0;
  7580. certChainSz = 0;
  7581. headerSz = OPAQUE8_LEN + certReqCtxLen + CERT_HEADER_SZ;
  7582. length = headerSz;
  7583. listSz = 0;
  7584. }
  7585. else {
  7586. if (!ssl->buffers.certificate) {
  7587. WOLFSSL_MSG("Send Cert missing certificate buffer");
  7588. return BUFFER_ERROR;
  7589. }
  7590. /* Certificate Data */
  7591. certSz = ssl->buffers.certificate->length;
  7592. /* Cert Req Ctx Len | Cert Req Ctx | Cert List Len | Cert Data Len */
  7593. headerSz = OPAQUE8_LEN + certReqCtxLen + CERT_HEADER_SZ +
  7594. CERT_HEADER_SZ;
  7595. ret = TLSX_GetResponseSize(ssl, certificate, &extSz);
  7596. if (ret < 0)
  7597. return ret;
  7598. /* Create extensions' data if none already present. */
  7599. if (extSz > OPAQUE16_LEN && ssl->buffers.certExts == NULL) {
  7600. ret = AllocDer(&ssl->buffers.certExts, extSz, CERT_TYPE, ssl->heap);
  7601. if (ret < 0)
  7602. return ret;
  7603. extSz = 0;
  7604. ret = TLSX_WriteResponse(ssl, ssl->buffers.certExts->buffer,
  7605. certificate, &extSz);
  7606. if (ret < 0)
  7607. return ret;
  7608. }
  7609. /* Length of message data with one certificate and extensions. */
  7610. length = headerSz + certSz + extSz;
  7611. /* Length of list data with one certificate and extensions. */
  7612. listSz = CERT_HEADER_SZ + certSz + extSz;
  7613. /* Send rest of chain if sending cert (chain has leading size/s). */
  7614. if (certSz > 0 && ssl->buffers.certChainCnt > 0) {
  7615. p = ssl->buffers.certChain->buffer;
  7616. /* Chain length including extensions. */
  7617. certChainSz = ssl->buffers.certChain->length +
  7618. OPAQUE16_LEN * ssl->buffers.certChainCnt;
  7619. length += certChainSz;
  7620. listSz += certChainSz;
  7621. }
  7622. else
  7623. certChainSz = 0;
  7624. }
  7625. payloadSz = length;
  7626. if (ssl->fragOffset != 0)
  7627. length -= (ssl->fragOffset + headerSz);
  7628. maxFragment = wolfSSL_GetMaxFragSize(ssl, MAX_RECORD_SIZE);
  7629. while (length > 0 && ret == 0) {
  7630. byte* output = NULL;
  7631. word32 fragSz = 0;
  7632. word32 i = RECORD_HEADER_SZ;
  7633. int sendSz = RECORD_HEADER_SZ;
  7634. #ifdef WOLFSSL_DTLS13
  7635. if (ssl->options.dtls) {
  7636. i = Dtls13GetRlHeaderLength(ssl, 1);
  7637. sendSz = (int)i;
  7638. }
  7639. #endif /* WOLFSSL_DTLS13 */
  7640. if (ssl->fragOffset == 0) {
  7641. if (headerSz + certSz + extSz + certChainSz <=
  7642. maxFragment - HANDSHAKE_HEADER_SZ) {
  7643. fragSz = headerSz + certSz + extSz + certChainSz;
  7644. }
  7645. #ifdef WOLFSSL_DTLS13
  7646. else if (ssl->options.dtls){
  7647. /* short-circuit the fragmentation logic here. DTLS
  7648. fragmentation will be done in dtls13HandshakeSend() */
  7649. fragSz = headerSz + certSz + extSz + certChainSz;
  7650. }
  7651. #endif /* WOLFSSL_DTLS13 */
  7652. else {
  7653. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  7654. }
  7655. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  7656. i += HANDSHAKE_HEADER_SZ;
  7657. #ifdef WOLFSSL_DTLS13
  7658. if (ssl->options.dtls) {
  7659. sendSz += DTLS_HANDSHAKE_EXTRA;
  7660. i += DTLS_HANDSHAKE_EXTRA;
  7661. }
  7662. #endif /* WOLFSSL_DTLS13 */
  7663. }
  7664. else {
  7665. fragSz = min(length, maxFragment);
  7666. sendSz += fragSz;
  7667. }
  7668. sendSz += MAX_MSG_EXTRA;
  7669. /* Check buffers are big enough and grow if needed. */
  7670. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  7671. return ret;
  7672. /* Get position in output buffer to write new message to. */
  7673. output = GetOutputBuffer(ssl);
  7674. if (ssl->fragOffset == 0) {
  7675. AddTls13FragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  7676. /* Request context. */
  7677. output[i++] = certReqCtxLen;
  7678. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  7679. if (certReqCtxLen > 0) {
  7680. XMEMCPY(output + i, certReqCtx, certReqCtxLen);
  7681. i += certReqCtxLen;
  7682. }
  7683. #endif
  7684. length -= OPAQUE8_LEN + certReqCtxLen;
  7685. fragSz -= OPAQUE8_LEN + certReqCtxLen;
  7686. /* Certificate list length. */
  7687. c32to24(listSz, output + i);
  7688. i += CERT_HEADER_SZ;
  7689. length -= CERT_HEADER_SZ;
  7690. fragSz -= CERT_HEADER_SZ;
  7691. /* Leaf certificate data length. */
  7692. if (certSz > 0) {
  7693. c32to24(certSz, output + i);
  7694. i += CERT_HEADER_SZ;
  7695. length -= CERT_HEADER_SZ;
  7696. fragSz -= CERT_HEADER_SZ;
  7697. }
  7698. }
  7699. else
  7700. AddTls13RecordHeader(output, fragSz, handshake, ssl);
  7701. if (certSz > 0 && ssl->fragOffset < certSz + extSz) {
  7702. /* Put in the leaf certificate with extensions. */
  7703. word32 copySz = AddCertExt(ssl, ssl->buffers.certificate->buffer,
  7704. certSz, extSz, ssl->fragOffset, fragSz, output + i);
  7705. i += copySz;
  7706. ssl->fragOffset += copySz;
  7707. length -= copySz;
  7708. fragSz -= copySz;
  7709. if (ssl->fragOffset == certSz + extSz)
  7710. FreeDer(&ssl->buffers.certExts);
  7711. }
  7712. if (certChainSz > 0 && fragSz > 0) {
  7713. /* Put in the CA certificates with empty extensions. */
  7714. while (fragSz > 0) {
  7715. word32 l;
  7716. if (offset == len + OPAQUE16_LEN) {
  7717. /* Find next CA certificate to write out. */
  7718. offset = 0;
  7719. /* Point to the start of current cert in chain buffer. */
  7720. p = ssl->buffers.certChain->buffer + idx;
  7721. len = NextCert(ssl->buffers.certChain->buffer,
  7722. ssl->buffers.certChain->length, &idx);
  7723. if (len == 0)
  7724. break;
  7725. }
  7726. /* Write out certificate and empty extension. */
  7727. l = AddCertExt(ssl, p, len, OPAQUE16_LEN, offset, fragSz,
  7728. output + i);
  7729. i += l;
  7730. ssl->fragOffset += l;
  7731. length -= l;
  7732. fragSz -= l;
  7733. offset += l;
  7734. }
  7735. }
  7736. if ((int)i - RECORD_HEADER_SZ < 0) {
  7737. WOLFSSL_MSG("Send Cert bad inputSz");
  7738. return BUFFER_E;
  7739. }
  7740. #ifdef WOLFSSL_DTLS13
  7741. if (ssl->options.dtls) {
  7742. /* DTLS1.3 uses a separate variable and logic for fragments */
  7743. ssl->options.buildingMsg = 0;
  7744. ssl->fragOffset = 0;
  7745. ret = Dtls13HandshakeSend(ssl, output, (word16)sendSz, (word16)i,
  7746. certificate, 1);
  7747. }
  7748. else
  7749. #endif /* WOLFSSL_DTLS13 */
  7750. {
  7751. /* This message is always encrypted. */
  7752. sendSz = BuildTls13Message(ssl, output, sendSz,
  7753. output + RECORD_HEADER_SZ, i - RECORD_HEADER_SZ, handshake, 1,
  7754. 0, 0);
  7755. if (sendSz < 0)
  7756. return sendSz;
  7757. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  7758. if (ssl->hsInfoOn)
  7759. AddPacketName(ssl, "Certificate");
  7760. if (ssl->toInfoOn) {
  7761. ret = AddPacketInfo(ssl, "Certificate", handshake, output,
  7762. sendSz, WRITE_PROTO, 0, ssl->heap);
  7763. if (ret != 0)
  7764. return ret;
  7765. }
  7766. #endif
  7767. ssl->buffers.outputBuffer.length += sendSz;
  7768. ssl->options.buildingMsg = 0;
  7769. if (!ssl->options.groupMessages)
  7770. ret = SendBuffered(ssl);
  7771. }
  7772. }
  7773. if (ret != WANT_WRITE) {
  7774. /* Clean up the fragment offset. */
  7775. ssl->options.buildingMsg = 0;
  7776. ssl->fragOffset = 0;
  7777. if (ssl->options.side == WOLFSSL_SERVER_END)
  7778. ssl->options.serverState = SERVER_CERT_COMPLETE;
  7779. }
  7780. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  7781. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->certReqCtx != NULL) {
  7782. CertReqCtx* ctx = ssl->certReqCtx;
  7783. ssl->certReqCtx = ssl->certReqCtx->next;
  7784. XFREE(ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  7785. }
  7786. #endif
  7787. WOLFSSL_LEAVE("SendTls13Certificate", ret);
  7788. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  7789. return ret;
  7790. }
  7791. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  7792. defined(HAVE_ED448) || defined(HAVE_PQC)) && \
  7793. (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH))
  7794. typedef struct Scv13Args {
  7795. byte* output; /* not allocated */
  7796. byte* verify; /* not allocated */
  7797. word32 idx;
  7798. word32 sigLen;
  7799. int sendSz;
  7800. word16 length;
  7801. byte sigAlgo;
  7802. byte* sigData;
  7803. word16 sigDataSz;
  7804. #ifdef WOLFSSL_DUAL_ALG_CERTS
  7805. byte altSigAlgo;
  7806. word32 altSigLen; /* Only used in the case of both native and alt. */
  7807. byte* altSigData;
  7808. word16 altSigDataSz;
  7809. #endif
  7810. } Scv13Args;
  7811. static void FreeScv13Args(WOLFSSL* ssl, void* pArgs)
  7812. {
  7813. Scv13Args* args = (Scv13Args*)pArgs;
  7814. (void)ssl;
  7815. if (args && args->sigData) {
  7816. XFREE(args->sigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  7817. args->sigData = NULL;
  7818. }
  7819. #ifdef WOLFSSL_DUAL_ALG_CERTS
  7820. if (args && args->altSigData != NULL) {
  7821. XFREE(args->altSigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  7822. args->altSigData = NULL;
  7823. }
  7824. #endif
  7825. }
  7826. /* handle generation TLS v1.3 certificate_verify (15) */
  7827. /* Send the TLS v1.3 CertificateVerify message.
  7828. * A hash of all the message so far is used.
  7829. * The signed data is:
  7830. * 0x20 * 64 | context string | 0x00 | hash of messages
  7831. * This message is always encrypted in TLS v1.3.
  7832. *
  7833. * ssl The SSL/TLS object.
  7834. * returns 0 on success, otherwise failure.
  7835. */
  7836. static int SendTls13CertificateVerify(WOLFSSL* ssl)
  7837. {
  7838. int ret = 0;
  7839. #ifndef NO_RSA
  7840. /* Use this as a temporary buffer for RSA signature verification. */
  7841. buffer* rsaSigBuf = &ssl->buffers.sig;
  7842. #endif
  7843. #ifdef WOLFSSL_ASYNC_CRYPT
  7844. Scv13Args* args = NULL;
  7845. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  7846. #else
  7847. Scv13Args args[1];
  7848. #endif
  7849. #ifdef WOLFSSL_DTLS13
  7850. int recordLayerHdrExtra;
  7851. #endif /* WOLFSSL_DTLS13 */
  7852. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  7853. WOLFSSL_ENTER("SendTls13CertificateVerify");
  7854. ssl->options.buildingMsg = 1;
  7855. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  7856. ret = tsip_Tls13SendCertVerify(ssl);
  7857. if (ret != CRYPTOCB_UNAVAILABLE) {
  7858. goto exit_scv;
  7859. }
  7860. ret = 0;
  7861. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  7862. #ifdef WOLFSSL_DTLS13
  7863. /* can be negative */
  7864. if (ssl->options.dtls)
  7865. recordLayerHdrExtra = Dtls13GetRlHeaderLength(ssl, 1) - RECORD_HEADER_SZ;
  7866. else
  7867. recordLayerHdrExtra = 0;
  7868. #endif /* WOLFSSL_DTLS13 */
  7869. #ifdef WOLFSSL_ASYNC_CRYPT
  7870. if (ssl->async == NULL) {
  7871. ssl->async = (struct WOLFSSL_ASYNC*)
  7872. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  7873. DYNAMIC_TYPE_ASYNC);
  7874. if (ssl->async == NULL)
  7875. ERROR_OUT(MEMORY_E, exit_scv);
  7876. }
  7877. args = (Scv13Args*)ssl->async->args;
  7878. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  7879. if (ret != WC_NO_PENDING_E) {
  7880. /* Check for error */
  7881. if (ret < 0)
  7882. goto exit_scv;
  7883. }
  7884. else
  7885. #endif
  7886. {
  7887. /* Reset state */
  7888. ret = 0;
  7889. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  7890. XMEMSET(args, 0, sizeof(Scv13Args));
  7891. #ifdef WOLFSSL_ASYNC_CRYPT
  7892. ssl->async->freeArgs = FreeScv13Args;
  7893. #endif
  7894. }
  7895. switch(ssl->options.asyncState)
  7896. {
  7897. case TLS_ASYNC_BEGIN:
  7898. {
  7899. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  7900. return 0; /* sent blank cert, can't verify */
  7901. }
  7902. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  7903. /* Always encrypted. */
  7904. args->sendSz += MAX_MSG_EXTRA;
  7905. /* check for available size */
  7906. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  7907. goto exit_scv;
  7908. }
  7909. /* get output buffer */
  7910. args->output = GetOutputBuffer(ssl);
  7911. /* Advance state and proceed */
  7912. ssl->options.asyncState = TLS_ASYNC_BUILD;
  7913. } /* case TLS_ASYNC_BEGIN */
  7914. FALL_THROUGH;
  7915. case TLS_ASYNC_BUILD:
  7916. {
  7917. int rem = ssl->buffers.outputBuffer.bufferSize
  7918. - ssl->buffers.outputBuffer.length
  7919. - RECORD_HEADER_SZ - HANDSHAKE_HEADER_SZ;
  7920. /* idx is used to track verify pointer offset to output */
  7921. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  7922. args->verify =
  7923. &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  7924. #ifdef WOLFSSL_DTLS13
  7925. if (ssl->options.dtls) {
  7926. rem -= recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
  7927. args->idx += recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
  7928. args->verify += recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
  7929. }
  7930. #endif /* WOLFSSL_DTLS13 */
  7931. if (ssl->buffers.key == NULL) {
  7932. #ifdef HAVE_PK_CALLBACKS
  7933. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  7934. args->length = (word16)GetPrivateKeySigSize(ssl);
  7935. else
  7936. #endif
  7937. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  7938. }
  7939. else {
  7940. #ifdef WOLFSSL_DUAL_ALG_CERTS
  7941. if (ssl->sigSpec != NULL &&
  7942. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) {
  7943. /* In the case of alternative, we swap in the alt. */
  7944. if (ssl->buffers.altKey == NULL) {
  7945. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  7946. }
  7947. ssl->buffers.keyType = ssl->buffers.altKeyType;
  7948. ssl->buffers.keySz = ssl->buffers.altKeySz;
  7949. /* If we own it, free key before overriding it. */
  7950. if (ssl->buffers.weOwnKey) {
  7951. FreeDer(&ssl->buffers.key);
  7952. }
  7953. /* Swap keys */
  7954. ssl->buffers.key = ssl->buffers.altKey;
  7955. ssl->buffers.weOwnKey = ssl->buffers.weOwnAltKey;
  7956. }
  7957. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  7958. ret = DecodePrivateKey(ssl, &args->sigLen);
  7959. if (ret != 0)
  7960. goto exit_scv;
  7961. }
  7962. if (rem < 0 || (int)args->sigLen > rem) {
  7963. ERROR_OUT(BUFFER_E, exit_scv);
  7964. }
  7965. if (args->sigLen == 0) {
  7966. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  7967. }
  7968. /* Add signature algorithm. */
  7969. if (ssl->hsType == DYNAMIC_TYPE_RSA)
  7970. args->sigAlgo = rsa_pss_sa_algo;
  7971. #ifdef HAVE_ECC
  7972. else if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  7973. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  7974. if (ssl->buffers.keyType == sm2_sa_algo) {
  7975. args->sigAlgo = sm2_sa_algo;
  7976. }
  7977. else
  7978. #endif
  7979. {
  7980. args->sigAlgo = ecc_dsa_sa_algo;
  7981. }
  7982. }
  7983. #endif
  7984. #ifdef HAVE_ED25519
  7985. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  7986. args->sigAlgo = ed25519_sa_algo;
  7987. #endif
  7988. #ifdef HAVE_ED448
  7989. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  7990. args->sigAlgo = ed448_sa_algo;
  7991. #endif
  7992. #if defined(HAVE_PQC)
  7993. #if defined(HAVE_FALCON)
  7994. else if (ssl->hsType == DYNAMIC_TYPE_FALCON) {
  7995. falcon_key* fkey = (falcon_key*)ssl->hsKey;
  7996. byte level = 0;
  7997. if (wc_falcon_get_level(fkey, &level) != 0) {
  7998. ERROR_OUT(ALGO_ID_E, exit_scv);
  7999. }
  8000. if (level == 1) {
  8001. args->sigAlgo = falcon_level1_sa_algo;
  8002. }
  8003. else if (level == 5) {
  8004. args->sigAlgo = falcon_level5_sa_algo;
  8005. }
  8006. else {
  8007. ERROR_OUT(ALGO_ID_E, exit_scv);
  8008. }
  8009. }
  8010. #endif /* HAVE_FALCON */
  8011. #if defined(HAVE_DILITHIUM)
  8012. else if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) {
  8013. dilithium_key* fkey = (dilithium_key*)ssl->hsKey;
  8014. byte level = 0;
  8015. if (wc_dilithium_get_level(fkey, &level) != 0) {
  8016. ERROR_OUT(ALGO_ID_E, exit_scv);
  8017. }
  8018. if (level == 2) {
  8019. args->sigAlgo = dilithium_level2_sa_algo;
  8020. }
  8021. else if (level == 3) {
  8022. args->sigAlgo = dilithium_level3_sa_algo;
  8023. }
  8024. else if (level == 5) {
  8025. args->sigAlgo = dilithium_level5_sa_algo;
  8026. }
  8027. else {
  8028. ERROR_OUT(ALGO_ID_E, exit_scv);
  8029. }
  8030. }
  8031. #endif /* HAVE_DILITHIUM */
  8032. #endif /* HAVE_PQC */
  8033. else {
  8034. ERROR_OUT(ALGO_ID_E, exit_scv);
  8035. }
  8036. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8037. if (ssl->peerSigSpec == NULL) {
  8038. /* The peer did not respond. We didn't send CKS or they don't
  8039. * support it. Either way, we do not need to handle dual
  8040. * key/sig case. */
  8041. ssl->sigSpec = NULL;
  8042. ssl->sigSpecSz = 0;
  8043. }
  8044. if (ssl->sigSpec != NULL &&
  8045. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
  8046. /* The native was already decoded. Now we need to do the
  8047. * alternative. Note that no swap was done because this case is
  8048. * both native and alternative, not just alternative. */
  8049. if (ssl->ctx->altPrivateKey == NULL) {
  8050. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  8051. }
  8052. /* After this call, args->altSigLen has the length we need for
  8053. * the alternative signature. */
  8054. ret = DecodeAltPrivateKey(ssl, &args->altSigLen);
  8055. if (ret != 0)
  8056. goto exit_scv;
  8057. if (ssl->buffers.altKeyType == ecc_dsa_sa_algo ||
  8058. ssl->buffers.altKeyType == falcon_level1_sa_algo ||
  8059. ssl->buffers.altKeyType == falcon_level5_sa_algo ||
  8060. ssl->buffers.altKeyType == dilithium_level2_sa_algo ||
  8061. ssl->buffers.altKeyType == dilithium_level3_sa_algo ||
  8062. ssl->buffers.altKeyType == dilithium_level5_sa_algo) {
  8063. args->altSigAlgo = ssl->buffers.altKeyType;
  8064. }
  8065. else if (ssl->buffers.altKeyType == rsa_sa_algo &&
  8066. ssl->hsAltType == DYNAMIC_TYPE_RSA) {
  8067. args->altSigAlgo = rsa_pss_sa_algo;
  8068. }
  8069. else {
  8070. ERROR_OUT(ALGO_ID_E, exit_scv);
  8071. }
  8072. EncodeDualSigAlg(args->sigAlgo, args->altSigAlgo, args->verify);
  8073. if (args->verify[0] == 0) {
  8074. ERROR_OUT(ALGO_ID_E, exit_scv);
  8075. }
  8076. }
  8077. else
  8078. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8079. EncodeSigAlg(ssl->options.hashAlgo, args->sigAlgo,
  8080. args->verify);
  8081. if (args->sigData == NULL) {
  8082. word32 sigLen = MAX_SIG_DATA_SZ;
  8083. if ((ssl->hsType == DYNAMIC_TYPE_RSA) &&
  8084. (args->sigLen > MAX_SIG_DATA_SZ)) {
  8085. /* We store the RSA signature in the sigData buffer
  8086. * temporarly, hence its size must be fitting. */
  8087. sigLen = args->sigLen;
  8088. }
  8089. args->sigData = (byte*)XMALLOC(sigLen, ssl->heap,
  8090. DYNAMIC_TYPE_SIGNATURE);
  8091. if (args->sigData == NULL) {
  8092. ERROR_OUT(MEMORY_E, exit_scv);
  8093. }
  8094. }
  8095. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8096. if ((ssl->sigSpec != NULL) &&
  8097. (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) &&
  8098. (args->altSigData == NULL)) {
  8099. word32 sigLen = MAX_SIG_DATA_SZ;
  8100. if (ssl->hsAltType == DYNAMIC_TYPE_RSA &&
  8101. args->altSigLen > MAX_SIG_DATA_SZ) {
  8102. /* We store the RSA signature in the sigData buffer
  8103. * temporarly, hence its size must be fitting. */
  8104. sigLen = args->altSigLen;
  8105. }
  8106. args->altSigData = (byte*)XMALLOC(sigLen, ssl->heap,
  8107. DYNAMIC_TYPE_SIGNATURE);
  8108. if (args->altSigData == NULL) {
  8109. ERROR_OUT(MEMORY_E, exit_scv);
  8110. }
  8111. }
  8112. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8113. /* Create the data to be signed. */
  8114. ret = CreateSigData(ssl, args->sigData, &args->sigDataSz, 0);
  8115. if (ret != 0)
  8116. goto exit_scv;
  8117. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8118. if ((ssl->sigSpec != NULL) &&
  8119. (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH)) {
  8120. XMEMCPY(args->altSigData, args->sigData, args->sigDataSz);
  8121. args->altSigDataSz = args->sigDataSz;
  8122. }
  8123. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8124. #ifndef NO_RSA
  8125. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  8126. /* build encoded signature buffer */
  8127. rsaSigBuf->length = WC_MAX_DIGEST_SIZE;
  8128. rsaSigBuf->buffer = (byte*)XMALLOC(rsaSigBuf->length, ssl->heap,
  8129. DYNAMIC_TYPE_SIGNATURE);
  8130. if (rsaSigBuf->buffer == NULL) {
  8131. ERROR_OUT(MEMORY_E, exit_scv);
  8132. }
  8133. ret = CreateRSAEncodedSig(rsaSigBuf->buffer, args->sigData,
  8134. args->sigDataSz, args->sigAlgo, ssl->options.hashAlgo);
  8135. if (ret < 0)
  8136. goto exit_scv;
  8137. rsaSigBuf->length = ret;
  8138. ret = 0;
  8139. }
  8140. #endif /* !NO_RSA */
  8141. #ifdef HAVE_ECC
  8142. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  8143. args->sigLen = args->sendSz - args->idx - HASH_SIG_SIZE -
  8144. VERIFY_HEADER;
  8145. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  8146. if (ssl->buffers.keyType != sm2_sa_algo)
  8147. #endif
  8148. {
  8149. ret = CreateECCEncodedSig(args->sigData,
  8150. args->sigDataSz, ssl->options.hashAlgo);
  8151. if (ret < 0)
  8152. goto exit_scv;
  8153. args->sigDataSz = (word16)ret;
  8154. ret = 0;
  8155. }
  8156. }
  8157. #endif /* HAVE_ECC */
  8158. #ifdef HAVE_ED25519
  8159. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  8160. ret = Ed25519CheckPubKey(ssl);
  8161. if (ret < 0) {
  8162. ERROR_OUT(ret, exit_scv);
  8163. }
  8164. args->sigLen = ED25519_SIG_SIZE;
  8165. }
  8166. #endif /* HAVE_ED25519 */
  8167. #ifdef HAVE_ED448
  8168. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  8169. ret = Ed448CheckPubKey(ssl);
  8170. if (ret < 0) {
  8171. ERROR_OUT(ret, exit_scv);
  8172. }
  8173. args->sigLen = ED448_SIG_SIZE;
  8174. }
  8175. #endif /* HAVE_ED448 */
  8176. #if defined(HAVE_PQC)
  8177. #if defined(HAVE_FALCON)
  8178. if (ssl->hsType == DYNAMIC_TYPE_FALCON) {
  8179. args->sigLen = FALCON_MAX_SIG_SIZE;
  8180. }
  8181. #endif /* HAVE_FALCON */
  8182. #if defined(HAVE_DILITHIUM)
  8183. if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) {
  8184. args->sigLen = DILITHIUM_MAX_SIG_SIZE;
  8185. }
  8186. #endif /* HAVE_DILITHIUM */
  8187. #endif /* HAVE_PQC */
  8188. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8189. if (ssl->sigSpec != NULL &&
  8190. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
  8191. #ifndef NO_RSA
  8192. if (ssl->hsAltType == DYNAMIC_TYPE_RSA) {
  8193. /* build encoded signature buffer */
  8194. rsaSigBuf->length = WC_MAX_DIGEST_SIZE;
  8195. rsaSigBuf->buffer = (byte*)XMALLOC(rsaSigBuf->length,
  8196. ssl->heap,
  8197. DYNAMIC_TYPE_SIGNATURE);
  8198. if (rsaSigBuf->buffer == NULL) {
  8199. ERROR_OUT(MEMORY_E, exit_scv);
  8200. }
  8201. ret = CreateRSAEncodedSig(rsaSigBuf->buffer,
  8202. args->altSigData, args->altSigDataSz,
  8203. args->altSigAlgo, ssl->options.hashAlgo);
  8204. if (ret < 0)
  8205. goto exit_scv;
  8206. rsaSigBuf->length = ret;
  8207. ret = 0;
  8208. }
  8209. #endif /* !NO_RSA */
  8210. #ifdef HAVE_ECC
  8211. if (ssl->hsAltType == DYNAMIC_TYPE_ECC) {
  8212. ret = CreateECCEncodedSig(args->altSigData,
  8213. args->altSigDataSz, ssl->options.hashAlgo);
  8214. if (ret < 0)
  8215. goto exit_scv;
  8216. args->altSigDataSz = (word16)ret;
  8217. ret = 0;
  8218. }
  8219. #endif /* HAVE_ECC */
  8220. }
  8221. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8222. /* Advance state and proceed */
  8223. ssl->options.asyncState = TLS_ASYNC_DO;
  8224. } /* case TLS_ASYNC_BUILD */
  8225. FALL_THROUGH;
  8226. case TLS_ASYNC_DO:
  8227. {
  8228. byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER;
  8229. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8230. if (ssl->sigSpec != NULL &&
  8231. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
  8232. /* As we have two signatures in the message, we store
  8233. * the length of each before the actual signature. This
  8234. * is necessary, as we could have two algorithms with
  8235. * variable length signatures. */
  8236. sigOut += OPAQUE16_LEN;
  8237. }
  8238. #endif
  8239. #ifdef HAVE_ECC
  8240. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  8241. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  8242. if (ssl->buffers.keyType == sm2_sa_algo) {
  8243. ret = Sm2wSm3Sign(ssl, TLS13_SM2_SIG_ID,
  8244. TLS13_SM2_SIG_ID_SZ, args->sigData, args->sigDataSz,
  8245. sigOut, &args->sigLen, (ecc_key*)ssl->hsKey, NULL);
  8246. }
  8247. else
  8248. #endif
  8249. {
  8250. ret = EccSign(ssl, args->sigData, args->sigDataSz,
  8251. sigOut, &args->sigLen, (ecc_key*)ssl->hsKey,
  8252. #ifdef HAVE_PK_CALLBACKS
  8253. ssl->buffers.key
  8254. #else
  8255. NULL
  8256. #endif
  8257. );
  8258. }
  8259. args->length = (word16)args->sigLen;
  8260. }
  8261. #endif /* HAVE_ECC */
  8262. #ifdef HAVE_ED25519
  8263. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  8264. ret = Ed25519Sign(ssl, args->sigData, args->sigDataSz,
  8265. sigOut, &args->sigLen, (ed25519_key*)ssl->hsKey,
  8266. #ifdef HAVE_PK_CALLBACKS
  8267. ssl->buffers.key
  8268. #else
  8269. NULL
  8270. #endif
  8271. );
  8272. args->length = (word16)args->sigLen;
  8273. }
  8274. #endif
  8275. #ifdef HAVE_ED448
  8276. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  8277. ret = Ed448Sign(ssl, args->sigData, args->sigDataSz,
  8278. sigOut, &args->sigLen, (ed448_key*)ssl->hsKey,
  8279. #ifdef HAVE_PK_CALLBACKS
  8280. ssl->buffers.key
  8281. #else
  8282. NULL
  8283. #endif
  8284. );
  8285. args->length = (word16)args->sigLen;
  8286. }
  8287. #endif
  8288. #if defined(HAVE_PQC)
  8289. #if defined(HAVE_FALCON)
  8290. if (ssl->hsType == DYNAMIC_TYPE_FALCON) {
  8291. ret = wc_falcon_sign_msg(args->sigData, args->sigDataSz,
  8292. sigOut, &args->sigLen,
  8293. (falcon_key*)ssl->hsKey, ssl->rng);
  8294. args->length = (word16)args->sigLen;
  8295. }
  8296. #endif /* HAVE_FALCON */
  8297. #if defined(HAVE_DILITHIUM)
  8298. if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) {
  8299. ret = wc_dilithium_sign_msg(args->sigData, args->sigDataSz,
  8300. sigOut, &args->sigLen,
  8301. (dilithium_key*)ssl->hsKey, ssl->rng);
  8302. args->length = (word16)args->sigLen;
  8303. }
  8304. #endif /* HAVE_DILITHIUM */
  8305. #endif /* HAVE_PQC */
  8306. #ifndef NO_RSA
  8307. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  8308. ret = RsaSign(ssl, rsaSigBuf->buffer, (word32)rsaSigBuf->length,
  8309. sigOut, &args->sigLen, args->sigAlgo,
  8310. ssl->options.hashAlgo, (RsaKey*)ssl->hsKey,
  8311. ssl->buffers.key);
  8312. if (ret == 0) {
  8313. args->length = (word16)args->sigLen;
  8314. XMEMCPY(args->sigData, sigOut, args->sigLen);
  8315. }
  8316. }
  8317. #endif /* !NO_RSA */
  8318. /* Check for error */
  8319. if (ret != 0) {
  8320. goto exit_scv;
  8321. }
  8322. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8323. if (ssl->sigSpec != NULL &&
  8324. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
  8325. /* Add signature length for the first signature. */
  8326. c16toa((word16)args->sigLen, sigOut - OPAQUE16_LEN);
  8327. args->length += OPAQUE16_LEN;
  8328. /* Advance our pointer to where we store the alt signature.
  8329. * We also add additional space for the length field of the
  8330. * second signature. */
  8331. sigOut += args->sigLen + OPAQUE16_LEN;
  8332. /* Generate the alternative signature */
  8333. #ifdef HAVE_ECC
  8334. if (ssl->hsAltType == DYNAMIC_TYPE_ECC) {
  8335. ret = EccSign(ssl, args->altSigData, args->altSigDataSz,
  8336. sigOut, &args->altSigLen,
  8337. (ecc_key*)ssl->hsAltKey,
  8338. #ifdef HAVE_PK_CALLBACKS
  8339. ssl->buffers.altKey
  8340. #else
  8341. NULL
  8342. #endif
  8343. );
  8344. }
  8345. #endif /* HAVE_ECC */
  8346. #ifndef NO_RSA
  8347. if (ssl->hsAltType == DYNAMIC_TYPE_RSA) {
  8348. ret = RsaSign(ssl, rsaSigBuf->buffer,
  8349. (word32)rsaSigBuf->length, sigOut,
  8350. &args->altSigLen, args->altSigAlgo,
  8351. ssl->options.hashAlgo, (RsaKey*)ssl->hsAltKey,
  8352. ssl->buffers.altKey);
  8353. if (ret == 0) {
  8354. XMEMCPY(args->altSigData, sigOut, args->altSigLen);
  8355. }
  8356. }
  8357. #endif /* !NO_RSA */
  8358. #if defined(HAVE_PQC)
  8359. #if defined(HAVE_FALCON)
  8360. if (ssl->hsAltType == DYNAMIC_TYPE_FALCON) {
  8361. ret = wc_falcon_sign_msg(args->altSigData,
  8362. args->altSigDataSz, sigOut,
  8363. &args->altSigLen,
  8364. (falcon_key*)ssl->hsAltKey,
  8365. ssl->rng);
  8366. }
  8367. #endif /* HAVE_FALCON */
  8368. #if defined(HAVE_DILITHIUM)
  8369. if (ssl->hsAltType == DYNAMIC_TYPE_DILITHIUM) {
  8370. ret = wc_dilithium_sign_msg(args->altSigData,
  8371. args->altSigDataSz, sigOut,
  8372. &args->altSigLen,
  8373. (dilithium_key*)ssl->hsAltKey,
  8374. ssl->rng);
  8375. }
  8376. #endif /* HAVE_DILITHIUM */
  8377. #endif /* HAVE_PQC */
  8378. /* Check for error */
  8379. if (ret != 0) {
  8380. goto exit_scv;
  8381. }
  8382. /* Add signature length for the alternative signature. */
  8383. c16toa((word16)args->altSigLen, sigOut - OPAQUE16_LEN);
  8384. /* Add length of the alt sig to the total length */
  8385. args->length += args->altSigLen + OPAQUE16_LEN;
  8386. }
  8387. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8388. /* Add signature length. */
  8389. c16toa(args->length, args->verify + HASH_SIG_SIZE);
  8390. /* Advance state and proceed */
  8391. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  8392. } /* case TLS_ASYNC_DO */
  8393. FALL_THROUGH;
  8394. case TLS_ASYNC_VERIFY:
  8395. {
  8396. #ifndef NO_RSA
  8397. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  8398. /* check for signature faults */
  8399. ret = VerifyRsaSign(ssl, args->sigData, args->sigLen,
  8400. rsaSigBuf->buffer, (word32)rsaSigBuf->length, args->sigAlgo,
  8401. ssl->options.hashAlgo, (RsaKey*)ssl->hsKey,
  8402. ssl->buffers.key);
  8403. }
  8404. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8405. if (ssl->sigSpec != NULL &&
  8406. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
  8407. ssl->hsAltType == DYNAMIC_TYPE_RSA) {
  8408. /* check for signature faults */
  8409. ret = VerifyRsaSign(ssl, args->altSigData, args->altSigLen,
  8410. rsaSigBuf->buffer, (word32)rsaSigBuf->length,
  8411. args->altSigAlgo, ssl->options.hashAlgo,
  8412. (RsaKey*)ssl->hsAltKey, ssl->buffers.altKey);
  8413. }
  8414. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8415. #endif /* !NO_RSA */
  8416. #if defined(HAVE_ECC) && defined(WOLFSSL_CHECK_SIG_FAULTS)
  8417. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  8418. byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER;
  8419. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8420. if (ssl->sigSpec != NULL &&
  8421. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
  8422. /* Add our length offset. */
  8423. sigOut += OPAQUE16_LEN;
  8424. }
  8425. #endif
  8426. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  8427. if (ssl->buffers.keyType == sm2_sa_algo) {
  8428. ret = Sm2wSm3Verify(ssl, TLS13_SM2_SIG_ID,
  8429. TLS13_SM2_SIG_ID_SZ,
  8430. sigOut, args->sigLen, args->sigData, args->sigDataSz,
  8431. (ecc_key*)ssl->hsKey, NULL);
  8432. }
  8433. else
  8434. #endif
  8435. {
  8436. ret = EccVerify(ssl, sigOut, args->sigLen,
  8437. args->sigData, args->sigDataSz,
  8438. (ecc_key*)ssl->hsKey,
  8439. #ifdef HAVE_PK_CALLBACKS
  8440. ssl->buffers.key
  8441. #else
  8442. NULL
  8443. #endif
  8444. );
  8445. }
  8446. }
  8447. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8448. if (ssl->sigSpec != NULL &&
  8449. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
  8450. ssl->hsAltType == DYNAMIC_TYPE_ECC) {
  8451. /* check for signature faults */
  8452. byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER +
  8453. args->sigLen + OPAQUE16_LEN + OPAQUE16_LEN;
  8454. ret = EccVerify(ssl, sigOut, args->altSigLen,
  8455. args->altSigData, args->altSigDataSz,
  8456. (ecc_key*)ssl->hsAltKey,
  8457. #ifdef HAVE_PK_CALLBACKS
  8458. ssl->buffers.altKey
  8459. #else
  8460. NULL
  8461. #endif
  8462. );
  8463. }
  8464. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8465. #endif /* HAVE_ECC && WOLFSSL_CHECK_SIG_FAULTS */
  8466. /* Check for error */
  8467. if (ret != 0) {
  8468. goto exit_scv;
  8469. }
  8470. /* Advance state and proceed */
  8471. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  8472. } /* case TLS_ASYNC_VERIFY */
  8473. FALL_THROUGH;
  8474. case TLS_ASYNC_FINALIZE:
  8475. {
  8476. /* Put the record and handshake headers on. */
  8477. AddTls13Headers(args->output, args->length + HASH_SIG_SIZE +
  8478. VERIFY_HEADER, certificate_verify, ssl);
  8479. args->sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ +
  8480. args->length + HASH_SIG_SIZE + VERIFY_HEADER;
  8481. #ifdef WOLFSSL_DTLS13
  8482. if (ssl->options.dtls)
  8483. args->sendSz += recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA;
  8484. #endif /* WOLFSSL_DTLS13 */
  8485. /* Advance state and proceed */
  8486. ssl->options.asyncState = TLS_ASYNC_END;
  8487. } /* case TLS_ASYNC_FINALIZE */
  8488. FALL_THROUGH;
  8489. case TLS_ASYNC_END:
  8490. {
  8491. #ifdef WOLFSSL_DTLS13
  8492. if (ssl->options.dtls) {
  8493. ssl->options.buildingMsg = 0;
  8494. ret = Dtls13HandshakeSend(ssl, args->output,
  8495. MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA + MAX_MSG_EXTRA,
  8496. (word16)args->sendSz, certificate_verify, 1);
  8497. if (ret != 0)
  8498. goto exit_scv;
  8499. break;
  8500. }
  8501. #endif /* WOLFSSL_DTLS13 */
  8502. /* This message is always encrypted. */
  8503. ret = BuildTls13Message(ssl, args->output,
  8504. MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA,
  8505. args->output + RECORD_HEADER_SZ,
  8506. args->sendSz - RECORD_HEADER_SZ, handshake,
  8507. 1, 0, 0);
  8508. if (ret < 0) {
  8509. goto exit_scv;
  8510. }
  8511. else {
  8512. args->sendSz = ret;
  8513. ret = 0;
  8514. }
  8515. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  8516. if (ssl->hsInfoOn)
  8517. AddPacketName(ssl, "CertificateVerify");
  8518. if (ssl->toInfoOn) {
  8519. ret = AddPacketInfo(ssl, "CertificateVerify", handshake,
  8520. args->output, args->sendSz, WRITE_PROTO, 0,
  8521. ssl->heap);
  8522. if (ret != 0)
  8523. goto exit_scv;
  8524. }
  8525. #endif
  8526. ssl->buffers.outputBuffer.length += args->sendSz;
  8527. ssl->options.buildingMsg = 0;
  8528. if (!ssl->options.groupMessages)
  8529. ret = SendBuffered(ssl);
  8530. break;
  8531. }
  8532. default:
  8533. ret = INPUT_CASE_ERROR;
  8534. } /* switch(ssl->options.asyncState) */
  8535. exit_scv:
  8536. WOLFSSL_LEAVE("SendTls13CertificateVerify", ret);
  8537. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  8538. #ifdef WOLFSSL_ASYNC_CRYPT
  8539. /* Handle async operation */
  8540. if (ret == WC_PENDING_E) {
  8541. return ret;
  8542. }
  8543. #endif /* WOLFSSL_ASYNC_CRYPT */
  8544. /* Final cleanup */
  8545. FreeScv13Args(ssl, args);
  8546. FreeKeyExchange(ssl);
  8547. #ifdef WOLFSSL_ASYNC_IO
  8548. /* Cleanup async */
  8549. FreeAsyncCtx(ssl, 0);
  8550. #endif
  8551. if (ret != 0) {
  8552. WOLFSSL_ERROR_VERBOSE(ret);
  8553. }
  8554. return ret;
  8555. }
  8556. #endif
  8557. #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */
  8558. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  8559. /* handle processing TLS v1.3 certificate (11) */
  8560. /* Parse and handle a TLS v1.3 Certificate message.
  8561. *
  8562. * ssl The SSL/TLS object.
  8563. * input The message buffer.
  8564. * inOutIdx On entry, the index into the message buffer of Certificate.
  8565. * On exit, the index of byte after the Certificate message.
  8566. * totalSz The length of the current handshake message.
  8567. * returns 0 on success and otherwise failure.
  8568. */
  8569. static int DoTls13Certificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  8570. word32 totalSz)
  8571. {
  8572. int ret = 0;
  8573. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  8574. WOLFSSL_ENTER("DoTls13Certificate");
  8575. #ifdef WOLFSSL_DTLS13
  8576. if (ssl->options.dtls && ssl->options.handShakeDone) {
  8577. /* certificate needs some special care after the handshake */
  8578. ret = Dtls13RtxProcessingCertificate(
  8579. ssl, input + *inOutIdx, totalSz);
  8580. }
  8581. #endif /* WOLFSSL_DTLS13 */
  8582. if (ret == 0)
  8583. ret = ProcessPeerCerts(ssl, input, inOutIdx, totalSz);
  8584. if (ret == 0) {
  8585. #if !defined(NO_WOLFSSL_CLIENT)
  8586. if (ssl->options.side == WOLFSSL_CLIENT_END)
  8587. ssl->options.serverState = SERVER_CERT_COMPLETE;
  8588. #endif
  8589. #if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  8590. if (ssl->options.side == WOLFSSL_SERVER_END &&
  8591. ssl->options.handShakeState == HANDSHAKE_DONE) {
  8592. /* reset handshake states */
  8593. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  8594. ssl->options.acceptState = TICKET_SENT;
  8595. ssl->options.handShakeState = SERVER_FINISHED_COMPLETE;
  8596. }
  8597. #endif
  8598. }
  8599. WOLFSSL_LEAVE("DoTls13Certificate", ret);
  8600. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  8601. return ret;
  8602. }
  8603. #endif
  8604. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  8605. defined(HAVE_ED448)
  8606. typedef struct Dcv13Args {
  8607. byte* output; /* not allocated */
  8608. word32 sendSz;
  8609. word16 sz;
  8610. word32 sigSz;
  8611. word32 idx;
  8612. word32 begin;
  8613. byte* sigData;
  8614. word16 sigDataSz;
  8615. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8616. byte altSigAlgo;
  8617. byte* altSigData;
  8618. word32 altSigDataSz;
  8619. word32 altSignatureSz;
  8620. byte altPeerAuthGood;
  8621. #endif
  8622. } Dcv13Args;
  8623. static void FreeDcv13Args(WOLFSSL* ssl, void* pArgs)
  8624. {
  8625. Dcv13Args* args = (Dcv13Args*)pArgs;
  8626. if (args && args->sigData != NULL) {
  8627. XFREE(args->sigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  8628. args->sigData = NULL;
  8629. }
  8630. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8631. if (args && args->altSigData != NULL) {
  8632. XFREE(args->altSigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  8633. args->altSigData = NULL;
  8634. }
  8635. #endif
  8636. (void)ssl;
  8637. }
  8638. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8639. /* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
  8640. * RSA public key. Convert it into a usable public key. */
  8641. static int decodeRsaKey(WOLFSSL* ssl)
  8642. {
  8643. int keyRet;
  8644. word32 tmpIdx = 0;
  8645. if (ssl->peerRsaKeyPresent)
  8646. return INVALID_PARAMETER;
  8647. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  8648. if (keyRet != 0)
  8649. return PEER_KEY_ERROR;
  8650. ssl->peerRsaKeyPresent = 1;
  8651. keyRet = wc_RsaPublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
  8652. ssl->peerRsaKey,
  8653. ssl->peerCert.sapkiLen);
  8654. if (keyRet != 0)
  8655. return PEER_KEY_ERROR;
  8656. return 0;
  8657. }
  8658. /* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
  8659. * ECC public key. Convert it into a usable public key. */
  8660. static int decodeEccKey(WOLFSSL* ssl)
  8661. {
  8662. int keyRet;
  8663. word32 tmpIdx = 0;
  8664. if (ssl->peerEccDsaKeyPresent)
  8665. return INVALID_PARAMETER;
  8666. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  8667. if (keyRet != 0)
  8668. return PEER_KEY_ERROR;
  8669. ssl->peerEccDsaKeyPresent = 1;
  8670. keyRet = wc_EccPublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
  8671. ssl->peerEccDsaKey,
  8672. ssl->peerCert.sapkiLen);
  8673. if (keyRet != 0)
  8674. return PEER_KEY_ERROR;
  8675. return 0;
  8676. }
  8677. /* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
  8678. * dilithium public key. Convert it into a usable public key. */
  8679. static int decodeDilithiumKey(WOLFSSL* ssl, int level)
  8680. {
  8681. int keyRet;
  8682. word32 tmpIdx = 0;
  8683. if (ssl->peerDilithiumKeyPresent)
  8684. return INVALID_PARAMETER;
  8685. keyRet = AllocKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  8686. (void**)&ssl->peerDilithiumKey);
  8687. if (keyRet != 0)
  8688. return PEER_KEY_ERROR;
  8689. ssl->peerDilithiumKeyPresent = 1;
  8690. keyRet = wc_dilithium_set_level(ssl->peerDilithiumKey, level);
  8691. if (keyRet != 0)
  8692. return PEER_KEY_ERROR;
  8693. keyRet = wc_Dilithium_PublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
  8694. ssl->peerDilithiumKey,
  8695. ssl->peerCert.sapkiLen);
  8696. if (keyRet != 0)
  8697. return PEER_KEY_ERROR;
  8698. return 0;
  8699. }
  8700. /* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a
  8701. * falcon public key. Convert it into a usable public key. */
  8702. static int decodeFalconKey(WOLFSSL* ssl, int level)
  8703. {
  8704. int keyRet;
  8705. word32 tmpIdx = 0;
  8706. if (ssl->peerFalconKeyPresent)
  8707. return INVALID_PARAMETER;
  8708. keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  8709. if (keyRet != 0)
  8710. return PEER_KEY_ERROR;
  8711. ssl->peerFalconKeyPresent = 1;
  8712. keyRet = wc_falcon_set_level(ssl->peerFalconKey, level);
  8713. if (keyRet != 0)
  8714. return PEER_KEY_ERROR;
  8715. keyRet = wc_Falcon_PublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx,
  8716. ssl->peerFalconKey,
  8717. ssl->peerCert.sapkiLen);
  8718. if (keyRet != 0)
  8719. return PEER_KEY_ERROR;
  8720. return 0;
  8721. }
  8722. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8723. /* handle processing TLS v1.3 certificate_verify (15) */
  8724. /* Parse and handle a TLS v1.3 CertificateVerify message.
  8725. *
  8726. * ssl The SSL/TLS object.
  8727. * input The message buffer.
  8728. * inOutIdx On entry, the index into the message buffer of
  8729. * CertificateVerify.
  8730. * On exit, the index of byte after the CertificateVerify message.
  8731. * totalSz The length of the current handshake message.
  8732. * returns 0 on success and otherwise failure.
  8733. */
  8734. static int DoTls13CertificateVerify(WOLFSSL* ssl, byte* input,
  8735. word32* inOutIdx, word32 totalSz)
  8736. {
  8737. int ret = 0;
  8738. byte* sig = NULL;
  8739. #ifndef NO_RSA
  8740. /* Use this as a temporary buffer for RSA signature verification. */
  8741. buffer* rsaSigBuf = &ssl->buffers.sig;
  8742. #endif
  8743. #ifdef WOLFSSL_ASYNC_CRYPT
  8744. Dcv13Args* args = NULL;
  8745. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  8746. #else
  8747. Dcv13Args args[1];
  8748. #endif
  8749. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  8750. WOLFSSL_ENTER("DoTls13CertificateVerify");
  8751. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  8752. ret = tsip_Tls13CertificateVerify(ssl, input, inOutIdx, totalSz);
  8753. if (ret != CRYPTOCB_UNAVAILABLE) {
  8754. goto exit_dcv;
  8755. }
  8756. ret = 0;
  8757. #endif
  8758. #ifdef WOLFSSL_ASYNC_CRYPT
  8759. if (ssl->async == NULL) {
  8760. ssl->async = (struct WOLFSSL_ASYNC*)
  8761. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  8762. DYNAMIC_TYPE_ASYNC);
  8763. if (ssl->async == NULL)
  8764. ERROR_OUT(MEMORY_E, exit_dcv);
  8765. }
  8766. args = (Dcv13Args*)ssl->async->args;
  8767. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  8768. if (ret != WC_NO_PENDING_E) {
  8769. /* Check for error */
  8770. if (ret < 0)
  8771. goto exit_dcv;
  8772. }
  8773. else
  8774. #endif
  8775. {
  8776. /* Reset state */
  8777. ret = 0;
  8778. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  8779. XMEMSET(args, 0, sizeof(Dcv13Args));
  8780. ssl->options.peerHashAlgo = sha_mac;
  8781. ssl->options.peerSigAlgo = anonymous_sa_algo;
  8782. args->idx = *inOutIdx;
  8783. args->begin = *inOutIdx;
  8784. #ifdef WOLFSSL_ASYNC_CRYPT
  8785. ssl->async->freeArgs = FreeDcv13Args;
  8786. #endif
  8787. }
  8788. switch(ssl->options.asyncState)
  8789. {
  8790. case TLS_ASYNC_BEGIN:
  8791. {
  8792. #ifdef WOLFSSL_CALLBACKS
  8793. if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateVerify");
  8794. if (ssl->toInfoOn) AddLateName("CertificateVerify",
  8795. &ssl->timeoutInfo);
  8796. #endif
  8797. /* Advance state and proceed */
  8798. ssl->options.asyncState = TLS_ASYNC_BUILD;
  8799. } /* case TLS_ASYNC_BEGIN */
  8800. FALL_THROUGH;
  8801. case TLS_ASYNC_BUILD:
  8802. {
  8803. int validSigAlgo;
  8804. /* Signature algorithm. */
  8805. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > totalSz) {
  8806. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  8807. }
  8808. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8809. if (ssl->peerSigSpec == NULL) {
  8810. /* The peer did not respond. We didn't send CKS or they don't
  8811. * support it. Either way, we do not need to handle dual
  8812. * key/sig case. */
  8813. ssl->sigSpec = NULL;
  8814. ssl->sigSpecSz = 0;
  8815. }
  8816. /* If no CKS extension or either native or alternative, then just
  8817. * get a normal sigalgo. But if BOTH, then get the native and alt
  8818. * sig algos. */
  8819. if (ssl->sigSpec == NULL ||
  8820. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_NATIVE ||
  8821. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) {
  8822. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8823. ret = DecodeTls13SigAlg(input + args->idx,
  8824. &ssl->options.peerHashAlgo, &ssl->options.peerSigAlgo);
  8825. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8826. }
  8827. else {
  8828. ret = DecodeTls13HybridSigAlg(input + args->idx,
  8829. &ssl->options.peerHashAlgo,
  8830. &ssl->options.peerSigAlgo,
  8831. &args->altSigAlgo);
  8832. }
  8833. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8834. if (ret < 0)
  8835. goto exit_dcv;
  8836. args->idx += OPAQUE16_LEN;
  8837. /* Signature length. */
  8838. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  8839. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  8840. }
  8841. ato16(input + args->idx, &args->sz);
  8842. args->idx += OPAQUE16_LEN;
  8843. /* Signature data. */
  8844. if ((args->idx - args->begin) + args->sz > totalSz ||
  8845. args->sz > ENCRYPT_LEN) {
  8846. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  8847. }
  8848. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8849. if ((ssl->sigSpec != NULL) &&
  8850. (*ssl->sigSpec != WOLFSSL_CKS_SIGSPEC_NATIVE)) {
  8851. word16 sa;
  8852. if (args->altSigAlgo == 0)
  8853. sa = ssl->options.peerSigAlgo;
  8854. else
  8855. sa = args->altSigAlgo;
  8856. switch(sa) {
  8857. case rsa_pss_sa_algo:
  8858. ret = decodeRsaKey(ssl);
  8859. break;
  8860. case ecc_dsa_sa_algo:
  8861. ret = decodeEccKey(ssl);
  8862. break;
  8863. case dilithium_level2_sa_algo:
  8864. ret = decodeDilithiumKey(ssl, 2);
  8865. break;
  8866. case dilithium_level3_sa_algo:
  8867. ret = decodeDilithiumKey(ssl, 3);
  8868. break;
  8869. case dilithium_level5_sa_algo:
  8870. ret = decodeDilithiumKey(ssl, 5);
  8871. break;
  8872. case falcon_level1_sa_algo:
  8873. ret = decodeFalconKey(ssl, 1);
  8874. break;
  8875. case falcon_level5_sa_algo:
  8876. ret = decodeFalconKey(ssl, 5);
  8877. break;
  8878. default:
  8879. ERROR_OUT(PEER_KEY_ERROR, exit_dcv);
  8880. }
  8881. if (ret != 0)
  8882. ERROR_OUT(ret, exit_dcv);
  8883. if (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) {
  8884. /* Now swap in the alternative by removing the native.
  8885. * sa contains the alternative signature type. */
  8886. if (ssl->peerRsaKeyPresent && sa != rsa_pss_sa_algo) {
  8887. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  8888. (void**)&ssl->peerRsaKey);
  8889. ssl->peerRsaKeyPresent = 0;
  8890. }
  8891. else if (ssl->peerEccDsaKeyPresent &&
  8892. sa != ecc_dsa_sa_algo) {
  8893. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  8894. (void**)&ssl->peerEccDsaKey);
  8895. ssl->peerEccDsaKeyPresent = 0;
  8896. }
  8897. else if (ssl->peerDilithiumKeyPresent &&
  8898. sa != dilithium_level2_sa_algo &&
  8899. sa != dilithium_level3_sa_algo &&
  8900. sa != dilithium_level5_sa_algo) {
  8901. FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  8902. (void**)&ssl->peerDilithiumKey);
  8903. ssl->peerDilithiumKeyPresent = 0;
  8904. }
  8905. else if (ssl->peerFalconKeyPresent &&
  8906. sa != falcon_level1_sa_algo &&
  8907. sa != falcon_level5_sa_algo) {
  8908. FreeKey(ssl, DYNAMIC_TYPE_FALCON,
  8909. (void**)&ssl->peerFalconKey);
  8910. ssl->peerFalconKeyPresent = 0;
  8911. }
  8912. else {
  8913. ERROR_OUT(PEER_KEY_ERROR, exit_dcv);
  8914. }
  8915. }
  8916. }
  8917. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  8918. /* Check for public key of required type. */
  8919. /* Assume invalid unless signature algo matches the key provided */
  8920. validSigAlgo = 0;
  8921. #ifdef HAVE_ED25519
  8922. if (ssl->options.peerSigAlgo == ed25519_sa_algo) {
  8923. WOLFSSL_MSG("Peer sent ED25519 sig");
  8924. validSigAlgo = (ssl->peerEd25519Key != NULL) &&
  8925. ssl->peerEd25519KeyPresent;
  8926. }
  8927. #endif
  8928. #ifdef HAVE_ED448
  8929. if (ssl->options.peerSigAlgo == ed448_sa_algo) {
  8930. WOLFSSL_MSG("Peer sent ED448 sig");
  8931. validSigAlgo = (ssl->peerEd448Key != NULL) &&
  8932. ssl->peerEd448KeyPresent;
  8933. }
  8934. #endif
  8935. #ifdef HAVE_ECC
  8936. if (ssl->options.peerSigAlgo == ecc_dsa_sa_algo) {
  8937. WOLFSSL_MSG("Peer sent ECC sig");
  8938. validSigAlgo = (ssl->peerEccDsaKey != NULL) &&
  8939. ssl->peerEccDsaKeyPresent;
  8940. }
  8941. #endif
  8942. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  8943. if (ssl->options.peerSigAlgo == sm2_sa_algo) {
  8944. WOLFSSL_MSG("Peer sent SM2 sig");
  8945. validSigAlgo = (ssl->peerEccDsaKey != NULL) &&
  8946. ssl->peerEccDsaKeyPresent;
  8947. }
  8948. #endif
  8949. #ifdef HAVE_PQC
  8950. if (ssl->options.peerSigAlgo == falcon_level1_sa_algo) {
  8951. WOLFSSL_MSG("Peer sent Falcon Level 1 sig");
  8952. validSigAlgo = (ssl->peerFalconKey != NULL) &&
  8953. ssl->peerFalconKeyPresent;
  8954. }
  8955. if (ssl->options.peerSigAlgo == falcon_level5_sa_algo) {
  8956. WOLFSSL_MSG("Peer sent Falcon Level 5 sig");
  8957. validSigAlgo = (ssl->peerFalconKey != NULL) &&
  8958. ssl->peerFalconKeyPresent;
  8959. }
  8960. if (ssl->options.peerSigAlgo == dilithium_level2_sa_algo) {
  8961. WOLFSSL_MSG("Peer sent Dilithium Level 2 sig");
  8962. validSigAlgo = (ssl->peerDilithiumKey != NULL) &&
  8963. ssl->peerDilithiumKeyPresent;
  8964. }
  8965. if (ssl->options.peerSigAlgo == dilithium_level3_sa_algo) {
  8966. WOLFSSL_MSG("Peer sent Dilithium Level 3 sig");
  8967. validSigAlgo = (ssl->peerDilithiumKey != NULL) &&
  8968. ssl->peerDilithiumKeyPresent;
  8969. }
  8970. if (ssl->options.peerSigAlgo == dilithium_level5_sa_algo) {
  8971. WOLFSSL_MSG("Peer sent Dilithium Level 5 sig");
  8972. validSigAlgo = (ssl->peerDilithiumKey != NULL) &&
  8973. ssl->peerDilithiumKeyPresent;
  8974. }
  8975. #endif
  8976. #ifndef NO_RSA
  8977. if (ssl->options.peerSigAlgo == rsa_sa_algo) {
  8978. WOLFSSL_MSG("Peer sent PKCS#1.5 algo - not valid TLS 1.3");
  8979. ERROR_OUT(INVALID_PARAMETER, exit_dcv);
  8980. }
  8981. if (ssl->options.peerSigAlgo == rsa_pss_sa_algo) {
  8982. WOLFSSL_MSG("Peer sent RSA sig");
  8983. validSigAlgo = (ssl->peerRsaKey != NULL) &&
  8984. ssl->peerRsaKeyPresent;
  8985. }
  8986. #endif
  8987. if (!validSigAlgo) {
  8988. WOLFSSL_MSG("Sig algo doesn't correspond to certificate");
  8989. ERROR_OUT(SIG_VERIFY_E, exit_dcv);
  8990. }
  8991. args->sigSz = args->sz;
  8992. #ifdef WOLFSSL_DUAL_ALG_CERTS
  8993. if (ssl->sigSpec != NULL &&
  8994. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
  8995. /* In case we received two signatures, both of them are encoded
  8996. * with their size as 16-bit integeter prior in memory. Hence,
  8997. * we can decode both lengths here now. */
  8998. word32 tmpIdx = args->idx;
  8999. ato32(input + tmpIdx, &args->sigSz);
  9000. tmpIdx += OPAQUE16_LEN + args->sigSz;
  9001. ato32(input + tmpIdx, &args->altSignatureSz);
  9002. if (args->sz != (args->sigSz + args->altSignatureSz +
  9003. OPAQUE16_LEN + OPAQUE16_LEN)) {
  9004. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  9005. }
  9006. }
  9007. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  9008. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  9009. /* In case we have to verify an RSA signature, we have to store the
  9010. * signature in the 'rsaSigBuf' structure for further processing.
  9011. */
  9012. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  9013. word32 sigSz = args->sigSz;
  9014. sig = input + args->idx;
  9015. #ifdef WOLFSSL_DUAL_ALG_CERTS
  9016. /* Check if our alternative signature was RSA */
  9017. if (ssl->sigSpec != NULL &&
  9018. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
  9019. if (ssl->options.peerSigAlgo != rsa_pss_sa_algo) {
  9020. /* We have to skip the first signature (length field
  9021. * and signature itself) and the length field of the
  9022. * alternative signature. */
  9023. sig += OPAQUE16_LEN + OPAQUE16_LEN + args->sigSz;
  9024. sigSz = args->altSignatureSz;
  9025. }
  9026. else {
  9027. /* We have to skip the length field */
  9028. sig += OPAQUE16_LEN;
  9029. }
  9030. }
  9031. #endif
  9032. rsaSigBuf->buffer = (byte*)XMALLOC(sigSz, ssl->heap,
  9033. DYNAMIC_TYPE_SIGNATURE);
  9034. if (rsaSigBuf->buffer == NULL) {
  9035. ERROR_OUT(MEMORY_E, exit_dcv);
  9036. }
  9037. rsaSigBuf->length = sigSz;
  9038. XMEMCPY(rsaSigBuf->buffer, sig, rsaSigBuf->length);
  9039. }
  9040. #endif /* !NO_RSA && WC_RSA_PSS */
  9041. args->sigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap,
  9042. DYNAMIC_TYPE_SIGNATURE);
  9043. if (args->sigData == NULL) {
  9044. ERROR_OUT(MEMORY_E, exit_dcv);
  9045. }
  9046. ret = CreateSigData(ssl, args->sigData, &args->sigDataSz, 1);
  9047. if (ret < 0)
  9048. goto exit_dcv;
  9049. #ifdef WOLFSSL_DUAL_ALG_CERTS
  9050. if ((ssl->sigSpec != NULL) &&
  9051. (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH)) {
  9052. args->altSigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap,
  9053. DYNAMIC_TYPE_SIGNATURE);
  9054. if (args->altSigData == NULL) {
  9055. ERROR_OUT(MEMORY_E, exit_dcv);
  9056. }
  9057. XMEMCPY(args->altSigData, args->sigData, args->sigDataSz);
  9058. args->altSigDataSz = args->sigDataSz;
  9059. }
  9060. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  9061. #ifdef HAVE_ECC
  9062. if ((ssl->options.peerSigAlgo == ecc_dsa_sa_algo) &&
  9063. (ssl->peerEccDsaKeyPresent)) {
  9064. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  9065. if (ssl->options.peerSigAlgo != sm2_sa_algo)
  9066. #endif
  9067. {
  9068. ret = CreateECCEncodedSig(args->sigData,
  9069. args->sigDataSz, ssl->options.peerHashAlgo);
  9070. if (ret < 0)
  9071. goto exit_dcv;
  9072. args->sigDataSz = (word16)ret;
  9073. ret = 0;
  9074. }
  9075. }
  9076. #ifdef WOLFSSL_DUAL_ALG_CERTS
  9077. if ((ssl->sigSpec != NULL) &&
  9078. (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) &&
  9079. (args->altSigAlgo == ecc_dsa_sa_algo) &&
  9080. (ssl->peerEccDsaKeyPresent)) {
  9081. ret = CreateECCEncodedSig(args->altSigData,
  9082. args->altSigDataSz, ssl->options.peerHashAlgo);
  9083. if (ret < 0)
  9084. goto exit_dcv;
  9085. args->altSigDataSz = (word16)ret;
  9086. ret = 0;
  9087. }
  9088. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  9089. #endif /* HAVE_ECC */
  9090. /* Advance state and proceed */
  9091. ssl->options.asyncState = TLS_ASYNC_DO;
  9092. } /* case TLS_ASYNC_BUILD */
  9093. FALL_THROUGH;
  9094. case TLS_ASYNC_DO:
  9095. {
  9096. sig = input + args->idx;
  9097. #ifdef WOLFSSL_DUAL_ALG_CERTS
  9098. if (ssl->sigSpec != NULL &&
  9099. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
  9100. /* As we have two signatures in the message, we stored
  9101. * the length of each before the actual signature. This
  9102. * is necessary, as we could have two algorithms with
  9103. * variable length signatures. */
  9104. sig += OPAQUE16_LEN;
  9105. }
  9106. #endif
  9107. #ifndef NO_RSA
  9108. if ((ssl->options.peerSigAlgo == rsa_pss_sa_algo) &&
  9109. (ssl->peerRsaKey != NULL) && (ssl->peerRsaKeyPresent != 0)) {
  9110. WOLFSSL_MSG("Doing RSA peer cert verify");
  9111. ret = RsaVerify(ssl, rsaSigBuf->buffer,
  9112. (word32)rsaSigBuf->length, &args->output,
  9113. ssl->options.peerSigAlgo,
  9114. ssl->options.peerHashAlgo, ssl->peerRsaKey,
  9115. #ifdef HAVE_PK_CALLBACKS
  9116. &ssl->buffers.peerRsaKey
  9117. #else
  9118. NULL
  9119. #endif
  9120. );
  9121. if (ret >= 0) {
  9122. args->sendSz = ret;
  9123. ret = 0;
  9124. }
  9125. }
  9126. #endif /* !NO_RSA */
  9127. #ifdef HAVE_ECC
  9128. if ((ssl->options.peerSigAlgo == ecc_dsa_sa_algo) &&
  9129. (ssl->peerEccDsaKeyPresent)) {
  9130. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  9131. if (ssl->options.peerSigAlgo == sm2_sa_algo) {
  9132. ret = Sm2wSm3Verify(ssl, TLS13_SM2_SIG_ID,
  9133. TLS13_SM2_SIG_ID_SZ, sig, args->sigSz,
  9134. args->sigData, args->sigDataSz,
  9135. ssl->peerEccDsaKey, NULL);
  9136. }
  9137. else
  9138. #endif
  9139. {
  9140. WOLFSSL_MSG("Doing ECC peer cert verify");
  9141. ret = EccVerify(ssl, sig, args->sigSz,
  9142. args->sigData, args->sigDataSz,
  9143. ssl->peerEccDsaKey,
  9144. #ifdef HAVE_PK_CALLBACKS
  9145. &ssl->buffers.peerEccDsaKey
  9146. #else
  9147. NULL
  9148. #endif
  9149. );
  9150. }
  9151. if (ret >= 0) {
  9152. /* CLIENT/SERVER: data verified with public key from
  9153. * certificate. */
  9154. ssl->options.peerAuthGood = 1;
  9155. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  9156. ssl->peerEccDsaKeyPresent = 0;
  9157. }
  9158. }
  9159. #endif /* HAVE_ECC */
  9160. #ifdef HAVE_ED25519
  9161. if ((ssl->options.peerSigAlgo == ed25519_sa_algo) &&
  9162. (ssl->peerEd25519KeyPresent)) {
  9163. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  9164. ret = Ed25519Verify(ssl, sig, args->sigSz,
  9165. args->sigData, args->sigDataSz,
  9166. ssl->peerEd25519Key,
  9167. #ifdef HAVE_PK_CALLBACKS
  9168. &ssl->buffers.peerEd25519Key
  9169. #else
  9170. NULL
  9171. #endif
  9172. );
  9173. if (ret >= 0) {
  9174. /* CLIENT/SERVER: data verified with public key from
  9175. * certificate. */
  9176. ssl->options.peerAuthGood = 1;
  9177. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  9178. (void**)&ssl->peerEd25519Key);
  9179. ssl->peerEd25519KeyPresent = 0;
  9180. }
  9181. }
  9182. #endif
  9183. #ifdef HAVE_ED448
  9184. if ((ssl->options.peerSigAlgo == ed448_sa_algo) &&
  9185. (ssl->peerEd448KeyPresent)) {
  9186. WOLFSSL_MSG("Doing ED448 peer cert verify");
  9187. ret = Ed448Verify(ssl, sig, args->sigSz,
  9188. args->sigData, args->sigDataSz,
  9189. ssl->peerEd448Key,
  9190. #ifdef HAVE_PK_CALLBACKS
  9191. &ssl->buffers.peerEd448Key
  9192. #else
  9193. NULL
  9194. #endif
  9195. );
  9196. if (ret >= 0) {
  9197. /* CLIENT/SERVER: data verified with public key from
  9198. * certificate. */
  9199. ssl->options.peerAuthGood = 1;
  9200. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  9201. (void**)&ssl->peerEd448Key);
  9202. ssl->peerEd448KeyPresent = 0;
  9203. }
  9204. }
  9205. #endif
  9206. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  9207. if (((ssl->options.peerSigAlgo == falcon_level1_sa_algo) ||
  9208. (ssl->options.peerSigAlgo == falcon_level5_sa_algo)) &&
  9209. (ssl->peerFalconKeyPresent)) {
  9210. int res = 0;
  9211. WOLFSSL_MSG("Doing Falcon peer cert verify");
  9212. ret = wc_falcon_verify_msg(sig, args->sigSz,
  9213. args->sigData, args->sigDataSz,
  9214. &res, ssl->peerFalconKey);
  9215. if ((ret >= 0) && (res == 1)) {
  9216. /* CLIENT/SERVER: data verified with public key from
  9217. * certificate. */
  9218. ssl->options.peerAuthGood = 1;
  9219. FreeKey(ssl, DYNAMIC_TYPE_FALCON,
  9220. (void**)&ssl->peerFalconKey);
  9221. ssl->peerFalconKeyPresent = 0;
  9222. }
  9223. }
  9224. #endif /* HAVE_PQC && HAVE_FALCON */
  9225. #if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
  9226. if (((ssl->options.peerSigAlgo == dilithium_level2_sa_algo) ||
  9227. (ssl->options.peerSigAlgo == dilithium_level3_sa_algo) ||
  9228. (ssl->options.peerSigAlgo == dilithium_level5_sa_algo)) &&
  9229. (ssl->peerDilithiumKeyPresent)) {
  9230. int res = 0;
  9231. WOLFSSL_MSG("Doing Dilithium peer cert verify");
  9232. ret = wc_dilithium_verify_msg(sig, args->sigSz,
  9233. args->sigData, args->sigDataSz,
  9234. &res, ssl->peerDilithiumKey);
  9235. if ((ret >= 0) && (res == 1)) {
  9236. /* CLIENT/SERVER: data verified with public key from
  9237. * certificate. */
  9238. ssl->options.peerAuthGood = 1;
  9239. FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  9240. (void**)&ssl->peerDilithiumKey);
  9241. ssl->peerDilithiumKeyPresent = 0;
  9242. }
  9243. }
  9244. #endif /* HAVE_PQC && HAVE_DILITHIUM */
  9245. /* Check for error */
  9246. if (ret != 0) {
  9247. goto exit_dcv;
  9248. }
  9249. #ifdef WOLFSSL_DUAL_ALG_CERTS
  9250. if (ssl->sigSpec != NULL &&
  9251. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
  9252. /* Move forward to the alternative signature. */
  9253. sig += args->sigSz + OPAQUE16_LEN;
  9254. /* Verify the alternative signature */
  9255. #ifndef NO_RSA
  9256. if ((args->altSigAlgo == rsa_pss_sa_algo) &&
  9257. (ssl->peerRsaKey != NULL) &&
  9258. (ssl->peerRsaKeyPresent != 0)) {
  9259. WOLFSSL_MSG("Doing RSA peer cert alt verify");
  9260. ret = RsaVerify(ssl, rsaSigBuf->buffer,
  9261. (word32)rsaSigBuf->length,
  9262. &args->output, args->altSigAlgo,
  9263. ssl->options.peerHashAlgo, ssl->peerRsaKey,
  9264. #ifdef HAVE_PK_CALLBACKS
  9265. &ssl->buffers.peerRsaKey
  9266. #else
  9267. NULL
  9268. #endif
  9269. );
  9270. if (ret >= 0) {
  9271. args->sendSz = ret;
  9272. ret = 0;
  9273. }
  9274. }
  9275. #endif /* !NO_RSA */
  9276. #ifdef HAVE_ECC
  9277. if ((args->altSigAlgo == ecc_dsa_sa_algo) &&
  9278. (ssl->peerEccDsaKeyPresent)) {
  9279. WOLFSSL_MSG("Doing ECC peer cert alt verify");
  9280. ret = EccVerify(ssl, sig, args->altSignatureSz,
  9281. args->altSigData, args->altSigDataSz,
  9282. ssl->peerEccDsaKey,
  9283. #ifdef HAVE_PK_CALLBACKS
  9284. &ssl->buffers.peerEccDsaKey
  9285. #else
  9286. NULL
  9287. #endif
  9288. );
  9289. if (ret >= 0) {
  9290. /* CLIENT/SERVER: data verified with public key from
  9291. * certificate. */
  9292. args->altPeerAuthGood = 1;
  9293. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  9294. (void**)&ssl->peerEccDsaKey);
  9295. ssl->peerEccDsaKeyPresent = 0;
  9296. }
  9297. }
  9298. #endif /* HAVE_ECC */
  9299. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  9300. if (((args->altSigAlgo == falcon_level1_sa_algo) ||
  9301. (args->altSigAlgo == falcon_level5_sa_algo)) &&
  9302. (ssl->peerFalconKeyPresent)) {
  9303. int res = 0;
  9304. WOLFSSL_MSG("Doing Falcon peer cert alt verify");
  9305. ret = wc_falcon_verify_msg(sig, args->altSignatureSz,
  9306. args->altSigData, args->altSigDataSz,
  9307. &res, ssl->peerFalconKey);
  9308. if ((ret >= 0) && (res == 1)) {
  9309. /* CLIENT/SERVER: data verified with public key from
  9310. * certificate. */
  9311. args->altPeerAuthGood = 1;
  9312. FreeKey(ssl, DYNAMIC_TYPE_FALCON,
  9313. (void**)&ssl->peerFalconKey);
  9314. ssl->peerFalconKeyPresent = 0;
  9315. }
  9316. }
  9317. #endif /* HAVE_PQC && HAVE_FALCON */
  9318. #if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
  9319. if (((args->altSigAlgo == dilithium_level2_sa_algo) ||
  9320. (args->altSigAlgo == dilithium_level3_sa_algo) ||
  9321. (args->altSigAlgo == dilithium_level5_sa_algo)) &&
  9322. (ssl->peerDilithiumKeyPresent)) {
  9323. int res = 0;
  9324. WOLFSSL_MSG("Doing Dilithium peer cert alt verify");
  9325. ret = wc_dilithium_verify_msg(sig, args->altSignatureSz,
  9326. args->altSigData, args->altSigDataSz,
  9327. &res, ssl->peerDilithiumKey);
  9328. if ((ret >= 0) && (res == 1)) {
  9329. /* CLIENT/SERVER: data verified with public key from
  9330. * certificate. */
  9331. args->altPeerAuthGood = 1;
  9332. FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  9333. (void**)&ssl->peerDilithiumKey);
  9334. ssl->peerDilithiumKeyPresent = 0;
  9335. }
  9336. }
  9337. #endif /* HAVE_PQC && HAVE_DILITHIUM */
  9338. /* Check for error */
  9339. if (ret != 0) {
  9340. goto exit_dcv;
  9341. }
  9342. }
  9343. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  9344. /* Advance state and proceed */
  9345. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  9346. } /* case TLS_ASYNC_DO */
  9347. FALL_THROUGH;
  9348. case TLS_ASYNC_VERIFY:
  9349. {
  9350. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  9351. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  9352. int sigAlgo = ssl->options.peerSigAlgo;
  9353. #ifdef WOLFSSL_DUAL_ALG_CERTS
  9354. /* Check if our alternative signature was RSA */
  9355. if (ssl->sigSpec != NULL &&
  9356. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
  9357. ssl->options.peerSigAlgo != rsa_pss_sa_algo) {
  9358. sigAlgo = args->altSigAlgo;
  9359. }
  9360. #endif
  9361. ret = CheckRSASignature(ssl, sigAlgo,
  9362. ssl->options.peerHashAlgo, args->output, args->sendSz);
  9363. if (ret != 0)
  9364. goto exit_dcv;
  9365. /* CLIENT/SERVER: data verified with public key from
  9366. * certificate. */
  9367. ssl->peerRsaKeyPresent = 0;
  9368. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  9369. #ifdef WOLFSSL_DUAL_ALG_CERTS
  9370. /* Check if our alternative signature was RSA */
  9371. if (ssl->sigSpec != NULL &&
  9372. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH &&
  9373. ssl->options.peerSigAlgo != rsa_pss_sa_algo) {
  9374. args->altPeerAuthGood = 1;
  9375. }
  9376. else
  9377. #endif
  9378. ssl->options.peerAuthGood = 1;
  9379. }
  9380. #endif /* !NO_RSA && WC_RSA_PSS */
  9381. /* Advance state and proceed */
  9382. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  9383. } /* case TLS_ASYNC_VERIFY */
  9384. FALL_THROUGH;
  9385. case TLS_ASYNC_FINALIZE:
  9386. {
  9387. #ifdef WOLFSSL_DUAL_ALG_CERTS
  9388. if (ssl->options.peerAuthGood &&
  9389. ssl->sigSpec != NULL &&
  9390. *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) {
  9391. ssl->options.peerAuthGood = args->altPeerAuthGood;
  9392. }
  9393. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  9394. ssl->options.havePeerVerify = 1;
  9395. /* Set final index */
  9396. args->idx += args->sz;
  9397. *inOutIdx = args->idx;
  9398. /* Encryption is always on: add padding */
  9399. *inOutIdx += ssl->keys.padSz;
  9400. /* Advance state and proceed */
  9401. ssl->options.asyncState = TLS_ASYNC_END;
  9402. #if !defined(NO_WOLFSSL_CLIENT)
  9403. if (ssl->options.side == WOLFSSL_CLIENT_END)
  9404. ssl->options.serverState = SERVER_CERT_VERIFY_COMPLETE;
  9405. #endif
  9406. } /* case TLS_ASYNC_FINALIZE */
  9407. FALL_THROUGH;
  9408. case TLS_ASYNC_END:
  9409. {
  9410. break;
  9411. }
  9412. default:
  9413. ret = INPUT_CASE_ERROR;
  9414. } /* switch(ssl->options.asyncState) */
  9415. exit_dcv:
  9416. WOLFSSL_LEAVE("DoTls13CertificateVerify", ret);
  9417. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  9418. #ifdef WOLFSSL_ASYNC_CRYPT
  9419. /* Handle async operation */
  9420. if (ret == WC_PENDING_E) {
  9421. /* Mark message as not received so it can process again */
  9422. ssl->msgsReceived.got_certificate_verify = 0;
  9423. return ret;
  9424. }
  9425. else
  9426. #endif /* WOLFSSL_ASYNC_CRYPT */
  9427. if (ret != 0) {
  9428. WOLFSSL_ERROR_VERBOSE(ret);
  9429. if (ret != INVALID_PARAMETER) {
  9430. SendAlert(ssl, alert_fatal, decrypt_error);
  9431. }
  9432. }
  9433. /* Final cleanup */
  9434. FreeDcv13Args(ssl, args);
  9435. FreeKeyExchange(ssl);
  9436. #ifdef WOLFSSL_ASYNC_IO
  9437. /* Cleanup async */
  9438. FreeAsyncCtx(ssl, 0);
  9439. #endif
  9440. return ret;
  9441. }
  9442. #endif /* !NO_RSA || HAVE_ECC */
  9443. #endif /* !NO_CERTS */
  9444. /* Parse and handle a TLS v1.3 Finished message.
  9445. *
  9446. * ssl The SSL/TLS object.
  9447. * input The message buffer.
  9448. * inOutIdx On entry, the index into the message buffer of Finished.
  9449. * On exit, the index of byte after the Finished message and padding.
  9450. * size Length of message data.
  9451. * totalSz Length of remaining data in the message buffer.
  9452. * sniff Indicates whether we are sniffing packets.
  9453. * returns 0 on success and otherwise failure.
  9454. */
  9455. int DoTls13Finished(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  9456. word32 size, word32 totalSz, int sniff)
  9457. {
  9458. int ret;
  9459. word32 finishedSz = 0;
  9460. byte* secret;
  9461. byte mac[WC_MAX_DIGEST_SIZE];
  9462. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  9463. WOLFSSL_ENTER("DoTls13Finished");
  9464. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  9465. /* verify the client sent certificate if required */
  9466. if (ssl->options.side == WOLFSSL_SERVER_END && !ssl->options.resuming &&
  9467. (ssl->options.mutualAuth || ssl->options.failNoCert)) {
  9468. #ifdef OPENSSL_COMPATIBLE_DEFAULTS
  9469. if (ssl->options.isPSK) {
  9470. WOLFSSL_MSG("TLS v1.3 client used PSK but cert required. Allowing "
  9471. "for OpenSSL compatibility");
  9472. }
  9473. else
  9474. #endif
  9475. if (
  9476. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  9477. !ssl->options.verifyPostHandshake &&
  9478. #endif
  9479. (!ssl->options.havePeerCert || !ssl->options.havePeerVerify)) {
  9480. ret = NO_PEER_CERT; /* NO_PEER_VERIFY */
  9481. WOLFSSL_MSG("TLS v1.3 client did not present peer cert");
  9482. DoCertFatalAlert(ssl, ret);
  9483. return ret;
  9484. }
  9485. }
  9486. #endif
  9487. /* check against totalSz */
  9488. if (*inOutIdx + size > totalSz)
  9489. return BUFFER_E;
  9490. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  9491. ret = tsip_Tls13HandleFinished(ssl, input, inOutIdx, size, totalSz);
  9492. if (ret == 0) {
  9493. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  9494. return ret;
  9495. }
  9496. if (ret == VERIFY_FINISHED_ERROR) {
  9497. SendAlert(ssl, alert_fatal, decrypt_error);
  9498. return ret;
  9499. }
  9500. if (ret != CRYPTOCB_UNAVAILABLE) {
  9501. /* other errors */
  9502. return ret;
  9503. }
  9504. ret = 0;
  9505. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  9506. if (ssl->options.handShakeDone) {
  9507. ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
  9508. ssl->keys.client_write_MAC_secret,
  9509. WOLFSSL_CLIENT_END);
  9510. if (ret != 0)
  9511. return ret;
  9512. secret = ssl->keys.client_write_MAC_secret;
  9513. }
  9514. else if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9515. /* All the handshake messages have been received to calculate
  9516. * client and server finished keys.
  9517. */
  9518. ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
  9519. ssl->keys.client_write_MAC_secret,
  9520. WOLFSSL_CLIENT_END);
  9521. if (ret != 0)
  9522. return ret;
  9523. ret = DeriveFinishedSecret(ssl, ssl->serverSecret,
  9524. ssl->keys.server_write_MAC_secret,
  9525. WOLFSSL_SERVER_END);
  9526. if (ret != 0)
  9527. return ret;
  9528. secret = ssl->keys.server_write_MAC_secret;
  9529. }
  9530. else {
  9531. secret = ssl->keys.client_write_MAC_secret;
  9532. }
  9533. if (sniff == NO_SNIFF) {
  9534. ret = BuildTls13HandshakeHmac(ssl, secret, mac, &finishedSz);
  9535. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  9536. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9537. XMEMCPY(ssl->serverFinished, mac, finishedSz);
  9538. ssl->serverFinished_len = finishedSz;
  9539. }
  9540. else {
  9541. XMEMCPY(ssl->clientFinished, mac, finishedSz);
  9542. ssl->clientFinished_len = finishedSz;
  9543. }
  9544. #endif /* WOLFSSL_HAVE_TLS_UNIQUE */
  9545. if (ret != 0)
  9546. return ret;
  9547. if (size != finishedSz)
  9548. return BUFFER_ERROR;
  9549. }
  9550. #ifdef WOLFSSL_CALLBACKS
  9551. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  9552. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  9553. #endif
  9554. if (sniff == NO_SNIFF) {
  9555. /* Actually check verify data. */
  9556. if (size > WC_MAX_DIGEST_SIZE ||
  9557. XMEMCMP(input + *inOutIdx, mac, size) != 0){
  9558. WOLFSSL_MSG("Verify finished error on hashes");
  9559. SendAlert(ssl, alert_fatal, decrypt_error);
  9560. WOLFSSL_ERROR_VERBOSE(VERIFY_FINISHED_ERROR);
  9561. return VERIFY_FINISHED_ERROR;
  9562. }
  9563. }
  9564. /* Force input exhaustion at ProcessReply by consuming padSz. */
  9565. *inOutIdx += size + ssl->keys.padSz;
  9566. if (ssl->options.side == WOLFSSL_SERVER_END &&
  9567. !ssl->options.handShakeDone) {
  9568. #ifdef WOLFSSL_EARLY_DATA
  9569. if (ssl->earlyData != no_early_data) {
  9570. if ((ret = DeriveTls13Keys(ssl, no_key, DECRYPT_SIDE_ONLY, 1)) != 0)
  9571. return ret;
  9572. }
  9573. #endif
  9574. /* Setup keys for application data messages from client. */
  9575. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  9576. return ret;
  9577. }
  9578. #ifndef NO_WOLFSSL_CLIENT
  9579. if (ssl->options.side == WOLFSSL_CLIENT_END)
  9580. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  9581. #endif
  9582. #ifndef NO_WOLFSSL_SERVER
  9583. if (ssl->options.side == WOLFSSL_SERVER_END) {
  9584. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  9585. ssl->options.handShakeState = HANDSHAKE_DONE;
  9586. ssl->options.handShakeDone = 1;
  9587. }
  9588. #endif
  9589. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_EARLY_DATA)
  9590. if (ssl->options.dtls && ssl->earlyData > early_data_ext) {
  9591. /* DTLSv1.3 has no EndOfearlydata messages. We stop processing EarlyData
  9592. as soon we receive the client's finished message */
  9593. ssl->earlyData = done_early_data;
  9594. }
  9595. #endif /* WOLFSSL_DTLS13 && WOLFSSL_EARLY_DATA */
  9596. #if defined(WOLFSSL_QUIC) && defined(WOLFSSL_EARLY_DATA)
  9597. if (WOLFSSL_IS_QUIC(ssl) && ssl->earlyData > early_data_ext) {
  9598. /* QUIC has no EndOfEarlyData messages. We stop processing EarlyData
  9599. as soon we receive the client's finished message */
  9600. ssl->earlyData = done_early_data;
  9601. }
  9602. #endif /* WOLFSSL_QUIC && WOLFSSL_EARLY_DATA */
  9603. WOLFSSL_LEAVE("DoTls13Finished", 0);
  9604. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  9605. return 0;
  9606. }
  9607. #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)
  9608. /* Send the TLS v1.3 Finished message.
  9609. *
  9610. * ssl The SSL/TLS object.
  9611. * returns 0 on success, otherwise failure.
  9612. */
  9613. static int SendTls13Finished(WOLFSSL* ssl)
  9614. {
  9615. int finishedSz = ssl->specs.hash_size;
  9616. byte* input;
  9617. byte* output;
  9618. int ret;
  9619. int headerSz = HANDSHAKE_HEADER_SZ;
  9620. int outputSz;
  9621. byte* secret;
  9622. #ifdef WOLFSSL_DTLS13
  9623. int dtlsRet = 0, isDtls = 0;
  9624. #endif /* WOLFSSL_DTLS13 */
  9625. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  9626. WOLFSSL_ENTER("SendTls13Finished");
  9627. ssl->options.buildingMsg = 1;
  9628. #ifdef WOLFSSL_DTLS13
  9629. if (ssl->options.dtls) {
  9630. headerSz = DTLS_HANDSHAKE_HEADER_SZ;
  9631. /* using isDtls instead of ssl->options.dtls will abide clang static
  9632. analyzer on using an uninitialized value */
  9633. isDtls = 1;
  9634. }
  9635. #endif /* WOLFSSL_DTLS13 */
  9636. outputSz = WC_MAX_DIGEST_SIZE + DTLS_HANDSHAKE_HEADER_SZ + MAX_MSG_EXTRA;
  9637. /* Check buffers are big enough and grow if needed. */
  9638. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  9639. return ret;
  9640. /* get output buffer */
  9641. output = GetOutputBuffer(ssl);
  9642. input = output + RECORD_HEADER_SZ;
  9643. #ifdef WOLFSSL_DTLS13
  9644. if (isDtls)
  9645. input = output + Dtls13GetRlHeaderLength(ssl, 1);
  9646. #endif /* WOLFSSL_DTLS13 */
  9647. AddTls13HandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  9648. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  9649. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9650. ret = tsip_Tls13SendFinished(ssl, output, outputSz, input, 1);
  9651. if (ret != CRYPTOCB_UNAVAILABLE) {
  9652. return ret;
  9653. }
  9654. ret = 0;
  9655. }
  9656. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  9657. /* make finished hashes */
  9658. if (ssl->options.handShakeDone) {
  9659. ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
  9660. ssl->keys.client_write_MAC_secret,
  9661. WOLFSSL_CLIENT_END);
  9662. if (ret != 0)
  9663. return ret;
  9664. secret = ssl->keys.client_write_MAC_secret;
  9665. }
  9666. else if (ssl->options.side == WOLFSSL_CLIENT_END)
  9667. secret = ssl->keys.client_write_MAC_secret;
  9668. else {
  9669. /* All the handshake messages have been done to calculate client and
  9670. * server finished keys.
  9671. */
  9672. ret = DeriveFinishedSecret(ssl, ssl->clientSecret,
  9673. ssl->keys.client_write_MAC_secret,
  9674. WOLFSSL_SERVER_END);
  9675. if (ret != 0)
  9676. return ret;
  9677. ret = DeriveFinishedSecret(ssl, ssl->serverSecret,
  9678. ssl->keys.server_write_MAC_secret,
  9679. WOLFSSL_CLIENT_END);
  9680. if (ret != 0)
  9681. return ret;
  9682. secret = ssl->keys.server_write_MAC_secret;
  9683. }
  9684. ret = BuildTls13HandshakeHmac(ssl, secret, &input[headerSz], NULL);
  9685. if (ret != 0)
  9686. return ret;
  9687. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  9688. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9689. XMEMCPY(ssl->clientFinished, &input[headerSz], finishedSz);
  9690. ssl->clientFinished_len = finishedSz;
  9691. }
  9692. else {
  9693. XMEMCPY(ssl->serverFinished, &input[headerSz], finishedSz);
  9694. ssl->serverFinished_len = finishedSz;
  9695. }
  9696. #endif /* WOLFSSL_HAVE_TLS_UNIQUE */
  9697. #ifdef WOLFSSL_DTLS13
  9698. if (isDtls) {
  9699. dtlsRet = Dtls13HandshakeSend(ssl, output, (word16)outputSz,
  9700. (word16)(Dtls13GetRlHeaderLength(ssl, 1) + headerSz + finishedSz), finished,
  9701. 1);
  9702. if (dtlsRet != 0 && dtlsRet != WANT_WRITE)
  9703. return ret;
  9704. } else
  9705. #endif /* WOLFSSL_DTLS13 */
  9706. {
  9707. /* This message is always encrypted. */
  9708. int sendSz = BuildTls13Message(ssl, output, outputSz, input,
  9709. headerSz + finishedSz, handshake, 1, 0, 0);
  9710. if (sendSz < 0) {
  9711. WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
  9712. return BUILD_MSG_ERROR;
  9713. }
  9714. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  9715. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  9716. if (ssl->toInfoOn) {
  9717. ret = AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  9718. WRITE_PROTO, 0, ssl->heap);
  9719. if (ret != 0)
  9720. return ret;
  9721. }
  9722. #endif
  9723. ssl->buffers.outputBuffer.length += sendSz;
  9724. ssl->options.buildingMsg = 0;
  9725. }
  9726. if (ssl->options.side == WOLFSSL_SERVER_END) {
  9727. #ifdef WOLFSSL_EARLY_DATA
  9728. byte storeTrafficDecKeys = ssl->earlyData == no_early_data;
  9729. #endif
  9730. /* Can send application data now. */
  9731. if ((ret = DeriveMasterSecret(ssl)) != 0)
  9732. return ret;
  9733. /* Last use of preMasterSecret - zeroize as soon as possible. */
  9734. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  9735. #ifdef WOLFSSL_EARLY_DATA
  9736. #ifdef WOLFSSL_DTLS13
  9737. /* DTLS13 dynamically change keys and it needs all
  9738. the keys in ssl->keys to save the keying material */
  9739. if (isDtls)
  9740. storeTrafficDecKeys = 1;
  9741. #endif /* WOLFSSL_DTLS13 */
  9742. if ((ret = DeriveTls13Keys(ssl, traffic_key, ENCRYPT_SIDE_ONLY, 1))
  9743. != 0) {
  9744. return ret;
  9745. }
  9746. if ((ret = DeriveTls13Keys(ssl, traffic_key, DECRYPT_SIDE_ONLY,
  9747. storeTrafficDecKeys)) != 0) {
  9748. return ret;
  9749. }
  9750. #else
  9751. if ((ret = DeriveTls13Keys(ssl, traffic_key, ENCRYPT_AND_DECRYPT_SIDE,
  9752. 1)) != 0) {
  9753. return ret;
  9754. }
  9755. #endif
  9756. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  9757. return ret;
  9758. #ifdef WOLFSSL_DTLS13
  9759. if (isDtls) {
  9760. w64wrapper epochTraffic0;
  9761. epochTraffic0 = w64From32(0, DTLS13_EPOCH_TRAFFIC0);
  9762. ssl->dtls13Epoch = epochTraffic0;
  9763. ssl->dtls13PeerEpoch = epochTraffic0;
  9764. ret = Dtls13NewEpoch(
  9765. ssl, epochTraffic0, ENCRYPT_AND_DECRYPT_SIDE);
  9766. if (ret != 0)
  9767. return ret;
  9768. ret = Dtls13SetEpochKeys(
  9769. ssl, epochTraffic0, ENCRYPT_AND_DECRYPT_SIDE);
  9770. if (ret != 0)
  9771. return ret;
  9772. }
  9773. #endif /* WOLFSSL_DTLS13 */
  9774. }
  9775. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  9776. !ssl->options.handShakeDone) {
  9777. #ifdef WOLFSSL_EARLY_DATA
  9778. if (ssl->earlyData != no_early_data) {
  9779. if ((ret = DeriveTls13Keys(ssl, no_key, ENCRYPT_AND_DECRYPT_SIDE,
  9780. 1)) != 0) {
  9781. return ret;
  9782. }
  9783. }
  9784. #endif
  9785. /* Setup keys for application data messages. */
  9786. if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) != 0)
  9787. return ret;
  9788. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  9789. ret = DeriveResumptionSecret(ssl, ssl->session->masterSecret);
  9790. if (ret != 0)
  9791. return ret;
  9792. #endif
  9793. #ifdef WOLFSSL_DTLS13
  9794. if (isDtls) {
  9795. w64wrapper epochTraffic0;
  9796. epochTraffic0 = w64From32(0, DTLS13_EPOCH_TRAFFIC0);
  9797. ssl->dtls13Epoch = epochTraffic0;
  9798. ssl->dtls13PeerEpoch = epochTraffic0;
  9799. ret = Dtls13NewEpoch(
  9800. ssl, epochTraffic0, ENCRYPT_AND_DECRYPT_SIDE);
  9801. if (ret != 0)
  9802. return ret;
  9803. ret = Dtls13SetEpochKeys(
  9804. ssl, epochTraffic0, ENCRYPT_AND_DECRYPT_SIDE);
  9805. if (ret != 0)
  9806. return ret;
  9807. }
  9808. #endif /* WOLFSSL_DTLS13 */
  9809. }
  9810. #ifndef NO_WOLFSSL_CLIENT
  9811. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9812. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  9813. ssl->options.handShakeState = HANDSHAKE_DONE;
  9814. ssl->options.handShakeDone = 1;
  9815. }
  9816. #endif
  9817. #ifndef NO_WOLFSSL_SERVER
  9818. if (ssl->options.side == WOLFSSL_SERVER_END) {
  9819. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  9820. }
  9821. #endif
  9822. #ifdef WOLFSSL_DTLS13
  9823. if (isDtls) {
  9824. WOLFSSL_LEAVE("SendTls13Finished", ret);
  9825. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  9826. return dtlsRet;
  9827. }
  9828. #endif /* WOLFSSL_DTLS13 */
  9829. if ((ret = SendBuffered(ssl)) != 0)
  9830. return ret;
  9831. WOLFSSL_LEAVE("SendTls13Finished", ret);
  9832. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  9833. return ret;
  9834. }
  9835. #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */
  9836. /* handle generation TLS v1.3 key_update (24) */
  9837. /* Send the TLS v1.3 KeyUpdate message.
  9838. *
  9839. * ssl The SSL/TLS object.
  9840. * returns 0 on success, otherwise failure.
  9841. */
  9842. static int SendTls13KeyUpdate(WOLFSSL* ssl)
  9843. {
  9844. byte* input;
  9845. byte* output;
  9846. int ret;
  9847. int headerSz = HANDSHAKE_HEADER_SZ;
  9848. int outputSz;
  9849. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  9850. WOLFSSL_START(WC_FUNC_KEY_UPDATE_SEND);
  9851. WOLFSSL_ENTER("SendTls13KeyUpdate");
  9852. #ifdef WOLFSSL_DTLS13
  9853. if (ssl->options.dtls)
  9854. i = Dtls13GetRlHeaderLength(ssl, 1) + DTLS_HANDSHAKE_HEADER_SZ;
  9855. #endif /* WOLFSSL_DTLS13 */
  9856. outputSz = OPAQUE8_LEN + MAX_MSG_EXTRA;
  9857. /* Check buffers are big enough and grow if needed. */
  9858. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  9859. return ret;
  9860. /* get output buffer */
  9861. output = GetOutputBuffer(ssl);
  9862. input = output + RECORD_HEADER_SZ;
  9863. #ifdef WOLFSSL_DTLS13
  9864. if (ssl->options.dtls)
  9865. input = output + Dtls13GetRlHeaderLength(ssl, 1);
  9866. #endif /* WOLFSSL_DTLS13 */
  9867. AddTls13Headers(output, OPAQUE8_LEN, key_update, ssl);
  9868. /* If:
  9869. * 1. I haven't sent a KeyUpdate requesting a response and
  9870. * 2. This isn't responding to peer KeyUpdate requiring a response then,
  9871. * I want a response.
  9872. */
  9873. ssl->keys.updateResponseReq = output[i++] =
  9874. !ssl->keys.updateResponseReq && !ssl->keys.keyUpdateRespond;
  9875. /* Sent response, no longer need to respond. */
  9876. ssl->keys.keyUpdateRespond = 0;
  9877. #ifdef WOLFSSL_DTLS13
  9878. if (ssl->options.dtls) {
  9879. ret = Dtls13HandshakeSend(ssl, output, (word16)outputSz,
  9880. OPAQUE8_LEN + Dtls13GetRlHeaderLength(ssl, 1) +
  9881. DTLS_HANDSHAKE_HEADER_SZ,
  9882. key_update, 0);
  9883. }
  9884. else
  9885. #endif /* WOLFSSL_DTLS13 */
  9886. {
  9887. /* This message is always encrypted. */
  9888. int sendSz = BuildTls13Message(ssl, output, outputSz, input,
  9889. headerSz + OPAQUE8_LEN, handshake, 0, 0, 0);
  9890. if (sendSz < 0)
  9891. return BUILD_MSG_ERROR;
  9892. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  9893. if (ssl->hsInfoOn) AddPacketName(ssl, "KeyUpdate");
  9894. if (ssl->toInfoOn) {
  9895. ret = AddPacketInfo(ssl, "KeyUpdate", handshake, output, sendSz,
  9896. WRITE_PROTO, 0, ssl->heap);
  9897. if (ret != 0)
  9898. return ret;
  9899. }
  9900. #endif
  9901. ssl->buffers.outputBuffer.length += sendSz;
  9902. ret = SendBuffered(ssl);
  9903. if (ret != 0 && ret != WANT_WRITE)
  9904. return ret;
  9905. }
  9906. /* In DTLS we must wait for the ack before setting up the new keys */
  9907. if (!ssl->options.dtls) {
  9908. /* Future traffic uses new encryption keys. */
  9909. if ((ret = DeriveTls13Keys(
  9910. ssl, update_traffic_key, ENCRYPT_SIDE_ONLY, 1))
  9911. != 0)
  9912. return ret;
  9913. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  9914. return ret;
  9915. }
  9916. WOLFSSL_LEAVE("SendTls13KeyUpdate", ret);
  9917. WOLFSSL_END(WC_FUNC_KEY_UPDATE_SEND);
  9918. return ret;
  9919. }
  9920. /* handle processing TLS v1.3 key_update (24) */
  9921. /* Parse and handle a TLS v1.3 KeyUpdate message.
  9922. *
  9923. * ssl The SSL/TLS object.
  9924. * input The message buffer.
  9925. * inOutIdx On entry, the index into the message buffer of Finished.
  9926. * On exit, the index of byte after the Finished message and padding.
  9927. * totalSz The length of the current handshake message.
  9928. * returns 0 on success and otherwise failure.
  9929. */
  9930. static int DoTls13KeyUpdate(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  9931. word32 totalSz)
  9932. {
  9933. int ret;
  9934. word32 i = *inOutIdx;
  9935. WOLFSSL_START(WC_FUNC_KEY_UPDATE_DO);
  9936. WOLFSSL_ENTER("DoTls13KeyUpdate");
  9937. /* check against totalSz */
  9938. if (OPAQUE8_LEN != totalSz)
  9939. return BUFFER_E;
  9940. switch (input[i]) {
  9941. case update_not_requested:
  9942. /* This message in response to any outstanding request. */
  9943. ssl->keys.keyUpdateRespond = 0;
  9944. ssl->keys.updateResponseReq = 0;
  9945. break;
  9946. case update_requested:
  9947. /* New key update requiring a response. */
  9948. ssl->keys.keyUpdateRespond = 1;
  9949. break;
  9950. default:
  9951. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  9952. return INVALID_PARAMETER;
  9953. }
  9954. /* Move index to byte after message. */
  9955. *inOutIdx += totalSz;
  9956. /* Always encrypted. */
  9957. *inOutIdx += ssl->keys.padSz;
  9958. /* Future traffic uses new decryption keys. */
  9959. if ((ret = DeriveTls13Keys(ssl, update_traffic_key, DECRYPT_SIDE_ONLY, 1))
  9960. != 0) {
  9961. return ret;
  9962. }
  9963. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  9964. return ret;
  9965. #ifdef WOLFSSL_DTLS13
  9966. if (ssl->options.dtls) {
  9967. w64Increment(&ssl->dtls13PeerEpoch);
  9968. ret = Dtls13NewEpoch(ssl, ssl->dtls13PeerEpoch, DECRYPT_SIDE_ONLY);
  9969. if (ret != 0)
  9970. return ret;
  9971. ret = Dtls13SetEpochKeys(ssl, ssl->dtls13PeerEpoch, DECRYPT_SIDE_ONLY);
  9972. if (ret != 0)
  9973. return ret;
  9974. }
  9975. #endif /* WOLFSSL_DTLS13 */
  9976. if (ssl->keys.keyUpdateRespond) {
  9977. #ifdef WOLFSSL_DTLS13
  9978. /* we already sent a keyUpdate (either in response to a previous
  9979. KeyUpdate or initiated by the application) and we are waiting for the
  9980. ack. We can't send a new KeyUpdate right away but to honor the RFC we
  9981. should send another KeyUpdate after the one in-flight is acked. We
  9982. don't do that as it looks redundant, it will make the code more
  9983. complex and I don't see a good use case for that. */
  9984. if (ssl->options.dtls && ssl->dtls13WaitKeyUpdateAck) {
  9985. ssl->keys.keyUpdateRespond = 0;
  9986. return 0;
  9987. }
  9988. #endif /* WOLFSSL_DTLS13 */
  9989. return SendTls13KeyUpdate(ssl);
  9990. }
  9991. WOLFSSL_LEAVE("DoTls13KeyUpdate", ret);
  9992. WOLFSSL_END(WC_FUNC_KEY_UPDATE_DO);
  9993. return 0;
  9994. }
  9995. #ifdef WOLFSSL_EARLY_DATA
  9996. #ifndef NO_WOLFSSL_CLIENT
  9997. /* Send the TLS v1.3 EndOfEarlyData message to indicate that there will be no
  9998. * more early application data.
  9999. * The encryption key now changes to the pre-calculated handshake key.
  10000. *
  10001. * ssl The SSL/TLS object.
  10002. * returns 0 on success and otherwise failure.
  10003. */
  10004. static int SendTls13EndOfEarlyData(WOLFSSL* ssl)
  10005. {
  10006. byte* output;
  10007. int ret;
  10008. int sendSz;
  10009. word32 length;
  10010. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  10011. WOLFSSL_START(WC_FUNC_END_OF_EARLY_DATA_SEND);
  10012. WOLFSSL_ENTER("SendTls13EndOfEarlyData");
  10013. length = 0;
  10014. sendSz = idx + length + MAX_MSG_EXTRA;
  10015. ssl->options.buildingMsg = 1;
  10016. /* Check buffers are big enough and grow if needed. */
  10017. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  10018. return ret;
  10019. /* Get position in output buffer to write new message to. */
  10020. output = GetOutputBuffer(ssl);
  10021. /* Put the record and handshake headers on. */
  10022. AddTls13Headers(output, length, end_of_early_data, ssl);
  10023. /* This message is always encrypted. */
  10024. sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ,
  10025. idx - RECORD_HEADER_SZ, handshake, 1, 0, 0);
  10026. if (sendSz < 0)
  10027. return sendSz;
  10028. ssl->buffers.outputBuffer.length += sendSz;
  10029. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  10030. return ret;
  10031. ssl->options.buildingMsg = 0;
  10032. if (!ssl->options.groupMessages)
  10033. ret = SendBuffered(ssl);
  10034. ssl->earlyData = done_early_data;
  10035. WOLFSSL_LEAVE("SendTls13EndOfEarlyData", ret);
  10036. WOLFSSL_END(WC_FUNC_END_OF_EARLY_DATA_SEND);
  10037. return ret;
  10038. }
  10039. #endif /* !NO_WOLFSSL_CLIENT */
  10040. #ifndef NO_WOLFSSL_SERVER
  10041. /* handle processing of TLS 1.3 end_of_early_data (5) */
  10042. /* Parse the TLS v1.3 EndOfEarlyData message that indicates that there will be
  10043. * no more early application data.
  10044. * The decryption key now changes to the pre-calculated handshake key.
  10045. *
  10046. * ssl The SSL/TLS object.
  10047. * returns 0 on success and otherwise failure.
  10048. */
  10049. static int DoTls13EndOfEarlyData(WOLFSSL* ssl, const byte* input,
  10050. word32* inOutIdx, word32 size)
  10051. {
  10052. int ret;
  10053. word32 begin = *inOutIdx;
  10054. (void)input;
  10055. WOLFSSL_START(WC_FUNC_END_OF_EARLY_DATA_DO);
  10056. WOLFSSL_ENTER("DoTls13EndOfEarlyData");
  10057. if ((*inOutIdx - begin) != size)
  10058. return BUFFER_ERROR;
  10059. if (ssl->earlyData == no_early_data) {
  10060. WOLFSSL_MSG("EndOfEarlyData received unexpectedly");
  10061. SendAlert(ssl, alert_fatal, unexpected_message);
  10062. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10063. return OUT_OF_ORDER_E;
  10064. }
  10065. ssl->earlyData = done_early_data;
  10066. /* Always encrypted. */
  10067. *inOutIdx += ssl->keys.padSz;
  10068. ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY);
  10069. WOLFSSL_LEAVE("DoTls13EndOfEarlyData", ret);
  10070. WOLFSSL_END(WC_FUNC_END_OF_EARLY_DATA_DO);
  10071. return ret;
  10072. }
  10073. #endif /* !NO_WOLFSSL_SERVER */
  10074. #endif /* WOLFSSL_EARLY_DATA */
  10075. #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  10076. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  10077. int SessionTicketNoncePopulate(WOLFSSL_SESSION *session, const byte *nonce,
  10078. byte len)
  10079. {
  10080. if (session->ticketNonce.data
  10081. != session->ticketNonce.dataStatic) {
  10082. XFREE(session->ticketNonce.data, session->heap,
  10083. DYNAMIC_TYPE_SESSION_TICK);
  10084. session->ticketNonce.data = session->ticketNonce.dataStatic;
  10085. session->ticketNonce.len = 0;
  10086. }
  10087. if (len > MAX_TICKET_NONCE_STATIC_SZ) {
  10088. WOLFSSL_MSG("Using dynamic nonce buffer");
  10089. session->ticketNonce.data = (byte*)XMALLOC(len,
  10090. session->heap, DYNAMIC_TYPE_SESSION_TICK);
  10091. if (session->ticketNonce.data == NULL)
  10092. return MEMORY_ERROR;
  10093. }
  10094. XMEMCPY(session->ticketNonce.data, nonce, len);
  10095. session->ticketNonce.len = len;
  10096. return 0;
  10097. }
  10098. #endif
  10099. #ifndef NO_WOLFSSL_CLIENT
  10100. /* Handle a New Session Ticket handshake message.
  10101. * Message contains the information required to perform resumption.
  10102. *
  10103. * ssl The SSL/TLS object.
  10104. * input The message buffer.
  10105. * inOutIdx On entry, the index into the message buffer of Finished.
  10106. * On exit, the index of byte after the Finished message and padding.
  10107. * size The length of the current handshake message.
  10108. * returns 0 on success, otherwise failure.
  10109. */
  10110. static int DoTls13NewSessionTicket(WOLFSSL* ssl, const byte* input,
  10111. word32* inOutIdx, word32 size)
  10112. {
  10113. #ifdef HAVE_SESSION_TICKET
  10114. int ret;
  10115. word32 begin = *inOutIdx;
  10116. word32 lifetime;
  10117. word32 ageAdd;
  10118. word16 length;
  10119. #ifdef WOLFSSL_32BIT_MILLI_TIME
  10120. word32 now;
  10121. #else
  10122. sword64 now;
  10123. #endif
  10124. const byte* nonce;
  10125. byte nonceLength;
  10126. WOLFSSL_START(WC_FUNC_NEW_SESSION_TICKET_DO);
  10127. WOLFSSL_ENTER("DoTls13NewSessionTicket");
  10128. /* Lifetime hint. */
  10129. if ((*inOutIdx - begin) + SESSION_HINT_SZ > size)
  10130. return BUFFER_ERROR;
  10131. ato32(input + *inOutIdx, &lifetime);
  10132. *inOutIdx += SESSION_HINT_SZ;
  10133. if (lifetime > MAX_LIFETIME) {
  10134. WOLFSSL_ERROR_VERBOSE(SERVER_HINT_ERROR);
  10135. return SERVER_HINT_ERROR;
  10136. }
  10137. /* Age add. */
  10138. if ((*inOutIdx - begin) + SESSION_ADD_SZ > size)
  10139. return BUFFER_ERROR;
  10140. ato32(input + *inOutIdx, &ageAdd);
  10141. *inOutIdx += SESSION_ADD_SZ;
  10142. /* Ticket nonce. */
  10143. if ((*inOutIdx - begin) + 1 > size)
  10144. return BUFFER_ERROR;
  10145. nonceLength = input[*inOutIdx];
  10146. #if !defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  10147. (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3))
  10148. if (nonceLength > MAX_TICKET_NONCE_STATIC_SZ) {
  10149. WOLFSSL_MSG("Nonce length not supported");
  10150. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  10151. return INVALID_PARAMETER;
  10152. }
  10153. #endif /* WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3) */
  10154. *inOutIdx += 1;
  10155. if ((*inOutIdx - begin) + nonceLength > size)
  10156. return BUFFER_ERROR;
  10157. nonce = input + *inOutIdx;
  10158. *inOutIdx += nonceLength;
  10159. /* Ticket length. */
  10160. if ((*inOutIdx - begin) + LENGTH_SZ > size)
  10161. return BUFFER_ERROR;
  10162. ato16(input + *inOutIdx, &length);
  10163. *inOutIdx += LENGTH_SZ;
  10164. if ((*inOutIdx - begin) + length > size)
  10165. return BUFFER_ERROR;
  10166. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  10167. return ret;
  10168. *inOutIdx += length;
  10169. now = TimeNowInMilliseconds();
  10170. if (now == 0)
  10171. return GETTIME_ERROR;
  10172. /* Copy in ticket data (server identity). */
  10173. ssl->timeout = lifetime;
  10174. ssl->session->timeout = lifetime;
  10175. ssl->session->cipherSuite0 = ssl->options.cipherSuite0;
  10176. ssl->session->cipherSuite = ssl->options.cipherSuite;
  10177. ssl->session->ticketSeen = now;
  10178. ssl->session->ticketAdd = ageAdd;
  10179. #ifdef WOLFSSL_EARLY_DATA
  10180. ssl->session->maxEarlyDataSz = ssl->options.maxEarlyDataSz;
  10181. #endif
  10182. #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  10183. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  10184. ret = SessionTicketNoncePopulate(ssl->session, nonce, nonceLength);
  10185. if (ret != 0)
  10186. return ret;
  10187. #else
  10188. ssl->session->ticketNonce.len = nonceLength;
  10189. if (nonceLength > MAX_TICKET_NONCE_STATIC_SZ) {
  10190. ret = BUFFER_ERROR;
  10191. return ret;
  10192. }
  10193. if (nonceLength > 0)
  10194. XMEMCPY(ssl->session->ticketNonce.data, nonce, nonceLength);
  10195. #endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
  10196. ssl->session->namedGroup = ssl->namedGroup;
  10197. if ((*inOutIdx - begin) + EXTS_SZ > size)
  10198. return BUFFER_ERROR;
  10199. ato16(input + *inOutIdx, &length);
  10200. *inOutIdx += EXTS_SZ;
  10201. if ((*inOutIdx - begin) + length != size)
  10202. return BUFFER_ERROR;
  10203. #ifdef WOLFSSL_EARLY_DATA
  10204. ret = TLSX_Parse(ssl, (byte *)input + (*inOutIdx), length, session_ticket,
  10205. NULL);
  10206. if (ret != 0)
  10207. return ret;
  10208. #endif
  10209. *inOutIdx += length;
  10210. SetupSession(ssl);
  10211. #ifndef NO_SESSION_CACHE
  10212. AddSession(ssl);
  10213. #endif
  10214. /* Always encrypted. */
  10215. *inOutIdx += ssl->keys.padSz;
  10216. ssl->expect_session_ticket = 0;
  10217. #else
  10218. (void)ssl;
  10219. (void)input;
  10220. WOLFSSL_ENTER("DoTls13NewSessionTicket");
  10221. *inOutIdx += size + ssl->keys.padSz;
  10222. #endif /* HAVE_SESSION_TICKET */
  10223. WOLFSSL_LEAVE("DoTls13NewSessionTicket", 0);
  10224. WOLFSSL_END(WC_FUNC_NEW_SESSION_TICKET_DO);
  10225. return 0;
  10226. }
  10227. #endif /* NO_WOLFSSL_CLIENT */
  10228. #ifndef NO_WOLFSSL_SERVER
  10229. #ifdef HAVE_SESSION_TICKET
  10230. #ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
  10231. /* Offset of the MAC size in the finished message. */
  10232. #define FINISHED_MSG_SIZE_OFFSET 3
  10233. /* Calculate the resumption secret which includes the unseen client finished
  10234. * message.
  10235. *
  10236. * ssl The SSL/TLS object.
  10237. * returns 0 on success, otherwise failure.
  10238. */
  10239. static int ExpectedResumptionSecret(WOLFSSL* ssl)
  10240. {
  10241. int ret;
  10242. word32 finishedSz = 0;
  10243. byte mac[WC_MAX_DIGEST_SIZE];
  10244. Digest digest;
  10245. static byte header[] = { 0x14, 0x00, 0x00, 0x00 };
  10246. /* Copy the running hash so we can restore it after. */
  10247. switch (ssl->specs.mac_algorithm) {
  10248. #ifndef NO_SHA256
  10249. case sha256_mac:
  10250. ret = wc_Sha256Copy(&ssl->hsHashes->hashSha256, &digest.sha256);
  10251. if (ret != 0)
  10252. return ret;
  10253. break;
  10254. #endif
  10255. #ifdef WOLFSSL_SHA384
  10256. case sha384_mac:
  10257. ret = wc_Sha384Copy(&ssl->hsHashes->hashSha384, &digest.sha384);
  10258. if (ret != 0)
  10259. return ret;
  10260. break;
  10261. #endif
  10262. #ifdef WOLFSSL_TLS13_SHA512
  10263. case sha512_mac:
  10264. ret = wc_Sha512Copy(&ssl->hsHashes->hashSha512, &digest.sha512);
  10265. if (ret != 0)
  10266. return ret;
  10267. break;
  10268. #endif
  10269. #ifdef WOLFSSL_SM3
  10270. case sm3_mac:
  10271. ret = wc_Sm3Copy(&ssl->hsHashes->hashSm3, &digest.sm3);
  10272. if (ret != 0)
  10273. return ret;
  10274. break;
  10275. #endif
  10276. }
  10277. /* Generate the Client's Finished message and hash it. */
  10278. ret = BuildTls13HandshakeHmac(ssl, ssl->keys.client_write_MAC_secret, mac,
  10279. &finishedSz);
  10280. if (ret != 0)
  10281. return ret;
  10282. header[FINISHED_MSG_SIZE_OFFSET] = finishedSz;
  10283. #ifdef WOLFSSL_EARLY_DATA
  10284. if (ssl->earlyData != no_early_data) {
  10285. static byte endOfEarlyData[] = { 0x05, 0x00, 0x00, 0x00 };
  10286. ret = HashRaw(ssl, endOfEarlyData, sizeof(endOfEarlyData));
  10287. if (ret != 0)
  10288. return ret;
  10289. }
  10290. #endif
  10291. if ((ret = HashRaw(ssl, header, sizeof(header))) != 0)
  10292. return ret;
  10293. if ((ret = HashRaw(ssl, mac, finishedSz)) != 0)
  10294. return ret;
  10295. if ((ret = DeriveResumptionSecret(ssl, ssl->session->masterSecret)) != 0)
  10296. return ret;
  10297. /* Restore the hash inline with currently seen messages. */
  10298. switch (ssl->specs.mac_algorithm) {
  10299. #ifndef NO_SHA256
  10300. case sha256_mac:
  10301. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  10302. ret = wc_Sha256Copy(&digest.sha256, &ssl->hsHashes->hashSha256);
  10303. wc_Sha256Free(&digest.sha256);
  10304. if (ret != 0)
  10305. return ret;
  10306. break;
  10307. #endif
  10308. #ifdef WOLFSSL_SHA384
  10309. case sha384_mac:
  10310. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  10311. ret = wc_Sha384Copy(&digest.sha384, &ssl->hsHashes->hashSha384);
  10312. wc_Sha384Free(&digest.sha384);
  10313. if (ret != 0)
  10314. return ret;
  10315. break;
  10316. #endif
  10317. #ifdef WOLFSSL_TLS13_SHA512
  10318. case sha512_mac:
  10319. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  10320. ret = wc_Sha512Copy(&digest.sha512, &ssl->hsHashes->hashSha512);
  10321. wc_Sha512Free(&digest.sha512);
  10322. if (ret != 0)
  10323. return ret;
  10324. break;
  10325. #endif
  10326. #ifdef WOLFSSL_SM3
  10327. case sm3_mac:
  10328. wc_Sm3Free(&ssl->hsHashes->hashSm3);
  10329. ret = wc_Sm3Copy(&digest.sm3, &ssl->hsHashes->hashSm3);
  10330. wc_Sm3Free(&digest.sm3);
  10331. if (ret != 0)
  10332. return ret;
  10333. break;
  10334. #endif
  10335. }
  10336. return ret;
  10337. }
  10338. #endif
  10339. /* Send New Session Ticket handshake message.
  10340. * Message contains the information required to perform resumption.
  10341. *
  10342. * ssl The SSL/TLS object.
  10343. * returns 0 on success, otherwise failure.
  10344. */
  10345. static int SendTls13NewSessionTicket(WOLFSSL* ssl)
  10346. {
  10347. byte* output;
  10348. int ret;
  10349. int sendSz;
  10350. word16 extSz;
  10351. word32 length;
  10352. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  10353. WOLFSSL_START(WC_FUNC_NEW_SESSION_TICKET_SEND);
  10354. WOLFSSL_ENTER("SendTls13NewSessionTicket");
  10355. #ifdef WOLFSSL_DTLS13
  10356. if (ssl->options.dtls)
  10357. idx = Dtls13GetRlHeaderLength(ssl, 1) + DTLS_HANDSHAKE_HEADER_SZ;
  10358. #endif /* WOLFSSL_DTLS13 */
  10359. #ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
  10360. if (!ssl->msgsReceived.got_finished) {
  10361. if ((ret = ExpectedResumptionSecret(ssl)) != 0)
  10362. return ret;
  10363. }
  10364. #endif
  10365. /* Start ticket nonce at 0 and go up to 255. */
  10366. if (ssl->session->ticketNonce.len == 0) {
  10367. ssl->session->ticketNonce.len = DEF_TICKET_NONCE_SZ;
  10368. ssl->session->ticketNonce.data[0] = 0;
  10369. }
  10370. else
  10371. #ifdef WOLFSSL_ASYNC_CRYPT
  10372. if (ssl->error != WC_PENDING_E)
  10373. #endif
  10374. {
  10375. ssl->session->ticketNonce.data[0]++;
  10376. }
  10377. if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0) {
  10378. /* In this case we only send the ID as the ticket. Let's generate a new
  10379. * ID for the new ticket so that we don't overwrite any old ones */
  10380. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID,
  10381. ID_LEN);
  10382. if (ret != 0)
  10383. return ret;
  10384. ssl->session->haveAltSessionID = 1;
  10385. }
  10386. if (!ssl->options.noTicketTls13) {
  10387. if ((ret = SetupTicket(ssl)) != 0)
  10388. return ret;
  10389. /* No need to create the ticket if we only send the ID */
  10390. if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) == 0) {
  10391. if ((ret = CreateTicket(ssl)) != 0)
  10392. return ret;
  10393. }
  10394. }
  10395. #ifdef WOLFSSL_EARLY_DATA
  10396. ssl->session->maxEarlyDataSz = ssl->options.maxEarlyDataSz;
  10397. if (ssl->session->maxEarlyDataSz > 0)
  10398. TLSX_EarlyData_Use(ssl, ssl->session->maxEarlyDataSz, 1);
  10399. extSz = 0;
  10400. ret = TLSX_GetResponseSize(ssl, session_ticket, &extSz);
  10401. if (ret != 0)
  10402. return ret;
  10403. #else
  10404. extSz = EXTS_SZ;
  10405. #endif
  10406. /* Lifetime | Age Add | Ticket session ID | Extensions */
  10407. length = SESSION_HINT_SZ + SESSION_ADD_SZ + LENGTH_SZ;
  10408. if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  10409. length += ID_LEN + extSz;
  10410. else
  10411. length += ssl->session->ticketLen + extSz;
  10412. /* Nonce */
  10413. length += TICKET_NONCE_LEN_SZ + DEF_TICKET_NONCE_SZ;
  10414. sendSz = idx + length + MAX_MSG_EXTRA;
  10415. /* Check buffers are big enough and grow if needed. */
  10416. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  10417. return ret;
  10418. /* Get position in output buffer to write new message to. */
  10419. output = GetOutputBuffer(ssl);
  10420. /* Put the record and handshake headers on. */
  10421. AddTls13Headers(output, length, session_ticket, ssl);
  10422. /* Lifetime hint */
  10423. c32toa(ssl->ctx->ticketHint, output + idx);
  10424. idx += SESSION_HINT_SZ;
  10425. /* Age add - obfuscator */
  10426. c32toa(ssl->session->ticketAdd, output + idx);
  10427. idx += SESSION_ADD_SZ;
  10428. output[idx++] = ssl->session->ticketNonce.len;
  10429. output[idx++] = ssl->session->ticketNonce.data[0];
  10430. /* length */
  10431. if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0) {
  10432. c16toa(ID_LEN, output + idx);
  10433. }
  10434. else {
  10435. c16toa(ssl->session->ticketLen, output + idx);
  10436. }
  10437. idx += LENGTH_SZ;
  10438. /* ticket */
  10439. if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0) {
  10440. if (ssl->session->haveAltSessionID)
  10441. XMEMCPY(output + idx, ssl->session->altSessionID, ID_LEN);
  10442. else
  10443. return BAD_FUNC_ARG; /* Should not happen */
  10444. idx += ID_LEN;
  10445. }
  10446. else {
  10447. XMEMCPY(output + idx, ssl->session->ticket, ssl->session->ticketLen);
  10448. idx += ssl->session->ticketLen;
  10449. }
  10450. #ifdef WOLFSSL_EARLY_DATA
  10451. extSz = 0;
  10452. ret = TLSX_WriteResponse(ssl, output + idx, session_ticket, &extSz);
  10453. if (ret != 0)
  10454. return ret;
  10455. idx += extSz;
  10456. #else
  10457. /* No extension support - empty extensions. */
  10458. c16toa(0, output + idx);
  10459. idx += EXTS_SZ;
  10460. #endif
  10461. ssl->options.haveSessionId = 1;
  10462. SetupSession(ssl);
  10463. /* Only add to cache when support built in and when the ticket contains
  10464. * an ID. Otherwise we have no way to actually retrieve the ticket from the
  10465. * cache. */
  10466. #if !defined(NO_SESSION_CACHE) && defined(WOLFSSL_TICKET_HAVE_ID)
  10467. AddSession(ssl);
  10468. #endif
  10469. #ifdef WOLFSSL_DTLS13
  10470. if (ssl->options.dtls)
  10471. return Dtls13HandshakeSend(ssl, output, sendSz, idx, session_ticket, 0);
  10472. #endif /* WOLFSSL_DTLS13 */
  10473. /* This message is always encrypted. */
  10474. sendSz = BuildTls13Message(ssl, output, sendSz, output + RECORD_HEADER_SZ,
  10475. idx - RECORD_HEADER_SZ, handshake, 0, 0, 0);
  10476. if (sendSz < 0)
  10477. return sendSz;
  10478. ssl->buffers.outputBuffer.length += sendSz;
  10479. /* Always send as this is either directly after server's Finished or only
  10480. * message after client's Finished.
  10481. */
  10482. ret = SendBuffered(ssl);
  10483. WOLFSSL_LEAVE("SendTls13NewSessionTicket", 0);
  10484. WOLFSSL_END(WC_FUNC_NEW_SESSION_TICKET_SEND);
  10485. return ret;
  10486. }
  10487. #endif /* HAVE_SESSION_TICKET */
  10488. #endif /* NO_WOLFSSL_SERVER */
  10489. /* Make sure no duplicates, no fast forward, or other problems
  10490. *
  10491. * ssl The SSL/TLS object.
  10492. * type Type of handshake message received.
  10493. * returns 0 on success, otherwise failure.
  10494. */
  10495. static int SanityCheckTls13MsgReceived(WOLFSSL* ssl, byte type)
  10496. {
  10497. /* verify not a duplicate, mark received, check state */
  10498. switch (type) {
  10499. #ifndef NO_WOLFSSL_SERVER
  10500. case client_hello:
  10501. #ifndef NO_WOLFSSL_CLIENT
  10502. /* Only valid when received on SERVER side. */
  10503. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10504. WOLFSSL_MSG("ClientHello received by client");
  10505. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  10506. return SIDE_ERROR;
  10507. }
  10508. #endif
  10509. /* Check state. */
  10510. if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE) {
  10511. WOLFSSL_MSG("ClientHello received out of order");
  10512. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10513. return OUT_OF_ORDER_E;
  10514. }
  10515. /* Check previously seen. */
  10516. /* Initial and after HelloRetryRequest - no more than 2. */
  10517. if (ssl->msgsReceived.got_client_hello == 2) {
  10518. WOLFSSL_MSG("Too many ClientHello received");
  10519. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10520. return DUPLICATE_MSG_E;
  10521. }
  10522. /* Second only after HelloRetryRequest seen. */
  10523. if (ssl->msgsReceived.got_client_hello == 1 &&
  10524. ssl->options.serverState !=
  10525. SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
  10526. WOLFSSL_MSG("Duplicate ClientHello received");
  10527. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10528. return DUPLICATE_MSG_E;
  10529. }
  10530. ssl->msgsReceived.got_client_hello++;
  10531. break;
  10532. #endif
  10533. #ifndef NO_WOLFSSL_CLIENT
  10534. case server_hello:
  10535. #ifndef NO_WOLFSSL_SERVER
  10536. /* Only valid when received on CLIENT side. */
  10537. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10538. WOLFSSL_MSG("ServerHello received by server");
  10539. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  10540. return SIDE_ERROR;
  10541. }
  10542. #endif
  10543. /* Check state. */
  10544. if (ssl->options.serverState >= SERVER_HELLO_COMPLETE) {
  10545. WOLFSSL_MSG("ServerHello received out of order");
  10546. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10547. return OUT_OF_ORDER_E;
  10548. }
  10549. /* Check previously seen. */
  10550. /* Only once after ClientHello.
  10551. * HelloRetryRequest has ServerHello type but count fixed up later
  10552. * - see DoTls13ServerHello().
  10553. */
  10554. if (ssl->msgsReceived.got_server_hello) {
  10555. WOLFSSL_MSG("Duplicate ServerHello received");
  10556. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10557. return DUPLICATE_MSG_E;
  10558. }
  10559. ssl->msgsReceived.got_server_hello = 1;
  10560. break;
  10561. #endif
  10562. #ifndef NO_WOLFSSL_CLIENT
  10563. case session_ticket:
  10564. #ifndef NO_WOLFSSL_SERVER
  10565. /* Only valid when received on CLIENT side. */
  10566. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10567. WOLFSSL_MSG("NewSessionTicket received by server");
  10568. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  10569. return SIDE_ERROR;
  10570. }
  10571. #endif
  10572. /* Check state. */
  10573. #ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
  10574. /* Only allowed after server's Finished message. */
  10575. if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
  10576. WOLFSSL_MSG("NewSessionTicket received out of order");
  10577. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10578. return OUT_OF_ORDER_E;
  10579. }
  10580. #else
  10581. /* Only allowed after client's Finished message. */
  10582. if (ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
  10583. WOLFSSL_MSG("NewSessionTicket received out of order");
  10584. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10585. return OUT_OF_ORDER_E;
  10586. }
  10587. #endif
  10588. /* Many SessionTickets can be sent. */
  10589. ssl->msgsReceived.got_session_ticket = 1;
  10590. break;
  10591. #endif
  10592. #ifndef NO_WOLFSSL_SERVER
  10593. #ifdef WOLFSSL_EARLY_DATA
  10594. case end_of_early_data:
  10595. #ifndef NO_WOLFSSL_CLIENT
  10596. /* Only valid when received on SERVER side. */
  10597. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10598. WOLFSSL_MSG("EndOfEarlyData received by client");
  10599. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  10600. return SIDE_ERROR;
  10601. }
  10602. #endif
  10603. /* Check state. */
  10604. /* Only after server's Finished and before client's Finished. */
  10605. if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
  10606. WOLFSSL_MSG("EndOfEarlyData received out of order");
  10607. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10608. return OUT_OF_ORDER_E;
  10609. }
  10610. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE) {
  10611. WOLFSSL_MSG("EndOfEarlyData received out of order");
  10612. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10613. return OUT_OF_ORDER_E;
  10614. }
  10615. /* Check previously seen. */
  10616. if (ssl->msgsReceived.got_end_of_early_data) {
  10617. WOLFSSL_MSG("Too many EndOfEarlyData received");
  10618. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10619. return DUPLICATE_MSG_E;
  10620. }
  10621. ssl->msgsReceived.got_end_of_early_data = 1;
  10622. break;
  10623. #endif
  10624. #endif
  10625. #ifndef NO_WOLFSSL_CLIENT
  10626. case encrypted_extensions:
  10627. #ifndef NO_WOLFSSL_SERVER
  10628. /* Only valid when received on CLIENT side. */
  10629. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10630. WOLFSSL_MSG("EncryptedExtensions received by server");
  10631. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  10632. return SIDE_ERROR;
  10633. }
  10634. #endif
  10635. /* Check state. */
  10636. /* Must be received directly after ServerHello.
  10637. * DoTls13EncryptedExtensions() changes state to:
  10638. * SERVER_ENCRYPTED_EXTENSIONS_COMPLETE.
  10639. */
  10640. if (ssl->options.serverState != SERVER_HELLO_COMPLETE) {
  10641. WOLFSSL_MSG("EncryptedExtensions received out of order");
  10642. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10643. return OUT_OF_ORDER_E;
  10644. }
  10645. /* Check previously seen. */
  10646. if (ssl->msgsReceived.got_encrypted_extensions) {
  10647. WOLFSSL_MSG("Duplicate EncryptedExtensions received");
  10648. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10649. return DUPLICATE_MSG_E;
  10650. }
  10651. ssl->msgsReceived.got_encrypted_extensions = 1;
  10652. break;
  10653. #endif
  10654. case certificate:
  10655. /* Valid on both sides. */
  10656. #ifndef NO_WOLFSSL_CLIENT
  10657. /* Check state. */
  10658. /* On client, seen after EncryptedExtension and CertificateRequest
  10659. * (if sent) and before CertificateVerify and Finished.
  10660. * DoTls13Certificate() sets serverState to SERVER_CERT_COMPLETE.
  10661. */
  10662. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  10663. ssl->options.serverState !=
  10664. SERVER_ENCRYPTED_EXTENSIONS_COMPLETE) {
  10665. WOLFSSL_MSG("Certificate received out of order - Client");
  10666. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10667. return OUT_OF_ORDER_E;
  10668. }
  10669. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  10670. /* Server's authenticating with PSK must not send this. */
  10671. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  10672. ssl->options.serverState == SERVER_CERT_COMPLETE &&
  10673. ssl->options.pskNegotiated) {
  10674. WOLFSSL_MSG("Certificate received while using PSK");
  10675. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  10676. return SANITY_MSG_E;
  10677. }
  10678. #endif
  10679. #endif
  10680. #ifndef NO_WOLFSSL_SERVER
  10681. /* Check state. */
  10682. /* On Server, valid after ClientHello received and ServerFinished
  10683. * sent. */
  10684. if (ssl->options.side == WOLFSSL_SERVER_END &&
  10685. ssl->options.clientState != CLIENT_HELLO_COMPLETE &&
  10686. ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
  10687. WOLFSSL_MSG("Certificate received out of order - Server");
  10688. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10689. return OUT_OF_ORDER_E;
  10690. }
  10691. #endif
  10692. /* Check previously seen. */
  10693. if (ssl->msgsReceived.got_certificate) {
  10694. WOLFSSL_MSG("Duplicate Certificate received");
  10695. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10696. return DUPLICATE_MSG_E;
  10697. }
  10698. ssl->msgsReceived.got_certificate = 1;
  10699. break;
  10700. #ifndef NO_WOLFSSL_CLIENT
  10701. case certificate_request:
  10702. #ifndef NO_WOLFSSL_SERVER
  10703. /* Only valid when received on CLIENT side. */
  10704. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10705. WOLFSSL_MSG("CertificateRequest received by server");
  10706. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  10707. return SIDE_ERROR;
  10708. }
  10709. #endif
  10710. /* Check state. */
  10711. #ifndef WOLFSSL_POST_HANDSHAKE_AUTH
  10712. /* Only valid when sent after EncryptedExtensions and before
  10713. * Certificate. */
  10714. if (ssl->options.serverState !=
  10715. SERVER_ENCRYPTED_EXTENSIONS_COMPLETE) {
  10716. WOLFSSL_MSG("CertificateRequest received out of order");
  10717. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10718. return OUT_OF_ORDER_E;
  10719. }
  10720. #else
  10721. /* Valid when sent after EncryptedExtensions and before Certificate
  10722. * and after both client and server have sent Finished (Post
  10723. * Handshake Authentication). */
  10724. if (ssl->options.serverState !=
  10725. SERVER_ENCRYPTED_EXTENSIONS_COMPLETE &&
  10726. (ssl->options.serverState < SERVER_FINISHED_COMPLETE ||
  10727. ssl->options.clientState != CLIENT_FINISHED_COMPLETE)) {
  10728. WOLFSSL_MSG("CertificateRequest received out of order");
  10729. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10730. return OUT_OF_ORDER_E;
  10731. }
  10732. #endif
  10733. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  10734. /* Server's authenticating with PSK must not send this. */
  10735. if (ssl->options.pskNegotiated) {
  10736. WOLFSSL_MSG("CertificateRequest received while using PSK");
  10737. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  10738. return SANITY_MSG_E;
  10739. }
  10740. #endif
  10741. /* Check previously seen. */
  10742. #ifndef WOLFSSL_POST_HANDSHAKE_AUTH
  10743. /* Only once during handshake. */
  10744. if (ssl->msgsReceived.got_certificate_request) {
  10745. WOLFSSL_MSG("Duplicate CertificateRequest received");
  10746. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10747. return DUPLICATE_MSG_E;
  10748. }
  10749. #else
  10750. /* Only once during handshake. */
  10751. if (ssl->msgsReceived.got_certificate_request &&
  10752. ssl->options.clientState != CLIENT_FINISHED_COMPLETE) {
  10753. WOLFSSL_MSG("Duplicate CertificateRequest received");
  10754. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10755. return DUPLICATE_MSG_E;
  10756. }
  10757. #endif
  10758. ssl->msgsReceived.got_certificate_request = 1;
  10759. break;
  10760. #endif
  10761. case certificate_verify:
  10762. /* Valid on both sides. */
  10763. #ifndef NO_WOLFSSL_CLIENT
  10764. /* Check state on client.
  10765. * Valid only directly after a Certificate message. */
  10766. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10767. if (ssl->options.serverState != SERVER_CERT_COMPLETE) {
  10768. WOLFSSL_MSG("No Cert before CertVerify");
  10769. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10770. return OUT_OF_ORDER_E;
  10771. }
  10772. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  10773. /* Server's authenticating with PSK must not send this. */
  10774. if (ssl->options.pskNegotiated) {
  10775. WOLFSSL_MSG("CertificateVerify received while using PSK");
  10776. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  10777. return SANITY_MSG_E;
  10778. }
  10779. #endif
  10780. }
  10781. #endif
  10782. #ifndef NO_WOLFSSL_SERVER
  10783. /* Check state on server. */
  10784. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10785. /* Server must have sent Finished message. */
  10786. if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
  10787. WOLFSSL_MSG("CertificateVerify received out of order");
  10788. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10789. return OUT_OF_ORDER_E;
  10790. }
  10791. /* Valid only directly after a Certificate message. */
  10792. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  10793. WOLFSSL_MSG("CertificateVerify before ClientHello done");
  10794. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10795. return OUT_OF_ORDER_E;
  10796. }
  10797. if (!ssl->msgsReceived.got_certificate) {
  10798. WOLFSSL_MSG("No Cert before CertificateVerify");
  10799. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10800. return OUT_OF_ORDER_E;
  10801. }
  10802. }
  10803. #endif
  10804. /* Check previously seen. */
  10805. if (ssl->msgsReceived.got_certificate_verify) {
  10806. WOLFSSL_MSG("Duplicate CertificateVerify received");
  10807. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10808. return DUPLICATE_MSG_E;
  10809. }
  10810. ssl->msgsReceived.got_certificate_verify = 1;
  10811. break;
  10812. case finished:
  10813. /* Valid on both sides. */
  10814. #ifndef NO_WOLFSSL_CLIENT
  10815. /* Check state on client. */
  10816. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10817. /* After sending ClientHello */
  10818. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  10819. WOLFSSL_MSG("Finished received out of order - clientState");
  10820. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10821. return OUT_OF_ORDER_E;
  10822. }
  10823. /* Must have seen certificate and verify from server except when
  10824. * using PSK. */
  10825. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  10826. if (ssl->options.pskNegotiated) {
  10827. if (ssl->options.serverState !=
  10828. SERVER_ENCRYPTED_EXTENSIONS_COMPLETE) {
  10829. WOLFSSL_MSG("Finished received out of order - PSK");
  10830. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10831. return OUT_OF_ORDER_E;
  10832. }
  10833. }
  10834. else
  10835. #endif
  10836. if (ssl->options.serverState != SERVER_CERT_VERIFY_COMPLETE) {
  10837. WOLFSSL_MSG("Finished received out of order - serverState");
  10838. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10839. return OUT_OF_ORDER_E;
  10840. }
  10841. }
  10842. #endif
  10843. #ifndef NO_WOLFSSL_SERVER
  10844. /* Check state on server. */
  10845. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10846. if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
  10847. WOLFSSL_MSG("Finished received out of order - serverState");
  10848. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10849. return OUT_OF_ORDER_E;
  10850. }
  10851. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  10852. WOLFSSL_MSG("Finished received out of order - clientState");
  10853. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10854. return OUT_OF_ORDER_E;
  10855. }
  10856. #ifdef WOLFSSL_EARLY_DATA
  10857. if (ssl->earlyData == process_early_data &&
  10858. /* early data may be lost when using DTLS */
  10859. !ssl->options.dtls
  10860. /* QUIC does not use EndOfEarlyData records */
  10861. && !WOLFSSL_IS_QUIC(ssl)) {
  10862. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10863. return OUT_OF_ORDER_E;
  10864. }
  10865. #endif
  10866. }
  10867. #endif
  10868. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  10869. if (!ssl->options.pskNegotiated)
  10870. #endif
  10871. {
  10872. /* Must have received a Certificate message from client if
  10873. * verifying the peer. Empty certificate message indicates
  10874. * no certificate available.
  10875. */
  10876. if (ssl->options.verifyPeer &&
  10877. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  10878. !ssl->options.verifyPostHandshake &&
  10879. #endif
  10880. !ssl->msgsReceived.got_certificate) {
  10881. WOLFSSL_MSG("Finished received out of order - "
  10882. "missing Certificate message");
  10883. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10884. return OUT_OF_ORDER_E;
  10885. }
  10886. /* Mutual authentication on server requires a certificate from
  10887. * peer. Verify peer set on client side requires a certificate
  10888. * from peer as not doing PSK.
  10889. */
  10890. if ((ssl->options.mutualAuth ||
  10891. (ssl->options.side == WOLFSSL_CLIENT_END &&
  10892. ssl->options.verifyPeer)) && !ssl->options.havePeerCert) {
  10893. WOLFSSL_MSG("Finished received out of order - "
  10894. "no valid certificate");
  10895. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10896. return OUT_OF_ORDER_E;
  10897. }
  10898. /* Must have received a valid CertificateVerify if verifying
  10899. * peer and got a peer certificate.
  10900. */
  10901. if ((ssl->options.mutualAuth || ssl->options.verifyPeer) &&
  10902. ssl->options.havePeerCert && !ssl->options.havePeerVerify) {
  10903. WOLFSSL_MSG("Finished received out of order - "
  10904. "Certificate message but no CertificateVerify");
  10905. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10906. return OUT_OF_ORDER_E;
  10907. }
  10908. }
  10909. /* Check previously seen. */
  10910. if (ssl->msgsReceived.got_finished) {
  10911. WOLFSSL_MSG("Duplicate Finished received");
  10912. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10913. return DUPLICATE_MSG_E;
  10914. }
  10915. ssl->msgsReceived.got_finished = 1;
  10916. break;
  10917. case key_update:
  10918. /* Valid on both sides. */
  10919. /* Check state.
  10920. * Client and server must have received finished message from other
  10921. * side.
  10922. */
  10923. if (!ssl->msgsReceived.got_finished) {
  10924. WOLFSSL_MSG("No KeyUpdate before Finished");
  10925. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10926. return OUT_OF_ORDER_E;
  10927. }
  10928. /* Multiple KeyUpdates can be sent. */
  10929. break;
  10930. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12)
  10931. case hello_verify_request:
  10932. if (!ssl->options.dtls) {
  10933. WOLFSSL_MSG("HelloVerifyRequest when not in DTLS");
  10934. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10935. return OUT_OF_ORDER_E;
  10936. }
  10937. if (ssl->msgsReceived.got_hello_verify_request) {
  10938. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  10939. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10940. return DUPLICATE_MSG_E;
  10941. }
  10942. ssl->msgsReceived.got_hello_verify_request = 1;
  10943. if (ssl->msgsReceived.got_hello_retry_request) {
  10944. WOLFSSL_MSG(
  10945. "Both HelloVerifyRequest and HelloRetryRequest received");
  10946. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  10947. return DUPLICATE_MSG_E;
  10948. }
  10949. if (ssl->options.serverState >=
  10950. SERVER_HELLO_RETRY_REQUEST_COMPLETE ||
  10951. ssl->options.connectState != CLIENT_HELLO_SENT) {
  10952. WOLFSSL_MSG("HelloVerifyRequest received out of order");
  10953. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  10954. return OUT_OF_ORDER_E;
  10955. }
  10956. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10957. WOLFSSL_MSG("HelloVerifyRequest received on the server");
  10958. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  10959. return SIDE_ERROR;
  10960. }
  10961. if (!ssl->options.downgrade ||
  10962. ssl->options.minDowngrade < DTLSv1_2_MINOR) {
  10963. WOLFSSL_MSG(
  10964. "HelloVerifyRequest received but not DTLSv1.2 allowed");
  10965. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  10966. return VERSION_ERROR;
  10967. }
  10968. break;
  10969. #endif /* WOLFSSL_DTLS13 && !WOLFSSL_NO_TLS12*/
  10970. default:
  10971. WOLFSSL_MSG("Unknown message type");
  10972. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  10973. return SANITY_MSG_E;
  10974. }
  10975. return 0;
  10976. }
  10977. /* Handle a type of handshake message that has been received.
  10978. *
  10979. * ssl The SSL/TLS object.
  10980. * input The message buffer.
  10981. * inOutIdx On entry, the index into the buffer of the current message.
  10982. * On exit, the index into the buffer of the next message.
  10983. * size The length of the current handshake message.
  10984. * totalSz Length of remaining data in the message buffer.
  10985. * returns 0 on success and otherwise failure.
  10986. */
  10987. int DoTls13HandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10988. byte type, word32 size, word32 totalSz)
  10989. {
  10990. int ret = 0, tmp;
  10991. word32 inIdx = *inOutIdx;
  10992. int alertType = invalid_alert;
  10993. #if defined(HAVE_ECH)
  10994. TLSX* echX = NULL;
  10995. word32 echInOutIdx;
  10996. #endif
  10997. (void)totalSz;
  10998. WOLFSSL_ENTER("DoTls13HandShakeMsgType");
  10999. /* make sure we can read the message */
  11000. if (*inOutIdx + size > totalSz)
  11001. return INCOMPLETE_DATA;
  11002. /* sanity check msg received */
  11003. if ((ret = SanityCheckTls13MsgReceived(ssl, type)) != 0) {
  11004. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  11005. if (ret == VERSION_ERROR)
  11006. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  11007. else
  11008. SendAlert(ssl, alert_fatal, unexpected_message);
  11009. return ret;
  11010. }
  11011. #if defined(WOLFSSL_CALLBACKS)
  11012. /* add name later, add on record and handshake header part back on */
  11013. if (ssl->toInfoOn) {
  11014. ret = AddPacketInfo(ssl, 0, handshake, input + *inOutIdx -
  11015. HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ, READ_PROTO,
  11016. RECORD_HEADER_SZ, ssl->heap);
  11017. if (ret != 0)
  11018. return ret;
  11019. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  11020. }
  11021. #endif
  11022. if (ssl->options.handShakeState == HANDSHAKE_DONE &&
  11023. type != session_ticket && type != certificate_request &&
  11024. type != certificate && type != key_update && type != finished) {
  11025. WOLFSSL_MSG("HandShake message after handshake complete");
  11026. SendAlert(ssl, alert_fatal, unexpected_message);
  11027. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  11028. return OUT_OF_ORDER_E;
  11029. }
  11030. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  11031. ssl->options.serverState == NULL_STATE &&
  11032. type != server_hello && type != hello_retry_request
  11033. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12)
  11034. && (!ssl->options.dtls || type != hello_verify_request)
  11035. #endif /* defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12) */
  11036. ) {
  11037. WOLFSSL_MSG("First server message not server hello");
  11038. SendAlert(ssl, alert_fatal, unexpected_message);
  11039. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  11040. return OUT_OF_ORDER_E;
  11041. }
  11042. if (ssl->options.side == WOLFSSL_SERVER_END &&
  11043. ssl->options.clientState == NULL_STATE && type != client_hello) {
  11044. WOLFSSL_MSG("First client message not client hello");
  11045. SendAlert(ssl, alert_fatal, unexpected_message);
  11046. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  11047. return OUT_OF_ORDER_E;
  11048. }
  11049. /* above checks handshake state */
  11050. switch (type) {
  11051. #ifndef NO_WOLFSSL_CLIENT
  11052. /* Messages only received by client. */
  11053. case server_hello:
  11054. WOLFSSL_MSG("processing server hello");
  11055. ret = DoTls13ServerHello(ssl, input, inOutIdx, size, &type);
  11056. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  11057. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  11058. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  11059. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  11060. IsAtLeastTLSv1_3(ssl->version)) {
  11061. ssl->options.cacheMessages = 0;
  11062. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  11063. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  11064. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  11065. ssl->hsHashes->messages = NULL;
  11066. }
  11067. }
  11068. #endif
  11069. break;
  11070. case encrypted_extensions:
  11071. WOLFSSL_MSG("processing encrypted extensions");
  11072. ret = DoTls13EncryptedExtensions(ssl, input, inOutIdx, size);
  11073. break;
  11074. #ifndef NO_CERTS
  11075. case certificate_request:
  11076. WOLFSSL_MSG("processing certificate request");
  11077. ret = DoTls13CertificateRequest(ssl, input, inOutIdx, size);
  11078. break;
  11079. #endif
  11080. case session_ticket:
  11081. WOLFSSL_MSG("processing new session ticket");
  11082. ret = DoTls13NewSessionTicket(ssl, input, inOutIdx, size);
  11083. break;
  11084. #endif /* !NO_WOLFSSL_CLIENT */
  11085. #ifndef NO_WOLFSSL_SERVER
  11086. /* Messages only received by server. */
  11087. case client_hello:
  11088. WOLFSSL_MSG("processing client hello");
  11089. #if defined(HAVE_ECH)
  11090. /* keep the start idx so we can restore it for the inner call */
  11091. echInOutIdx = *inOutIdx;
  11092. #endif
  11093. ret = DoTls13ClientHello(ssl, input, inOutIdx, size);
  11094. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  11095. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  11096. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  11097. if ((ssl->options.resuming || !ssl->options.verifyPeer ||
  11098. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version))
  11099. #ifdef WOLFSSL_DTLS13
  11100. && (!ssl->options.dtls)
  11101. #endif
  11102. ) {
  11103. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11104. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  11105. #endif
  11106. {
  11107. ssl->options.cacheMessages = 0;
  11108. if ((ssl->hsHashes != NULL) &&
  11109. (ssl->hsHashes->messages != NULL)) {
  11110. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  11111. XFREE(ssl->hsHashes->messages, ssl->heap,
  11112. DYNAMIC_TYPE_HASHES);
  11113. ssl->hsHashes->messages = NULL;
  11114. }
  11115. }
  11116. }
  11117. #endif
  11118. #if defined(HAVE_ECH)
  11119. if (ret == 0) {
  11120. echX = TLSX_Find(ssl->extensions, TLSX_ECH);
  11121. if (echX != NULL &&
  11122. ((WOLFSSL_ECH*)echX->data)->state == ECH_WRITE_NONE) {
  11123. /* reset the inOutIdx to the outer start */
  11124. *inOutIdx = echInOutIdx;
  11125. /* call again with the inner hello */
  11126. ret = DoTls13ClientHello(ssl,
  11127. ((WOLFSSL_ECH*)echX->data)->innerClientHello,
  11128. &echInOutIdx,
  11129. ((WOLFSSL_ECH*)echX->data)->innerClientHelloLen);
  11130. /* if the inner ech parsed successfully we have successfully
  11131. * handled the hello and can skip the whole message */
  11132. if (ret == 0)
  11133. *inOutIdx += size;
  11134. }
  11135. }
  11136. #endif /* HAVE_ECH */
  11137. break;
  11138. #ifdef WOLFSSL_EARLY_DATA
  11139. case end_of_early_data:
  11140. WOLFSSL_MSG("processing end of early data");
  11141. ret = DoTls13EndOfEarlyData(ssl, input, inOutIdx, size);
  11142. break;
  11143. #endif
  11144. #endif /* !NO_WOLFSSL_SERVER */
  11145. /* Messages received by both client and server. */
  11146. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  11147. !defined(WOLFSSL_NO_CLIENT_AUTH))
  11148. case certificate:
  11149. WOLFSSL_MSG("processing certificate");
  11150. ret = DoTls13Certificate(ssl, input, inOutIdx, size);
  11151. break;
  11152. #endif
  11153. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  11154. defined(HAVE_ED448) || defined(HAVE_PQC)
  11155. case certificate_verify:
  11156. WOLFSSL_MSG("processing certificate verify");
  11157. ret = DoTls13CertificateVerify(ssl, input, inOutIdx, size);
  11158. break;
  11159. #endif
  11160. case finished:
  11161. WOLFSSL_MSG("processing finished");
  11162. ret = DoTls13Finished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  11163. break;
  11164. case key_update:
  11165. WOLFSSL_MSG("processing key update");
  11166. ret = DoTls13KeyUpdate(ssl, input, inOutIdx, size);
  11167. break;
  11168. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_TLS12) && \
  11169. !defined(NO_WOLFSSL_CLIENT)
  11170. case hello_verify_request:
  11171. WOLFSSL_MSG("processing hello verify request");
  11172. ret = DoHelloVerifyRequest(ssl, input, inOutIdx, size);
  11173. break;
  11174. #endif
  11175. default:
  11176. WOLFSSL_MSG("Unknown handshake message type");
  11177. ret = UNKNOWN_HANDSHAKE_TYPE;
  11178. break;
  11179. }
  11180. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_ASYNC_IO)
  11181. /* if async, offset index so this msg will be processed again */
  11182. /* NOTE: check this now before other calls can overwrite ret */
  11183. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  11184. /* DTLS always stores a message in a buffer when async is enable, so we
  11185. * don't need to adjust for the extra bytes here (*inOutIdx is always
  11186. * == 0) */
  11187. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  11188. }
  11189. /* make sure async error is cleared */
  11190. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  11191. ssl->error = 0;
  11192. }
  11193. #endif
  11194. if (ret == 0 && type != client_hello && type != session_ticket &&
  11195. type != key_update) {
  11196. ret = HashInput(ssl, input + inIdx, size);
  11197. }
  11198. alertType = TranslateErrorToAlert(ret);
  11199. if (alertType != invalid_alert) {
  11200. #ifdef WOLFSSL_DTLS13
  11201. if (type == client_hello && ssl->options.dtls)
  11202. DtlsSetSeqNumForReply(ssl);
  11203. #endif
  11204. tmp = SendAlert(ssl, alert_fatal, alertType);
  11205. /* propagate socket error instead of tls error to be sure the error is
  11206. * not ignored by DTLS code */
  11207. if (tmp == SOCKET_ERROR_E)
  11208. ret = SOCKET_ERROR_E;
  11209. }
  11210. if (ret == 0 && ssl->options.tls1_3) {
  11211. /* Need to hash input message before deriving secrets. */
  11212. #ifndef NO_WOLFSSL_CLIENT
  11213. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11214. if (type == server_hello) {
  11215. if ((ret = DeriveEarlySecret(ssl)) != 0)
  11216. return ret;
  11217. if ((ret = DeriveHandshakeSecret(ssl)) != 0)
  11218. return ret;
  11219. if ((ret = DeriveTls13Keys(ssl, handshake_key,
  11220. ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0) {
  11221. return ret;
  11222. }
  11223. #ifdef WOLFSSL_EARLY_DATA
  11224. if (ssl->earlyData != no_early_data) {
  11225. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  11226. return ret;
  11227. }
  11228. else
  11229. #endif
  11230. if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) != 0)
  11231. return ret;
  11232. #ifdef WOLFSSL_DTLS13
  11233. if (ssl->options.dtls) {
  11234. w64wrapper epochHandshake;
  11235. epochHandshake = w64From32(0, DTLS13_EPOCH_HANDSHAKE);
  11236. ssl->dtls13Epoch = epochHandshake;
  11237. ssl->dtls13PeerEpoch = epochHandshake;
  11238. ret = Dtls13NewEpoch(
  11239. ssl, epochHandshake, ENCRYPT_AND_DECRYPT_SIDE);
  11240. if (ret != 0)
  11241. return ret;
  11242. ret = Dtls13SetEpochKeys(
  11243. ssl, epochHandshake, ENCRYPT_AND_DECRYPT_SIDE);
  11244. if (ret != 0)
  11245. return ret;
  11246. }
  11247. #endif /* WOLFSSL_DTLS13 */
  11248. }
  11249. if (type == finished) {
  11250. if ((ret = DeriveMasterSecret(ssl)) != 0)
  11251. return ret;
  11252. /* Last use of preMasterSecret - zeroize as soon as possible. */
  11253. ForceZero(ssl->arrays->preMasterSecret,
  11254. ssl->arrays->preMasterSz);
  11255. #ifdef WOLFSSL_EARLY_DATA
  11256. #ifdef WOLFSSL_QUIC
  11257. if (WOLFSSL_IS_QUIC(ssl) && ssl->earlyData != no_early_data) {
  11258. /* QUIC never sends/receives EndOfEarlyData, but having
  11259. * early data means the last encrpytion keys had not been
  11260. * set yet. */
  11261. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  11262. return ret;
  11263. }
  11264. #endif
  11265. if ((ret = DeriveTls13Keys(ssl, traffic_key,
  11266. ENCRYPT_AND_DECRYPT_SIDE,
  11267. ssl->earlyData == no_early_data)) != 0) {
  11268. return ret;
  11269. }
  11270. #else
  11271. if ((ret = DeriveTls13Keys(ssl, traffic_key,
  11272. ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0) {
  11273. return ret;
  11274. }
  11275. #endif
  11276. }
  11277. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  11278. if (type == certificate_request &&
  11279. ssl->options.handShakeState == HANDSHAKE_DONE) {
  11280. /* reset handshake states */
  11281. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  11282. ssl->options.connectState = FIRST_REPLY_DONE;
  11283. ssl->options.handShakeState = CLIENT_HELLO_COMPLETE;
  11284. ssl->options.processReply = 0; /* doProcessInit */
  11285. /*
  11286. DTLSv1.3 note: We can't reset serverState to
  11287. SERVER_FINISHED_COMPLETE with the goal that this connect
  11288. blocks until the cert/cert_verify/finished flight gets ACKed
  11289. by the server. The problem is that we will invoke
  11290. ProcessReplyEx() in that case, but we came here from
  11291. ProcessReplyEx() and it is not re-entrant safe (the input
  11292. buffer would still have the certificate_request message). */
  11293. if (wolfSSL_connect_TLSv13(ssl) != WOLFSSL_SUCCESS) {
  11294. ret = ssl->error;
  11295. if (ret != WC_PENDING_E)
  11296. ret = POST_HAND_AUTH_ERROR;
  11297. }
  11298. }
  11299. #endif
  11300. }
  11301. #endif /* NO_WOLFSSL_CLIENT */
  11302. #ifndef NO_WOLFSSL_SERVER
  11303. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  11304. if (ssl->options.side == WOLFSSL_SERVER_END && type == finished) {
  11305. ret = DeriveResumptionSecret(ssl, ssl->session->masterSecret);
  11306. if (ret != 0)
  11307. return ret;
  11308. }
  11309. #endif
  11310. #endif /* NO_WOLFSSL_SERVER */
  11311. }
  11312. #ifdef WOLFSSL_DTLS13
  11313. if (ssl->options.dtls && !ssl->options.dtlsStateful) {
  11314. DtlsResetState(ssl);
  11315. if (DtlsIgnoreError(ret))
  11316. ret = 0;
  11317. }
  11318. #endif
  11319. WOLFSSL_LEAVE("DoTls13HandShakeMsgType()", ret);
  11320. return ret;
  11321. }
  11322. /* Handle a handshake message that has been received.
  11323. *
  11324. * ssl The SSL/TLS object.
  11325. * input The message buffer.
  11326. * inOutIdx On entry, the index into the buffer of the current message.
  11327. * On exit, the index into the buffer of the next message.
  11328. * totalSz Length of remaining data in the message buffer.
  11329. * returns 0 on success and otherwise failure.
  11330. */
  11331. int DoTls13HandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11332. word32 totalSz)
  11333. {
  11334. int ret = 0;
  11335. word32 inputLength;
  11336. byte type;
  11337. word32 size = 0;
  11338. WOLFSSL_ENTER("DoTls13HandShakeMsg");
  11339. if (ssl->arrays == NULL) {
  11340. if (GetHandshakeHeader(ssl, input, inOutIdx, &type, &size,
  11341. totalSz) != 0) {
  11342. SendAlert(ssl, alert_fatal, unexpected_message);
  11343. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  11344. return PARSE_ERROR;
  11345. }
  11346. ret = EarlySanityCheckMsgReceived(ssl, type, size);
  11347. if (ret != 0) {
  11348. WOLFSSL_ERROR(ret);
  11349. return ret;
  11350. }
  11351. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  11352. totalSz);
  11353. }
  11354. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx - ssl->keys.padSz;
  11355. /* If there is a pending fragmented handshake message,
  11356. * pending message size will be non-zero. */
  11357. if (ssl->arrays->pendingMsgSz == 0) {
  11358. if (GetHandshakeHeader(ssl, input, inOutIdx, &type, &size,
  11359. totalSz) != 0) {
  11360. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  11361. return PARSE_ERROR;
  11362. }
  11363. ret = EarlySanityCheckMsgReceived(ssl, type,
  11364. min(inputLength - HANDSHAKE_HEADER_SZ, size));
  11365. if (ret != 0) {
  11366. WOLFSSL_ERROR(ret);
  11367. return ret;
  11368. }
  11369. /* Cap the maximum size of a handshake message to something reasonable.
  11370. * By default is the maximum size of a certificate message assuming
  11371. * nine 2048-bit RSA certificates in the chain. */
  11372. if (size > MAX_HANDSHAKE_SZ) {
  11373. WOLFSSL_MSG("Handshake message too large");
  11374. WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
  11375. return HANDSHAKE_SIZE_ERROR;
  11376. }
  11377. /* size is the size of the certificate message payload */
  11378. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  11379. ssl->arrays->pendingMsgType = type;
  11380. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  11381. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  11382. ssl->heap,
  11383. DYNAMIC_TYPE_ARRAYS);
  11384. if (ssl->arrays->pendingMsg == NULL)
  11385. return MEMORY_E;
  11386. XMEMCPY(ssl->arrays->pendingMsg,
  11387. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  11388. inputLength);
  11389. ssl->arrays->pendingMsgOffset = inputLength;
  11390. *inOutIdx += inputLength + ssl->keys.padSz - HANDSHAKE_HEADER_SZ;
  11391. return 0;
  11392. }
  11393. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  11394. totalSz);
  11395. }
  11396. else {
  11397. if (inputLength + ssl->arrays->pendingMsgOffset >
  11398. ssl->arrays->pendingMsgSz) {
  11399. inputLength = ssl->arrays->pendingMsgSz -
  11400. ssl->arrays->pendingMsgOffset;
  11401. }
  11402. ret = EarlySanityCheckMsgReceived(ssl, ssl->arrays->pendingMsgType,
  11403. inputLength);
  11404. if (ret != 0) {
  11405. WOLFSSL_ERROR(ret);
  11406. return ret;
  11407. }
  11408. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  11409. input + *inOutIdx, inputLength);
  11410. ssl->arrays->pendingMsgOffset += inputLength;
  11411. *inOutIdx += inputLength + ssl->keys.padSz;
  11412. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  11413. {
  11414. word32 idx = 0;
  11415. ret = DoTls13HandShakeMsgType(ssl,
  11416. ssl->arrays->pendingMsg + HANDSHAKE_HEADER_SZ,
  11417. &idx, ssl->arrays->pendingMsgType,
  11418. ssl->arrays->pendingMsgSz - HANDSHAKE_HEADER_SZ,
  11419. ssl->arrays->pendingMsgSz);
  11420. #ifdef WOLFSSL_ASYNC_CRYPT
  11421. if (ret == WC_PENDING_E) {
  11422. /* setup to process fragment again */
  11423. ssl->arrays->pendingMsgOffset -= inputLength;
  11424. *inOutIdx -= inputLength + ssl->keys.padSz;
  11425. }
  11426. else
  11427. #endif
  11428. {
  11429. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  11430. ssl->arrays->pendingMsg = NULL;
  11431. ssl->arrays->pendingMsgSz = 0;
  11432. }
  11433. }
  11434. }
  11435. WOLFSSL_LEAVE("DoTls13HandShakeMsg", ret);
  11436. return ret;
  11437. }
  11438. #ifndef NO_WOLFSSL_CLIENT
  11439. /* The client connecting to the server.
  11440. * The protocol version is expecting to be TLS v1.3.
  11441. * If the server downgrades, and older versions of the protocol are compiled
  11442. * in, the client will fallback to wolfSSL_connect().
  11443. * Please see note at top of README if you get an error from connect.
  11444. *
  11445. * ssl The SSL/TLS object.
  11446. * returns WOLFSSL_SUCCESS on successful handshake, WOLFSSL_FATAL_ERROR when
  11447. * unrecoverable error occurs and 0 otherwise.
  11448. * For more error information use wolfSSL_get_error().
  11449. */
  11450. int wolfSSL_connect_TLSv13(WOLFSSL* ssl)
  11451. {
  11452. int advanceState;
  11453. int ret = 0;
  11454. WOLFSSL_ENTER("wolfSSL_connect_TLSv13");
  11455. #ifdef HAVE_ERRNO_H
  11456. errno = 0;
  11457. #endif
  11458. if (ssl == NULL)
  11459. return BAD_FUNC_ARG;
  11460. if (ssl->options.side != WOLFSSL_CLIENT_END) {
  11461. ssl->error = SIDE_ERROR;
  11462. WOLFSSL_ERROR(ssl->error);
  11463. return WOLFSSL_FATAL_ERROR;
  11464. }
  11465. /* make sure this wolfSSL object has arrays and rng setup. Protects
  11466. * case where the WOLFSSL object is re-used via wolfSSL_clear() */
  11467. if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
  11468. return ret;
  11469. }
  11470. #ifdef WOLFSSL_DTLS
  11471. if (ssl->version.major == DTLS_MAJOR) {
  11472. ssl->options.dtls = 1;
  11473. ssl->options.dtlsStateful = 1;
  11474. }
  11475. #endif
  11476. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  11477. if ((ssl->ConnectFilter != NULL) &&
  11478. (ssl->options.connectState == CONNECT_BEGIN))
  11479. {
  11480. wolfSSL_netfilter_decision_t res;
  11481. if ((ssl->ConnectFilter(ssl, ssl->ConnectFilter_arg, &res) ==
  11482. WOLFSSL_SUCCESS) &&
  11483. (res == WOLFSSL_NETFILTER_REJECT)) {
  11484. ssl->error = SOCKET_FILTERED_E;
  11485. WOLFSSL_ERROR(ssl->error);
  11486. return WOLFSSL_FATAL_ERROR;
  11487. }
  11488. }
  11489. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  11490. /* fragOffset is non-zero when sending fragments. On the last
  11491. * fragment, fragOffset is zero again, and the state can be
  11492. * advanced. Also, only advance from states in which we send data */
  11493. advanceState = (ssl->options.connectState == CONNECT_BEGIN ||
  11494. ssl->options.connectState == HELLO_AGAIN ||
  11495. (ssl->options.connectState >= FIRST_REPLY_DONE &&
  11496. ssl->options.connectState <= FIRST_REPLY_FOURTH));
  11497. #ifdef WOLFSSL_DTLS13
  11498. if (ssl->options.dtls)
  11499. advanceState = advanceState && !ssl->dtls13SendingFragments
  11500. && !ssl->dtls13SendingAckOrRtx;
  11501. #endif /* WOLFSSL_DTLS13 */
  11502. if (ssl->buffers.outputBuffer.length > 0
  11503. #ifdef WOLFSSL_ASYNC_CRYPT
  11504. /* do not send buffered or advance state if last error was an
  11505. async pending operation */
  11506. && ssl->error != WC_PENDING_E
  11507. #endif
  11508. ) {
  11509. if ((ret = SendBuffered(ssl)) == 0) {
  11510. if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
  11511. if (advanceState) {
  11512. #ifdef WOLFSSL_DTLS13
  11513. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version) &&
  11514. ssl->options.connectState == FIRST_REPLY_FOURTH) {
  11515. /* WAIT_FINISHED_ACK is a state added afterwards, but it
  11516. can't follow FIRST_REPLY_FOURTH in the enum order. Indeed
  11517. the value of the enum ConnectState is stored in
  11518. serialized session. This would make importing serialized
  11519. session from other wolfSSL version incompatible */
  11520. ssl->options.connectState = WAIT_FINISHED_ACK;
  11521. }
  11522. else
  11523. #endif /* WOLFSSL_DTLS13 */
  11524. {
  11525. ssl->options.connectState++;
  11526. }
  11527. WOLFSSL_MSG("connect state: "
  11528. "Advanced from last buffered fragment send");
  11529. #ifdef WOLFSSL_ASYNC_IO
  11530. FreeAsyncCtx(ssl, 0);
  11531. #endif
  11532. }
  11533. }
  11534. else {
  11535. WOLFSSL_MSG("connect state: "
  11536. "Not advanced, more fragments to send");
  11537. }
  11538. #ifdef WOLFSSL_DTLS13
  11539. if (ssl->options.dtls)
  11540. ssl->dtls13SendingAckOrRtx = 0;
  11541. #endif /* WOLFSSL_DTLS13 */
  11542. }
  11543. else {
  11544. ssl->error = ret;
  11545. WOLFSSL_ERROR(ssl->error);
  11546. return WOLFSSL_FATAL_ERROR;
  11547. }
  11548. }
  11549. ret = RetrySendAlert(ssl);
  11550. if (ret != 0) {
  11551. ssl->error = ret;
  11552. WOLFSSL_ERROR(ssl->error);
  11553. return WOLFSSL_FATAL_ERROR;
  11554. }
  11555. #ifdef WOLFSSL_DTLS13
  11556. if (ssl->options.dtls && ssl->dtls13SendingFragments) {
  11557. if ((ssl->error = Dtls13FragmentsContinue(ssl)) != 0) {
  11558. WOLFSSL_ERROR(ssl->error);
  11559. return WOLFSSL_FATAL_ERROR;
  11560. }
  11561. /* we sent all the fragments. Advance state. */
  11562. ssl->options.connectState++;
  11563. }
  11564. #endif /* WOLFSSL_DTLS13 */
  11565. switch (ssl->options.connectState) {
  11566. case CONNECT_BEGIN:
  11567. /* Always send client hello first. */
  11568. if ((ssl->error = SendTls13ClientHello(ssl)) != 0) {
  11569. WOLFSSL_ERROR(ssl->error);
  11570. return WOLFSSL_FATAL_ERROR;
  11571. }
  11572. ssl->options.connectState = CLIENT_HELLO_SENT;
  11573. WOLFSSL_MSG("TLSv13 connect state: CLIENT_HELLO_SENT");
  11574. #ifdef WOLFSSL_EARLY_DATA
  11575. if (ssl->earlyData != no_early_data) {
  11576. #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
  11577. if (!ssl->options.dtls && ssl->options.tls13MiddleBoxCompat) {
  11578. if ((ssl->error = SendChangeCipher(ssl)) != 0) {
  11579. WOLFSSL_ERROR(ssl->error);
  11580. return WOLFSSL_FATAL_ERROR;
  11581. }
  11582. ssl->options.sentChangeCipher = 1;
  11583. }
  11584. #endif
  11585. ssl->options.handShakeState = CLIENT_HELLO_COMPLETE;
  11586. return WOLFSSL_SUCCESS;
  11587. }
  11588. #endif
  11589. FALL_THROUGH;
  11590. case CLIENT_HELLO_SENT:
  11591. /* Get the response/s from the server. */
  11592. while (ssl->options.serverState <
  11593. SERVER_HELLOVERIFYREQUEST_COMPLETE) {
  11594. if ((ssl->error = ProcessReply(ssl)) < 0) {
  11595. WOLFSSL_ERROR(ssl->error);
  11596. return WOLFSSL_FATAL_ERROR;
  11597. }
  11598. #ifdef WOLFSSL_DTLS13
  11599. if (ssl->options.dtls) {
  11600. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  11601. WOLFSSL_ERROR(ssl->error);
  11602. return WOLFSSL_FATAL_ERROR;
  11603. }
  11604. }
  11605. #endif /* WOLFSSL_DTLS13 */
  11606. }
  11607. if (!ssl->options.tls1_3) {
  11608. #ifndef WOLFSSL_NO_TLS12
  11609. if (ssl->options.downgrade)
  11610. return wolfSSL_connect(ssl);
  11611. #endif
  11612. WOLFSSL_MSG("Client using higher version, fatal error");
  11613. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  11614. return VERSION_ERROR;
  11615. }
  11616. ssl->options.connectState = HELLO_AGAIN;
  11617. WOLFSSL_MSG("connect state: HELLO_AGAIN");
  11618. FALL_THROUGH;
  11619. case HELLO_AGAIN:
  11620. if (ssl->options.serverState ==
  11621. SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
  11622. #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
  11623. if (!ssl->options.dtls && !ssl->options.sentChangeCipher
  11624. && ssl->options.tls13MiddleBoxCompat) {
  11625. if ((ssl->error = SendChangeCipher(ssl)) != 0) {
  11626. WOLFSSL_ERROR(ssl->error);
  11627. return WOLFSSL_FATAL_ERROR;
  11628. }
  11629. ssl->options.sentChangeCipher = 1;
  11630. }
  11631. #endif
  11632. /* Try again with different security parameters. */
  11633. if ((ssl->error = SendTls13ClientHello(ssl)) != 0) {
  11634. WOLFSSL_ERROR(ssl->error);
  11635. return WOLFSSL_FATAL_ERROR;
  11636. }
  11637. }
  11638. ssl->options.connectState = HELLO_AGAIN_REPLY;
  11639. WOLFSSL_MSG("connect state: HELLO_AGAIN_REPLY");
  11640. FALL_THROUGH;
  11641. case HELLO_AGAIN_REPLY:
  11642. /* Get the response/s from the server. */
  11643. while (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
  11644. if ((ssl->error = ProcessReply(ssl)) < 0) {
  11645. WOLFSSL_ERROR(ssl->error);
  11646. return WOLFSSL_FATAL_ERROR;
  11647. }
  11648. #ifdef WOLFSSL_DTLS13
  11649. if (ssl->options.dtls) {
  11650. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  11651. WOLFSSL_ERROR(ssl->error);
  11652. return WOLFSSL_FATAL_ERROR;
  11653. }
  11654. }
  11655. #endif /* WOLFSSL_DTLS13 */
  11656. }
  11657. ssl->options.connectState = FIRST_REPLY_DONE;
  11658. WOLFSSL_MSG("connect state: FIRST_REPLY_DONE");
  11659. FALL_THROUGH;
  11660. case FIRST_REPLY_DONE:
  11661. if (ssl->options.certOnly)
  11662. return WOLFSSL_SUCCESS;
  11663. #ifdef WOLFSSL_EARLY_DATA
  11664. if (!ssl->options.dtls && ssl->earlyData != no_early_data
  11665. && !WOLFSSL_IS_QUIC(ssl)) {
  11666. if ((ssl->error = SendTls13EndOfEarlyData(ssl)) != 0) {
  11667. WOLFSSL_ERROR(ssl->error);
  11668. return WOLFSSL_FATAL_ERROR;
  11669. }
  11670. WOLFSSL_MSG("sent: end_of_early_data");
  11671. }
  11672. #endif
  11673. ssl->options.connectState = FIRST_REPLY_FIRST;
  11674. WOLFSSL_MSG("connect state: FIRST_REPLY_FIRST");
  11675. FALL_THROUGH;
  11676. case FIRST_REPLY_FIRST:
  11677. #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
  11678. if (!ssl->options.sentChangeCipher && !ssl->options.dtls
  11679. && ssl->options.tls13MiddleBoxCompat) {
  11680. if ((ssl->error = SendChangeCipher(ssl)) != 0) {
  11681. WOLFSSL_ERROR(ssl->error);
  11682. return WOLFSSL_FATAL_ERROR;
  11683. }
  11684. ssl->options.sentChangeCipher = 1;
  11685. }
  11686. #endif
  11687. ssl->options.connectState = FIRST_REPLY_SECOND;
  11688. WOLFSSL_MSG("connect state: FIRST_REPLY_SECOND");
  11689. FALL_THROUGH;
  11690. case FIRST_REPLY_SECOND:
  11691. /* CLIENT: check peer authentication. */
  11692. if (!ssl->options.peerAuthGood) {
  11693. WOLFSSL_MSG("Server authentication did not happen");
  11694. WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
  11695. return WOLFSSL_FATAL_ERROR;
  11696. }
  11697. #ifndef NO_CERTS
  11698. if (!ssl->options.resuming && ssl->options.sendVerify) {
  11699. ssl->error = SendTls13Certificate(ssl);
  11700. if (ssl->error != 0) {
  11701. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11702. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11703. #endif
  11704. WOLFSSL_ERROR(ssl->error);
  11705. return WOLFSSL_FATAL_ERROR;
  11706. }
  11707. WOLFSSL_MSG("sent: certificate");
  11708. }
  11709. #endif
  11710. ssl->options.connectState = FIRST_REPLY_THIRD;
  11711. WOLFSSL_MSG("connect state: FIRST_REPLY_THIRD");
  11712. FALL_THROUGH;
  11713. case FIRST_REPLY_THIRD:
  11714. #if (!defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \
  11715. defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  11716. defined(HAVE_PQC))) && (!defined(NO_WOLFSSL_SERVER) || \
  11717. !defined(WOLFSSL_NO_CLIENT_AUTH))
  11718. if (!ssl->options.resuming && ssl->options.sendVerify) {
  11719. ssl->error = SendTls13CertificateVerify(ssl);
  11720. if (ssl->error != 0) {
  11721. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11722. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11723. #endif
  11724. WOLFSSL_ERROR(ssl->error);
  11725. return WOLFSSL_FATAL_ERROR;
  11726. }
  11727. WOLFSSL_MSG("sent: certificate verify");
  11728. }
  11729. #endif
  11730. ssl->options.connectState = FIRST_REPLY_FOURTH;
  11731. WOLFSSL_MSG("connect state: FIRST_REPLY_FOURTH");
  11732. FALL_THROUGH;
  11733. case FIRST_REPLY_FOURTH:
  11734. if ((ssl->error = SendTls13Finished(ssl)) != 0) {
  11735. #ifdef WOLFSSL_CHECK_ALERT_ON_ERR
  11736. ProcessReplyEx(ssl, 1); /* See if an alert was sent. */
  11737. #endif
  11738. WOLFSSL_ERROR(ssl->error);
  11739. return WOLFSSL_FATAL_ERROR;
  11740. }
  11741. WOLFSSL_MSG("sent: finished");
  11742. #ifdef WOLFSSL_DTLS13
  11743. ssl->options.connectState = WAIT_FINISHED_ACK;
  11744. WOLFSSL_MSG("connect state: WAIT_FINISHED_ACK");
  11745. FALL_THROUGH;
  11746. case WAIT_FINISHED_ACK:
  11747. if (ssl->options.dtls) {
  11748. while (ssl->options.serverState != SERVER_FINISHED_ACKED) {
  11749. if ((ssl->error = ProcessReply(ssl)) < 0) {
  11750. WOLFSSL_ERROR(ssl->error);
  11751. return WOLFSSL_FATAL_ERROR;
  11752. }
  11753. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  11754. WOLFSSL_ERROR(ssl->error);
  11755. return WOLFSSL_FATAL_ERROR;
  11756. }
  11757. }
  11758. }
  11759. #endif /* WOLFSSL_DTLS13 */
  11760. ssl->options.connectState = FINISHED_DONE;
  11761. WOLFSSL_MSG("connect state: FINISHED_DONE");
  11762. FALL_THROUGH;
  11763. case FINISHED_DONE:
  11764. #ifndef NO_HANDSHAKE_DONE_CB
  11765. if (ssl->hsDoneCb != NULL) {
  11766. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  11767. if (cbret < 0) {
  11768. ssl->error = cbret;
  11769. WOLFSSL_ERROR_VERBOSE(ssl->error);
  11770. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  11771. return WOLFSSL_FATAL_ERROR;
  11772. }
  11773. }
  11774. #endif /* NO_HANDSHAKE_DONE_CB */
  11775. if (!ssl->options.keepResources) {
  11776. FreeHandshakeResources(ssl);
  11777. }
  11778. #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
  11779. /* Free the remaining async context if not using it for crypto */
  11780. FreeAsyncCtx(ssl, 1);
  11781. #endif
  11782. ssl->error = 0; /* clear the error */
  11783. WOLFSSL_LEAVE("wolfSSL_connect_TLSv13", WOLFSSL_SUCCESS);
  11784. return WOLFSSL_SUCCESS;
  11785. default:
  11786. WOLFSSL_MSG("Unknown connect state ERROR");
  11787. return WOLFSSL_FATAL_ERROR; /* unknown connect state */
  11788. }
  11789. }
  11790. #endif
  11791. #if defined(WOLFSSL_SEND_HRR_COOKIE)
  11792. /* Send a cookie with the HelloRetryRequest to avoid storing state.
  11793. *
  11794. * ssl SSL/TLS object.
  11795. * secret Secret to use when generating integrity check for cookie.
  11796. * A value of NULL indicates to generate a new random secret.
  11797. * secretSz Size of secret data in bytes.
  11798. * Use a value of 0 to indicate use of default size.
  11799. * returns BAD_FUNC_ARG when ssl is NULL or not using TLS v1.3, SIDE_ERROR when
  11800. * called on a client; WOLFSSL_SUCCESS on success and otherwise failure.
  11801. */
  11802. int wolfSSL_send_hrr_cookie(WOLFSSL* ssl, const unsigned char* secret,
  11803. unsigned int secretSz)
  11804. {
  11805. int ret;
  11806. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  11807. return BAD_FUNC_ARG;
  11808. #ifndef NO_WOLFSSL_SERVER
  11809. if (ssl->options.side == WOLFSSL_CLIENT_END)
  11810. return SIDE_ERROR;
  11811. if (secretSz == 0) {
  11812. #if !defined(NO_SHA) && defined(NO_SHA256)
  11813. secretSz = WC_SHA_DIGEST_SIZE;
  11814. #endif /* NO_SHA */
  11815. #ifndef NO_SHA256
  11816. secretSz = WC_SHA256_DIGEST_SIZE;
  11817. #endif /* NO_SHA256 */
  11818. }
  11819. if (secretSz != ssl->buffers.tls13CookieSecret.length) {
  11820. byte* newSecret;
  11821. if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
  11822. ForceZero(ssl->buffers.tls13CookieSecret.buffer,
  11823. ssl->buffers.tls13CookieSecret.length);
  11824. XFREE(ssl->buffers.tls13CookieSecret.buffer,
  11825. ssl->heap, DYNAMIC_TYPE_COOKIE_PWD);
  11826. }
  11827. newSecret = (byte*)XMALLOC(secretSz, ssl->heap,
  11828. DYNAMIC_TYPE_COOKIE_PWD);
  11829. if (newSecret == NULL) {
  11830. ssl->buffers.tls13CookieSecret.buffer = NULL;
  11831. ssl->buffers.tls13CookieSecret.length = 0;
  11832. WOLFSSL_MSG("couldn't allocate new cookie secret");
  11833. return MEMORY_ERROR;
  11834. }
  11835. ssl->buffers.tls13CookieSecret.buffer = newSecret;
  11836. ssl->buffers.tls13CookieSecret.length = secretSz;
  11837. #ifdef WOLFSSL_CHECK_MEM_ZERO
  11838. wc_MemZero_Add("wolfSSL_send_hrr_cookie secret",
  11839. ssl->buffers.tls13CookieSecret.buffer,
  11840. ssl->buffers.tls13CookieSecret.length);
  11841. #endif
  11842. }
  11843. /* If the supplied secret is NULL, randomly generate a new secret. */
  11844. if (secret == NULL) {
  11845. ret = wc_RNG_GenerateBlock(ssl->rng,
  11846. ssl->buffers.tls13CookieSecret.buffer, secretSz);
  11847. if (ret < 0)
  11848. return ret;
  11849. }
  11850. else
  11851. XMEMCPY(ssl->buffers.tls13CookieSecret.buffer, secret, secretSz);
  11852. ssl->options.sendCookie = 1;
  11853. ret = WOLFSSL_SUCCESS;
  11854. #else
  11855. (void)secret;
  11856. (void)secretSz;
  11857. ret = SIDE_ERROR;
  11858. #endif
  11859. return ret;
  11860. }
  11861. int wolfSSL_disable_hrr_cookie(WOLFSSL* ssl)
  11862. {
  11863. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  11864. return BAD_FUNC_ARG;
  11865. #ifdef NO_WOLFSSL_SERVER
  11866. return SIDE_ERROR;
  11867. #else
  11868. if (ssl->options.side == WOLFSSL_CLIENT_END)
  11869. return SIDE_ERROR;
  11870. if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
  11871. ForceZero(ssl->buffers.tls13CookieSecret.buffer,
  11872. ssl->buffers.tls13CookieSecret.length);
  11873. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  11874. DYNAMIC_TYPE_COOKIE_PWD);
  11875. ssl->buffers.tls13CookieSecret.buffer = NULL;
  11876. ssl->buffers.tls13CookieSecret.length = 0;
  11877. }
  11878. ssl->options.sendCookie = 0;
  11879. return WOLFSSL_SUCCESS;
  11880. #endif /* NO_WOLFSSL_SERVER */
  11881. }
  11882. #endif /* defined(WOLFSSL_SEND_HRR_COOKIE) */
  11883. #ifdef HAVE_SUPPORTED_CURVES
  11884. /* Create a key share entry from group.
  11885. * Generates a key pair.
  11886. *
  11887. * ssl The SSL/TLS object.
  11888. * group The named group.
  11889. * returns 0 on success, otherwise failure.
  11890. * for async can return WC_PENDING_E and should be called again
  11891. */
  11892. int wolfSSL_UseKeyShare(WOLFSSL* ssl, word16 group)
  11893. {
  11894. int ret;
  11895. if (ssl == NULL)
  11896. return BAD_FUNC_ARG;
  11897. #ifdef WOLFSSL_ASYNC_CRYPT
  11898. ret = wolfSSL_AsyncPop(ssl, NULL);
  11899. if (ret != WC_NO_PENDING_E) {
  11900. /* Check for error */
  11901. if (ret < 0)
  11902. return ret;
  11903. }
  11904. #endif
  11905. #ifdef HAVE_PQC
  11906. if (WOLFSSL_NAMED_GROUP_IS_PQC(group)) {
  11907. if (ssl->ctx != NULL && ssl->ctx->method != NULL &&
  11908. !IsAtLeastTLSv1_3(ssl->version)) {
  11909. return BAD_FUNC_ARG;
  11910. }
  11911. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11912. /* If I am the server of a KEM connection, do not do keygen because I'm
  11913. * going to encapsulate with the client's public key. Note that I might
  11914. * be the client and ssl->option.side has not been properly set yet. In
  11915. * that case the KeyGen operation will be deferred to connection time. */
  11916. return WOLFSSL_SUCCESS;
  11917. }
  11918. }
  11919. #endif
  11920. #if defined(NO_TLS)
  11921. (void)ret;
  11922. (void)group;
  11923. #else
  11924. ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
  11925. if (ret != 0)
  11926. return ret;
  11927. #endif /* NO_TLS */
  11928. return WOLFSSL_SUCCESS;
  11929. }
  11930. /* Send no key share entries - use HelloRetryRequest to negotiate shared group.
  11931. *
  11932. * ssl The SSL/TLS object.
  11933. * returns 0 on success, otherwise failure.
  11934. */
  11935. int wolfSSL_NoKeyShares(WOLFSSL* ssl)
  11936. {
  11937. int ret;
  11938. if (ssl == NULL)
  11939. return BAD_FUNC_ARG;
  11940. if (ssl->options.side == WOLFSSL_SERVER_END)
  11941. return SIDE_ERROR;
  11942. #if defined(NO_TLS)
  11943. (void)ret;
  11944. #else
  11945. ret = TLSX_KeyShare_Empty(ssl);
  11946. if (ret != 0)
  11947. return ret;
  11948. #endif /* NO_TLS */
  11949. return WOLFSSL_SUCCESS;
  11950. }
  11951. #endif
  11952. #ifdef WOLFSSL_DUAL_ALG_CERTS
  11953. int wolfSSL_UseCKS(WOLFSSL* ssl, byte *sigSpec, word16 sigSpecSz)
  11954. {
  11955. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->ctx->method->version) ||
  11956. sigSpec == NULL || sigSpecSz == 0)
  11957. return BAD_FUNC_ARG;
  11958. ssl->sigSpec = sigSpec;
  11959. ssl->sigSpecSz = sigSpecSz;
  11960. return WOLFSSL_SUCCESS;
  11961. }
  11962. int wolfSSL_CTX_UseCKS(WOLFSSL_CTX* ctx, byte *sigSpec, word16 sigSpecSz)
  11963. {
  11964. if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version) ||
  11965. sigSpec == NULL || sigSpecSz == 0)
  11966. return BAD_FUNC_ARG;
  11967. ctx->sigSpec = sigSpec;
  11968. ctx->sigSpecSz = sigSpecSz;
  11969. return WOLFSSL_SUCCESS;
  11970. }
  11971. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  11972. /* Do not send a ticket after TLS v1.3 handshake for resumption.
  11973. *
  11974. * ctx The SSL/TLS CTX object.
  11975. * returns BAD_FUNC_ARG when ctx is NULL and 0 on success.
  11976. */
  11977. int wolfSSL_CTX_no_ticket_TLSv13(WOLFSSL_CTX* ctx)
  11978. {
  11979. if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
  11980. return BAD_FUNC_ARG;
  11981. if (ctx->method->side == WOLFSSL_CLIENT_END)
  11982. return SIDE_ERROR;
  11983. #ifdef HAVE_SESSION_TICKET
  11984. ctx->noTicketTls13 = 1;
  11985. #endif
  11986. return 0;
  11987. }
  11988. /* Do not send a ticket after TLS v1.3 handshake for resumption.
  11989. *
  11990. * ssl The SSL/TLS object.
  11991. * returns BAD_FUNC_ARG when ssl is NULL, not using TLS v1.3, or called on
  11992. * a client and 0 on success.
  11993. */
  11994. int wolfSSL_no_ticket_TLSv13(WOLFSSL* ssl)
  11995. {
  11996. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  11997. return BAD_FUNC_ARG;
  11998. if (ssl->options.side == WOLFSSL_CLIENT_END)
  11999. return SIDE_ERROR;
  12000. #ifdef HAVE_SESSION_TICKET
  12001. ssl->options.noTicketTls13 = 1;
  12002. #endif
  12003. return 0;
  12004. }
  12005. /* Disallow (EC)DHE key exchange when using pre-shared keys.
  12006. *
  12007. * ctx The SSL/TLS CTX object.
  12008. * returns BAD_FUNC_ARG when ctx is NULL and 0 on success.
  12009. */
  12010. int wolfSSL_CTX_no_dhe_psk(WOLFSSL_CTX* ctx)
  12011. {
  12012. if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
  12013. return BAD_FUNC_ARG;
  12014. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  12015. ctx->noPskDheKe = 1;
  12016. #endif
  12017. return 0;
  12018. }
  12019. /* Disallow (EC)DHE key exchange when using pre-shared keys.
  12020. *
  12021. * ssl The SSL/TLS object.
  12022. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3 and 0 on
  12023. * success.
  12024. */
  12025. int wolfSSL_no_dhe_psk(WOLFSSL* ssl)
  12026. {
  12027. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  12028. return BAD_FUNC_ARG;
  12029. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  12030. ssl->options.noPskDheKe = 1;
  12031. #endif
  12032. return 0;
  12033. }
  12034. #ifdef HAVE_SUPPORTED_CURVES
  12035. /* Only allow (EC)DHE key exchange when using pre-shared keys.
  12036. *
  12037. * ctx The SSL/TLS CTX object.
  12038. * returns BAD_FUNC_ARG when ctx is NULL and 0 on success.
  12039. */
  12040. int wolfSSL_CTX_only_dhe_psk(WOLFSSL_CTX* ctx)
  12041. {
  12042. if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
  12043. return BAD_FUNC_ARG;
  12044. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  12045. ctx->onlyPskDheKe = 1;
  12046. #endif
  12047. return 0;
  12048. }
  12049. /* Only allow (EC)DHE key exchange when using pre-shared keys.
  12050. *
  12051. * ssl The SSL/TLS object.
  12052. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3 and 0 on
  12053. * success.
  12054. */
  12055. int wolfSSL_only_dhe_psk(WOLFSSL* ssl)
  12056. {
  12057. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  12058. return BAD_FUNC_ARG;
  12059. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  12060. ssl->options.onlyPskDheKe = 1;
  12061. #endif
  12062. return 0;
  12063. }
  12064. #endif /* HAVE_SUPPORTED_CURVES */
  12065. int Tls13UpdateKeys(WOLFSSL* ssl)
  12066. {
  12067. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  12068. return BAD_FUNC_ARG;
  12069. #ifdef WOLFSSL_DTLS13
  12070. /* we are already waiting for the ack of a sent key update message. We can't
  12071. send another one before receiving its ack. Either wolfSSL_update_keys()
  12072. was invoked multiple times over a short period of time or we replied to a
  12073. KeyUpdate with update request. We'll just ignore sending this
  12074. KeyUpdate. */
  12075. /* TODO: add WOLFSSL_ERROR_ALREADY_IN_PROGRESS type of error here */
  12076. if (ssl->options.dtls && ssl->dtls13WaitKeyUpdateAck)
  12077. return 0;
  12078. #endif /* WOLFSSL_DTLS13 */
  12079. return SendTls13KeyUpdate(ssl);
  12080. }
  12081. /* Update the keys for encryption and decryption.
  12082. * If using non-blocking I/O and WOLFSSL_ERROR_WANT_WRITE is returned then
  12083. * calling wolfSSL_write() will have the message sent when ready.
  12084. *
  12085. * ssl The SSL/TLS object.
  12086. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  12087. * WOLFSSL_ERROR_WANT_WRITE when non-blocking I/O is not ready to write,
  12088. * WOLFSSL_SUCCESS on success and otherwise failure.
  12089. */
  12090. int wolfSSL_update_keys(WOLFSSL* ssl)
  12091. {
  12092. int ret;
  12093. ret = Tls13UpdateKeys(ssl);
  12094. if (ret == WANT_WRITE)
  12095. ret = WOLFSSL_ERROR_WANT_WRITE;
  12096. else if (ret == 0)
  12097. ret = WOLFSSL_SUCCESS;
  12098. return ret;
  12099. }
  12100. /* Whether a response is waiting for key update request.
  12101. *
  12102. * ssl The SSL/TLS object.
  12103. * required 0 when no key update response required.
  12104. * 1 when no key update response required.
  12105. * return 0 on success.
  12106. * return BAD_FUNC_ARG when ssl is NULL or not using TLS v1.3
  12107. */
  12108. int wolfSSL_key_update_response(WOLFSSL* ssl, int* required)
  12109. {
  12110. if (required == NULL || ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  12111. return BAD_FUNC_ARG;
  12112. *required = ssl->keys.updateResponseReq;
  12113. return 0;
  12114. }
  12115. #if !defined(NO_CERTS) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  12116. /* Allow post-handshake authentication in TLS v1.3 connections.
  12117. *
  12118. * ctx The SSL/TLS CTX object.
  12119. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a client and
  12120. * 0 on success.
  12121. */
  12122. int wolfSSL_CTX_allow_post_handshake_auth(WOLFSSL_CTX* ctx)
  12123. {
  12124. if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
  12125. return BAD_FUNC_ARG;
  12126. if (ctx->method->side == WOLFSSL_SERVER_END)
  12127. return SIDE_ERROR;
  12128. ctx->postHandshakeAuth = 1;
  12129. return 0;
  12130. }
  12131. /* Allow post-handshake authentication in TLS v1.3 connection.
  12132. *
  12133. * ssl The SSL/TLS object.
  12134. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  12135. * SIDE_ERROR when not a client and 0 on success.
  12136. */
  12137. int wolfSSL_allow_post_handshake_auth(WOLFSSL* ssl)
  12138. {
  12139. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  12140. return BAD_FUNC_ARG;
  12141. if (ssl->options.side == WOLFSSL_SERVER_END)
  12142. return SIDE_ERROR;
  12143. ssl->options.postHandshakeAuth = 1;
  12144. return 0;
  12145. }
  12146. /* Request a certificate of the client.
  12147. * Can be called any time after handshake completion.
  12148. * A maximum of 256 requests can be sent on a connection.
  12149. *
  12150. * ssl SSL/TLS object.
  12151. */
  12152. int wolfSSL_request_certificate(WOLFSSL* ssl)
  12153. {
  12154. int ret;
  12155. #ifndef NO_WOLFSSL_SERVER
  12156. CertReqCtx* certReqCtx;
  12157. #endif
  12158. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  12159. return BAD_FUNC_ARG;
  12160. #ifndef NO_WOLFSSL_SERVER
  12161. if (ssl->options.side == WOLFSSL_CLIENT_END)
  12162. return SIDE_ERROR;
  12163. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  12164. return NOT_READY_ERROR;
  12165. if (!ssl->options.postHandshakeAuth)
  12166. return POST_HAND_AUTH_ERROR;
  12167. certReqCtx = (CertReqCtx*)XMALLOC(sizeof(CertReqCtx), ssl->heap,
  12168. DYNAMIC_TYPE_TMP_BUFFER);
  12169. if (certReqCtx == NULL)
  12170. return MEMORY_E;
  12171. XMEMSET(certReqCtx, 0, sizeof(CertReqCtx));
  12172. certReqCtx->next = ssl->certReqCtx;
  12173. certReqCtx->len = 1;
  12174. if (certReqCtx->next != NULL)
  12175. certReqCtx->ctx = certReqCtx->next->ctx + 1;
  12176. ssl->certReqCtx = certReqCtx;
  12177. ssl->msgsReceived.got_certificate = 0;
  12178. ssl->msgsReceived.got_certificate_verify = 0;
  12179. ssl->msgsReceived.got_finished = 0;
  12180. ret = SendTls13CertificateRequest(ssl, &certReqCtx->ctx, certReqCtx->len);
  12181. if (ret == WANT_WRITE)
  12182. ret = WOLFSSL_ERROR_WANT_WRITE;
  12183. else if (ret == 0)
  12184. ret = WOLFSSL_SUCCESS;
  12185. #else
  12186. ret = SIDE_ERROR;
  12187. #endif
  12188. return ret;
  12189. }
  12190. #endif /* !NO_CERTS && WOLFSSL_POST_HANDSHAKE_AUTH */
  12191. #if !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
  12192. /* Get the preferred key exchange group.
  12193. *
  12194. * ssl The SSL/TLS object.
  12195. * returns BAD_FUNC_ARG when ssl is NULL or not using TLS v1.3,
  12196. * SIDE_ERROR when not a client, NOT_READY_ERROR when handshake not complete
  12197. * and group number on success.
  12198. */
  12199. int wolfSSL_preferred_group(WOLFSSL* ssl)
  12200. {
  12201. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  12202. return BAD_FUNC_ARG;
  12203. #ifndef NO_WOLFSSL_CLIENT
  12204. if (ssl->options.side == WOLFSSL_SERVER_END)
  12205. return SIDE_ERROR;
  12206. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  12207. return NOT_READY_ERROR;
  12208. #ifdef HAVE_SUPPORTED_CURVES
  12209. /* Return supported groups only. */
  12210. return TLSX_SupportedCurve_Preferred(ssl, 1);
  12211. #else
  12212. return 0;
  12213. #endif
  12214. #else
  12215. return SIDE_ERROR;
  12216. #endif
  12217. }
  12218. #endif
  12219. #if defined(HAVE_SUPPORTED_CURVES)
  12220. /* Sets the key exchange groups in rank order on a context.
  12221. *
  12222. * ctx SSL/TLS context object.
  12223. * groups Array of groups.
  12224. * count Number of groups in array.
  12225. * returns BAD_FUNC_ARG when ctx or groups is NULL, not using TLS v1.3 or
  12226. * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success.
  12227. */
  12228. int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count)
  12229. {
  12230. int ret, i;
  12231. WOLFSSL_ENTER("wolfSSL_CTX_set_groups");
  12232. if (ctx == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT)
  12233. return BAD_FUNC_ARG;
  12234. if (!IsAtLeastTLSv1_3(ctx->method->version))
  12235. return BAD_FUNC_ARG;
  12236. ctx->numGroups = 0;
  12237. #if !defined(NO_TLS)
  12238. TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
  12239. #endif /* !NO_TLS */
  12240. for (i = 0; i < count; i++) {
  12241. /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups
  12242. * are valid */
  12243. if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, (word16)groups[i]))
  12244. != WOLFSSL_SUCCESS) {
  12245. #if !defined(NO_TLS)
  12246. TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
  12247. #endif /* !NO_TLS */
  12248. return ret;
  12249. }
  12250. ctx->group[i] = (word16)groups[i];
  12251. }
  12252. ctx->numGroups = (byte)count;
  12253. return WOLFSSL_SUCCESS;
  12254. }
  12255. /* Sets the key exchange groups in rank order.
  12256. *
  12257. * ssl SSL/TLS object.
  12258. * groups Array of groups.
  12259. * count Number of groups in array.
  12260. * returns BAD_FUNC_ARG when ssl or groups is NULL, not using TLS v1.3 or
  12261. * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success.
  12262. */
  12263. int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count)
  12264. {
  12265. int ret, i;
  12266. WOLFSSL_ENTER("wolfSSL_set_groups");
  12267. if (ssl == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT)
  12268. return BAD_FUNC_ARG;
  12269. if (!IsAtLeastTLSv1_3(ssl->version))
  12270. return BAD_FUNC_ARG;
  12271. ssl->numGroups = 0;
  12272. #if !defined(NO_TLS)
  12273. TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
  12274. #endif /* !NO_TLS */
  12275. for (i = 0; i < count; i++) {
  12276. /* Call to wolfSSL_UseSupportedCurve also checks if input groups
  12277. * are valid */
  12278. if ((ret = wolfSSL_UseSupportedCurve(ssl, (word16)groups[i]))
  12279. != WOLFSSL_SUCCESS) {
  12280. #if !defined(NO_TLS)
  12281. TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
  12282. #endif /* !NO_TLS */
  12283. return ret;
  12284. }
  12285. ssl->group[i] = (word16)groups[i];
  12286. }
  12287. ssl->numGroups = (byte)count;
  12288. return WOLFSSL_SUCCESS;
  12289. }
  12290. #endif /* HAVE_SUPPORTED_CURVES */
  12291. #ifndef NO_PSK
  12292. /* Set the PSK callback, that is passed the cipher suite, for a client to use
  12293. * against context object.
  12294. *
  12295. * @param [in, out] ctx SSL/TLS context object.
  12296. * @param [in] cb Client PSK callback passed a cipher suite.
  12297. */
  12298. void wolfSSL_CTX_set_psk_client_cs_callback(WOLFSSL_CTX* ctx,
  12299. wc_psk_client_cs_callback cb)
  12300. {
  12301. WOLFSSL_ENTER("wolfSSL_CTX_set_psk_client_cs_callback");
  12302. if (ctx == NULL)
  12303. return;
  12304. ctx->havePSK = 1;
  12305. ctx->client_psk_cs_cb = cb;
  12306. }
  12307. /* Set the PSK callback, that is passed the cipher suite, for a client to use
  12308. * against SSL object.
  12309. *
  12310. * @param [in, out] ssl SSL/TLS object.
  12311. * @param [in] cb Client PSK callback passed a cipher suite.
  12312. */
  12313. void wolfSSL_set_psk_client_cs_callback(WOLFSSL* ssl,
  12314. wc_psk_client_cs_callback cb)
  12315. {
  12316. byte haveRSA = 1;
  12317. int keySz = 0;
  12318. WOLFSSL_ENTER("wolfSSL_set_psk_client_cs_callback");
  12319. if (ssl == NULL)
  12320. return;
  12321. ssl->options.havePSK = 1;
  12322. ssl->options.client_psk_cs_cb = cb;
  12323. #ifdef NO_RSA
  12324. haveRSA = 0;
  12325. #endif
  12326. #ifndef NO_CERTS
  12327. keySz = ssl->buffers.keySz;
  12328. #endif
  12329. if (AllocateSuites(ssl) != 0)
  12330. return;
  12331. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  12332. ssl->options.haveDH, ssl->options.haveECDSAsig,
  12333. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  12334. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  12335. ssl->options.useAnon, TRUE, ssl->options.side);
  12336. }
  12337. /* Set the PSK callback that returns the cipher suite for a client to use
  12338. * against context object.
  12339. *
  12340. * @param [in, out] ctx SSL/TLS context object.
  12341. * @param [in] cb Client PSK callback returning cipher suite.
  12342. */
  12343. void wolfSSL_CTX_set_psk_client_tls13_callback(WOLFSSL_CTX* ctx,
  12344. wc_psk_client_tls13_callback cb)
  12345. {
  12346. WOLFSSL_ENTER("wolfSSL_CTX_set_psk_client_tls13_callback");
  12347. if (ctx == NULL)
  12348. return;
  12349. ctx->havePSK = 1;
  12350. ctx->client_psk_tls13_cb = cb;
  12351. }
  12352. /* Set the PSK callback that returns the cipher suite for a client to use
  12353. * against SSL object.
  12354. *
  12355. * @param [in, out] ssl SSL/TLS object.
  12356. * @param [in] cb Client PSK callback returning cipher suite.
  12357. */
  12358. void wolfSSL_set_psk_client_tls13_callback(WOLFSSL* ssl,
  12359. wc_psk_client_tls13_callback cb)
  12360. {
  12361. byte haveRSA = 1;
  12362. int keySz = 0;
  12363. WOLFSSL_ENTER("wolfSSL_set_psk_client_tls13_callback");
  12364. if (ssl == NULL)
  12365. return;
  12366. ssl->options.havePSK = 1;
  12367. ssl->options.client_psk_tls13_cb = cb;
  12368. #ifdef NO_RSA
  12369. haveRSA = 0;
  12370. #endif
  12371. #ifndef NO_CERTS
  12372. keySz = ssl->buffers.keySz;
  12373. #endif
  12374. if (AllocateSuites(ssl) != 0)
  12375. return;
  12376. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  12377. ssl->options.haveDH, ssl->options.haveECDSAsig,
  12378. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  12379. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  12380. ssl->options.useAnon, TRUE, ssl->options.side);
  12381. }
  12382. /* Set the PSK callback that returns the cipher suite for a server to use
  12383. * against context object.
  12384. *
  12385. * @param [in, out] ctx SSL/TLS context object.
  12386. * @param [in] cb Server PSK callback returning cipher suite.
  12387. */
  12388. void wolfSSL_CTX_set_psk_server_tls13_callback(WOLFSSL_CTX* ctx,
  12389. wc_psk_server_tls13_callback cb)
  12390. {
  12391. WOLFSSL_ENTER("wolfSSL_CTX_set_psk_server_tls13_callback");
  12392. if (ctx == NULL)
  12393. return;
  12394. ctx->havePSK = 1;
  12395. ctx->server_psk_tls13_cb = cb;
  12396. }
  12397. /* Set the PSK callback that returns the cipher suite for a server to use
  12398. * against SSL object.
  12399. *
  12400. * @param [in, out] ssl SSL/TLS object.
  12401. * @param [in] cb Server PSK callback returning cipher suite.
  12402. */
  12403. void wolfSSL_set_psk_server_tls13_callback(WOLFSSL* ssl,
  12404. wc_psk_server_tls13_callback cb)
  12405. {
  12406. byte haveRSA = 1;
  12407. int keySz = 0;
  12408. WOLFSSL_ENTER("wolfSSL_set_psk_server_tls13_callback");
  12409. if (ssl == NULL)
  12410. return;
  12411. ssl->options.havePSK = 1;
  12412. ssl->options.server_psk_tls13_cb = cb;
  12413. #ifdef NO_RSA
  12414. haveRSA = 0;
  12415. #endif
  12416. #ifndef NO_CERTS
  12417. keySz = ssl->buffers.keySz;
  12418. #endif
  12419. if (AllocateSuites(ssl) != 0)
  12420. return;
  12421. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
  12422. ssl->options.haveDH, ssl->options.haveECDSAsig,
  12423. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  12424. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  12425. ssl->options.useAnon, TRUE, ssl->options.side);
  12426. }
  12427. /* Get name of first supported cipher suite that uses the hash indicated.
  12428. *
  12429. * @param [in] ssl SSL/TLS object.
  12430. * @param [in] hash Name of hash algorithm. e.g. "SHA256", "SHA384"
  12431. * @return Name of cipher suite.
  12432. * @return NULL on failure.
  12433. */
  12434. const char* wolfSSL_get_cipher_name_by_hash(WOLFSSL* ssl, const char* hash)
  12435. {
  12436. const char* name = NULL;
  12437. byte mac = no_mac;
  12438. int i;
  12439. const Suites* suites = WOLFSSL_SUITES(ssl);
  12440. if (XSTRCMP(hash, "SHA256") == 0) {
  12441. mac = sha256_mac;
  12442. }
  12443. else if (XSTRCMP(hash, "SHA384") == 0) {
  12444. mac = sha384_mac;
  12445. }
  12446. if (mac != no_mac) {
  12447. for (i = 0; i < suites->suiteSz; i += 2) {
  12448. if (SuiteMac(suites->suites + i) == mac) {
  12449. name = GetCipherNameInternal(suites->suites[i + 0],
  12450. suites->suites[i + 1]);
  12451. break;
  12452. }
  12453. }
  12454. }
  12455. return name;
  12456. }
  12457. #endif /* !NO_PSK */
  12458. #ifndef NO_WOLFSSL_SERVER
  12459. /* The server accepting a connection from a client.
  12460. * The protocol version is expecting to be TLS v1.3.
  12461. * If the client downgrades, and older versions of the protocol are compiled
  12462. * in, the server will fallback to wolfSSL_accept().
  12463. * Please see note at top of README if you get an error from accept.
  12464. *
  12465. * ssl The SSL/TLS object.
  12466. * returns WOLFSSL_SUCCESS on successful handshake, WOLFSSL_FATAL_ERROR when
  12467. * unrecoverable error occurs and 0 otherwise.
  12468. * For more error information use wolfSSL_get_error().
  12469. */
  12470. int wolfSSL_accept_TLSv13(WOLFSSL* ssl)
  12471. {
  12472. #if !defined(NO_CERTS) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  12473. word16 havePSK = 0;
  12474. #endif
  12475. int ret = 0;
  12476. WOLFSSL_ENTER("wolfSSL_accept_TLSv13");
  12477. #ifdef HAVE_ERRNO_H
  12478. errno = 0;
  12479. #endif
  12480. if (ssl == NULL)
  12481. return WOLFSSL_FATAL_ERROR;
  12482. #if !defined(NO_CERTS) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
  12483. havePSK = ssl->options.havePSK;
  12484. #endif
  12485. if (ssl->options.side != WOLFSSL_SERVER_END) {
  12486. ssl->error = SIDE_ERROR;
  12487. WOLFSSL_ERROR(ssl->error);
  12488. return WOLFSSL_FATAL_ERROR;
  12489. }
  12490. /* make sure this wolfSSL object has arrays and rng setup. Protects
  12491. * case where the WOLFSSL object is re-used via wolfSSL_clear() */
  12492. if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) {
  12493. return ret;
  12494. }
  12495. #ifdef WOLFSSL_DTLS
  12496. if (ssl->version.major == DTLS_MAJOR) {
  12497. ssl->options.dtls = 1;
  12498. if (!IsDtlsNotSctpMode(ssl) || !ssl->options.sendCookie)
  12499. ssl->options.dtlsStateful = 1;
  12500. }
  12501. #endif
  12502. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  12503. if ((ssl->AcceptFilter != NULL) &&
  12504. ((ssl->options.acceptState == TLS13_ACCEPT_BEGIN)
  12505. #ifdef HAVE_SECURE_RENEGOTIATION
  12506. || (ssl->options.acceptState == TLS13_ACCEPT_BEGIN_RENEG)
  12507. #endif
  12508. ))
  12509. {
  12510. wolfSSL_netfilter_decision_t res;
  12511. if ((ssl->AcceptFilter(ssl, ssl->AcceptFilter_arg, &res) ==
  12512. WOLFSSL_SUCCESS) &&
  12513. (res == WOLFSSL_NETFILTER_REJECT)) {
  12514. ssl->error = SOCKET_FILTERED_E;
  12515. WOLFSSL_ERROR(ssl->error);
  12516. return WOLFSSL_FATAL_ERROR;
  12517. }
  12518. }
  12519. #endif /* WOLFSSL_WOLFSENTRY_HOOKS */
  12520. #ifndef NO_CERTS
  12521. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  12522. if (!havePSK)
  12523. #endif
  12524. {
  12525. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  12526. defined(WOLFSSL_NGINX) || defined (WOLFSSL_HAPROXY)
  12527. if (ssl->ctx->certSetupCb != NULL) {
  12528. WOLFSSL_MSG("CertSetupCb set. server cert and "
  12529. "key not checked");
  12530. }
  12531. else
  12532. #endif
  12533. {
  12534. if (!ssl->buffers.certificate ||
  12535. !ssl->buffers.certificate->buffer) {
  12536. WOLFSSL_MSG("accept error: server cert required");
  12537. ssl->error = NO_PRIVATE_KEY;
  12538. WOLFSSL_ERROR(ssl->error);
  12539. return WOLFSSL_FATAL_ERROR;
  12540. }
  12541. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  12542. /* allow no private key if using existing key */
  12543. #ifdef WOLF_PRIVATE_KEY_ID
  12544. if (ssl->devId != INVALID_DEVID
  12545. #ifdef HAVE_PK_CALLBACKS
  12546. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  12547. #endif
  12548. ) {
  12549. WOLFSSL_MSG("Allowing no server private key (external)");
  12550. }
  12551. else
  12552. #endif
  12553. {
  12554. WOLFSSL_MSG("accept error: server key required");
  12555. ssl->error = NO_PRIVATE_KEY;
  12556. WOLFSSL_ERROR(ssl->error);
  12557. return WOLFSSL_FATAL_ERROR;
  12558. }
  12559. }
  12560. }
  12561. }
  12562. #endif /* NO_CERTS */
  12563. if (ssl->buffers.outputBuffer.length > 0
  12564. #ifdef WOLFSSL_ASYNC_CRYPT
  12565. /* do not send buffered or advance state if last error was an
  12566. async pending operation */
  12567. && ssl->error != WC_PENDING_E
  12568. #endif
  12569. ) {
  12570. /* fragOffset is non-zero when sending fragments. On the last
  12571. * fragment, fragOffset is zero again, and the state can be
  12572. * advanced. */
  12573. int advanceState =
  12574. (ssl->options.acceptState == TLS13_ACCEPT_CLIENT_HELLO_DONE ||
  12575. ssl->options.acceptState ==
  12576. TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE ||
  12577. ssl->options.acceptState == TLS13_ACCEPT_SECOND_REPLY_DONE ||
  12578. ssl->options.acceptState == TLS13_SERVER_HELLO_SENT ||
  12579. ssl->options.acceptState == TLS13_ACCEPT_THIRD_REPLY_DONE ||
  12580. ssl->options.acceptState == TLS13_SERVER_EXTENSIONS_SENT ||
  12581. ssl->options.acceptState == TLS13_CERT_REQ_SENT ||
  12582. ssl->options.acceptState == TLS13_CERT_SENT ||
  12583. ssl->options.acceptState == TLS13_CERT_VERIFY_SENT ||
  12584. ssl->options.acceptState == TLS13_ACCEPT_FINISHED_SENT ||
  12585. ssl->options.acceptState == TLS13_ACCEPT_FINISHED_DONE);
  12586. #ifdef WOLFSSL_DTLS13
  12587. if (ssl->options.dtls)
  12588. advanceState = advanceState && !ssl->dtls13SendingFragments
  12589. && !ssl->dtls13SendingAckOrRtx;
  12590. #endif /* WOLFSSL_DTLS13 */
  12591. ret = SendBuffered(ssl);
  12592. if (ret == 0) {
  12593. if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) {
  12594. if (advanceState) {
  12595. ssl->options.acceptState++;
  12596. WOLFSSL_MSG("accept state: "
  12597. "Advanced from last buffered fragment send");
  12598. #ifdef WOLFSSL_ASYNC_IO
  12599. FreeAsyncCtx(ssl, 0);
  12600. #endif
  12601. }
  12602. }
  12603. else {
  12604. WOLFSSL_MSG("accept state: "
  12605. "Not advanced, more fragments to send");
  12606. }
  12607. #ifdef WOLFSSL_DTLS13
  12608. if (ssl->options.dtls)
  12609. ssl->dtls13SendingAckOrRtx = 0;
  12610. #endif /* WOLFSSL_DTLS13 */
  12611. }
  12612. else {
  12613. ssl->error = ret;
  12614. WOLFSSL_ERROR(ssl->error);
  12615. return WOLFSSL_FATAL_ERROR;
  12616. }
  12617. }
  12618. ret = RetrySendAlert(ssl);
  12619. if (ret != 0) {
  12620. ssl->error = ret;
  12621. WOLFSSL_ERROR(ssl->error);
  12622. return WOLFSSL_FATAL_ERROR;
  12623. }
  12624. #ifdef WOLFSSL_DTLS13
  12625. if (ssl->options.dtls && ssl->dtls13SendingFragments) {
  12626. if ((ssl->error = Dtls13FragmentsContinue(ssl)) != 0) {
  12627. WOLFSSL_ERROR(ssl->error);
  12628. return WOLFSSL_FATAL_ERROR;
  12629. }
  12630. /* we sent all the fragments. Advance state. */
  12631. ssl->options.acceptState++;
  12632. }
  12633. #endif /* WOLFSSL_DTLS13 */
  12634. switch (ssl->options.acceptState) {
  12635. #ifdef HAVE_SECURE_RENEGOTIATION
  12636. case TLS13_ACCEPT_BEGIN_RENEG:
  12637. #endif
  12638. case TLS13_ACCEPT_BEGIN :
  12639. /* get client_hello */
  12640. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  12641. if ((ssl->error = ProcessReply(ssl)) < 0) {
  12642. WOLFSSL_ERROR(ssl->error);
  12643. return WOLFSSL_FATAL_ERROR;
  12644. }
  12645. #ifdef WOLFSSL_DTLS13
  12646. if (ssl->options.dtls) {
  12647. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  12648. WOLFSSL_ERROR(ssl->error);
  12649. return WOLFSSL_FATAL_ERROR;
  12650. }
  12651. }
  12652. #endif /* WOLFSSL_DTLS13 */
  12653. }
  12654. ssl->options.acceptState = TLS13_ACCEPT_CLIENT_HELLO_DONE;
  12655. WOLFSSL_MSG("accept state ACCEPT_CLIENT_HELLO_DONE");
  12656. if (!IsAtLeastTLSv1_3(ssl->version))
  12657. return wolfSSL_accept(ssl);
  12658. FALL_THROUGH;
  12659. case TLS13_ACCEPT_CLIENT_HELLO_DONE :
  12660. if (ssl->options.serverState ==
  12661. SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
  12662. if ((ssl->error = SendTls13ServerHello(ssl,
  12663. hello_retry_request)) != 0) {
  12664. WOLFSSL_ERROR(ssl->error);
  12665. return WOLFSSL_FATAL_ERROR;
  12666. }
  12667. }
  12668. ssl->options.acceptState = TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE;
  12669. WOLFSSL_MSG("accept state ACCEPT_HELLO_RETRY_REQUEST_DONE");
  12670. FALL_THROUGH;
  12671. case TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE :
  12672. #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
  12673. if (!ssl->options.dtls && ssl->options.tls13MiddleBoxCompat
  12674. && ssl->options.serverState ==
  12675. SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
  12676. if ((ssl->error = SendChangeCipher(ssl)) != 0) {
  12677. WOLFSSL_ERROR(ssl->error);
  12678. return WOLFSSL_FATAL_ERROR;
  12679. }
  12680. ssl->options.sentChangeCipher = 1;
  12681. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  12682. }
  12683. #endif
  12684. ssl->options.acceptState = TLS13_ACCEPT_FIRST_REPLY_DONE;
  12685. WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
  12686. FALL_THROUGH;
  12687. case TLS13_ACCEPT_FIRST_REPLY_DONE :
  12688. if (ssl->options.serverState ==
  12689. SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
  12690. ssl->options.clientState = CLIENT_HELLO_RETRY;
  12691. while (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  12692. if ((ssl->error = ProcessReply(ssl)) < 0) {
  12693. WOLFSSL_ERROR(ssl->error);
  12694. return WOLFSSL_FATAL_ERROR;
  12695. }
  12696. #ifdef WOLFSSL_DTLS13
  12697. if (ssl->options.dtls) {
  12698. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  12699. WOLFSSL_ERROR(ssl->error);
  12700. return WOLFSSL_FATAL_ERROR;
  12701. }
  12702. }
  12703. #endif /* WOLFSSL_DTLS13 */
  12704. }
  12705. }
  12706. ssl->options.acceptState = TLS13_ACCEPT_SECOND_REPLY_DONE;
  12707. WOLFSSL_MSG("accept state ACCEPT_SECOND_REPLY_DONE");
  12708. FALL_THROUGH;
  12709. case TLS13_ACCEPT_SECOND_REPLY_DONE :
  12710. if ((ssl->error = SendTls13ServerHello(ssl, server_hello)) != 0) {
  12711. WOLFSSL_ERROR(ssl->error);
  12712. return WOLFSSL_FATAL_ERROR;
  12713. }
  12714. ssl->options.acceptState = TLS13_SERVER_HELLO_SENT;
  12715. WOLFSSL_MSG("accept state SERVER_HELLO_SENT");
  12716. FALL_THROUGH;
  12717. case TLS13_SERVER_HELLO_SENT :
  12718. #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
  12719. if (!ssl->options.dtls && ssl->options.tls13MiddleBoxCompat
  12720. && !ssl->options.sentChangeCipher && !ssl->options.dtls) {
  12721. if ((ssl->error = SendChangeCipher(ssl)) != 0) {
  12722. WOLFSSL_ERROR(ssl->error);
  12723. return WOLFSSL_FATAL_ERROR;
  12724. }
  12725. ssl->options.sentChangeCipher = 1;
  12726. }
  12727. #endif
  12728. ssl->options.acceptState = TLS13_ACCEPT_THIRD_REPLY_DONE;
  12729. WOLFSSL_MSG("accept state ACCEPT_THIRD_REPLY_DONE");
  12730. FALL_THROUGH;
  12731. case TLS13_ACCEPT_THIRD_REPLY_DONE :
  12732. #ifdef HAVE_SUPPORTED_CURVES
  12733. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  12734. if (!ssl->options.noPskDheKe)
  12735. #endif
  12736. {
  12737. ssl->error = TLSX_KeyShare_DeriveSecret(ssl);
  12738. if (ssl->error != 0)
  12739. return WOLFSSL_FATAL_ERROR;
  12740. }
  12741. #endif
  12742. if ((ssl->error = SendTls13EncryptedExtensions(ssl)) != 0) {
  12743. WOLFSSL_ERROR(ssl->error);
  12744. return WOLFSSL_FATAL_ERROR;
  12745. }
  12746. ssl->options.acceptState = TLS13_SERVER_EXTENSIONS_SENT;
  12747. WOLFSSL_MSG("accept state SERVER_EXTENSIONS_SENT");
  12748. FALL_THROUGH;
  12749. case TLS13_SERVER_EXTENSIONS_SENT :
  12750. #ifndef NO_CERTS
  12751. if (!ssl->options.resuming) {
  12752. if (ssl->options.verifyPeer
  12753. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  12754. && !ssl->options.verifyPostHandshake
  12755. #endif
  12756. ) {
  12757. ssl->error = SendTls13CertificateRequest(ssl, NULL, 0);
  12758. if (ssl->error != 0) {
  12759. WOLFSSL_ERROR(ssl->error);
  12760. return WOLFSSL_FATAL_ERROR;
  12761. }
  12762. }
  12763. else {
  12764. /* SERVER: Peer auth good if not verifying client. */
  12765. ssl->options.peerAuthGood = 1;
  12766. }
  12767. }
  12768. #endif
  12769. ssl->options.acceptState = TLS13_CERT_REQ_SENT;
  12770. WOLFSSL_MSG("accept state CERT_REQ_SENT");
  12771. FALL_THROUGH;
  12772. case TLS13_CERT_REQ_SENT :
  12773. #ifndef NO_CERTS
  12774. if (!ssl->options.resuming && ssl->options.sendVerify) {
  12775. if ((ssl->error = SendTls13Certificate(ssl)) != 0) {
  12776. WOLFSSL_ERROR(ssl->error);
  12777. return WOLFSSL_FATAL_ERROR;
  12778. }
  12779. }
  12780. #endif
  12781. ssl->options.acceptState = TLS13_CERT_SENT;
  12782. WOLFSSL_MSG("accept state CERT_SENT");
  12783. FALL_THROUGH;
  12784. case TLS13_CERT_SENT :
  12785. #if !defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \
  12786. defined(HAVE_ED25519) || defined(HAVE_ED448) || defined(HAVE_PQC))
  12787. if (!ssl->options.resuming && ssl->options.sendVerify) {
  12788. if ((ssl->error = SendTls13CertificateVerify(ssl)) != 0) {
  12789. WOLFSSL_ERROR(ssl->error);
  12790. return WOLFSSL_FATAL_ERROR;
  12791. }
  12792. }
  12793. #endif
  12794. ssl->options.acceptState = TLS13_CERT_VERIFY_SENT;
  12795. WOLFSSL_MSG("accept state CERT_VERIFY_SENT");
  12796. FALL_THROUGH;
  12797. case TLS13_CERT_VERIFY_SENT :
  12798. if ((ssl->error = SendTls13Finished(ssl)) != 0) {
  12799. WOLFSSL_ERROR(ssl->error);
  12800. return WOLFSSL_FATAL_ERROR;
  12801. }
  12802. ssl->options.acceptState = TLS13_ACCEPT_FINISHED_SENT;
  12803. WOLFSSL_MSG("accept state ACCEPT_FINISHED_SENT");
  12804. #ifdef WOLFSSL_EARLY_DATA
  12805. if (ssl->earlyData != no_early_data) {
  12806. ssl->options.handShakeState = SERVER_FINISHED_COMPLETE;
  12807. return WOLFSSL_SUCCESS;
  12808. }
  12809. #endif
  12810. FALL_THROUGH;
  12811. case TLS13_ACCEPT_FINISHED_SENT :
  12812. #ifdef HAVE_SESSION_TICKET
  12813. #ifdef WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
  12814. if (!ssl->options.verifyPeer && !ssl->options.noTicketTls13 &&
  12815. ssl->ctx->ticketEncCb != NULL) {
  12816. if ((ssl->error = SendTls13NewSessionTicket(ssl)) != 0) {
  12817. WOLFSSL_ERROR(ssl->error);
  12818. return WOLFSSL_FATAL_ERROR;
  12819. }
  12820. ssl->options.ticketsSent = 1;
  12821. }
  12822. #endif
  12823. #endif /* HAVE_SESSION_TICKET */
  12824. ssl->options.acceptState = TLS13_PRE_TICKET_SENT;
  12825. WOLFSSL_MSG("accept state TICKET_SENT");
  12826. FALL_THROUGH;
  12827. case TLS13_PRE_TICKET_SENT :
  12828. while (ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
  12829. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  12830. WOLFSSL_ERROR(ssl->error);
  12831. return WOLFSSL_FATAL_ERROR;
  12832. }
  12833. #ifdef WOLFSSL_DTLS13
  12834. if (ssl->options.dtls) {
  12835. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  12836. WOLFSSL_ERROR(ssl->error);
  12837. return WOLFSSL_FATAL_ERROR;
  12838. }
  12839. }
  12840. #endif /* WOLFSSL_DTLS13 */
  12841. }
  12842. ssl->options.acceptState = TLS13_ACCEPT_FINISHED_DONE;
  12843. WOLFSSL_MSG("accept state ACCEPT_FINISHED_DONE");
  12844. FALL_THROUGH;
  12845. case TLS13_ACCEPT_FINISHED_DONE :
  12846. /* SERVER: When not resuming and verifying peer but no certificate
  12847. * received and not failing when not received then peer auth good.
  12848. */
  12849. if (!ssl->options.resuming && ssl->options.verifyPeer &&
  12850. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  12851. !ssl->options.verifyPostHandshake &&
  12852. #endif
  12853. !ssl->options.havePeerCert && !ssl->options.failNoCert) {
  12854. ssl->options.peerAuthGood = 1;
  12855. }
  12856. /* SERVER: check peer authentication. */
  12857. if (!ssl->options.peerAuthGood) {
  12858. WOLFSSL_MSG("Client authentication did not happen");
  12859. return WOLFSSL_FATAL_ERROR;
  12860. }
  12861. #ifdef HAVE_SESSION_TICKET
  12862. while (ssl->options.ticketsSent < ssl->options.maxTicketTls13) {
  12863. if (!ssl->options.noTicketTls13 && ssl->ctx->ticketEncCb
  12864. != NULL) {
  12865. if ((ssl->error = SendTls13NewSessionTicket(ssl)) != 0) {
  12866. WOLFSSL_ERROR(ssl->error);
  12867. return WOLFSSL_FATAL_ERROR;
  12868. }
  12869. }
  12870. ssl->options.ticketsSent++;
  12871. /* only one session ticket is sent on session resumption */
  12872. if (ssl->options.resuming) {
  12873. break;
  12874. }
  12875. }
  12876. #endif /* HAVE_SESSION_TICKET */
  12877. ssl->options.acceptState = TLS13_TICKET_SENT;
  12878. WOLFSSL_MSG("accept state TICKET_SENT");
  12879. FALL_THROUGH;
  12880. case TLS13_TICKET_SENT :
  12881. #ifndef NO_HANDSHAKE_DONE_CB
  12882. if (ssl->hsDoneCb) {
  12883. int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
  12884. if (cbret < 0) {
  12885. ssl->error = cbret;
  12886. WOLFSSL_MSG("HandShake Done Cb don't continue error");
  12887. return WOLFSSL_FATAL_ERROR;
  12888. }
  12889. }
  12890. #endif /* NO_HANDSHAKE_DONE_CB */
  12891. if (!ssl->options.keepResources) {
  12892. FreeHandshakeResources(ssl);
  12893. }
  12894. #if defined(WOLFSSL_ASYNC_IO) && !defined(WOLFSSL_ASYNC_CRYPT)
  12895. /* Free the remaining async context if not using it for crypto */
  12896. FreeAsyncCtx(ssl, 1);
  12897. #endif
  12898. ssl->error = 0; /* clear the error */
  12899. WOLFSSL_LEAVE("wolfSSL_accept", WOLFSSL_SUCCESS);
  12900. return WOLFSSL_SUCCESS;
  12901. default :
  12902. WOLFSSL_MSG("Unknown accept state ERROR");
  12903. return WOLFSSL_FATAL_ERROR;
  12904. }
  12905. }
  12906. #endif
  12907. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SESSION_TICKET)
  12908. /* Server sends a session ticket to the peer.
  12909. *
  12910. * RFC 8446, section 4.6.1, para 1.
  12911. *
  12912. * ssl The SSL/TLS object.
  12913. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  12914. * SIDE_ERROR when not a server,
  12915. * NOT_READY_ERROR when handshake not complete,
  12916. * WOLFSSL_FATAL_ERROR when creating or sending message fails, and
  12917. * WOLFSSL_SUCCESS on success.
  12918. */
  12919. int wolfSSL_send_SessionTicket(WOLFSSL* ssl)
  12920. {
  12921. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  12922. return BAD_FUNC_ARG;
  12923. if (ssl->options.side == WOLFSSL_CLIENT_END)
  12924. return SIDE_ERROR;
  12925. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  12926. return NOT_READY_ERROR;
  12927. if ((ssl->error = SendTls13NewSessionTicket(ssl)) != 0) {
  12928. WOLFSSL_ERROR(ssl->error);
  12929. return WOLFSSL_FATAL_ERROR;
  12930. }
  12931. ssl->options.ticketsSent++;
  12932. return WOLFSSL_SUCCESS;
  12933. }
  12934. #endif
  12935. #ifdef WOLFSSL_EARLY_DATA
  12936. /* Sets the maximum amount of early data that can be seen by server when using
  12937. * session tickets for resumption.
  12938. * A value of zero indicates no early data is to be sent by client using session
  12939. * tickets.
  12940. *
  12941. * ctx The SSL/TLS CTX object.
  12942. * sz Maximum size of the early data.
  12943. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  12944. * 0 on success.
  12945. */
  12946. int wolfSSL_CTX_set_max_early_data(WOLFSSL_CTX* ctx, unsigned int sz)
  12947. {
  12948. if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
  12949. return BAD_FUNC_ARG;
  12950. if (ctx->method->side == WOLFSSL_CLIENT_END)
  12951. return SIDE_ERROR;
  12952. ctx->maxEarlyDataSz = sz;
  12953. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_ERROR_CODE_OPENSSL)
  12954. /* 1 on success in OpenSSL*/
  12955. return WOLFSSL_SUCCESS;
  12956. #else
  12957. return 0;
  12958. #endif
  12959. }
  12960. /* Sets the maximum amount of early data that a client or server would like
  12961. * to exchange. Servers will advertise this value in session tickets sent
  12962. * to a client.
  12963. * A value of zero indicates no early data will be sent by a client, or
  12964. * no early data is accepted by a server (and announced as such in send out
  12965. * session tickets).
  12966. *
  12967. * ssl The SSL/TLS object.
  12968. * sz Maximum size of the early data.
  12969. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  12970. * and 0 on success.
  12971. */
  12972. int wolfSSL_set_max_early_data(WOLFSSL* ssl, unsigned int sz)
  12973. {
  12974. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  12975. return BAD_FUNC_ARG;
  12976. ssl->options.maxEarlyDataSz = sz;
  12977. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_ERROR_CODE_OPENSSL)
  12978. /* 1 on success in OpenSSL*/
  12979. return WOLFSSL_SUCCESS;
  12980. #else
  12981. return 0;
  12982. #endif
  12983. }
  12984. /* Gets the maximum amount of early data that can be seen by server when using
  12985. * session tickets for resumption.
  12986. * A value of zero indicates no early data is to be sent by client using session
  12987. * tickets.
  12988. *
  12989. * ctx The SSL/TLS CTX object.
  12990. * returns BAD_FUNC_ARG when ctx is NULL, SIDE_ERROR when not a server and
  12991. * returns the maximum amount of early data to be set
  12992. */
  12993. int wolfSSL_CTX_get_max_early_data(WOLFSSL_CTX* ctx)
  12994. {
  12995. if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version))
  12996. return BAD_FUNC_ARG;
  12997. if (ctx->method->side == WOLFSSL_CLIENT_END)
  12998. return SIDE_ERROR;
  12999. return ctx->maxEarlyDataSz;
  13000. }
  13001. /* Gets the maximum amount of early data that can be seen by server when using
  13002. * session tickets for resumption.
  13003. * A value of zero indicates no early data is to be sent by client using session
  13004. * tickets.
  13005. *
  13006. * ssl The SSL/TLS object.
  13007. * returns BAD_FUNC_ARG when ssl is NULL, or not using TLS v1.3,
  13008. * SIDE_ERROR when not a server and
  13009. * returns the maximum amount of early data to be set
  13010. */
  13011. int wolfSSL_get_max_early_data(WOLFSSL* ssl)
  13012. {
  13013. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  13014. return BAD_FUNC_ARG;
  13015. return ssl->options.maxEarlyDataSz;
  13016. }
  13017. /* Write early data to the server.
  13018. *
  13019. * ssl The SSL/TLS object.
  13020. * data Early data to write
  13021. * sz The size of the early data in bytes.
  13022. * outSz The number of early data bytes written.
  13023. * returns BAD_FUNC_ARG when: ssl, data or outSz is NULL; sz is negative;
  13024. * or not using TLS v1.3. SIDE ERROR when not a server. Otherwise the number of
  13025. * early data bytes written.
  13026. */
  13027. int wolfSSL_write_early_data(WOLFSSL* ssl, const void* data, int sz, int* outSz)
  13028. {
  13029. int ret = 0;
  13030. WOLFSSL_ENTER("wolfSSL_write_early_data");
  13031. if (ssl == NULL || data == NULL || sz < 0 || outSz == NULL)
  13032. return BAD_FUNC_ARG;
  13033. if (!IsAtLeastTLSv1_3(ssl->version))
  13034. return BAD_FUNC_ARG;
  13035. #ifndef NO_WOLFSSL_CLIENT
  13036. if (ssl->options.side == WOLFSSL_SERVER_END)
  13037. return SIDE_ERROR;
  13038. if (ssl->options.handShakeState == NULL_STATE) {
  13039. if (ssl->error != WC_PENDING_E)
  13040. ssl->earlyData = expecting_early_data;
  13041. ret = wolfSSL_connect_TLSv13(ssl);
  13042. if (ret != WOLFSSL_SUCCESS)
  13043. return WOLFSSL_FATAL_ERROR;
  13044. /* on client side, status is set to rejected */
  13045. /* until sever accepts the early data extension. */
  13046. ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
  13047. }
  13048. if (ssl->options.handShakeState == CLIENT_HELLO_COMPLETE) {
  13049. #ifdef OPENSSL_EXTRA
  13050. /* when processed early data exceeds max size */
  13051. if (ssl->session->maxEarlyDataSz > 0 &&
  13052. (ssl->earlyDataSz + sz > ssl->session->maxEarlyDataSz)) {
  13053. ssl->error = TOO_MUCH_EARLY_DATA;
  13054. return WOLFSSL_FATAL_ERROR;
  13055. }
  13056. #endif
  13057. ret = SendData(ssl, data, sz);
  13058. if (ret > 0) {
  13059. *outSz = ret;
  13060. /* store amount of processed early data from client */
  13061. ssl->earlyDataSz += ret;
  13062. }
  13063. }
  13064. #else
  13065. return SIDE_ERROR;
  13066. #endif
  13067. WOLFSSL_LEAVE("wolfSSL_write_early_data", ret);
  13068. if (ret < 0)
  13069. ret = WOLFSSL_FATAL_ERROR;
  13070. return ret;
  13071. }
  13072. /* Read the any early data from the client.
  13073. *
  13074. * ssl The SSL/TLS object.
  13075. * data Buffer to put the early data into.
  13076. * sz The size of the buffer in bytes.
  13077. * outSz The number of early data bytes read.
  13078. * returns BAD_FUNC_ARG when: ssl, data or outSz is NULL; sz is negative;
  13079. * or not using TLS v1.3. SIDE ERROR when not a server. Otherwise the number of
  13080. * early data bytes read.
  13081. */
  13082. int wolfSSL_read_early_data(WOLFSSL* ssl, void* data, int sz, int* outSz)
  13083. {
  13084. int ret = 0;
  13085. WOLFSSL_ENTER("wolfSSL_read_early_data");
  13086. if (ssl == NULL || data == NULL || sz < 0 || outSz == NULL)
  13087. return BAD_FUNC_ARG;
  13088. if (!IsAtLeastTLSv1_3(ssl->version))
  13089. return BAD_FUNC_ARG;
  13090. *outSz = 0;
  13091. #ifndef NO_WOLFSSL_SERVER
  13092. if (ssl->options.side == WOLFSSL_CLIENT_END)
  13093. return SIDE_ERROR;
  13094. if (ssl->options.handShakeState == NULL_STATE) {
  13095. if (ssl->error != WC_PENDING_E)
  13096. ssl->earlyData = expecting_early_data;
  13097. /* this used to be: ret = wolfSSL_accept_TLSv13(ssl);
  13098. * However, wolfSSL_accept_TLSv13() expects a certificate to
  13099. * be installed already, which is not the case in servers
  13100. * such as HAProxy. They do it after inspecting the ClientHello.
  13101. * The common wolfssl_accept() allows that. */
  13102. ret = wolfSSL_accept(ssl);
  13103. if (ret <= 0)
  13104. return WOLFSSL_FATAL_ERROR;
  13105. }
  13106. if (ssl->options.handShakeState == SERVER_FINISHED_COMPLETE) {
  13107. ret = ReceiveData(ssl, (byte*)data, sz, FALSE);
  13108. if (ret > 0)
  13109. *outSz = ret;
  13110. if (ssl->error == ZERO_RETURN) {
  13111. ssl->error = WOLFSSL_ERROR_NONE;
  13112. #ifdef WOLFSSL_DTLS13
  13113. if (ssl->options.dtls) {
  13114. ret = Dtls13DoScheduledWork(ssl);
  13115. if (ret < 0) {
  13116. ssl->error = ret;
  13117. WOLFSSL_ERROR(ssl->error);
  13118. return WOLFSSL_FATAL_ERROR;
  13119. }
  13120. }
  13121. #endif /* WOLFSSL_DTLS13 */
  13122. }
  13123. }
  13124. else
  13125. ret = 0;
  13126. #else
  13127. return SIDE_ERROR;
  13128. #endif
  13129. WOLFSSL_LEAVE("wolfSSL_read_early_data", ret);
  13130. if (ret < 0)
  13131. ret = WOLFSSL_FATAL_ERROR;
  13132. return ret;
  13133. }
  13134. /* Returns early data status
  13135. *
  13136. * ssl The SSL/TLS object.
  13137. * returns WOLFSSL_EARLY_DATA_ACCEPTED if the data was accepted
  13138. * WOLFSSL_EARLY_DATA_REJECTED if the data was rejected
  13139. * WOLFSSL_EARLY_DATA_NOT_SENT if no early data was sent
  13140. */
  13141. int wolfSSL_get_early_data_status(const WOLFSSL* ssl)
  13142. {
  13143. if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->version))
  13144. return BAD_FUNC_ARG;
  13145. return ssl->earlyDataStatus;
  13146. }
  13147. #endif
  13148. #ifdef HAVE_SECRET_CALLBACK
  13149. int wolfSSL_set_tls13_secret_cb(WOLFSSL* ssl, Tls13SecretCb cb, void* ctx)
  13150. {
  13151. WOLFSSL_ENTER("wolfSSL_set_tls13_secret_cb");
  13152. if (ssl == NULL)
  13153. return WOLFSSL_FATAL_ERROR;
  13154. ssl->tls13SecretCb = cb;
  13155. ssl->tls13SecretCtx = ctx;
  13156. return WOLFSSL_SUCCESS;
  13157. }
  13158. #if defined(SHOW_SECRETS) && defined(WOLFSSL_SSLKEYLOGFILE)
  13159. int tls13ShowSecrets(WOLFSSL* ssl, int id, const unsigned char* secret,
  13160. int secretSz, void* ctx)
  13161. {
  13162. int i;
  13163. const char* str = NULL;
  13164. byte clientRandom[RAN_LEN];
  13165. int clientRandomSz;
  13166. XFILE fp;
  13167. (void) ctx;
  13168. #ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT
  13169. fp = XFOPEN(WOLFSSL_SSLKEYLOGFILE_OUTPUT, "ab");
  13170. if (fp == XBADFILE) {
  13171. return BAD_FUNC_ARG;
  13172. }
  13173. #else
  13174. fp = stderr;
  13175. #endif
  13176. clientRandomSz = (int)wolfSSL_get_client_random(ssl, clientRandom,
  13177. sizeof(clientRandom));
  13178. if (clientRandomSz <= 0) {
  13179. printf("Error getting server random %d\n", clientRandomSz);
  13180. return BAD_FUNC_ARG;
  13181. }
  13182. #if 0
  13183. printf("TLS Server Secret CB: Rand %d, Secret %d\n",
  13184. serverRandomSz, secretSz);
  13185. #endif
  13186. switch (id) {
  13187. case CLIENT_EARLY_TRAFFIC_SECRET:
  13188. str = "CLIENT_EARLY_TRAFFIC_SECRET"; break;
  13189. case EARLY_EXPORTER_SECRET:
  13190. str = "EARLY_EXPORTER_SECRET"; break;
  13191. case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
  13192. str = "CLIENT_HANDSHAKE_TRAFFIC_SECRET"; break;
  13193. case SERVER_HANDSHAKE_TRAFFIC_SECRET:
  13194. str = "SERVER_HANDSHAKE_TRAFFIC_SECRET"; break;
  13195. case CLIENT_TRAFFIC_SECRET:
  13196. str = "CLIENT_TRAFFIC_SECRET_0"; break;
  13197. case SERVER_TRAFFIC_SECRET:
  13198. str = "SERVER_TRAFFIC_SECRET_0"; break;
  13199. case EXPORTER_SECRET:
  13200. str = "EXPORTER_SECRET"; break;
  13201. default:
  13202. #ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT
  13203. XFCLOSE(fp);
  13204. #endif
  13205. return BAD_FUNC_ARG;
  13206. break;
  13207. }
  13208. fprintf(fp, "%s ", str);
  13209. for (i = 0; i < (int)clientRandomSz; i++) {
  13210. fprintf(fp, "%02x", clientRandom[i]);
  13211. }
  13212. fprintf(fp, " ");
  13213. for (i = 0; i < secretSz; i++) {
  13214. fprintf(fp, "%02x", secret[i]);
  13215. }
  13216. fprintf(fp, "\n");
  13217. #ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT
  13218. XFCLOSE(fp);
  13219. #endif
  13220. return 0;
  13221. }
  13222. #endif
  13223. #endif
  13224. #undef ERROR_OUT
  13225. #endif /* !WOLFCRYPT_ONLY */
  13226. #endif /* WOLFSSL_TLS13 */