internal.c 1013 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000
  1. /* internal.c
  2. *
  3. * Copyright (C) 2006-2020 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <wolfssl/wolfcrypt/settings.h>
  25. /*
  26. * WOLFSSL_SMALL_CERT_VERIFY:
  27. * Verify the certificate signature without using DecodedCert. Doubles up
  28. * on some code but allows smaller peak heap memory usage.
  29. * Cannot be used with WOLFSSL_NONBLOCK_OCSP.
  30. * WOLFSSL_ALT_CERT_CHAINS:
  31. * Allows CA's to be presented by peer, but not part of a valid chain.
  32. * Default wolfSSL behavior is to require validation of all presented peer
  33. * certificates. This also allows loading intermediate CA's as trusted
  34. * and ignoring no signer failures for CA's up the chain to root.
  35. */
  36. #ifdef EXTERNAL_OPTS_OPENVPN
  37. #error EXTERNAL_OPTS_OPENVPN should not be defined\
  38. when building wolfSSL
  39. #endif
  40. #ifndef WOLFCRYPT_ONLY
  41. #include <wolfssl/internal.h>
  42. #include <wolfssl/error-ssl.h>
  43. #include <wolfssl/wolfcrypt/asn.h>
  44. #include <wolfssl/wolfcrypt/dh.h>
  45. #ifdef NO_INLINE
  46. #include <wolfssl/wolfcrypt/misc.h>
  47. #else
  48. #define WOLFSSL_MISC_INCLUDED
  49. #include <wolfcrypt/src/misc.c>
  50. #endif
  51. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
  52. #include <wolfssl/wolfcrypt/srp.h>
  53. #endif
  54. #ifdef HAVE_LIBZ
  55. #include "zlib.h"
  56. #endif
  57. #ifdef HAVE_NTRU
  58. #include "libntruencrypt/ntru_crypto.h"
  59. #endif
  60. #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
  61. defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
  62. #ifndef NO_STDIO_FILESYSTEM
  63. #include <stdio.h>
  64. #endif
  65. #endif
  66. #ifdef __sun
  67. #include <sys/filio.h>
  68. #endif
  69. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  70. #ifdef _MSC_VER
  71. /* disable for while(0) cases at the .c level for now */
  72. #pragma warning(disable:4127)
  73. #endif
  74. #if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
  75. #error \
  76. WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
  77. #endif
  78. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
  79. #error Cannot use both secure-renegotiation and renegotiation-indication
  80. #endif
  81. #ifndef WOLFSSL_NO_TLS12
  82. #ifndef NO_WOLFSSL_CLIENT
  83. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32*,
  84. word32);
  85. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input, word32*,
  86. word32);
  87. #ifndef NO_CERTS
  88. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*,
  89. word32);
  90. #endif
  91. #ifdef HAVE_SESSION_TICKET
  92. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32*,
  93. word32);
  94. #endif
  95. #endif
  96. #ifndef NO_WOLFSSL_SERVER
  97. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32*, word32);
  98. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  99. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  100. static int DoCertificateVerify(WOLFSSL* ssl, byte*, word32*, word32);
  101. #endif
  102. #ifdef WOLFSSL_DTLS
  103. static int SendHelloVerifyRequest(WOLFSSL*, const byte*, byte);
  104. #endif /* WOLFSSL_DTLS */
  105. #endif
  106. #endif /* !WOLFSSL_NO_TLS12 */
  107. #ifdef WOLFSSL_DTLS
  108. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl);
  109. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl);
  110. #endif
  111. enum processReply {
  112. doProcessInit = 0,
  113. #ifndef NO_WOLFSSL_SERVER
  114. runProcessOldClientHello,
  115. #endif
  116. getRecordLayerHeader,
  117. getData,
  118. verifyEncryptedMessage,
  119. decryptMessage,
  120. verifyMessage,
  121. runProcessingOneMessage
  122. };
  123. #ifndef WOLFSSL_NO_TLS12
  124. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  125. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  126. static const byte tls13Downgrade[7] = {
  127. 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
  128. };
  129. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  130. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  131. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  132. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  133. int padSz, int content, int verify, int epochOrder);
  134. #endif
  135. #endif /* !WOLFSSL_NO_TLS12 */
  136. #ifdef HAVE_QSH
  137. int QSH_Init(WOLFSSL* ssl);
  138. #endif
  139. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  140. int tsip_useable(const WOLFSSL *ssl);
  141. int tsip_generatePremasterSecret();
  142. int tsip_generateEncryptPreMasterSecret(WOLFSSL *ssl, byte *out, word32 *outSz);
  143. #endif
  144. int IsTLS(const WOLFSSL* ssl)
  145. {
  146. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  147. return 1;
  148. return 0;
  149. }
  150. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  151. {
  152. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  153. return 1;
  154. #ifdef WOLFSSL_DTLS
  155. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  156. return 1;
  157. #endif
  158. return 0;
  159. }
  160. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  161. {
  162. return (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  163. }
  164. static WC_INLINE int IsEncryptionOn(WOLFSSL* ssl, int isSend)
  165. {
  166. (void)isSend;
  167. #ifdef WOLFSSL_DTLS
  168. /* For DTLS, epoch 0 is always not encrypted. */
  169. if (ssl->options.dtls && !isSend && ssl->keys.curEpoch == 0)
  170. return 0;
  171. #endif /* WOLFSSL_DTLS */
  172. return ssl->keys.encryptionOn;
  173. }
  174. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  175. /* If SCTP is not enabled returns the state of the dtls option.
  176. * If SCTP is enabled returns dtls && !sctp. */
  177. static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl)
  178. {
  179. #ifdef WOLFSSL_SCTP
  180. return ssl->options.dtls && !ssl->options.dtlsSctp;
  181. #else
  182. return ssl->options.dtls;
  183. #endif
  184. }
  185. #endif /* DTLS || !WOLFSSL_NO_TLS12 */
  186. #ifdef HAVE_QSH
  187. /* free all structs that where used with QSH */
  188. static int QSH_FreeAll(WOLFSSL* ssl)
  189. {
  190. QSHKey* key = ssl->QSH_Key;
  191. QSHKey* preKey = NULL;
  192. QSHSecret* secret = ssl->QSH_secret;
  193. QSHScheme* list = NULL;
  194. QSHScheme* preList = NULL;
  195. /* free elements in struct */
  196. while (key) {
  197. preKey = key;
  198. if (key->pri.buffer) {
  199. ForceZero(key->pri.buffer, key->pri.length);
  200. XFREE(key->pri.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  201. }
  202. if (key->pub.buffer)
  203. XFREE(key->pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  204. key = (QSHKey*)key->next;
  205. /* free struct */
  206. XFREE(preKey, ssl->heap, DYNAMIC_TYPE_QSH);
  207. }
  208. /* free all of peers QSH keys */
  209. key = ssl->peerQSHKey;
  210. while (key) {
  211. preKey = key;
  212. if (key->pri.buffer) {
  213. ForceZero(key->pri.buffer, key->pri.length);
  214. XFREE(key->pri.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  215. }
  216. if (key->pub.buffer)
  217. XFREE(key->pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  218. key = (QSHKey*)key->next;
  219. /* free struct */
  220. XFREE(preKey, ssl->heap, DYNAMIC_TYPE_QSH);
  221. }
  222. key = NULL;
  223. /* free secret information */
  224. if (secret) {
  225. /* free up the QSHScheme list in QSHSecret */
  226. if (secret->list)
  227. list = secret->list;
  228. while (list) {
  229. preList = list;
  230. if (list->PK)
  231. XFREE(list->PK, ssl->heap, DYNAMIC_TYPE_SECRET);
  232. list = (QSHScheme*)list->next;
  233. XFREE(preList, ssl->heap, DYNAMIC_TYPE_QSH);
  234. }
  235. /* free secret buffers */
  236. if (secret->SerSi) {
  237. if (secret->SerSi->buffer) {
  238. /* clear extra secret material that supplemented Master Secret*/
  239. ForceZero(secret->SerSi->buffer, secret->SerSi->length);
  240. XFREE(secret->SerSi->buffer, ssl->heap, DYNAMIC_TYPE_SECRET);
  241. }
  242. XFREE(secret->SerSi, ssl->heap, DYNAMIC_TYPE_SECRET);
  243. }
  244. if (secret->CliSi) {
  245. if (secret->CliSi->buffer) {
  246. /* clear extra secret material that supplemented Master Secret*/
  247. ForceZero(secret->CliSi->buffer, secret->CliSi->length);
  248. XFREE(secret->CliSi->buffer, ssl->heap, DYNAMIC_TYPE_SECRET);
  249. }
  250. XFREE(secret->CliSi, ssl->heap, DYNAMIC_TYPE_SECRET);
  251. }
  252. }
  253. XFREE(secret, ssl->heap, DYNAMIC_TYPE_QSH);
  254. secret = NULL;
  255. return 0;
  256. }
  257. #endif
  258. #ifdef HAVE_NTRU
  259. static WOLFSSL_GLOBAL WC_RNG* rng;
  260. static WOLFSSL_GLOBAL wolfSSL_Mutex* rngMutex;
  261. static word32 GetEntropy(unsigned char* out, word32 num_bytes)
  262. {
  263. int ret = 0;
  264. if (rng == NULL) {
  265. if ((rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), 0,
  266. DYNAMIC_TYPE_RNG)) == NULL)
  267. return DRBG_OUT_OF_MEMORY;
  268. wc_InitRng(rng);
  269. }
  270. if (rngMutex == NULL) {
  271. if ((rngMutex = (wolfSSL_Mutex*)XMALLOC(sizeof(wolfSSL_Mutex), 0,
  272. DYNAMIC_TYPE_MUTEX)) == NULL)
  273. return DRBG_OUT_OF_MEMORY;
  274. wc_InitMutex(rngMutex);
  275. }
  276. ret |= wc_LockMutex(rngMutex);
  277. ret |= wc_RNG_GenerateBlock(rng, out, num_bytes);
  278. ret |= wc_UnLockMutex(rngMutex);
  279. if (ret != 0)
  280. return DRBG_ENTROPY_FAIL;
  281. return DRBG_OK;
  282. }
  283. #endif /* HAVE_NTRU */
  284. #ifdef HAVE_LIBZ
  285. /* alloc user allocs to work with zlib */
  286. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  287. {
  288. (void)opaque;
  289. return XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  290. }
  291. static void myFree(void* opaque, void* memory)
  292. {
  293. (void)opaque;
  294. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  295. }
  296. /* init zlib comp/decomp streams, 0 on success */
  297. static int InitStreams(WOLFSSL* ssl)
  298. {
  299. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  300. ssl->c_stream.zfree = (free_func)myFree;
  301. ssl->c_stream.opaque = (voidpf)ssl->heap;
  302. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  303. return ZLIB_INIT_ERROR;
  304. ssl->didStreamInit = 1;
  305. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  306. ssl->d_stream.zfree = (free_func)myFree;
  307. ssl->d_stream.opaque = (voidpf)ssl->heap;
  308. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  309. return 0;
  310. }
  311. static void FreeStreams(WOLFSSL* ssl)
  312. {
  313. if (ssl->didStreamInit) {
  314. deflateEnd(&ssl->c_stream);
  315. inflateEnd(&ssl->d_stream);
  316. }
  317. }
  318. /* compress in to out, return out size or error */
  319. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  320. {
  321. int err;
  322. int currTotal = (int)ssl->c_stream.total_out;
  323. ssl->c_stream.next_in = in;
  324. ssl->c_stream.avail_in = inSz;
  325. ssl->c_stream.next_out = out;
  326. ssl->c_stream.avail_out = outSz;
  327. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  328. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  329. return (int)ssl->c_stream.total_out - currTotal;
  330. }
  331. /* decompress in to out, return out size or error */
  332. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  333. {
  334. int err;
  335. int currTotal = (int)ssl->d_stream.total_out;
  336. ssl->d_stream.next_in = in;
  337. ssl->d_stream.avail_in = inSz;
  338. ssl->d_stream.next_out = out;
  339. ssl->d_stream.avail_out = outSz;
  340. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  341. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  342. return (int)ssl->d_stream.total_out - currTotal;
  343. }
  344. #endif /* HAVE_LIBZ */
  345. #ifdef WOLFSSL_SESSION_EXPORT
  346. #ifdef WOLFSSL_DTLS
  347. /* serializes the cipher specs struct for exporting */
  348. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  349. {
  350. word32 idx = 0;
  351. CipherSpecs* specs;
  352. WOLFSSL_ENTER("ExportCipherSpecState");
  353. if (exp == NULL || ssl == NULL) {
  354. return BAD_FUNC_ARG;
  355. }
  356. specs= &(ssl->specs);
  357. if (DTLS_EXPORT_SPC_SZ > len) {
  358. return BUFFER_E;
  359. }
  360. XMEMSET(exp, 0, DTLS_EXPORT_SPC_SZ);
  361. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  362. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  363. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  364. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  365. exp[idx++] = specs->bulk_cipher_algorithm;
  366. exp[idx++] = specs->cipher_type;
  367. exp[idx++] = specs->mac_algorithm;
  368. exp[idx++] = specs->kea;
  369. exp[idx++] = specs->sig_algo;
  370. exp[idx++] = specs->hash_size;
  371. exp[idx++] = specs->pad_size;
  372. exp[idx++] = specs->static_ecdh;
  373. if (idx != DTLS_EXPORT_SPC_SZ) {
  374. WOLFSSL_MSG("DTLS_EXPORT_SPC_SZ needs updated and export version");
  375. return DTLS_EXPORT_VER_E;
  376. }
  377. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  378. (void)ver;
  379. return idx;
  380. }
  381. /* serializes the key struct for exporting */
  382. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  383. byte small)
  384. {
  385. word32 idx = 0;
  386. byte sz;
  387. Keys* keys;
  388. WOLFSSL_ENTER("ExportKeyState");
  389. if (exp == NULL || ssl == NULL) {
  390. return BAD_FUNC_ARG;
  391. }
  392. keys = &(ssl->keys);
  393. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  394. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  395. return BUFFER_E;
  396. }
  397. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  398. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  399. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  400. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  401. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  402. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  403. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  404. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  405. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  406. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  407. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  408. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  409. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  410. c16toa(keys->dtls_peer_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  411. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  412. idx += OPAQUE16_LEN;
  413. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  414. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  415. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  416. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  417. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  418. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  419. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  420. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  421. exp[idx++] = keys->encryptionOn;
  422. exp[idx++] = keys->decryptedCur;
  423. /* from here on the buffer needs checked because is variable length that
  424. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  425. {
  426. word32 i;
  427. if ((OPAQUE16_LEN * 2) + idx +
  428. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  429. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  430. return BUFFER_E;
  431. }
  432. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  433. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  434. c32toa(keys->peerSeq[0].window[i], exp + idx);
  435. idx += OPAQUE32_LEN;
  436. }
  437. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  438. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  439. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  440. idx += OPAQUE32_LEN;
  441. }
  442. }
  443. if (idx >= len) {
  444. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  445. return BUFFER_E;
  446. }
  447. #ifdef HAVE_TRUNCATED_HMAC
  448. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  449. exp[idx++] = ssl->truncated_hmac;
  450. #else
  451. sz = ssl->specs.hash_size;
  452. exp[idx++] = 0; /* no truncated hmac */
  453. #endif
  454. sz = (small)? 0: sz;
  455. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  456. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  457. return BUFFER_E;
  458. }
  459. exp[idx++] = sz;
  460. if (sz > 0) {
  461. #ifndef WOLFSSL_AEAD_ONLY
  462. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  463. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  464. #else
  465. XMEMSET(exp + idx, 0, sz); idx += sz;
  466. XMEMSET(exp + idx, 0, sz); idx += sz;
  467. #endif
  468. }
  469. sz = (small)? 0: ssl->specs.key_size;
  470. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  471. WOLFSSL_MSG("Buffer not large enough for write key");
  472. return BUFFER_E;
  473. }
  474. exp[idx++] = sz;
  475. if (sz > 0) {
  476. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  477. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  478. }
  479. sz = (small)? 0: ssl->specs.iv_size;
  480. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  481. WOLFSSL_MSG("Buffer not large enough for IVs");
  482. return BUFFER_E;
  483. }
  484. exp[idx++] = sz;
  485. if (sz > 0) {
  486. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  487. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  488. }
  489. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  490. idx += AEAD_MAX_EXP_SZ;
  491. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  492. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  493. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  494. return BUFFER_E;
  495. }
  496. exp[idx++] = sz;
  497. if (sz > 0) {
  498. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  499. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  500. }
  501. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  502. if (idx > DTLS_EXPORT_KEY_SZ) {
  503. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  504. return DTLS_EXPORT_VER_E;
  505. }
  506. WOLFSSL_LEAVE("ExportKeyState", idx);
  507. (void)ver;
  508. return idx;
  509. }
  510. static int ImportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  511. {
  512. word32 idx = 0;
  513. CipherSpecs* specs;
  514. WOLFSSL_ENTER("ImportCipherSpecState");
  515. if (exp == NULL || ssl == NULL) {
  516. return BAD_FUNC_ARG;
  517. }
  518. specs= &(ssl->specs);
  519. if (DTLS_EXPORT_SPC_SZ > len) {
  520. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  521. return BUFFER_E;
  522. }
  523. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  524. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  525. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  526. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  527. specs->bulk_cipher_algorithm = exp[idx++];
  528. specs->cipher_type = exp[idx++];
  529. specs->mac_algorithm = exp[idx++];
  530. specs->kea = exp[idx++];
  531. specs->sig_algo = exp[idx++];
  532. specs->hash_size = exp[idx++];
  533. specs->pad_size = exp[idx++];
  534. specs->static_ecdh = exp[idx++];
  535. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  536. (void)ver;
  537. return idx;
  538. }
  539. static int ImportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  540. {
  541. word32 idx = 0;
  542. byte sz;
  543. Keys* keys;
  544. WOLFSSL_ENTER("ImportKeyState");
  545. if (exp == NULL || ssl == NULL) {
  546. return BAD_FUNC_ARG;
  547. }
  548. keys = &(ssl->keys);
  549. /* check minimum length -- includes byte used for size indicators */
  550. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  551. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  552. return BUFFER_E;
  553. }
  554. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  555. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  556. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  557. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  558. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  559. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  560. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  561. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  562. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  563. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  564. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  565. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  566. ato16(exp + idx, &keys->dtls_peer_handshake_number); idx += OPAQUE16_LEN;
  567. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  568. idx += OPAQUE16_LEN;
  569. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  570. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  571. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi); idx += OPAQUE16_LEN;
  572. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo); idx += OPAQUE32_LEN;
  573. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  574. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  575. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  576. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  577. keys->encryptionOn = exp[idx++];
  578. keys->decryptedCur = exp[idx++];
  579. {
  580. word16 i, wordCount, wordAdj = 0;
  581. /* do window */
  582. ato16(exp + idx, &wordCount);
  583. idx += OPAQUE16_LEN;
  584. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  585. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  586. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  587. }
  588. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  589. for (i = 0; i < wordCount; i++) {
  590. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  591. idx += OPAQUE32_LEN;
  592. }
  593. idx += wordAdj;
  594. /* do prevWindow */
  595. ato16(exp + idx, &wordCount);
  596. idx += OPAQUE16_LEN;
  597. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  598. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  599. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  600. }
  601. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  602. for (i = 0; i < wordCount; i++) {
  603. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  604. idx += OPAQUE32_LEN;
  605. }
  606. idx += wordAdj;
  607. }
  608. #ifdef HAVE_TRUNCATED_HMAC
  609. ssl->truncated_hmac = exp[idx++];
  610. #else
  611. idx++; /* no truncated hmac */
  612. #endif
  613. sz = exp[idx++];
  614. #ifndef WOLFSSL_AEAD_ONLY
  615. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  616. WOLFSSL_MSG("Buffer not large enough for MAC import");
  617. return BUFFER_E;
  618. }
  619. if (sz > 0) {
  620. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  621. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  622. }
  623. #else
  624. if (sz + idx > len) {
  625. return BUFFER_E;
  626. }
  627. idx += sz; idx += sz;
  628. #endif
  629. sz = exp[idx++];
  630. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  631. WOLFSSL_MSG("Buffer not large enough for key import");
  632. return BUFFER_E;
  633. }
  634. if (sz > 0) {
  635. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  636. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  637. }
  638. sz = exp[idx++];
  639. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  640. WOLFSSL_MSG("Buffer not large enough for write IV import");
  641. return BUFFER_E;
  642. }
  643. if (sz > 0) {
  644. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  645. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  646. }
  647. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  648. idx += AEAD_MAX_EXP_SZ;
  649. sz = exp[idx++];
  650. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  651. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  652. return BUFFER_E;
  653. }
  654. if (sz > 0) {
  655. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  656. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  657. }
  658. WOLFSSL_LEAVE("ImportKeyState", idx);
  659. (void)ver;
  660. return idx;
  661. }
  662. /* copy over necessary information from Options struct to buffer
  663. * On success returns size of buffer used on failure returns a negative value */
  664. static int dtls_export_new(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  665. {
  666. int idx = 0;
  667. word16 zero = 0;
  668. Options* options = &ssl->options;
  669. WOLFSSL_ENTER("dtls_export_new");
  670. if (exp == NULL || options == NULL || len < DTLS_EXPORT_OPT_SZ) {
  671. return BAD_FUNC_ARG;
  672. }
  673. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  674. /* these options are kept and sent to indicate verify status and strength
  675. * of handshake */
  676. exp[idx++] = options->sendVerify;
  677. exp[idx++] = options->verifyPeer;
  678. exp[idx++] = options->verifyNone;
  679. exp[idx++] = options->downgrade;
  680. #ifndef NO_DH
  681. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  682. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  683. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  684. #else
  685. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  686. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  687. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  688. #endif
  689. #ifndef NO_RSA
  690. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  691. #else
  692. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  693. #endif
  694. #ifdef HAVE_ECC
  695. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  696. #else
  697. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  698. #endif
  699. /* these options are kept to indicate state and behavior */
  700. #ifndef NO_PSK
  701. exp[idx++] = options->havePSK;
  702. #else
  703. exp[idx++] = 0;
  704. #endif
  705. exp[idx++] = options->sessionCacheOff;
  706. exp[idx++] = options->sessionCacheFlushOff;
  707. exp[idx++] = options->side;
  708. exp[idx++] = options->resuming;
  709. exp[idx++] = options->haveSessionId;
  710. exp[idx++] = options->tls;
  711. exp[idx++] = options->tls1_1;
  712. exp[idx++] = options->dtls;
  713. exp[idx++] = options->connReset;
  714. exp[idx++] = options->isClosed;
  715. exp[idx++] = options->closeNotify;
  716. exp[idx++] = options->sentNotify;
  717. exp[idx++] = options->usingCompression;
  718. exp[idx++] = options->haveRSA;
  719. exp[idx++] = options->haveECC;
  720. exp[idx++] = options->haveDH;
  721. exp[idx++] = options->haveNTRU;
  722. exp[idx++] = options->haveQSH;
  723. exp[idx++] = options->haveECDSAsig;
  724. exp[idx++] = options->haveStaticECC;
  725. exp[idx++] = options->havePeerVerify;
  726. exp[idx++] = options->usingPSK_cipher;
  727. exp[idx++] = options->usingAnon_cipher;
  728. exp[idx++] = options->sendAlertState;
  729. exp[idx++] = options->partialWrite;
  730. exp[idx++] = options->quietShutdown;
  731. exp[idx++] = options->groupMessages;
  732. #ifdef HAVE_POLY1305
  733. exp[idx++] = options->oldPoly;
  734. #else
  735. exp[idx++] = 0;
  736. #endif
  737. #ifdef HAVE_ANON
  738. exp[idx++] = options->haveAnon;
  739. #else
  740. exp[idx++] = 0;
  741. #endif
  742. #ifdef HAVE_SESSION_TICKET
  743. exp[idx++] = options->createTicket;
  744. exp[idx++] = options->useTicket;
  745. #ifdef WOLFSSL_TLS13
  746. if (ver > DTLS_EXPORT_VERSION_3) {
  747. exp[idx++] = options->noTicketTls13;
  748. }
  749. #else
  750. if (ver > DTLS_EXPORT_VERSION_3) {
  751. exp[idx++] = 0;
  752. }
  753. #endif
  754. #else
  755. exp[idx++] = 0;
  756. exp[idx++] = 0;
  757. if (ver > DTLS_EXPORT_VERSION_3) {
  758. exp[idx++] = 0;
  759. }
  760. #endif
  761. exp[idx++] = options->processReply;
  762. exp[idx++] = options->cipherSuite0;
  763. exp[idx++] = options->cipherSuite;
  764. exp[idx++] = options->serverState;
  765. exp[idx++] = options->clientState;
  766. exp[idx++] = options->handShakeState;
  767. exp[idx++] = options->handShakeDone;
  768. exp[idx++] = options->minDowngrade;
  769. exp[idx++] = options->connectState;
  770. exp[idx++] = options->acceptState;
  771. exp[idx++] = options->asyncState;
  772. /* version of connection */
  773. exp[idx++] = ssl->version.major;
  774. exp[idx++] = ssl->version.minor;
  775. (void)zero;
  776. /* check if changes were made and notify of need to update export version */
  777. switch (ver) {
  778. case DTLS_EXPORT_VERSION_3:
  779. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  780. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  781. return DTLS_EXPORT_VER_E;
  782. }
  783. break;
  784. case DTLS_EXPORT_VERSION:
  785. if (idx != DTLS_EXPORT_OPT_SZ) {
  786. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  787. return DTLS_EXPORT_VER_E;
  788. }
  789. break;
  790. default:
  791. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  792. return DTLS_EXPORT_VER_E;
  793. }
  794. WOLFSSL_LEAVE("dtls_export_new", idx);
  795. return idx;
  796. }
  797. /* copy items from Export struct to Options struct
  798. * On success returns size of buffer used on failure returns a negative value */
  799. static int dtls_export_load(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  800. {
  801. int idx = 0;
  802. Options* options = &ssl->options;
  803. switch (ver) {
  804. case DTLS_EXPORT_VERSION:
  805. if (len < DTLS_EXPORT_OPT_SZ) {
  806. WOLFSSL_MSG("Sanity check on buffer size failed");
  807. return BAD_FUNC_ARG;
  808. }
  809. break;
  810. case DTLS_EXPORT_VERSION_3:
  811. if (len < DTLS_EXPORT_OPT_SZ_3) {
  812. WOLFSSL_MSG("Sanity check on buffer size failed");
  813. return BAD_FUNC_ARG;
  814. }
  815. break;
  816. default:
  817. WOLFSSL_MSG("Export version not supported");
  818. return BAD_FUNC_ARG;
  819. }
  820. if (exp == NULL || options == NULL) {
  821. return BAD_FUNC_ARG;
  822. }
  823. /* these options are kept and sent to indicate verify status and strength
  824. * of handshake */
  825. options->sendVerify = exp[idx++];
  826. options->verifyPeer = exp[idx++];
  827. options->verifyNone = exp[idx++];
  828. options->downgrade = exp[idx++];
  829. #ifndef NO_DH
  830. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  831. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  832. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  833. #else
  834. idx += OPAQUE16_LEN;
  835. idx += OPAQUE16_LEN;
  836. idx += OPAQUE16_LEN;
  837. #endif
  838. #ifndef NO_RSA
  839. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  840. #else
  841. idx += OPAQUE16_LEN;
  842. #endif
  843. #ifdef HAVE_ECC
  844. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  845. #else
  846. idx += OPAQUE16_LEN;
  847. #endif
  848. /* these options are kept to indicate state and behavior */
  849. #ifndef NO_PSK
  850. options->havePSK = exp[idx++];
  851. #else
  852. idx++;
  853. #endif
  854. options->sessionCacheOff = exp[idx++];
  855. options->sessionCacheFlushOff = exp[idx++];
  856. options->side = exp[idx++];
  857. options->resuming = exp[idx++];
  858. options->haveSessionId = exp[idx++];
  859. options->tls = exp[idx++];
  860. options->tls1_1 = exp[idx++];
  861. options->dtls = exp[idx++];
  862. options->connReset = exp[idx++];
  863. options->isClosed = exp[idx++];
  864. options->closeNotify = exp[idx++];
  865. options->sentNotify = exp[idx++];
  866. options->usingCompression = exp[idx++];
  867. options->haveRSA = exp[idx++];
  868. options->haveECC = exp[idx++];
  869. options->haveDH = exp[idx++];
  870. options->haveNTRU = exp[idx++];
  871. options->haveQSH = exp[idx++];
  872. options->haveECDSAsig = exp[idx++];
  873. options->haveStaticECC = exp[idx++];
  874. options->havePeerVerify = exp[idx++];
  875. options->usingPSK_cipher = exp[idx++];
  876. options->usingAnon_cipher = exp[idx++];
  877. options->sendAlertState = exp[idx++];
  878. options->partialWrite = exp[idx++];
  879. options->quietShutdown = exp[idx++];
  880. options->groupMessages = exp[idx++];
  881. #ifdef HAVE_POLY1305
  882. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  883. #else
  884. idx++;
  885. #endif
  886. #ifdef HAVE_ANON
  887. options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */
  888. #else
  889. idx++;
  890. #endif
  891. #ifdef HAVE_SESSION_TICKET
  892. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  893. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  894. #ifdef WOLFSSL_TLS13
  895. if (ver > DTLS_EXPORT_VERSION_3) {
  896. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  897. }
  898. #else
  899. if (ver > DTLS_EXPORT_VERSION_3) {
  900. exp[idx++] = 0;
  901. }
  902. #endif
  903. #else
  904. idx++;
  905. idx++;
  906. if (ver > DTLS_EXPORT_VERSION_3) {
  907. idx++;
  908. }
  909. #endif
  910. options->processReply = exp[idx++];
  911. options->cipherSuite0 = exp[idx++];
  912. options->cipherSuite = exp[idx++];
  913. options->serverState = exp[idx++];
  914. options->clientState = exp[idx++];
  915. options->handShakeState = exp[idx++];
  916. options->handShakeDone = exp[idx++];
  917. options->minDowngrade = exp[idx++];
  918. options->connectState = exp[idx++];
  919. options->acceptState = exp[idx++];
  920. options->asyncState = exp[idx++];
  921. /* version of connection */
  922. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  923. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  924. return VERSION_ERROR;
  925. }
  926. return idx;
  927. }
  928. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  929. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  930. {
  931. int idx = 0;
  932. int ipSz = DTLS_EXPORT_IP; /* start as max size */
  933. int fam = 0;
  934. word16 port = 0;
  935. char ip[DTLS_EXPORT_IP];
  936. if (ver != DTLS_EXPORT_VERSION) {
  937. WOLFSSL_MSG("Export version not supported");
  938. return BAD_FUNC_ARG;
  939. }
  940. if (ssl == NULL || exp == NULL || len < sizeof(ip) + 3 * DTLS_EXPORT_LEN) {
  941. return BAD_FUNC_ARG;
  942. }
  943. if (ssl->ctx->CBGetPeer == NULL) {
  944. WOLFSSL_MSG("No get peer call back set");
  945. return BAD_FUNC_ARG;
  946. }
  947. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  948. WOLFSSL_MSG("Get peer callback error");
  949. return SOCKET_ERROR_E;
  950. }
  951. /* check that ipSz/fam is not negative or too large since user can set cb */
  952. if (ipSz < 0 || ipSz > DTLS_EXPORT_IP || fam < 0) {
  953. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  954. return SOCKET_ERROR_E;
  955. }
  956. c16toa((word16)fam, exp + idx); idx += DTLS_EXPORT_LEN;
  957. c16toa((word16)ipSz, exp + idx); idx += DTLS_EXPORT_LEN;
  958. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  959. c16toa(port, exp + idx); idx += DTLS_EXPORT_LEN;
  960. return idx;
  961. }
  962. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  963. static int ImportPeerInfo(WOLFSSL* ssl, byte* buf, word32 len, byte ver)
  964. {
  965. word16 idx = 0;
  966. word16 ipSz;
  967. word16 fam;
  968. word16 port;
  969. char ip[DTLS_EXPORT_IP];
  970. if (ver != DTLS_EXPORT_VERSION && ver != DTLS_EXPORT_VERSION_3) {
  971. WOLFSSL_MSG("Export version not supported");
  972. return BAD_FUNC_ARG;
  973. }
  974. if (len == 0) {
  975. WOLFSSL_MSG("No peer info sent");
  976. return 0;
  977. }
  978. if (ssl == NULL || buf == NULL || len < 3 * DTLS_EXPORT_LEN) {
  979. return BAD_FUNC_ARG;
  980. }
  981. /* import sin family */
  982. ato16(buf + idx, &fam); idx += DTLS_EXPORT_LEN;
  983. /* import ip address idx, and ipSz are unsigned but cast for enum */
  984. ato16(buf + idx, &ipSz); idx += DTLS_EXPORT_LEN;
  985. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + DTLS_EXPORT_LEN) > len) {
  986. return BUFFER_E;
  987. }
  988. XMEMSET(ip, 0, sizeof(ip));
  989. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  990. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  991. ato16(buf + idx, &port); idx += DTLS_EXPORT_LEN;
  992. /* sanity check for a function to call, then use it to import peer info */
  993. if (ssl->ctx->CBSetPeer == NULL) {
  994. WOLFSSL_MSG("No set peer function");
  995. return BAD_FUNC_ARG;
  996. }
  997. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  998. WOLFSSL_MSG("Error setting peer info");
  999. return SOCKET_ERROR_E;
  1000. }
  1001. return idx;
  1002. }
  1003. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1004. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1005. * passed in.
  1006. * On success returns the size of serialized session state.*/
  1007. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1008. {
  1009. int ret;
  1010. word32 idx = 0;
  1011. word32 totalLen = 0;
  1012. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1013. if (buf == NULL || ssl == NULL) {
  1014. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1015. return BAD_FUNC_ARG;
  1016. }
  1017. totalLen += DTLS_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1018. /* each of the following have a 2 byte length before data */
  1019. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1020. if (totalLen > sz) {
  1021. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1022. return BUFFER_E;
  1023. }
  1024. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1025. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1026. ((byte)DTLS_EXPORT_VERSION & 0X0F);
  1027. idx += DTLS_EXPORT_LEN; /* leave room for total length */
  1028. /* export keys struct and dtls state -- variable length stored in ret */
  1029. idx += DTLS_EXPORT_LEN; /* leave room for length */
  1030. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1031. DTLS_EXPORT_VERSION, 1)) < 0) {
  1032. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1033. return ret;
  1034. }
  1035. c16toa((word16)ret, buf + idx - DTLS_EXPORT_LEN); idx += ret;
  1036. /* place total length of exported buffer minus 2 bytes protocol/version */
  1037. c16toa((word16)(idx - DTLS_EXPORT_LEN), buf + DTLS_EXPORT_LEN);
  1038. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1039. /* if compiled with debug options then print the version, protocol, size */
  1040. {
  1041. char debug[256];
  1042. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1043. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1044. , (int)DTLS_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1045. WOLFSSL_MSG(debug);
  1046. }
  1047. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1048. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1049. return idx;
  1050. }
  1051. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session
  1052. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1053. * passed in.
  1054. * On success returns the size of serialized session.*/
  1055. int wolfSSL_dtls_export_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1056. {
  1057. int ret;
  1058. word32 idx = 0;
  1059. word32 totalLen = 0;
  1060. WOLFSSL_ENTER("wolfSSL_dtls_export_internal");
  1061. if (buf == NULL || ssl == NULL) {
  1062. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", BAD_FUNC_ARG);
  1063. return BAD_FUNC_ARG;
  1064. }
  1065. totalLen += DTLS_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1066. /* each of the following have a 2 byte length before data */
  1067. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1068. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1069. totalLen += DTLS_EXPORT_LEN + DTLS_EXPORT_SPC_SZ;
  1070. totalLen += DTLS_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1071. if (totalLen > sz) {
  1072. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", BUFFER_E);
  1073. return BUFFER_E;
  1074. }
  1075. buf[idx++] = (byte)DTLS_EXPORT_PRO;
  1076. buf[idx++] = ((byte)DTLS_EXPORT_PRO & 0xF0) |
  1077. ((byte)DTLS_EXPORT_VERSION & 0X0F);
  1078. idx += DTLS_EXPORT_LEN; /* leave spot for length */
  1079. c16toa((word16)DTLS_EXPORT_OPT_SZ, buf + idx); idx += DTLS_EXPORT_LEN;
  1080. if ((ret = dtls_export_new(ssl, buf + idx, sz - idx,
  1081. DTLS_EXPORT_VERSION)) < 0) {
  1082. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1083. return ret;
  1084. }
  1085. idx += ret;
  1086. /* export keys struct and dtls state -- variable length stored in ret */
  1087. idx += DTLS_EXPORT_LEN; /* leave room for length */
  1088. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1089. DTLS_EXPORT_VERSION, 0)) < 0) {
  1090. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1091. return ret;
  1092. }
  1093. c16toa((word16)ret, buf + idx - DTLS_EXPORT_LEN); idx += ret;
  1094. /* export of cipher specs struct */
  1095. c16toa((word16)DTLS_EXPORT_SPC_SZ, buf + idx); idx += DTLS_EXPORT_LEN;
  1096. if ((ret = ExportCipherSpecState(ssl, buf + idx, sz - idx,
  1097. DTLS_EXPORT_VERSION)) < 0) {
  1098. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1099. return ret;
  1100. }
  1101. idx += ret;
  1102. /* export of dtls peer information */
  1103. idx += DTLS_EXPORT_LEN;
  1104. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1105. ret = 0; /* not saving peer port/ip information */
  1106. #else
  1107. if ((ret = ExportPeerInfo(ssl, buf + idx, sz - idx,
  1108. DTLS_EXPORT_VERSION)) < 0) {
  1109. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", ret);
  1110. return ret;
  1111. }
  1112. #endif
  1113. c16toa(ret, buf + idx - DTLS_EXPORT_LEN);
  1114. idx += ret;
  1115. /* place total length of exported buffer minus 2 bytes protocol/version */
  1116. c16toa((word16)(idx - DTLS_EXPORT_LEN), buf + DTLS_EXPORT_LEN);
  1117. /* if compiled with debug options then print the version, protocol, size */
  1118. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1119. {
  1120. char debug[256];
  1121. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session\n"
  1122. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1123. , (int)DTLS_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1124. WOLFSSL_MSG(debug);
  1125. }
  1126. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1127. WOLFSSL_LEAVE("wolfSSL_dtls_export_internal", idx);
  1128. return idx;
  1129. }
  1130. /* On success return amount of buffer consumed */
  1131. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1132. {
  1133. word32 idx = 0;
  1134. word16 length = 0;
  1135. int version;
  1136. int ret;
  1137. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1138. /* check at least enough room for protocol and length */
  1139. if (sz < DTLS_EXPORT_LEN * 2 || ssl == NULL) {
  1140. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1141. return BAD_FUNC_ARG;
  1142. }
  1143. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1144. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1145. WOLFSSL_MSG("Incorrect protocol");
  1146. return BAD_FUNC_ARG;
  1147. }
  1148. version = buf[idx++] & 0x0F;
  1149. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1150. if (length > sz - DTLS_EXPORT_LEN) { /* subtract 2 for protocol */
  1151. WOLFSSL_MSG("Buffer size sanity check failed");
  1152. return BUFFER_E;
  1153. }
  1154. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1155. /* if compiled with debug options then print the version, protocol, size */
  1156. {
  1157. char debug[256];
  1158. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1159. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1160. , (int)version, buf[0], (buf[1] >> 4), length);
  1161. WOLFSSL_MSG(debug);
  1162. }
  1163. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1164. /* perform sanity checks and extract Options information used */
  1165. switch (version) {
  1166. case DTLS_EXPORT_VERSION:
  1167. break;
  1168. default:
  1169. WOLFSSL_MSG("Bad export state version");
  1170. return BAD_FUNC_ARG;
  1171. }
  1172. /* perform sanity checks and extract Keys struct */
  1173. if (DTLS_EXPORT_LEN + idx > sz) {
  1174. WOLFSSL_MSG("Import Key struct error");
  1175. return BUFFER_E;
  1176. }
  1177. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1178. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1179. WOLFSSL_MSG("Import Key struct error");
  1180. return BUFFER_E;
  1181. }
  1182. if ((ret = ImportKeyState(ssl, buf + idx, length, version)) < 0) {
  1183. WOLFSSL_MSG("Import Key struct error");
  1184. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1185. return ret;
  1186. }
  1187. idx += ret;
  1188. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1189. return ret;
  1190. }
  1191. /* On success return amount of buffer consumed */
  1192. int wolfSSL_dtls_import_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1193. {
  1194. word32 idx = 0;
  1195. word16 length = 0;
  1196. int version;
  1197. int ret;
  1198. int optSz;
  1199. WOLFSSL_ENTER("wolfSSL_dtls_import_internal");
  1200. /* check at least enough room for protocol and length */
  1201. if (sz < DTLS_EXPORT_LEN * 2 || ssl == NULL) {
  1202. return BAD_FUNC_ARG;
  1203. }
  1204. /* sanity check on protocol ID and size of buffer */
  1205. if (buf[idx++] != (byte)DTLS_EXPORT_PRO ||
  1206. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1207. /* don't increment on second idx to next get version */
  1208. /* check if importing state only */
  1209. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1210. }
  1211. version = buf[idx++] & 0x0F;
  1212. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1213. if (length > sz - DTLS_EXPORT_LEN) { /* subtract 2 for protocol */
  1214. return BUFFER_E;
  1215. }
  1216. /* if compiled with debug options then print the version, protocol, size */
  1217. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1218. {
  1219. char debug[256];
  1220. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1221. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1222. , (int)version, buf[0], (buf[1] >> 4), length);
  1223. WOLFSSL_MSG(debug);
  1224. }
  1225. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1226. /* perform sanity checks and extract Options information used */
  1227. switch (version) {
  1228. case DTLS_EXPORT_VERSION:
  1229. optSz = DTLS_EXPORT_OPT_SZ;
  1230. break;
  1231. case DTLS_EXPORT_VERSION_3:
  1232. WOLFSSL_MSG("Importing older version 3");
  1233. optSz = DTLS_EXPORT_OPT_SZ_3;
  1234. break;
  1235. default:
  1236. WOLFSSL_MSG("Bad export version");
  1237. return BAD_FUNC_ARG;
  1238. }
  1239. if (DTLS_EXPORT_LEN + optSz + idx > sz) {
  1240. WOLFSSL_MSG("Import Options struct error");
  1241. return BUFFER_E;
  1242. }
  1243. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1244. if (length != optSz) {
  1245. WOLFSSL_MSG("Import Options struct error");
  1246. return BUFFER_E;
  1247. }
  1248. if ((ret = dtls_export_load(ssl, buf + idx, length, version)) < 0) {
  1249. WOLFSSL_MSG("Import Options struct error");
  1250. return ret;
  1251. }
  1252. idx += length;
  1253. /* perform sanity checks and extract Keys struct */
  1254. if (DTLS_EXPORT_LEN + idx > sz) {
  1255. WOLFSSL_MSG("Import Key struct error");
  1256. return BUFFER_E;
  1257. }
  1258. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1259. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1260. WOLFSSL_MSG("Import Key struct error");
  1261. return BUFFER_E;
  1262. }
  1263. if ((ret = ImportKeyState(ssl, buf + idx, length, version)) < 0) {
  1264. WOLFSSL_MSG("Import Key struct error");
  1265. return ret;
  1266. }
  1267. idx += ret;
  1268. /* perform sanity checks and extract CipherSpecs struct */
  1269. if (DTLS_EXPORT_LEN + DTLS_EXPORT_SPC_SZ + idx > sz) {
  1270. WOLFSSL_MSG("Import CipherSpecs struct error");
  1271. return BUFFER_E;
  1272. }
  1273. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1274. if ( length != DTLS_EXPORT_SPC_SZ) {
  1275. WOLFSSL_MSG("Import CipherSpecs struct error");
  1276. return BUFFER_E;
  1277. }
  1278. if ((ret = ImportCipherSpecState(ssl, buf + idx, length, version)) < 0) {
  1279. WOLFSSL_MSG("Import CipherSpecs struct error");
  1280. return ret;
  1281. }
  1282. idx += ret;
  1283. /* perform sanity checks and extract DTLS peer info */
  1284. if (DTLS_EXPORT_LEN + idx > sz) {
  1285. WOLFSSL_MSG("Import DTLS peer info error");
  1286. return BUFFER_E;
  1287. }
  1288. ato16(buf + idx, &length); idx += DTLS_EXPORT_LEN;
  1289. if (idx + length > sz) {
  1290. WOLFSSL_MSG("Import DTLS peer info error");
  1291. return BUFFER_E;
  1292. }
  1293. if ((ret = ImportPeerInfo(ssl, buf + idx, length, version)) < 0) {
  1294. WOLFSSL_MSG("Import Peer Addr error");
  1295. return ret;
  1296. }
  1297. idx += ret;
  1298. SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  1299. /* set hmac function to use when verifying */
  1300. if (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1301. ssl->options.dtls == 1) {
  1302. ssl->hmac = TLS_hmac;
  1303. }
  1304. /* make sure is a valid suite used */
  1305. if (wolfSSL_get_cipher(ssl) == NULL) {
  1306. WOLFSSL_MSG("Can not match cipher suite imported");
  1307. return MATCH_SUITE_ERROR;
  1308. }
  1309. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1310. if (ssl->specs.cipher_type == stream &&
  1311. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1312. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1313. return SANITY_CIPHER_E;
  1314. }
  1315. return idx;
  1316. }
  1317. #endif /* WOLFSSL_DTLS */
  1318. #endif /* WOLFSSL_SESSION_EXPORT */
  1319. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1320. {
  1321. method->version = pv;
  1322. method->side = WOLFSSL_CLIENT_END;
  1323. method->downgrade = 0;
  1324. }
  1325. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
  1326. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1327. {
  1328. if (ssl == NULL)
  1329. return BAD_FUNC_ARG;
  1330. /* set side */
  1331. ssl->options.side = side;
  1332. /* reset options that are side specific */
  1333. #ifdef HAVE_NTRU
  1334. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1335. ssl->options.haveNTRU = 1; /* always on client side */
  1336. /* server can turn on by loading key */
  1337. }
  1338. #endif
  1339. #ifdef HAVE_ECC
  1340. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1341. ssl->options.haveECDSAsig = 1; /* always on client side */
  1342. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1343. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1344. }
  1345. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1346. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1347. ssl->options.haveECDSAsig = 1; /* always on client side */
  1348. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1349. }
  1350. #endif
  1351. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1352. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1353. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1354. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1355. ssl->options.haveEMS = 1;
  1356. }
  1357. #ifdef WOLFSSL_DTLS
  1358. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1359. ssl->options.haveEMS = 1;
  1360. #endif /* WOLFSSL_DTLS */
  1361. }
  1362. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1363. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  1364. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  1365. int ret;
  1366. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  1367. if (ret != 0) {
  1368. WOLFSSL_MSG("DTLS Cookie Secret error");
  1369. return ret;
  1370. }
  1371. }
  1372. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  1373. return InitSSL_Suites(ssl);
  1374. }
  1375. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1376. /* Initialize SSL context, return 0 on success */
  1377. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1378. {
  1379. int ret = 0;
  1380. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1381. ctx->method = method;
  1382. ctx->refCount = 1; /* so either CTX_free or SSL_free can release */
  1383. ctx->heap = ctx; /* defaults to self */
  1384. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1385. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE; /* current default: TLSv1_MINOR */
  1386. if (wc_InitMutex(&ctx->countMutex) < 0) {
  1387. WOLFSSL_MSG("Mutex error on CTX init");
  1388. ctx->err = CTX_INIT_MUTEX_E;
  1389. return BAD_MUTEX_E;
  1390. }
  1391. #ifndef NO_DH
  1392. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1393. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1394. #endif
  1395. #ifndef NO_RSA
  1396. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1397. #endif
  1398. #ifdef HAVE_ECC
  1399. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1400. ctx->eccTempKeySz = ECDHE_SIZE;
  1401. #endif
  1402. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  1403. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1404. #endif
  1405. #ifdef OPENSSL_EXTRA
  1406. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1407. #endif
  1408. #ifndef WOLFSSL_USER_IO
  1409. #ifdef MICRIUM
  1410. ctx->CBIORecv = MicriumReceive;
  1411. ctx->CBIOSend = MicriumSend;
  1412. #ifdef WOLFSSL_DTLS
  1413. if (method->version.major == DTLS_MAJOR) {
  1414. ctx->CBIORecv = MicriumReceiveFrom;
  1415. ctx->CBIOSend = MicriumSendTo;
  1416. }
  1417. #ifdef WOLFSSL_SESSION_EXPORT
  1418. #error Micrium port does not support DTLS session export yet
  1419. #endif
  1420. #endif
  1421. #elif defined WOLFSSL_UIP
  1422. ctx->CBIORecv = uIPReceive;
  1423. ctx->CBIOSend = uIPSend;
  1424. #ifdef WOLFSSL_DTLS
  1425. if (method->version.major == DTLS_MAJOR) {
  1426. ctx->CBIOSendTo = uIPSendTo;
  1427. ctx->CBIORecvFrom = uIPRecvFrom;
  1428. }
  1429. #endif
  1430. #else
  1431. ctx->CBIORecv = EmbedReceive;
  1432. ctx->CBIOSend = EmbedSend;
  1433. #ifdef WOLFSSL_DTLS
  1434. if (method->version.major == DTLS_MAJOR) {
  1435. ctx->CBIORecv = EmbedReceiveFrom;
  1436. ctx->CBIOSend = EmbedSendTo;
  1437. }
  1438. #ifdef WOLFSSL_SESSION_EXPORT
  1439. ctx->CBGetPeer = EmbedGetPeer;
  1440. ctx->CBSetPeer = EmbedSetPeer;
  1441. #endif
  1442. #endif
  1443. #endif /* MICRIUM */
  1444. #endif /* WOLFSSL_USER_IO */
  1445. #ifdef HAVE_NETX
  1446. ctx->CBIORecv = NetX_Receive;
  1447. ctx->CBIOSend = NetX_Send;
  1448. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1449. ctx->CBIORecv = Mynewt_Receive;
  1450. ctx->CBIOSend = Mynewt_Send;
  1451. #elif defined(WOLFSSL_GNRC)
  1452. ctx->CBIORecv = GNRC_ReceiveFrom;
  1453. ctx->CBIOSend = GNRC_SendTo;
  1454. #endif
  1455. #ifdef HAVE_NTRU
  1456. if (method->side == WOLFSSL_CLIENT_END)
  1457. ctx->haveNTRU = 1; /* always on client side */
  1458. /* server can turn on by loading key */
  1459. #endif
  1460. #ifdef HAVE_ECC
  1461. if (method->side == WOLFSSL_CLIENT_END) {
  1462. ctx->haveECDSAsig = 1; /* always on client side */
  1463. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1464. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  1465. }
  1466. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1467. if (method->side == WOLFSSL_CLIENT_END) {
  1468. ctx->haveECDSAsig = 1; /* always on client side */
  1469. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1470. }
  1471. #endif
  1472. ctx->devId = INVALID_DEVID;
  1473. #if defined(WOLFSSL_DTLS)
  1474. #ifdef WOLFSSL_SCTP
  1475. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  1476. #elif defined(WOLFSSL_DTLS_MTU)
  1477. ctx->dtlsMtuSz = MAX_MTU;
  1478. #endif
  1479. #endif
  1480. #ifndef NO_CERTS
  1481. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  1482. if (ctx->cm == NULL) {
  1483. WOLFSSL_MSG("Bad Cert Manager New");
  1484. return BAD_CERT_MANAGER_ERROR;
  1485. }
  1486. #ifdef OPENSSL_EXTRA
  1487. /* setup WOLFSSL_X509_STORE */
  1488. ctx->x509_store.cm = ctx->cm;
  1489. #endif
  1490. #endif
  1491. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1492. if (method->side == WOLFSSL_CLIENT_END) {
  1493. if ((method->version.major == SSLv3_MAJOR) &&
  1494. (method->version.minor >= TLSv1_MINOR)) {
  1495. ctx->haveEMS = 1;
  1496. }
  1497. #ifdef WOLFSSL_DTLS
  1498. if (method->version.major == DTLS_MAJOR)
  1499. ctx->haveEMS = 1;
  1500. #endif /* WOLFSSL_DTLS */
  1501. }
  1502. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1503. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  1504. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  1505. #endif
  1506. #ifdef HAVE_WOLF_EVENT
  1507. ret = wolfEventQueue_Init(&ctx->event_queue);
  1508. #endif /* HAVE_WOLF_EVENT */
  1509. #ifdef WOLFSSL_EARLY_DATA
  1510. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  1511. #endif
  1512. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  1513. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1514. return ret;
  1515. }
  1516. /* In case contexts are held in array and don't want to free actual ctx */
  1517. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  1518. {
  1519. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
  1520. defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
  1521. int i;
  1522. #endif
  1523. #ifdef HAVE_WOLF_EVENT
  1524. wolfEventQueue_Free(&ctx->event_queue);
  1525. #endif /* HAVE_WOLF_EVENT */
  1526. #ifdef WOLFSSL_STATIC_MEMORY
  1527. if (ctx->onHeap == 1) {
  1528. XFREE(ctx->method, ctx->heap, DYNAMIC_TYPE_METHOD);
  1529. }
  1530. else {
  1531. XFREE(ctx->method, NULL, DYNAMIC_TYPE_METHOD);
  1532. }
  1533. #else
  1534. XFREE(ctx->method, ctx->heap, DYNAMIC_TYPE_METHOD);
  1535. #endif
  1536. ctx->method = NULL;
  1537. if (ctx->suites) {
  1538. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  1539. ctx->suites = NULL;
  1540. }
  1541. #ifndef NO_DH
  1542. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1543. ctx->serverDH_G.buffer = NULL;
  1544. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  1545. ctx->serverDH_P.buffer = NULL;
  1546. #endif /* !NO_DH */
  1547. #ifdef SINGLE_THREADED
  1548. if (ctx->rng) {
  1549. wc_FreeRng(ctx->rng);
  1550. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  1551. ctx->rng = NULL;
  1552. }
  1553. #endif /* SINGLE_THREADED */
  1554. #ifndef NO_CERTS
  1555. FreeDer(&ctx->privateKey);
  1556. FreeDer(&ctx->certificate);
  1557. #ifdef KEEP_OUR_CERT
  1558. if (ctx->ourCert && ctx->ownOurCert) {
  1559. FreeX509(ctx->ourCert);
  1560. XFREE(ctx->ourCert, ctx->heap, DYNAMIC_TYPE_X509);
  1561. ctx->ourCert = NULL;
  1562. }
  1563. #endif /* KEEP_OUR_CERT */
  1564. FreeDer(&ctx->certChain);
  1565. wolfSSL_CertManagerFree(ctx->cm);
  1566. ctx->cm = NULL;
  1567. #ifdef OPENSSL_EXTRA
  1568. /* ctx->cm was free'd so cm of x509 store should now be NULL */
  1569. if (ctx->x509_store_pt != NULL) {
  1570. ctx->x509_store_pt->cm = NULL;
  1571. }
  1572. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  1573. while (ctx->ca_names != NULL) {
  1574. WOLFSSL_STACK *next = ctx->ca_names->next;
  1575. wolfSSL_X509_NAME_free(ctx->ca_names->data.name);
  1576. XFREE(ctx->ca_names, NULL, DYNAMIC_TYPE_OPENSSL);
  1577. ctx->ca_names = next;
  1578. }
  1579. #endif
  1580. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  1581. while (ctx->x509Chain != NULL) {
  1582. WOLFSSL_STACK *next = ctx->x509Chain->next;
  1583. wolfSSL_X509_free(ctx->x509Chain->data.x509);
  1584. XFREE(ctx->x509Chain, NULL, DYNAMIC_TYPE_OPENSSL);
  1585. ctx->x509Chain = next;
  1586. }
  1587. #endif
  1588. #endif /* !NO_CERTS */
  1589. #ifdef HAVE_TLS_EXTENSIONS
  1590. TLSX_FreeAll(ctx->extensions, ctx->heap);
  1591. #ifndef NO_WOLFSSL_SERVER
  1592. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  1593. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  1594. if (ctx->certOcspRequest) {
  1595. FreeOcspRequest(ctx->certOcspRequest);
  1596. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  1597. }
  1598. #endif
  1599. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  1600. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  1601. if (ctx->chainOcspRequest[i]) {
  1602. FreeOcspRequest(ctx->chainOcspRequest[i]);
  1603. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  1604. ctx->chainOcspRequest[i] = NULL;
  1605. }
  1606. }
  1607. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  1608. #endif /* !NO_WOLFSSL_SERVER */
  1609. #endif /* HAVE_TLS_EXTENSIONS */
  1610. #ifdef OPENSSL_EXTRA
  1611. if(ctx->alpn_cli_protos) {
  1612. XFREE((void *)ctx->alpn_cli_protos, NULL, DYNAMIC_TYPE_OPENSSL);
  1613. ctx->alpn_cli_protos = NULL;
  1614. }
  1615. #endif
  1616. #ifdef WOLFSSL_STATIC_EPHEMERAL
  1617. if (ctx->staticKE.key) {
  1618. FreeDer(&ctx->staticKE.key);
  1619. }
  1620. #endif
  1621. #ifdef WOLFSSL_STATIC_MEMORY
  1622. if (ctx->heap != NULL) {
  1623. #ifdef WOLFSSL_HEAP_TEST
  1624. /* avoid dereferencing a test value */
  1625. if (ctx->heap != (void*)WOLFSSL_HEAP_TEST)
  1626. #endif
  1627. {
  1628. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)(ctx->heap);
  1629. wc_FreeMutex(&((WOLFSSL_HEAP*)(hint->memory))->memory_mutex);
  1630. }
  1631. }
  1632. #endif /* WOLFSSL_STATIC_MEMORY */
  1633. }
  1634. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  1635. {
  1636. int refCount;
  1637. /* decrement CTX reference count */
  1638. if ((refCount = SSL_CTX_RefCount(ctx, -1)) < 0) {
  1639. /* check error state, if mutex error code then mutex init failed but
  1640. * CTX was still malloc'd */
  1641. if (ctx->err == CTX_INIT_MUTEX_E) {
  1642. SSL_CtxResourceFree(ctx);
  1643. XFREE(ctx, ctx->heap, DYNAMIC_TYPE_CTX);
  1644. }
  1645. return;
  1646. }
  1647. if (refCount == 0) {
  1648. void* heap = ctx->heap;
  1649. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  1650. SSL_CtxResourceFree(ctx);
  1651. wc_FreeMutex(&ctx->countMutex);
  1652. #ifdef WOLFSSL_STATIC_MEMORY
  1653. if (ctx->onHeap == 0) {
  1654. heap = NULL;
  1655. }
  1656. #endif
  1657. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  1658. (void)heap; /* not used in some builds */
  1659. }
  1660. else {
  1661. (void)ctx;
  1662. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  1663. }
  1664. }
  1665. /* Set cipher pointers to null */
  1666. void InitCiphers(WOLFSSL* ssl)
  1667. {
  1668. #ifdef BUILD_ARC4
  1669. ssl->encrypt.arc4 = NULL;
  1670. ssl->decrypt.arc4 = NULL;
  1671. #endif
  1672. #ifdef BUILD_DES3
  1673. ssl->encrypt.des3 = NULL;
  1674. ssl->decrypt.des3 = NULL;
  1675. #endif
  1676. #ifdef BUILD_AES
  1677. ssl->encrypt.aes = NULL;
  1678. ssl->decrypt.aes = NULL;
  1679. #endif
  1680. #ifdef HAVE_CAMELLIA
  1681. ssl->encrypt.cam = NULL;
  1682. ssl->decrypt.cam = NULL;
  1683. #endif
  1684. #ifdef HAVE_HC128
  1685. ssl->encrypt.hc128 = NULL;
  1686. ssl->decrypt.hc128 = NULL;
  1687. #endif
  1688. #ifdef BUILD_RABBIT
  1689. ssl->encrypt.rabbit = NULL;
  1690. ssl->decrypt.rabbit = NULL;
  1691. #endif
  1692. #ifdef HAVE_CHACHA
  1693. ssl->encrypt.chacha = NULL;
  1694. ssl->decrypt.chacha = NULL;
  1695. #endif
  1696. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  1697. ssl->auth.poly1305 = NULL;
  1698. #endif
  1699. ssl->encrypt.setup = 0;
  1700. ssl->decrypt.setup = 0;
  1701. #ifdef HAVE_ONE_TIME_AUTH
  1702. ssl->auth.setup = 0;
  1703. #endif
  1704. #ifdef HAVE_IDEA
  1705. ssl->encrypt.idea = NULL;
  1706. ssl->decrypt.idea = NULL;
  1707. #endif
  1708. }
  1709. /* Free ciphers */
  1710. void FreeCiphers(WOLFSSL* ssl)
  1711. {
  1712. (void)ssl;
  1713. #ifdef BUILD_ARC4
  1714. wc_Arc4Free(ssl->encrypt.arc4);
  1715. wc_Arc4Free(ssl->decrypt.arc4);
  1716. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1717. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1718. #endif
  1719. #ifdef BUILD_DES3
  1720. wc_Des3Free(ssl->encrypt.des3);
  1721. wc_Des3Free(ssl->decrypt.des3);
  1722. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1723. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1724. #endif
  1725. #if defined(BUILD_AES) || defined(BUILD_AESGCM) /* See: InitKeys() in keys.c
  1726. * on addition of BUILD_AESGCM
  1727. * check (enc->aes, dec->aes) */
  1728. wc_AesFree(ssl->encrypt.aes);
  1729. wc_AesFree(ssl->decrypt.aes);
  1730. #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \
  1731. !defined(WOLFSSL_NO_TLS12)
  1732. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1733. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1734. #endif
  1735. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1736. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1737. #endif
  1738. #ifdef CIPHER_NONCE
  1739. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1740. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  1741. #endif
  1742. #ifdef HAVE_CAMELLIA
  1743. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1744. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1745. #endif
  1746. #ifdef HAVE_HC128
  1747. XFREE(ssl->encrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1748. XFREE(ssl->decrypt.hc128, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1749. #endif
  1750. #ifdef BUILD_RABBIT
  1751. XFREE(ssl->encrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1752. XFREE(ssl->decrypt.rabbit, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1753. #endif
  1754. #ifdef HAVE_CHACHA
  1755. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1756. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1757. #endif
  1758. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  1759. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1760. #endif
  1761. #ifdef HAVE_IDEA
  1762. XFREE(ssl->encrypt.idea, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1763. XFREE(ssl->decrypt.idea, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1764. #endif
  1765. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  1766. wc_HmacFree(ssl->encrypt.hmac);
  1767. wc_HmacFree(ssl->decrypt.hmac);
  1768. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1769. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  1770. #endif
  1771. }
  1772. void InitCipherSpecs(CipherSpecs* cs)
  1773. {
  1774. XMEMSET(cs, 0, sizeof(CipherSpecs));
  1775. cs->bulk_cipher_algorithm = INVALID_BYTE;
  1776. cs->cipher_type = INVALID_BYTE;
  1777. cs->mac_algorithm = INVALID_BYTE;
  1778. cs->kea = INVALID_BYTE;
  1779. cs->sig_algo = INVALID_BYTE;
  1780. }
  1781. #if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
  1782. defined(HAVE_ECC))
  1783. static int GetMacDigestSize(byte macAlgo)
  1784. {
  1785. switch (macAlgo) {
  1786. #ifndef NO_SHA
  1787. case sha_mac:
  1788. return WC_SHA_DIGEST_SIZE;
  1789. #endif
  1790. #ifndef NO_SHA256
  1791. case sha256_mac:
  1792. return WC_SHA256_DIGEST_SIZE;
  1793. #endif
  1794. #ifdef WOLFSSL_SHA384
  1795. case sha384_mac:
  1796. return WC_SHA384_DIGEST_SIZE;
  1797. #endif
  1798. #ifdef WOLFSSL_SHA512
  1799. case sha512_mac:
  1800. return WC_SHA512_DIGEST_SIZE;
  1801. #endif
  1802. default:
  1803. break;
  1804. }
  1805. return NOT_COMPILED_IN;
  1806. }
  1807. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  1808. static WC_INLINE void AddSuiteHashSigAlgo(Suites* suites, byte macAlgo, byte sigAlgo,
  1809. int keySz, word16* inOutIdx)
  1810. {
  1811. int addSigAlgo = 1;
  1812. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  1813. if (sigAlgo == ecc_dsa_sa_algo) {
  1814. int digestSz = GetMacDigestSize(macAlgo);
  1815. /* do not add sig/algos with digest size larger than key size */
  1816. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  1817. addSigAlgo = 0;
  1818. }
  1819. }
  1820. #else
  1821. (void)keySz;
  1822. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  1823. if (addSigAlgo) {
  1824. #ifdef WC_RSA_PSS
  1825. if (sigAlgo == rsa_pss_sa_algo) {
  1826. /* RSA PSS is sig then mac */
  1827. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1828. *inOutIdx += 1;
  1829. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  1830. *inOutIdx += 1;
  1831. #ifdef WOLFSSL_TLS13
  1832. /* Add the certificate algorithm as well */
  1833. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1834. *inOutIdx += 1;
  1835. suites->hashSigAlgo[*inOutIdx] = PSS_RSAE_TO_PSS_PSS(macAlgo);
  1836. *inOutIdx += 1;
  1837. #endif
  1838. }
  1839. else
  1840. #endif
  1841. {
  1842. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  1843. *inOutIdx += 1;
  1844. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  1845. *inOutIdx += 1;
  1846. }
  1847. }
  1848. }
  1849. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  1850. int haveAnon, int tls1_2, int keySz)
  1851. {
  1852. word16 idx = 0;
  1853. (void)tls1_2;
  1854. (void)keySz;
  1855. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  1856. if (haveECDSAsig) {
  1857. #ifdef HAVE_ECC
  1858. #ifdef WOLFSSL_SHA512
  1859. AddSuiteHashSigAlgo(suites, sha512_mac, ecc_dsa_sa_algo, keySz, &idx);
  1860. #endif
  1861. #ifdef WOLFSSL_SHA384
  1862. AddSuiteHashSigAlgo(suites, sha384_mac, ecc_dsa_sa_algo, keySz, &idx);
  1863. #endif
  1864. #ifndef NO_SHA256
  1865. AddSuiteHashSigAlgo(suites, sha256_mac, ecc_dsa_sa_algo, keySz, &idx);
  1866. #endif
  1867. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  1868. defined(WOLFSSL_ALLOW_TLS_SHA1))
  1869. AddSuiteHashSigAlgo(suites, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  1870. #endif
  1871. #endif
  1872. #ifdef HAVE_ED25519
  1873. AddSuiteHashSigAlgo(suites, ED25519_SA_MAJOR, ED25519_SA_MINOR, keySz,
  1874. &idx);
  1875. #endif
  1876. #ifdef HAVE_ED448
  1877. AddSuiteHashSigAlgo(suites, ED448_SA_MAJOR, ED448_SA_MINOR, keySz,
  1878. &idx);
  1879. #endif
  1880. }
  1881. #endif /* HAVE_ECC || HAVE_ED25519 || defined(HAVE_ED448 */
  1882. if (haveRSAsig) {
  1883. #ifdef WC_RSA_PSS
  1884. if (tls1_2) {
  1885. #ifdef WOLFSSL_SHA512
  1886. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_pss_sa_algo, keySz,
  1887. &idx);
  1888. #endif
  1889. #ifdef WOLFSSL_SHA384
  1890. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_pss_sa_algo, keySz,
  1891. &idx);
  1892. #endif
  1893. #ifndef NO_SHA256
  1894. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_pss_sa_algo, keySz,
  1895. &idx);
  1896. #endif
  1897. }
  1898. #endif
  1899. #ifdef WOLFSSL_SHA512
  1900. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_sa_algo, keySz, &idx);
  1901. #endif
  1902. #ifdef WOLFSSL_SHA384
  1903. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_sa_algo, keySz, &idx);
  1904. #endif
  1905. #ifndef NO_SHA256
  1906. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_sa_algo, keySz, &idx);
  1907. #endif
  1908. #ifdef WOLFSSL_SHA224
  1909. AddSuiteHashSigAlgo(suites, sha224_mac, rsa_sa_algo, keySz, &idx);
  1910. #endif
  1911. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  1912. defined(WOLFSSL_ALLOW_TLS_SHA1))
  1913. AddSuiteHashSigAlgo(suites, sha_mac, rsa_sa_algo, keySz, &idx);
  1914. #endif
  1915. }
  1916. #ifdef HAVE_ANON
  1917. if (haveAnon) {
  1918. AddSuiteHashSigAlgo(suites, sha_mac, anonymous_sa_algo, keySz, &idx);
  1919. }
  1920. #endif
  1921. (void)haveAnon;
  1922. (void)haveECDSAsig;
  1923. suites->hashSigAlgoSz = idx;
  1924. }
  1925. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  1926. word16 havePSK, word16 haveDH, word16 haveNTRU,
  1927. word16 haveECDSAsig, word16 haveECC,
  1928. word16 haveStaticECC, int side)
  1929. {
  1930. word16 idx = 0;
  1931. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  1932. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  1933. #ifdef WOLFSSL_TLS13
  1934. int tls1_3 = IsAtLeastTLSv1_3(pv);
  1935. #endif
  1936. int dtls = 0;
  1937. int haveRSAsig = 1;
  1938. (void)tls; /* shut up compiler */
  1939. (void)tls1_2;
  1940. (void)dtls;
  1941. (void)haveDH;
  1942. (void)havePSK;
  1943. (void)haveNTRU;
  1944. (void)haveStaticECC;
  1945. (void)haveECC;
  1946. (void)side;
  1947. (void)haveRSA; /* some builds won't read */
  1948. (void)haveRSAsig; /* non ecc builds won't read */
  1949. if (suites == NULL) {
  1950. WOLFSSL_MSG("InitSuites pointer error");
  1951. return;
  1952. }
  1953. if (suites->setSuites)
  1954. return; /* trust user settings, don't override */
  1955. #ifdef WOLFSSL_TLS13
  1956. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  1957. if (tls1_3) {
  1958. suites->suites[idx++] = TLS13_BYTE;
  1959. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  1960. }
  1961. #endif
  1962. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  1963. if (tls1_3) {
  1964. suites->suites[idx++] = TLS13_BYTE;
  1965. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  1966. }
  1967. #endif
  1968. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  1969. if (tls1_3) {
  1970. suites->suites[idx++] = TLS13_BYTE;
  1971. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  1972. }
  1973. #endif
  1974. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  1975. if (tls1_3) {
  1976. suites->suites[idx++] = TLS13_BYTE;
  1977. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  1978. }
  1979. #endif
  1980. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  1981. if (tls1_3) {
  1982. suites->suites[idx++] = TLS13_BYTE;
  1983. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  1984. }
  1985. #endif
  1986. #ifdef HAVE_NULL_CIPHER
  1987. #ifdef BUILD_TLS_SHA256_SHA256
  1988. if (tls1_3) {
  1989. suites->suites[idx++] = ECC_BYTE;
  1990. suites->suites[idx++] = TLS_SHA256_SHA256;
  1991. }
  1992. #endif
  1993. #ifdef BUILD_TLS_SHA384_SHA384
  1994. if (tls1_3) {
  1995. suites->suites[idx++] = ECC_BYTE;
  1996. suites->suites[idx++] = TLS_SHA384_SHA384;
  1997. }
  1998. #endif
  1999. #endif
  2000. #endif /* WOLFSSL_TLS13 */
  2001. #ifndef WOLFSSL_NO_TLS12
  2002. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  2003. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  2004. haveRSA = 0; /* can't do RSA with ECDSA key */
  2005. }
  2006. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  2007. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  2008. }
  2009. #endif /* !NO_WOLFSSL_SERVER */
  2010. #ifdef WOLFSSL_DTLS
  2011. if (pv.major == DTLS_MAJOR) {
  2012. dtls = 1;
  2013. tls = 1;
  2014. /* May be dead assignments dependent upon configuration */
  2015. (void) dtls;
  2016. (void) tls;
  2017. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  2018. }
  2019. #endif
  2020. #ifdef HAVE_RENEGOTIATION_INDICATION
  2021. if (side == WOLFSSL_CLIENT_END) {
  2022. suites->suites[idx++] = CIPHER_BYTE;
  2023. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  2024. }
  2025. #endif
  2026. #ifdef BUILD_TLS_QSH
  2027. if (tls) {
  2028. suites->suites[idx++] = QSH_BYTE;
  2029. suites->suites[idx++] = TLS_QSH;
  2030. }
  2031. #endif
  2032. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  2033. if (tls && haveNTRU && haveRSA) {
  2034. suites->suites[idx++] = CIPHER_BYTE;
  2035. suites->suites[idx++] = TLS_NTRU_RSA_WITH_AES_256_CBC_SHA;
  2036. }
  2037. #endif
  2038. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  2039. if (tls && haveNTRU && haveRSA) {
  2040. suites->suites[idx++] = CIPHER_BYTE;
  2041. suites->suites[idx++] = TLS_NTRU_RSA_WITH_AES_128_CBC_SHA;
  2042. }
  2043. #endif
  2044. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  2045. if (!dtls && tls && haveNTRU && haveRSA) {
  2046. suites->suites[idx++] = CIPHER_BYTE;
  2047. suites->suites[idx++] = TLS_NTRU_RSA_WITH_RC4_128_SHA;
  2048. }
  2049. #endif
  2050. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  2051. if (tls && haveNTRU && haveRSA) {
  2052. suites->suites[idx++] = CIPHER_BYTE;
  2053. suites->suites[idx++] = TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA;
  2054. }
  2055. #endif
  2056. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2057. if (tls1_2 && haveECC) {
  2058. suites->suites[idx++] = ECC_BYTE;
  2059. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2060. }
  2061. #endif
  2062. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2063. if (tls1_2 && haveECC) {
  2064. suites->suites[idx++] = ECC_BYTE;
  2065. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2066. }
  2067. #endif
  2068. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2069. if (tls1_2 && haveRSA) {
  2070. suites->suites[idx++] = ECC_BYTE;
  2071. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2072. }
  2073. #endif
  2074. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2075. if (tls1_2 && haveRSA) {
  2076. suites->suites[idx++] = ECC_BYTE;
  2077. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2078. }
  2079. #endif
  2080. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2081. if (tls1_2 && haveDH && haveRSA) {
  2082. suites->suites[idx++] = CIPHER_BYTE;
  2083. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2084. }
  2085. #endif
  2086. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2087. if (tls1_2 && haveDH && haveRSA) {
  2088. suites->suites[idx++] = CIPHER_BYTE;
  2089. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2090. }
  2091. #endif
  2092. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  2093. if (tls1_2 && haveRSA) {
  2094. suites->suites[idx++] = CIPHER_BYTE;
  2095. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  2096. }
  2097. #endif
  2098. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  2099. if (tls1_2 && haveRSA) {
  2100. suites->suites[idx++] = CIPHER_BYTE;
  2101. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  2102. }
  2103. #endif
  2104. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  2105. if (tls1_2 && haveECC && haveStaticECC) {
  2106. suites->suites[idx++] = ECC_BYTE;
  2107. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  2108. }
  2109. #endif
  2110. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  2111. if (tls1_2 && haveECC && haveStaticECC) {
  2112. suites->suites[idx++] = ECC_BYTE;
  2113. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  2114. }
  2115. #endif
  2116. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  2117. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2118. suites->suites[idx++] = ECC_BYTE;
  2119. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  2120. }
  2121. #endif
  2122. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  2123. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2124. suites->suites[idx++] = ECC_BYTE;
  2125. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  2126. }
  2127. #endif
  2128. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  2129. if (tls1_2 && haveDH && havePSK) {
  2130. suites->suites[idx++] = CIPHER_BYTE;
  2131. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  2132. }
  2133. #endif
  2134. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  2135. if (tls1_2 && haveDH) {
  2136. suites->suites[idx++] = CIPHER_BYTE;
  2137. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  2138. }
  2139. #endif
  2140. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  2141. if (tls1_2 && haveDH) {
  2142. suites->suites[idx++] = CIPHER_BYTE;
  2143. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  2144. }
  2145. #endif
  2146. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  2147. if (tls1_2 && haveDH && havePSK) {
  2148. suites->suites[idx++] = CIPHER_BYTE;
  2149. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  2150. }
  2151. #endif
  2152. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  2153. if (tls1_2 && havePSK) {
  2154. suites->suites[idx++] = CIPHER_BYTE;
  2155. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  2156. }
  2157. #endif
  2158. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  2159. if (tls1_2 && havePSK) {
  2160. suites->suites[idx++] = CIPHER_BYTE;
  2161. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  2162. }
  2163. #endif
  2164. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  2165. if (tls1_2 && haveECC) {
  2166. suites->suites[idx++] = CHACHA_BYTE;
  2167. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  2168. }
  2169. #endif
  2170. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2171. if (tls1_2 && haveRSA) {
  2172. suites->suites[idx++] = CHACHA_BYTE;
  2173. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2174. }
  2175. #endif
  2176. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2177. if (tls1_2 && haveRSA) {
  2178. suites->suites[idx++] = CHACHA_BYTE;
  2179. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2180. }
  2181. #endif
  2182. /* Place as higher priority for MYSQL */
  2183. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  2184. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2185. if (tls && haveDH && haveRSA) {
  2186. suites->suites[idx++] = CIPHER_BYTE;
  2187. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2188. }
  2189. #endif
  2190. #endif
  2191. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  2192. if (tls1_2 && haveRSA) {
  2193. suites->suites[idx++] = ECC_BYTE;
  2194. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  2195. }
  2196. #endif
  2197. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  2198. if (tls1_2 && haveECC) {
  2199. suites->suites[idx++] = ECC_BYTE;
  2200. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  2201. }
  2202. #endif
  2203. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  2204. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2205. suites->suites[idx++] = ECC_BYTE;
  2206. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  2207. }
  2208. #endif
  2209. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  2210. if (tls1_2 && haveECC && haveStaticECC) {
  2211. suites->suites[idx++] = ECC_BYTE;
  2212. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  2213. }
  2214. #endif
  2215. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  2216. if (tls1_2 && haveRSA) {
  2217. suites->suites[idx++] = ECC_BYTE;
  2218. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  2219. }
  2220. #endif
  2221. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2222. if (tls1_2 && haveECC) {
  2223. suites->suites[idx++] = ECC_BYTE;
  2224. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  2225. }
  2226. #endif
  2227. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  2228. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2229. suites->suites[idx++] = ECC_BYTE;
  2230. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  2231. }
  2232. #endif
  2233. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  2234. if (tls1_2 && haveECC && haveStaticECC) {
  2235. suites->suites[idx++] = ECC_BYTE;
  2236. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  2237. }
  2238. #endif
  2239. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  2240. if (tls && haveECC) {
  2241. suites->suites[idx++] = ECC_BYTE;
  2242. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  2243. }
  2244. #endif
  2245. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  2246. if (tls && haveECC && haveStaticECC) {
  2247. suites->suites[idx++] = ECC_BYTE;
  2248. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  2249. }
  2250. #endif
  2251. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  2252. if (tls && haveECC) {
  2253. suites->suites[idx++] = ECC_BYTE;
  2254. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  2255. }
  2256. #endif
  2257. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  2258. if (tls && haveECC && haveStaticECC) {
  2259. suites->suites[idx++] = ECC_BYTE;
  2260. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  2261. }
  2262. #endif
  2263. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  2264. if (!dtls && tls && haveECC) {
  2265. suites->suites[idx++] = ECC_BYTE;
  2266. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  2267. }
  2268. #endif
  2269. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  2270. if (!dtls && tls && haveECC && haveStaticECC) {
  2271. suites->suites[idx++] = ECC_BYTE;
  2272. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  2273. }
  2274. #endif
  2275. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  2276. if (tls && haveECC) {
  2277. suites->suites[idx++] = ECC_BYTE;
  2278. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2279. }
  2280. #endif
  2281. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  2282. if (tls && haveECC && haveStaticECC) {
  2283. suites->suites[idx++] = ECC_BYTE;
  2284. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2285. }
  2286. #endif
  2287. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  2288. if (tls && haveRSA) {
  2289. suites->suites[idx++] = ECC_BYTE;
  2290. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  2291. }
  2292. #endif
  2293. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  2294. if (tls && haveRSAsig && haveStaticECC) {
  2295. suites->suites[idx++] = ECC_BYTE;
  2296. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  2297. }
  2298. #endif
  2299. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  2300. if (tls && haveRSA) {
  2301. suites->suites[idx++] = ECC_BYTE;
  2302. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  2303. }
  2304. #endif
  2305. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  2306. if (tls && haveRSAsig && haveStaticECC) {
  2307. suites->suites[idx++] = ECC_BYTE;
  2308. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  2309. }
  2310. #endif
  2311. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  2312. if (!dtls && tls && haveRSA) {
  2313. suites->suites[idx++] = ECC_BYTE;
  2314. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  2315. }
  2316. #endif
  2317. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  2318. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  2319. suites->suites[idx++] = ECC_BYTE;
  2320. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  2321. }
  2322. #endif
  2323. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  2324. if (tls && haveRSA) {
  2325. suites->suites[idx++] = ECC_BYTE;
  2326. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2327. }
  2328. #endif
  2329. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  2330. if (tls && haveRSAsig && haveStaticECC) {
  2331. suites->suites[idx++] = ECC_BYTE;
  2332. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  2333. }
  2334. #endif
  2335. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  2336. if (tls1_2 && haveECC) {
  2337. suites->suites[idx++] = ECC_BYTE;
  2338. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  2339. }
  2340. #endif
  2341. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  2342. if (tls1_2 && haveECC) {
  2343. suites->suites[idx++] = ECC_BYTE;
  2344. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  2345. }
  2346. #endif
  2347. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  2348. if (tls1_2 && haveECC) {
  2349. suites->suites[idx++] = ECC_BYTE;
  2350. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  2351. }
  2352. #endif
  2353. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  2354. if (tls1_2 && haveRSA) {
  2355. suites->suites[idx++] = ECC_BYTE;
  2356. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  2357. }
  2358. #endif
  2359. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  2360. if (tls1_2 && haveRSA) {
  2361. suites->suites[idx++] = ECC_BYTE;
  2362. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  2363. }
  2364. #endif
  2365. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  2366. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2367. if (tls1_2 && haveDH && haveRSA)
  2368. #else
  2369. if (tls && haveDH && haveRSA)
  2370. #endif
  2371. {
  2372. suites->suites[idx++] = CIPHER_BYTE;
  2373. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  2374. }
  2375. #endif
  2376. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  2377. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2378. if (tls1_2 && haveDH && haveRSA)
  2379. #else
  2380. if (tls && haveDH && haveRSA)
  2381. #endif
  2382. {
  2383. suites->suites[idx++] = CIPHER_BYTE;
  2384. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  2385. }
  2386. #endif
  2387. /* Place as higher priority for MYSQL testing */
  2388. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  2389. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2390. if (tls && haveDH && haveRSA) {
  2391. suites->suites[idx++] = CIPHER_BYTE;
  2392. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2393. }
  2394. #endif
  2395. #endif
  2396. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  2397. if (tls && haveDH && haveRSA) {
  2398. suites->suites[idx++] = CIPHER_BYTE;
  2399. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  2400. }
  2401. #endif
  2402. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  2403. if (tls && haveDH && haveRSA) {
  2404. suites->suites[idx++] = CIPHER_BYTE;
  2405. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2406. }
  2407. #endif
  2408. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  2409. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2410. if (tls1_2 && haveRSA)
  2411. #else
  2412. if (tls && haveRSA)
  2413. #endif
  2414. {
  2415. suites->suites[idx++] = CIPHER_BYTE;
  2416. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  2417. }
  2418. #endif
  2419. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  2420. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2421. if (tls1_2 && haveRSA)
  2422. #else
  2423. if (tls && haveRSA)
  2424. #endif
  2425. {
  2426. suites->suites[idx++] = CIPHER_BYTE;
  2427. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  2428. }
  2429. #endif
  2430. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  2431. if (tls && haveRSA) {
  2432. suites->suites[idx++] = CIPHER_BYTE;
  2433. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  2434. }
  2435. #endif
  2436. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  2437. if (tls && haveRSA) {
  2438. suites->suites[idx++] = CIPHER_BYTE;
  2439. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  2440. }
  2441. #endif
  2442. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2443. if (tls1_2 && haveECC) {
  2444. suites->suites[idx++] = CHACHA_BYTE;
  2445. suites->suites[idx++] =
  2446. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2447. }
  2448. #endif
  2449. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2450. if (tls1_2 && haveRSA) {
  2451. suites->suites[idx++] = CHACHA_BYTE;
  2452. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2453. }
  2454. #endif
  2455. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2456. if (tls1_2 && haveRSA) {
  2457. suites->suites[idx++] = CHACHA_BYTE;
  2458. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2459. }
  2460. #endif
  2461. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  2462. if (tls && haveECC) {
  2463. suites->suites[idx++] = ECC_BYTE;
  2464. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  2465. }
  2466. #endif
  2467. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  2468. if (tls && haveRSA) {
  2469. suites->suites[idx++] = CIPHER_BYTE;
  2470. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  2471. }
  2472. #endif
  2473. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  2474. if (tls && haveRSA) {
  2475. suites->suites[idx++] = CIPHER_BYTE;
  2476. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  2477. }
  2478. #endif
  2479. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  2480. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2481. if (tls1_2 && haveRSA)
  2482. #else
  2483. if (tls && haveRSA)
  2484. #endif
  2485. {
  2486. suites->suites[idx++] = CIPHER_BYTE;
  2487. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  2488. }
  2489. #endif
  2490. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  2491. if (tls && havePSK) {
  2492. suites->suites[idx++] = CIPHER_BYTE;
  2493. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  2494. }
  2495. #endif
  2496. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  2497. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2498. if (tls1_2 && haveDH && havePSK)
  2499. #else
  2500. if (tls && haveDH && havePSK)
  2501. #endif
  2502. {
  2503. suites->suites[idx++] = CIPHER_BYTE;
  2504. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  2505. }
  2506. #endif
  2507. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  2508. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2509. if (tls1_2 && havePSK)
  2510. #else
  2511. if (tls && havePSK)
  2512. #endif
  2513. {
  2514. suites->suites[idx++] = CIPHER_BYTE;
  2515. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  2516. }
  2517. #endif
  2518. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  2519. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2520. if (tls1_2 && haveDH && havePSK)
  2521. #else
  2522. if (tls && haveDH && havePSK)
  2523. #endif
  2524. {
  2525. suites->suites[idx++] = CIPHER_BYTE;
  2526. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  2527. }
  2528. #endif
  2529. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  2530. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2531. if (tls1_2 && havePSK)
  2532. #else
  2533. if (tls1 && havePSK)
  2534. #endif
  2535. {
  2536. suites->suites[idx++] = CIPHER_BYTE;
  2537. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  2538. }
  2539. #endif
  2540. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  2541. if (tls && havePSK) {
  2542. suites->suites[idx++] = CIPHER_BYTE;
  2543. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  2544. }
  2545. #endif
  2546. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  2547. if (tls && haveDH && havePSK) {
  2548. suites->suites[idx++] = ECC_BYTE;
  2549. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  2550. }
  2551. #endif
  2552. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  2553. if (tls && haveDH && havePSK) {
  2554. suites->suites[idx++] = ECC_BYTE;
  2555. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  2556. }
  2557. #endif
  2558. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  2559. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2560. if (tls1_2 && havePSK)
  2561. #else
  2562. if (tls && havePSK)
  2563. #endif
  2564. {
  2565. suites->suites[idx++] = CHACHA_BYTE;
  2566. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2567. }
  2568. #endif
  2569. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  2570. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2571. if (tls1_2 && havePSK)
  2572. #else
  2573. if (tls && havePSK)
  2574. #endif
  2575. {
  2576. suites->suites[idx++] = CHACHA_BYTE;
  2577. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2578. }
  2579. #endif
  2580. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  2581. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2582. if (tls1_2 && havePSK)
  2583. #else
  2584. if (tls && havePSK)
  2585. #endif
  2586. {
  2587. suites->suites[idx++] = CHACHA_BYTE;
  2588. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  2589. }
  2590. #endif
  2591. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  2592. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2593. if (tls1_2 && havePSK)
  2594. #else
  2595. if (tls && havePSK)
  2596. #endif
  2597. {
  2598. suites->suites[idx++] = ECC_BYTE;
  2599. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  2600. }
  2601. #endif
  2602. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  2603. if (tls && havePSK) {
  2604. suites->suites[idx++] = ECC_BYTE;
  2605. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  2606. }
  2607. #endif
  2608. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  2609. if (tls && havePSK) {
  2610. suites->suites[idx++] = ECC_BYTE;
  2611. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  2612. }
  2613. #endif
  2614. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  2615. if (tls && havePSK) {
  2616. suites->suites[idx++] = ECC_BYTE;
  2617. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  2618. }
  2619. #endif
  2620. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  2621. if (tls && havePSK) {
  2622. suites->suites[idx++] = ECC_BYTE;
  2623. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  2624. }
  2625. #endif
  2626. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  2627. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2628. if (tls1_2 && haveDH && havePSK)
  2629. #else
  2630. if (tls && haveDH && havePSK)
  2631. #endif
  2632. {
  2633. suites->suites[idx++] = CIPHER_BYTE;
  2634. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  2635. }
  2636. #endif
  2637. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  2638. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2639. if (tls1_2 && havePSK)
  2640. #else
  2641. if (tls && havePSK)
  2642. #endif
  2643. {
  2644. suites->suites[idx++] = CIPHER_BYTE;
  2645. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  2646. }
  2647. #endif
  2648. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  2649. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2650. if (tls1_2 && havePSK)
  2651. #else
  2652. if (tls && havePSK)
  2653. #endif
  2654. {
  2655. suites->suites[idx++] = ECC_BYTE;
  2656. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  2657. }
  2658. #endif
  2659. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  2660. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2661. if (tls1_2 && haveDH && havePSK)
  2662. #else
  2663. if (tls && haveDH && havePSK)
  2664. #endif
  2665. {
  2666. suites->suites[idx++] = CIPHER_BYTE;
  2667. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  2668. }
  2669. #endif
  2670. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  2671. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2672. if (tls1_2 && havePSK)
  2673. #else
  2674. if (tls && havePSK)
  2675. #endif
  2676. {
  2677. suites->suites[idx++] = CIPHER_BYTE;
  2678. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  2679. }
  2680. #endif
  2681. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  2682. if (tls && havePSK) {
  2683. suites->suites[idx++] = CIPHER_BYTE;
  2684. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  2685. }
  2686. #endif
  2687. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  2688. if (!dtls && haveRSA) {
  2689. suites->suites[idx++] = CIPHER_BYTE;
  2690. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  2691. }
  2692. #endif
  2693. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  2694. if (!dtls && haveRSA) {
  2695. suites->suites[idx++] = CIPHER_BYTE;
  2696. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  2697. }
  2698. #endif
  2699. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  2700. if (haveRSA ) {
  2701. suites->suites[idx++] = CIPHER_BYTE;
  2702. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  2703. }
  2704. #endif
  2705. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  2706. if (!dtls && tls && haveRSA) {
  2707. suites->suites[idx++] = CIPHER_BYTE;
  2708. suites->suites[idx++] = TLS_RSA_WITH_HC_128_MD5;
  2709. }
  2710. #endif
  2711. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  2712. if (!dtls && tls && haveRSA) {
  2713. suites->suites[idx++] = CIPHER_BYTE;
  2714. suites->suites[idx++] = TLS_RSA_WITH_HC_128_SHA;
  2715. }
  2716. #endif
  2717. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  2718. if (!dtls && tls && haveRSA) {
  2719. suites->suites[idx++] = CIPHER_BYTE;
  2720. suites->suites[idx++] = TLS_RSA_WITH_RABBIT_SHA;
  2721. }
  2722. #endif
  2723. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  2724. if (tls && haveRSA) {
  2725. suites->suites[idx++] = CIPHER_BYTE;
  2726. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  2727. }
  2728. #endif
  2729. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  2730. if (tls && haveDH && haveRSA) {
  2731. suites->suites[idx++] = CIPHER_BYTE;
  2732. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  2733. }
  2734. #endif
  2735. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  2736. if (tls && haveRSA) {
  2737. suites->suites[idx++] = CIPHER_BYTE;
  2738. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  2739. }
  2740. #endif
  2741. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  2742. if (tls && haveDH && haveRSA) {
  2743. suites->suites[idx++] = CIPHER_BYTE;
  2744. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  2745. }
  2746. #endif
  2747. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  2748. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2749. if (tls1_2 && haveRSA)
  2750. #else
  2751. if (tls && haveRSA)
  2752. #endif
  2753. {
  2754. suites->suites[idx++] = CIPHER_BYTE;
  2755. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  2756. }
  2757. #endif
  2758. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  2759. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2760. if (tls1_2 && haveDH && haveRSA)
  2761. #else
  2762. if (tls && haveDH && haveRSA)
  2763. #endif
  2764. {
  2765. suites->suites[idx++] = CIPHER_BYTE;
  2766. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  2767. }
  2768. #endif
  2769. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  2770. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2771. if (tls1_2 && haveRSA)
  2772. #else
  2773. if (tls && haveRSA)
  2774. #endif
  2775. {
  2776. suites->suites[idx++] = CIPHER_BYTE;
  2777. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  2778. }
  2779. #endif
  2780. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  2781. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2782. if (tls1_2 && haveDH && haveRSA)
  2783. #else
  2784. if (tls && haveDH && haveRSA)
  2785. #endif
  2786. {
  2787. suites->suites[idx++] = CIPHER_BYTE;
  2788. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  2789. }
  2790. #endif
  2791. #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA
  2792. if (haveRSA) {
  2793. suites->suites[idx++] = CIPHER_BYTE;
  2794. suites->suites[idx++] = SSL_RSA_WITH_IDEA_CBC_SHA;
  2795. }
  2796. #endif
  2797. #endif /* !WOLFSSL_NO_TLS12 */
  2798. suites->suiteSz = idx;
  2799. InitSuitesHashSigAlgo(suites, haveECDSAsig | haveECC, haveRSAsig | haveRSA,
  2800. 0, tls1_2, keySz);
  2801. }
  2802. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  2803. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  2804. /* Decode the signature algorithm.
  2805. *
  2806. * input The encoded signature algorithm.
  2807. * hashalgo The hash algorithm.
  2808. * hsType The signature type.
  2809. */
  2810. static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  2811. {
  2812. switch (input[0]) {
  2813. case NEW_SA_MAJOR:
  2814. #ifdef HAVE_ED25519
  2815. /* ED25519: 0x0807 */
  2816. if (input[1] == ED25519_SA_MINOR) {
  2817. *hsType = ed25519_sa_algo;
  2818. /* Hash performed as part of sign/verify operation. */
  2819. *hashAlgo = sha512_mac;
  2820. }
  2821. else
  2822. #endif
  2823. #ifdef HAVE_ED448
  2824. /* ED448: 0x0808 */
  2825. if (input[1] == ED448_SA_MINOR) {
  2826. *hsType = ed448_sa_algo;
  2827. /* Hash performed as part of sign/verify operation. */
  2828. *hashAlgo = sha512_mac;
  2829. }
  2830. else
  2831. #endif
  2832. #ifdef WC_RSA_PSS
  2833. /* PSS PSS signatures: 0x080[9-b] */
  2834. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  2835. *hsType = rsa_pss_pss_algo;
  2836. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  2837. }
  2838. else
  2839. #endif
  2840. {
  2841. *hsType = input[0];
  2842. *hashAlgo = input[1];
  2843. }
  2844. break;
  2845. default:
  2846. *hashAlgo = input[0];
  2847. *hsType = input[1];
  2848. break;
  2849. }
  2850. }
  2851. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  2852. #ifndef WOLFSSL_NO_TLS12
  2853. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  2854. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  2855. defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
  2856. static enum wc_HashType HashAlgoToType(int hashAlgo)
  2857. {
  2858. switch (hashAlgo) {
  2859. #ifdef WOLFSSL_SHA512
  2860. case sha512_mac:
  2861. return WC_HASH_TYPE_SHA512;
  2862. #endif
  2863. #ifdef WOLFSSL_SHA384
  2864. case sha384_mac:
  2865. return WC_HASH_TYPE_SHA384;
  2866. #endif
  2867. #ifndef NO_SHA256
  2868. case sha256_mac:
  2869. return WC_HASH_TYPE_SHA256;
  2870. #endif
  2871. #ifdef WOLFSSL_SHA224
  2872. case sha224_mac:
  2873. return WC_HASH_TYPE_SHA224;
  2874. #endif
  2875. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2876. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2877. case sha_mac:
  2878. return WC_HASH_TYPE_SHA;
  2879. #endif
  2880. default:
  2881. WOLFSSL_MSG("Bad hash sig algo");
  2882. break;
  2883. }
  2884. return WC_HASH_TYPE_NONE;
  2885. }
  2886. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  2887. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  2888. #endif /* !WOLFSSL_NO_TLS12 */
  2889. #ifndef NO_CERTS
  2890. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
  2891. {
  2892. (void)dynamicFlag;
  2893. (void)heap;
  2894. if (name != NULL) {
  2895. name->name = name->staticName;
  2896. name->dynamicName = 0;
  2897. name->sz = 0;
  2898. name->heap = heap;
  2899. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  2900. XMEMSET(&name->entry, 0, sizeof(name->entry));
  2901. name->x509 = NULL;
  2902. name->entrySz = 0;
  2903. #endif /* OPENSSL_EXTRA */
  2904. }
  2905. }
  2906. void FreeX509Name(WOLFSSL_X509_NAME* name)
  2907. {
  2908. if (name != NULL) {
  2909. if (name->dynamicName) {
  2910. XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
  2911. name->name = NULL;
  2912. }
  2913. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  2914. {
  2915. int i;
  2916. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  2917. if (name->entry[i].set) {
  2918. wolfSSL_ASN1_OBJECT_free(&name->entry[i].object);
  2919. wolfSSL_ASN1_STRING_free(name->entry[i].value);
  2920. }
  2921. }
  2922. }
  2923. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  2924. }
  2925. }
  2926. /* Initialize wolfSSL X509 type */
  2927. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  2928. {
  2929. if (x509 == NULL) {
  2930. WOLFSSL_MSG("Null parameter passed in!");
  2931. return;
  2932. }
  2933. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  2934. x509->heap = heap;
  2935. InitX509Name(&x509->issuer, 0, heap);
  2936. InitX509Name(&x509->subject, 0, heap);
  2937. x509->dynamicMemory = (byte)dynamicFlag;
  2938. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  2939. x509->refCount = 1;
  2940. (void)wc_InitMutex(&x509->refMutex);
  2941. #endif
  2942. }
  2943. /* Free wolfSSL X509 type */
  2944. void FreeX509(WOLFSSL_X509* x509)
  2945. {
  2946. if (x509 == NULL)
  2947. return;
  2948. FreeX509Name(&x509->issuer);
  2949. FreeX509Name(&x509->subject);
  2950. if (x509->pubKey.buffer) {
  2951. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2952. x509->pubKey.buffer = NULL;
  2953. }
  2954. FreeDer(&x509->derCert);
  2955. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  2956. x509->sig.buffer = NULL;
  2957. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  2958. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  2959. x509->authKeyId = NULL;
  2960. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  2961. x509->subjKeyId = NULL;
  2962. if (x509->authInfo != NULL) {
  2963. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  2964. x509->authInfo = NULL;
  2965. }
  2966. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  2967. if (x509->authInfoCaIssuer != NULL) {
  2968. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  2969. }
  2970. if (x509->ext_sk != NULL) {
  2971. wolfSSL_sk_X509_EXTENSION_free(x509->ext_sk);
  2972. }
  2973. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  2974. #ifdef OPENSSL_EXTRA
  2975. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  2976. if (x509->serialNumber != NULL) {
  2977. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  2978. }
  2979. #endif
  2980. if (x509->extKeyUsageSrc != NULL) {
  2981. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  2982. x509->extKeyUsageSrc= NULL;
  2983. }
  2984. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  2985. #if defined(OPENSSL_ALL)
  2986. if (x509->algor.algorithm) {
  2987. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  2988. x509->algor.algorithm = NULL;
  2989. }
  2990. if (x509->key.algor) {
  2991. wolfSSL_X509_ALGOR_free(x509->key.algor);
  2992. x509->key.algor = NULL;
  2993. }
  2994. if (x509->key.pkey) {
  2995. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  2996. x509->key.pkey = NULL;
  2997. }
  2998. #endif /* OPENSSL_ALL */
  2999. if (x509->altNames) {
  3000. FreeAltNames(x509->altNames, x509->heap);
  3001. x509->altNames = NULL;
  3002. }
  3003. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3004. wc_FreeMutex(&x509->refMutex);
  3005. #endif
  3006. }
  3007. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3008. #if !defined(WOLFSSL_NO_TLS12)
  3009. /* Encode the signature algorithm into buffer.
  3010. *
  3011. * hashalgo The hash algorithm.
  3012. * hsType The signature type.
  3013. * output The buffer to encode into.
  3014. */
  3015. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  3016. {
  3017. switch (hsType) {
  3018. #ifdef HAVE_ECC
  3019. case ecc_dsa_sa_algo:
  3020. output[0] = hashAlgo;
  3021. output[1] = ecc_dsa_sa_algo;
  3022. break;
  3023. #endif
  3024. #ifdef HAVE_ED25519
  3025. case ed25519_sa_algo:
  3026. output[0] = ED25519_SA_MAJOR;
  3027. output[1] = ED25519_SA_MINOR;
  3028. (void)hashAlgo;
  3029. break;
  3030. #endif
  3031. #ifdef HAVE_ED448
  3032. case ed448_sa_algo:
  3033. output[0] = ED448_SA_MAJOR;
  3034. output[1] = ED448_SA_MINOR;
  3035. (void)hashAlgo;
  3036. break;
  3037. #endif
  3038. #ifndef NO_RSA
  3039. case rsa_sa_algo:
  3040. output[0] = hashAlgo;
  3041. output[1] = rsa_sa_algo;
  3042. break;
  3043. #ifdef WC_RSA_PSS
  3044. /* PSS signatures: 0x080[4-6] */
  3045. case rsa_pss_sa_algo:
  3046. output[0] = rsa_pss_sa_algo;
  3047. output[1] = hashAlgo;
  3048. break;
  3049. #endif
  3050. #endif
  3051. }
  3052. (void)hashAlgo;
  3053. (void)output;
  3054. }
  3055. #endif
  3056. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  3057. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  3058. {
  3059. switch (hashAlgo) {
  3060. #ifndef NO_SHA
  3061. case sha_mac:
  3062. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  3063. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  3064. break;
  3065. #endif /* !NO_SHA */
  3066. #ifndef NO_SHA256
  3067. case sha256_mac:
  3068. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  3069. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  3070. break;
  3071. #endif /* !NO_SHA256 */
  3072. #ifdef WOLFSSL_SHA384
  3073. case sha384_mac:
  3074. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  3075. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  3076. break;
  3077. #endif /* WOLFSSL_SHA384 */
  3078. #ifdef WOLFSSL_SHA512
  3079. case sha512_mac:
  3080. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  3081. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  3082. break;
  3083. #endif /* WOLFSSL_SHA512 */
  3084. } /* switch */
  3085. }
  3086. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  3087. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3088. #endif /* !NO_CERTS */
  3089. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3090. static word32 MacSize(WOLFSSL* ssl)
  3091. {
  3092. #ifdef HAVE_TRUNCATED_HMAC
  3093. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  3094. : ssl->specs.hash_size;
  3095. #else
  3096. word32 digestSz = ssl->specs.hash_size;
  3097. #endif
  3098. return digestSz;
  3099. }
  3100. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  3101. #ifndef NO_RSA
  3102. #ifndef WOLFSSL_NO_TLS12
  3103. #if !defined(NO_WOLFSSL_SERVER) || (!defined(NO_WOLFSSL_CLIENT) && \
  3104. !defined(WOLFSSL_NO_CLIENT_AUTH))
  3105. static int TypeHash(int hashAlgo)
  3106. {
  3107. switch (hashAlgo) {
  3108. #ifdef WOLFSSL_SHA512
  3109. case sha512_mac:
  3110. return SHA512h;
  3111. #endif
  3112. #ifdef WOLFSSL_SHA384
  3113. case sha384_mac:
  3114. return SHA384h;
  3115. #endif
  3116. #ifndef NO_SHA256
  3117. case sha256_mac:
  3118. return SHA256h;
  3119. #endif
  3120. #ifdef WOLFSSL_SHA224
  3121. case sha224_mac:
  3122. return SHA224h;
  3123. #endif
  3124. #ifndef NO_SHA
  3125. case sha_mac:
  3126. return SHAh;
  3127. #endif
  3128. }
  3129. return 0;
  3130. }
  3131. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  3132. #endif /* !WOLFSSL_NO_TLS12 */
  3133. #if defined(WC_RSA_PSS)
  3134. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  3135. {
  3136. switch (hashAlgo) {
  3137. #ifdef WOLFSSL_SHA512
  3138. case sha512_mac:
  3139. *hashType = WC_HASH_TYPE_SHA512;
  3140. if (mgf != NULL)
  3141. *mgf = WC_MGF1SHA512;
  3142. break;
  3143. #endif
  3144. #ifdef WOLFSSL_SHA384
  3145. case sha384_mac:
  3146. *hashType = WC_HASH_TYPE_SHA384;
  3147. if (mgf != NULL)
  3148. *mgf = WC_MGF1SHA384;
  3149. break;
  3150. #endif
  3151. #ifndef NO_SHA256
  3152. case sha256_mac:
  3153. *hashType = WC_HASH_TYPE_SHA256;
  3154. if (mgf != NULL)
  3155. *mgf = WC_MGF1SHA256;
  3156. break;
  3157. #endif
  3158. default:
  3159. return BAD_FUNC_ARG;
  3160. }
  3161. return 0;
  3162. }
  3163. #endif
  3164. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3165. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3166. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3167. DerBuffer* keyBufInfo)
  3168. {
  3169. int ret;
  3170. #ifdef HAVE_PK_CALLBACKS
  3171. const byte* keyBuf = NULL;
  3172. word32 keySz = 0;
  3173. if (keyBufInfo) {
  3174. keyBuf = keyBufInfo->buffer;
  3175. keySz = keyBufInfo->length;
  3176. }
  3177. #endif
  3178. (void)ssl;
  3179. (void)keyBufInfo;
  3180. (void)sigAlgo;
  3181. (void)hashAlgo;
  3182. WOLFSSL_ENTER("RsaSign");
  3183. #ifdef WOLFSSL_ASYNC_CRYPT
  3184. /* initialize event */
  3185. if (key) {
  3186. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3187. if (ret != 0)
  3188. return ret;
  3189. }
  3190. #endif
  3191. #if defined(WC_RSA_PSS)
  3192. if (sigAlgo == rsa_pss_sa_algo) {
  3193. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3194. int mgf = 0;
  3195. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3196. if (ret != 0)
  3197. return ret;
  3198. #if defined(HAVE_PK_CALLBACKS)
  3199. if (ssl->ctx->RsaPssSignCb) {
  3200. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3201. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  3202. TypeHash(hashAlgo), mgf,
  3203. keyBuf, keySz, ctx);
  3204. }
  3205. else
  3206. #endif
  3207. {
  3208. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  3209. ssl->rng);
  3210. }
  3211. }
  3212. else
  3213. #endif
  3214. #if defined(HAVE_PK_CALLBACKS)
  3215. if (ssl->ctx->RsaSignCb) {
  3216. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3217. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3218. ctx);
  3219. }
  3220. else
  3221. #endif /*HAVE_PK_CALLBACKS */
  3222. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  3223. /* Handle async pending response */
  3224. #ifdef WOLFSSL_ASYNC_CRYPT
  3225. if (key && ret == WC_PENDING_E) {
  3226. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3227. }
  3228. #endif /* WOLFSSL_ASYNC_CRYPT */
  3229. /* For positive response return in outSz */
  3230. if (ret > 0) {
  3231. *outSz = ret;
  3232. ret = 0;
  3233. }
  3234. WOLFSSL_LEAVE("RsaSign", ret);
  3235. return ret;
  3236. }
  3237. #endif
  3238. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  3239. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  3240. {
  3241. int ret;
  3242. #ifdef HAVE_PK_CALLBACKS
  3243. const byte* keyBuf = NULL;
  3244. word32 keySz = 0;
  3245. if (keyBufInfo) {
  3246. keyBuf = keyBufInfo->buffer;
  3247. keySz = keyBufInfo->length;
  3248. }
  3249. #endif
  3250. (void)ssl;
  3251. (void)keyBufInfo;
  3252. (void)sigAlgo;
  3253. (void)hashAlgo;
  3254. WOLFSSL_ENTER("RsaVerify");
  3255. #ifdef WOLFSSL_ASYNC_CRYPT
  3256. /* initialize event */
  3257. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3258. if (ret != 0)
  3259. return ret;
  3260. #endif
  3261. #if defined(WC_RSA_PSS)
  3262. if (sigAlgo == rsa_pss_sa_algo) {
  3263. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3264. int mgf = 0;
  3265. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3266. if (ret != 0)
  3267. return ret;
  3268. #ifdef HAVE_PK_CALLBACKS
  3269. if (ssl->ctx->RsaPssVerifyCb) {
  3270. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  3271. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  3272. TypeHash(hashAlgo), mgf,
  3273. keyBuf, keySz, ctx);
  3274. }
  3275. else
  3276. #endif /*HAVE_PK_CALLBACKS */
  3277. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  3278. }
  3279. else
  3280. #endif
  3281. #ifdef HAVE_PK_CALLBACKS
  3282. if (ssl->ctx->RsaVerifyCb) {
  3283. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  3284. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3285. }
  3286. else
  3287. #endif /*HAVE_PK_CALLBACKS */
  3288. {
  3289. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  3290. }
  3291. /* Handle async pending response */
  3292. #ifdef WOLFSSL_ASYNC_CRYPT
  3293. if (ret == WC_PENDING_E) {
  3294. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3295. }
  3296. #endif /* WOLFSSL_ASYNC_CRYPT */
  3297. WOLFSSL_LEAVE("RsaVerify", ret);
  3298. return ret;
  3299. }
  3300. /* Verify RSA signature, 0 on success */
  3301. /* This function is used to check the sign result */
  3302. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  3303. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3304. DerBuffer* keyBufInfo)
  3305. {
  3306. byte* out = NULL; /* inline result */
  3307. int ret;
  3308. #ifdef HAVE_PK_CALLBACKS
  3309. const byte* keyBuf = NULL;
  3310. word32 keySz = 0;
  3311. if (keyBufInfo) {
  3312. keyBuf = keyBufInfo->buffer;
  3313. keySz = keyBufInfo->length;
  3314. }
  3315. #endif
  3316. (void)ssl;
  3317. (void)keyBufInfo;
  3318. (void)sigAlgo;
  3319. (void)hashAlgo;
  3320. WOLFSSL_ENTER("VerifyRsaSign");
  3321. if (verifySig == NULL || plain == NULL) {
  3322. return BAD_FUNC_ARG;
  3323. }
  3324. if (sigSz > ENCRYPT_LEN) {
  3325. WOLFSSL_MSG("Signature buffer too big");
  3326. return BUFFER_E;
  3327. }
  3328. #ifdef WOLFSSL_ASYNC_CRYPT
  3329. /* initialize event */
  3330. if (key) {
  3331. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3332. if (ret != 0)
  3333. return ret;
  3334. }
  3335. #endif
  3336. #if defined(WC_RSA_PSS)
  3337. if (sigAlgo == rsa_pss_sa_algo) {
  3338. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3339. int mgf = 0;
  3340. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3341. if (ret != 0)
  3342. return ret;
  3343. #ifdef HAVE_PK_CALLBACKS
  3344. if (ssl->ctx->RsaPssSignCheckCb) {
  3345. /* The key buffer includes private/public portion,
  3346. but only public is used */
  3347. /* If HSM hardware is checking the signature result you can
  3348. optionally skip the sign check and return 0 */
  3349. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3350. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3351. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  3352. TypeHash(hashAlgo), mgf,
  3353. keyBuf, keySz, ctx);
  3354. if (ret > 0) {
  3355. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  3356. hashType);
  3357. if (ret != 0)
  3358. ret = VERIFY_CERT_ERROR;
  3359. }
  3360. }
  3361. else
  3362. #endif /* HAVE_PK_CALLBACKS */
  3363. {
  3364. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  3365. key);
  3366. if (ret > 0) {
  3367. #ifdef HAVE_SELFTEST
  3368. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  3369. hashType);
  3370. #else
  3371. ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret,
  3372. hashType, -1,
  3373. mp_count_bits(&key->n));
  3374. #endif
  3375. if (ret != 0)
  3376. ret = VERIFY_CERT_ERROR;
  3377. }
  3378. }
  3379. }
  3380. else
  3381. #endif /* WC_RSA_PSS */
  3382. {
  3383. #ifdef HAVE_PK_CALLBACKS
  3384. if (ssl->ctx->RsaSignCheckCb) {
  3385. /* The key buffer includes private/public portion,
  3386. but only public is used */
  3387. /* If HSM hardware is checking the signature result you can
  3388. optionally skip the sign check and return 0 */
  3389. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3390. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3391. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  3392. keyBuf, keySz, ctx);
  3393. }
  3394. else
  3395. #endif /* HAVE_PK_CALLBACKS */
  3396. {
  3397. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  3398. }
  3399. if (ret > 0) {
  3400. if (ret != (int)plainSz || !out ||
  3401. XMEMCMP(plain, out, plainSz) != 0) {
  3402. WOLFSSL_MSG("RSA Signature verification failed");
  3403. ret = RSA_SIGN_FAULT;
  3404. } else {
  3405. ret = 0; /* RSA reset */
  3406. }
  3407. }
  3408. }
  3409. /* Handle async pending response */
  3410. #ifdef WOLFSSL_ASYNC_CRYPT
  3411. if (key && ret == WC_PENDING_E) {
  3412. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3413. }
  3414. #endif /* WOLFSSL_ASYNC_CRYPT */
  3415. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  3416. return ret;
  3417. }
  3418. #ifndef WOLFSSL_NO_TLS12
  3419. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3420. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  3421. RsaKey* key, DerBuffer* keyBufInfo)
  3422. {
  3423. int ret;
  3424. #ifdef HAVE_PK_CALLBACKS
  3425. const byte* keyBuf = NULL;
  3426. word32 keySz = 0;
  3427. if (keyBufInfo) {
  3428. keyBuf = keyBufInfo->buffer;
  3429. keySz = keyBufInfo->length;
  3430. }
  3431. #endif
  3432. (void)ssl;
  3433. (void)keyBufInfo;
  3434. WOLFSSL_ENTER("RsaDec");
  3435. #ifdef WOLFSSL_ASYNC_CRYPT
  3436. /* initialize event */
  3437. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3438. if (ret != 0)
  3439. return ret;
  3440. #endif
  3441. #ifdef HAVE_PK_CALLBACKS
  3442. if (ssl->ctx->RsaDecCb) {
  3443. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  3444. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3445. }
  3446. else
  3447. #endif /* HAVE_PK_CALLBACKS */
  3448. {
  3449. #ifdef WC_RSA_BLINDING
  3450. ret = wc_RsaSetRNG(key, ssl->rng);
  3451. if (ret != 0)
  3452. return ret;
  3453. #endif
  3454. ret = wc_RsaPrivateDecryptInline(in, inSz, out, key);
  3455. }
  3456. /* Handle async pending response */
  3457. #ifdef WOLFSSL_ASYNC_CRYPT
  3458. if (ret == WC_PENDING_E) {
  3459. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3460. }
  3461. #endif /* WOLFSSL_ASYNC_CRYPT */
  3462. /* For positive response return in outSz */
  3463. if (ret > 0) {
  3464. *outSz = ret;
  3465. ret = 0;
  3466. }
  3467. WOLFSSL_LEAVE("RsaDec", ret);
  3468. return ret;
  3469. }
  3470. #endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
  3471. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  3472. RsaKey* key, buffer* keyBufInfo)
  3473. {
  3474. int ret;
  3475. #ifdef HAVE_PK_CALLBACKS
  3476. const byte* keyBuf = NULL;
  3477. word32 keySz = 0;
  3478. if (keyBufInfo) {
  3479. keyBuf = keyBufInfo->buffer;
  3480. keySz = keyBufInfo->length;
  3481. }
  3482. #endif
  3483. (void)ssl;
  3484. (void)keyBufInfo;
  3485. WOLFSSL_ENTER("RsaEnc");
  3486. #ifdef WOLFSSL_ASYNC_CRYPT
  3487. /* initialize event */
  3488. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3489. if (ret != 0)
  3490. return ret;
  3491. #endif
  3492. #ifdef HAVE_PK_CALLBACKS
  3493. if (ssl->ctx->RsaEncCb) {
  3494. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  3495. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  3496. }
  3497. else
  3498. #endif /* HAVE_PK_CALLBACKS */
  3499. {
  3500. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  3501. }
  3502. /* Handle async pending response */
  3503. #ifdef WOLFSSL_ASYNC_CRYPT
  3504. if (ret == WC_PENDING_E) {
  3505. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3506. }
  3507. #endif /* WOLFSSL_ASYNC_CRYPT */
  3508. /* For positive response return in outSz */
  3509. if (ret > 0) {
  3510. *outSz = ret;
  3511. ret = 0;
  3512. }
  3513. WOLFSSL_LEAVE("RsaEnc", ret);
  3514. return ret;
  3515. }
  3516. #endif /* !WOLFSSL_NO_TLS12 */
  3517. #endif /* NO_RSA */
  3518. #ifdef HAVE_ECC
  3519. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3520. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  3521. {
  3522. int ret;
  3523. #ifdef HAVE_PK_CALLBACKS
  3524. const byte* keyBuf = NULL;
  3525. word32 keySz = 0;
  3526. if (keyBufInfo) {
  3527. keyBuf = keyBufInfo->buffer;
  3528. keySz = keyBufInfo->length;
  3529. }
  3530. #endif
  3531. (void)ssl;
  3532. (void)keyBufInfo;
  3533. WOLFSSL_ENTER("EccSign");
  3534. #ifdef WOLFSSL_ASYNC_CRYPT
  3535. /* initialize event */
  3536. if (key) {
  3537. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3538. if (ret != 0)
  3539. return ret;
  3540. }
  3541. #endif
  3542. #if defined(HAVE_PK_CALLBACKS)
  3543. if (ssl->ctx->EccSignCb) {
  3544. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  3545. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  3546. keySz, ctx);
  3547. }
  3548. else
  3549. #endif /* HAVE_PK_CALLBACKS */
  3550. {
  3551. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  3552. }
  3553. /* Handle async pending response */
  3554. #ifdef WOLFSSL_ASYNC_CRYPT
  3555. if (key && ret == WC_PENDING_E) {
  3556. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3557. }
  3558. #endif /* WOLFSSL_ASYNC_CRYPT */
  3559. WOLFSSL_LEAVE("EccSign", ret);
  3560. return ret;
  3561. }
  3562. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  3563. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  3564. {
  3565. int ret;
  3566. #ifdef HAVE_PK_CALLBACKS
  3567. const byte* keyBuf = NULL;
  3568. word32 keySz = 0;
  3569. if (keyBufInfo) {
  3570. keyBuf = keyBufInfo->buffer;
  3571. keySz = keyBufInfo->length;
  3572. }
  3573. #endif
  3574. (void)ssl;
  3575. (void)keyBufInfo;
  3576. WOLFSSL_ENTER("EccVerify");
  3577. #ifdef WOLFSSL_ASYNC_CRYPT
  3578. /* initialize event */
  3579. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3580. if (ret != 0)
  3581. return ret;
  3582. #endif
  3583. #ifdef HAVE_PK_CALLBACKS
  3584. if (ssl->ctx->EccVerifyCb) {
  3585. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  3586. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3587. &ssl->eccVerifyRes, ctx);
  3588. }
  3589. else
  3590. #endif /* HAVE_PK_CALLBACKS */
  3591. {
  3592. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  3593. }
  3594. /* Handle async pending response */
  3595. #ifdef WOLFSSL_ASYNC_CRYPT
  3596. if (ret == WC_PENDING_E) {
  3597. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3598. }
  3599. else
  3600. #endif /* WOLFSSL_ASYNC_CRYPT */
  3601. {
  3602. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  3603. }
  3604. WOLFSSL_LEAVE("EccVerify", ret);
  3605. return ret;
  3606. }
  3607. #ifdef HAVE_PK_CALLBACKS
  3608. /* Gets ECC key for shared secret callback testing
  3609. * Client side: returns peer key
  3610. * Server side: returns private key
  3611. */
  3612. static int EccGetKey(WOLFSSL* ssl, ecc_key** otherKey)
  3613. {
  3614. int ret = NO_PEER_KEY;
  3615. ecc_key* tmpKey = NULL;
  3616. if (ssl == NULL || otherKey == NULL) {
  3617. return BAD_FUNC_ARG;
  3618. }
  3619. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  3620. if (ssl->specs.static_ecdh) {
  3621. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent ||
  3622. !ssl->peerEccDsaKey->dp) {
  3623. return NO_PEER_KEY;
  3624. }
  3625. tmpKey = (struct ecc_key*)ssl->peerEccDsaKey;
  3626. }
  3627. else {
  3628. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  3629. !ssl->peerEccKey->dp) {
  3630. return NO_PEER_KEY;
  3631. }
  3632. tmpKey = (struct ecc_key*)ssl->peerEccKey;
  3633. }
  3634. }
  3635. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  3636. if (ssl->specs.static_ecdh) {
  3637. if (ssl->hsKey == NULL) {
  3638. return NO_PRIVATE_KEY;
  3639. }
  3640. tmpKey = (struct ecc_key*)ssl->hsKey;
  3641. }
  3642. else {
  3643. if (!ssl->eccTempKeyPresent) {
  3644. return NO_PRIVATE_KEY;
  3645. }
  3646. tmpKey = (struct ecc_key*)ssl->eccTempKey;
  3647. }
  3648. }
  3649. if (tmpKey) {
  3650. *otherKey = tmpKey;
  3651. ret = 0;
  3652. }
  3653. return ret;
  3654. }
  3655. #endif /* HAVE_PK_CALLBACKS */
  3656. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  3657. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  3658. int side)
  3659. {
  3660. int ret;
  3661. #ifdef HAVE_PK_CALLBACKS
  3662. ecc_key* otherKey = NULL;
  3663. #endif
  3664. #ifdef WOLFSSL_ASYNC_CRYPT
  3665. WC_ASYNC_DEV* asyncDev = &priv_key->asyncDev;
  3666. #endif
  3667. (void)ssl;
  3668. (void)pubKeyDer;
  3669. (void)pubKeySz;
  3670. (void)side;
  3671. WOLFSSL_ENTER("EccSharedSecret");
  3672. #ifdef HAVE_PK_CALLBACKS
  3673. if (ssl->ctx->EccSharedSecretCb) {
  3674. ret = EccGetKey(ssl, &otherKey);
  3675. if (ret != 0)
  3676. return ret;
  3677. #ifdef WOLFSSL_ASYNC_CRYPT
  3678. asyncDev = &otherKey->asyncDev;
  3679. #endif
  3680. }
  3681. #endif
  3682. #ifdef WOLFSSL_ASYNC_CRYPT
  3683. /* initialize event */
  3684. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3685. if (ret != 0)
  3686. return ret;
  3687. #endif
  3688. #ifdef HAVE_PK_CALLBACKS
  3689. if (ssl->ctx->EccSharedSecretCb) {
  3690. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  3691. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  3692. pubKeySz, out, outlen, side, ctx);
  3693. }
  3694. else
  3695. #endif
  3696. {
  3697. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  3698. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))) && \
  3699. !defined(HAVE_SELFTEST)
  3700. ret = wc_ecc_set_rng(priv_key, ssl->rng);
  3701. if (ret == 0)
  3702. #endif
  3703. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  3704. }
  3705. /* Handle async pending response */
  3706. #ifdef WOLFSSL_ASYNC_CRYPT
  3707. if (ret == WC_PENDING_E) {
  3708. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  3709. }
  3710. #endif /* WOLFSSL_ASYNC_CRYPT */
  3711. WOLFSSL_LEAVE("EccSharedSecret", ret);
  3712. return ret;
  3713. }
  3714. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  3715. {
  3716. int ret = 0;
  3717. int keySz = 0;
  3718. int ecc_curve = ECC_CURVE_DEF;
  3719. WOLFSSL_ENTER("EccMakeKey");
  3720. #ifdef WOLFSSL_ASYNC_CRYPT
  3721. /* initialize event */
  3722. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  3723. if (ret != 0)
  3724. return ret;
  3725. #endif
  3726. /* get key size */
  3727. if (peer == NULL) {
  3728. keySz = ssl->eccTempKeySz;
  3729. }
  3730. else {
  3731. keySz = peer->dp->size;
  3732. }
  3733. /* get curve type */
  3734. if (ssl->ecdhCurveOID > 0) {
  3735. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  3736. }
  3737. #ifdef HAVE_PK_CALLBACKS
  3738. if (ssl->ctx->EccKeyGenCb) {
  3739. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  3740. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  3741. }
  3742. else
  3743. #endif
  3744. {
  3745. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  3746. }
  3747. /* make sure the curve is set for TLS */
  3748. if (ret == 0 && key->dp) {
  3749. ssl->ecdhCurveOID = key->dp->oidSum;
  3750. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  3751. ssl->namedGroup = 0;
  3752. #endif
  3753. }
  3754. /* Handle async pending response */
  3755. #ifdef WOLFSSL_ASYNC_CRYPT
  3756. if (ret == WC_PENDING_E) {
  3757. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3758. }
  3759. #endif /* WOLFSSL_ASYNC_CRYPT */
  3760. WOLFSSL_LEAVE("EccMakeKey", ret);
  3761. return ret;
  3762. }
  3763. #endif /* HAVE_ECC */
  3764. #ifdef HAVE_ED25519
  3765. /* Check whether the key contains a public key.
  3766. * If not then pull it out of the leaf certificate.
  3767. *
  3768. * ssl SSL/TLS object.
  3769. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  3770. * 0 on success.
  3771. */
  3772. int Ed25519CheckPubKey(WOLFSSL* ssl)
  3773. {
  3774. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  3775. int ret = 0;
  3776. /* Public key required for signing. */
  3777. if (!key->pubKeySet) {
  3778. DerBuffer* leaf = ssl->buffers.certificate;
  3779. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert),
  3780. ssl->heap, DYNAMIC_TYPE_DCERT);
  3781. if (cert == NULL)
  3782. ret = MEMORY_E;
  3783. if (ret == 0) {
  3784. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  3785. ret = DecodeToKey(cert, 0);
  3786. }
  3787. if (ret == 0) {
  3788. ret = wc_ed25519_import_public(cert->publicKey, cert->pubKeySize,
  3789. key);
  3790. }
  3791. if (cert != NULL) {
  3792. FreeDecodedCert(cert);
  3793. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  3794. }
  3795. }
  3796. return ret;
  3797. }
  3798. /* Sign the data using EdDSA and key using Ed25519.
  3799. *
  3800. * ssl SSL object.
  3801. * in Data or message to sign.
  3802. * inSz Length of the data.
  3803. * out Buffer to hold signature.
  3804. * outSz On entry, size of the buffer. On exit, the size of the signature.
  3805. * key The private Ed25519 key data.
  3806. * keySz The length of the private key data in bytes.
  3807. * ctx The callback context.
  3808. * returns 0 on success, otherwise the value is an error.
  3809. */
  3810. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3811. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  3812. {
  3813. int ret;
  3814. #ifdef HAVE_PK_CALLBACKS
  3815. const byte* keyBuf = NULL;
  3816. word32 keySz = 0;
  3817. if (keyBufInfo) {
  3818. keyBuf = keyBufInfo->buffer;
  3819. keySz = keyBufInfo->length;
  3820. }
  3821. #endif
  3822. (void)ssl;
  3823. (void)keyBufInfo;
  3824. WOLFSSL_ENTER("Ed25519Sign");
  3825. #ifdef WOLFSSL_ASYNC_CRYPT
  3826. /* initialize event */
  3827. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3828. if (ret != 0)
  3829. return ret;
  3830. #endif
  3831. #if defined(HAVE_PK_CALLBACKS)
  3832. if (ssl->ctx->Ed25519SignCb) {
  3833. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  3834. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  3835. keySz, ctx);
  3836. }
  3837. else
  3838. #endif /* HAVE_PK_CALLBACKS */
  3839. {
  3840. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  3841. }
  3842. /* Handle async pending response */
  3843. #ifdef WOLFSSL_ASYNC_CRYPT
  3844. if (ret == WC_PENDING_E) {
  3845. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3846. }
  3847. #endif /* WOLFSSL_ASYNC_CRYPT */
  3848. WOLFSSL_LEAVE("Ed25519Sign", ret);
  3849. return ret;
  3850. }
  3851. /* Verify the data using EdDSA and key using Ed25519.
  3852. *
  3853. * ssl SSL object.
  3854. * in Signature data.
  3855. * inSz Length of the signature data in bytes.
  3856. * msg Message to verify.
  3857. * outSz Length of message in bytes.
  3858. * key The public Ed25519 key data.
  3859. * keySz The length of the private key data in bytes.
  3860. * ctx The callback context.
  3861. * returns 0 on success, otherwise the value is an error.
  3862. */
  3863. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  3864. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  3865. {
  3866. int ret;
  3867. #ifdef HAVE_PK_CALLBACKS
  3868. const byte* keyBuf = NULL;
  3869. word32 keySz = 0;
  3870. if (keyBufInfo) {
  3871. keyBuf = keyBufInfo->buffer;
  3872. keySz = keyBufInfo->length;
  3873. }
  3874. #endif
  3875. (void)ssl;
  3876. (void)keyBufInfo;
  3877. WOLFSSL_ENTER("Ed25519Verify");
  3878. #ifdef WOLFSSL_ASYNC_CRYPT
  3879. /* initialize event */
  3880. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3881. if (ret != 0)
  3882. return ret;
  3883. #endif
  3884. #ifdef HAVE_PK_CALLBACKS
  3885. if (ssl->ctx->Ed25519VerifyCb) {
  3886. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  3887. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  3888. keySz, &ssl->eccVerifyRes, ctx);
  3889. }
  3890. else
  3891. #endif /* HAVE_PK_CALLBACKS */
  3892. {
  3893. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  3894. &ssl->eccVerifyRes, key);
  3895. }
  3896. /* Handle async pending response */
  3897. #ifdef WOLFSSL_ASYNC_CRYPT
  3898. if (ret == WC_PENDING_E) {
  3899. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3900. }
  3901. else
  3902. #endif /* WOLFSSL_ASYNC_CRYPT */
  3903. {
  3904. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  3905. }
  3906. WOLFSSL_LEAVE("Ed25519Verify", ret);
  3907. return ret;
  3908. }
  3909. #endif /* HAVE_ED25519 */
  3910. #ifndef WOLFSSL_NO_TLS12
  3911. #ifdef HAVE_CURVE25519
  3912. #ifdef HAVE_PK_CALLBACKS
  3913. /* Gets X25519 key for shared secret callback testing
  3914. * Client side: returns peer key
  3915. * Server side: returns private key
  3916. */
  3917. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  3918. {
  3919. int ret = NO_PEER_KEY;
  3920. struct curve25519_key* tmpKey = NULL;
  3921. if (ssl == NULL || otherKey == NULL) {
  3922. return BAD_FUNC_ARG;
  3923. }
  3924. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  3925. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  3926. !ssl->peerX25519Key->dp) {
  3927. return NO_PEER_KEY;
  3928. }
  3929. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  3930. }
  3931. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  3932. if (!ssl->eccTempKeyPresent) {
  3933. return NO_PRIVATE_KEY;
  3934. }
  3935. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  3936. }
  3937. if (tmpKey) {
  3938. *otherKey = (curve25519_key *)tmpKey;
  3939. ret = 0;
  3940. }
  3941. return ret;
  3942. }
  3943. #endif /* HAVE_PK_CALLBACKS */
  3944. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  3945. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  3946. byte* out, word32* outlen, int side)
  3947. {
  3948. int ret;
  3949. (void)ssl;
  3950. (void)pubKeyDer;
  3951. (void)pubKeySz;
  3952. (void)side;
  3953. WOLFSSL_ENTER("X25519SharedSecret");
  3954. #ifdef WOLFSSL_ASYNC_CRYPT
  3955. /* initialize event */
  3956. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3957. if (ret != 0)
  3958. return ret;
  3959. #endif
  3960. #ifdef HAVE_PK_CALLBACKS
  3961. if (ssl->ctx->X25519SharedSecretCb) {
  3962. curve25519_key* otherKey = NULL;
  3963. ret = X25519GetKey(ssl, &otherKey);
  3964. if (ret == 0) {
  3965. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  3966. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  3967. pubKeySz, out, outlen, side, ctx);
  3968. }
  3969. }
  3970. else
  3971. #endif
  3972. {
  3973. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  3974. EC25519_LITTLE_ENDIAN);
  3975. }
  3976. /* Handle async pending response */
  3977. #ifdef WOLFSSL_ASYNC_CRYPT
  3978. if (ret == WC_PENDING_E) {
  3979. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  3980. }
  3981. #endif /* WOLFSSL_ASYNC_CRYPT */
  3982. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  3983. return ret;
  3984. }
  3985. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  3986. curve25519_key* peer)
  3987. {
  3988. int ret = 0;
  3989. (void)peer;
  3990. WOLFSSL_ENTER("X25519MakeKey");
  3991. #ifdef WOLFSSL_ASYNC_CRYPT
  3992. /* initialize event */
  3993. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  3994. if (ret != 0)
  3995. return ret;
  3996. #endif
  3997. #ifdef HAVE_PK_CALLBACKS
  3998. if (ssl->ctx->X25519KeyGenCb) {
  3999. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  4000. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  4001. }
  4002. else
  4003. #endif
  4004. {
  4005. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  4006. }
  4007. if (ret == 0) {
  4008. ssl->ecdhCurveOID = ECC_X25519_OID;
  4009. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4010. ssl->namedGroup = 0;
  4011. #endif
  4012. }
  4013. /* Handle async pending response */
  4014. #ifdef WOLFSSL_ASYNC_CRYPT
  4015. if (ret == WC_PENDING_E) {
  4016. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4017. }
  4018. #endif /* WOLFSSL_ASYNC_CRYPT */
  4019. WOLFSSL_LEAVE("X25519MakeKey", ret);
  4020. return ret;
  4021. }
  4022. #endif /* HAVE_CURVE25519 */
  4023. #ifdef HAVE_ED448
  4024. /* Check whether the key contains a public key.
  4025. * If not then pull it out of the leaf certificate.
  4026. *
  4027. * ssl SSL/TLS object.
  4028. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4029. * 0 on success.
  4030. */
  4031. int Ed448CheckPubKey(WOLFSSL* ssl)
  4032. {
  4033. ed448_key* key = (ed448_key*)ssl->hsKey;
  4034. int ret = 0;
  4035. /* Public key required for signing. */
  4036. if (!key->pubKeySet) {
  4037. DerBuffer* leaf = ssl->buffers.certificate;
  4038. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert), ssl->heap,
  4039. DYNAMIC_TYPE_DCERT);
  4040. if (cert == NULL)
  4041. ret = MEMORY_E;
  4042. if (ret == 0) {
  4043. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4044. ret = DecodeToKey(cert, 0);
  4045. }
  4046. if (ret == 0) {
  4047. ret = wc_ed448_import_public(cert->publicKey, cert->pubKeySize,
  4048. key);
  4049. }
  4050. if (cert != NULL) {
  4051. FreeDecodedCert(cert);
  4052. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4053. }
  4054. }
  4055. return ret;
  4056. }
  4057. /* Sign the data using EdDSA and key using Ed448.
  4058. *
  4059. * ssl SSL object.
  4060. * in Data or message to sign.
  4061. * inSz Length of the data.
  4062. * out Buffer to hold signature.
  4063. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4064. * key The private Ed448 key data.
  4065. * keySz The length of the private key data in bytes.
  4066. * ctx The callback context.
  4067. * returns 0 on success, otherwise the value is an error.
  4068. */
  4069. int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4070. word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
  4071. {
  4072. int ret;
  4073. #ifdef HAVE_PK_CALLBACKS
  4074. const byte* keyBuf = NULL;
  4075. word32 keySz = 0;
  4076. if (keyBufInfo) {
  4077. keyBuf = keyBufInfo->buffer;
  4078. keySz = keyBufInfo->length;
  4079. }
  4080. #endif
  4081. (void)ssl;
  4082. (void)keyBufInfo;
  4083. WOLFSSL_ENTER("Ed448Sign");
  4084. #ifdef WOLFSSL_ASYNC_CRYPT
  4085. /* initialize event */
  4086. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4087. if (ret != 0)
  4088. return ret;
  4089. #endif
  4090. #if defined(HAVE_PK_CALLBACKS)
  4091. if (ssl->ctx->Ed448SignCb) {
  4092. void* ctx = wolfSSL_GetEd448SignCtx(ssl);
  4093. ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4094. ctx);
  4095. }
  4096. else
  4097. #endif /* HAVE_PK_CALLBACKS */
  4098. {
  4099. ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
  4100. }
  4101. /* Handle async pending response */
  4102. #ifdef WOLFSSL_ASYNC_CRYPT
  4103. if (ret == WC_PENDING_E) {
  4104. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4105. }
  4106. #endif /* WOLFSSL_ASYNC_CRYPT */
  4107. WOLFSSL_LEAVE("Ed448Sign", ret);
  4108. return ret;
  4109. }
  4110. /* Verify the data using EdDSA and key using Ed448.
  4111. *
  4112. * ssl SSL object.
  4113. * in Signature data.
  4114. * inSz Length of the signature data in bytes.
  4115. * msg Message to verify.
  4116. * outSz Length of message in bytes.
  4117. * key The public Ed448 key data.
  4118. * keySz The length of the private key data in bytes.
  4119. * ctx The callback context.
  4120. * returns 0 on success, otherwise the value is an error.
  4121. */
  4122. int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4123. word32 msgSz, ed448_key* key, buffer* keyBufInfo)
  4124. {
  4125. int ret;
  4126. #ifdef HAVE_PK_CALLBACKS
  4127. const byte* keyBuf = NULL;
  4128. word32 keySz = 0;
  4129. if (keyBufInfo) {
  4130. keyBuf = keyBufInfo->buffer;
  4131. keySz = keyBufInfo->length;
  4132. }
  4133. #endif
  4134. (void)ssl;
  4135. (void)keyBufInfo;
  4136. WOLFSSL_ENTER("Ed448Verify");
  4137. #ifdef WOLFSSL_ASYNC_CRYPT
  4138. /* initialize event */
  4139. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4140. if (ret != 0)
  4141. return ret;
  4142. #endif
  4143. #ifdef HAVE_PK_CALLBACKS
  4144. if (ssl->ctx->Ed448VerifyCb) {
  4145. void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
  4146. ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
  4147. &ssl->eccVerifyRes, ctx);
  4148. }
  4149. else
  4150. #endif /* HAVE_PK_CALLBACKS */
  4151. {
  4152. ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
  4153. NULL, 0);
  4154. }
  4155. /* Handle async pending response */
  4156. #ifdef WOLFSSL_ASYNC_CRYPT
  4157. if (ret == WC_PENDING_E) {
  4158. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4159. }
  4160. else
  4161. #endif /* WOLFSSL_ASYNC_CRYPT */
  4162. {
  4163. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4164. }
  4165. WOLFSSL_LEAVE("Ed448Verify", ret);
  4166. return ret;
  4167. }
  4168. #endif /* HAVE_ED448 */
  4169. #ifdef HAVE_CURVE448
  4170. #ifdef HAVE_PK_CALLBACKS
  4171. /* Gets X448 key for shared secret callback testing
  4172. * Client side: returns peer key
  4173. * Server side: returns private key
  4174. */
  4175. static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
  4176. {
  4177. int ret = NO_PEER_KEY;
  4178. struct curve448_key* tmpKey = NULL;
  4179. if (ssl == NULL || otherKey == NULL) {
  4180. return BAD_FUNC_ARG;
  4181. }
  4182. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4183. if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
  4184. return NO_PEER_KEY;
  4185. }
  4186. tmpKey = (struct curve448_key*)ssl->peerX448Key;
  4187. }
  4188. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4189. if (!ssl->eccTempKeyPresent) {
  4190. return NO_PRIVATE_KEY;
  4191. }
  4192. tmpKey = (struct curve448_key*)ssl->eccTempKey;
  4193. }
  4194. if (tmpKey) {
  4195. *otherKey = (curve448_key *)tmpKey;
  4196. ret = 0;
  4197. }
  4198. return ret;
  4199. }
  4200. #endif /* HAVE_PK_CALLBACKS */
  4201. static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
  4202. curve448_key* pub_key, byte* pubKeyDer,
  4203. word32* pubKeySz, byte* out, word32* outlen,
  4204. int side)
  4205. {
  4206. int ret;
  4207. (void)ssl;
  4208. (void)pubKeyDer;
  4209. (void)pubKeySz;
  4210. (void)side;
  4211. WOLFSSL_ENTER("X448SharedSecret");
  4212. #ifdef WOLFSSL_ASYNC_CRYPT
  4213. /* initialize event */
  4214. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4215. if (ret != 0)
  4216. return ret;
  4217. #endif
  4218. #ifdef HAVE_PK_CALLBACKS
  4219. if (ssl->ctx->X448SharedSecretCb) {
  4220. curve448_key* otherKey = NULL;
  4221. ret = X448GetKey(ssl, &otherKey);
  4222. if (ret == 0) {
  4223. void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
  4224. ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
  4225. pubKeySz, out, outlen, side, ctx);
  4226. }
  4227. }
  4228. else
  4229. #endif
  4230. {
  4231. ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
  4232. EC448_LITTLE_ENDIAN);
  4233. }
  4234. /* Handle async pending response */
  4235. #ifdef WOLFSSL_ASYNC_CRYPT
  4236. if (ret == WC_PENDING_E) {
  4237. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4238. }
  4239. #endif /* WOLFSSL_ASYNC_CRYPT */
  4240. WOLFSSL_LEAVE("X448SharedSecret", ret);
  4241. return ret;
  4242. }
  4243. static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
  4244. {
  4245. int ret = 0;
  4246. (void)peer;
  4247. WOLFSSL_ENTER("X448MakeKey");
  4248. #ifdef WOLFSSL_ASYNC_CRYPT
  4249. /* initialize event */
  4250. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4251. if (ret != 0)
  4252. return ret;
  4253. #endif
  4254. #ifdef HAVE_PK_CALLBACKS
  4255. if (ssl->ctx->X448KeyGenCb) {
  4256. void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
  4257. ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
  4258. }
  4259. else
  4260. #endif
  4261. {
  4262. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  4263. }
  4264. if (ret == 0) {
  4265. ssl->ecdhCurveOID = ECC_X448_OID;
  4266. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4267. ssl->namedGroup = 0;
  4268. #endif
  4269. }
  4270. /* Handle async pending response */
  4271. #ifdef WOLFSSL_ASYNC_CRYPT
  4272. if (ret == WC_PENDING_E) {
  4273. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4274. }
  4275. #endif /* WOLFSSL_ASYNC_CRYPT */
  4276. WOLFSSL_LEAVE("X448MakeKey", ret);
  4277. return ret;
  4278. }
  4279. #endif /* HAVE_CURVE448 */
  4280. #if !defined(NO_CERTS) || !defined(NO_PSK)
  4281. #if !defined(NO_DH)
  4282. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  4283. byte* priv, word32* privSz,
  4284. byte* pub, word32* pubSz)
  4285. {
  4286. int ret;
  4287. WOLFSSL_ENTER("DhGenKeyPair");
  4288. #ifdef WOLFSSL_ASYNC_CRYPT
  4289. /* initialize event */
  4290. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4291. if (ret != 0)
  4292. return ret;
  4293. #endif
  4294. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  4295. /* Handle async pending response */
  4296. #ifdef WOLFSSL_ASYNC_CRYPT
  4297. if (ret == WC_PENDING_E) {
  4298. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  4299. }
  4300. #endif /* WOLFSSL_ASYNC_CRYPT */
  4301. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  4302. return ret;
  4303. }
  4304. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  4305. const byte* priv, word32 privSz,
  4306. const byte* otherPub, word32 otherPubSz,
  4307. byte* agree, word32* agreeSz)
  4308. {
  4309. int ret;
  4310. (void)ssl;
  4311. WOLFSSL_ENTER("DhAgree");
  4312. #ifdef WOLFSSL_ASYNC_CRYPT
  4313. /* initialize event */
  4314. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4315. if (ret != 0)
  4316. return ret;
  4317. #endif
  4318. #ifdef HAVE_PK_CALLBACKS
  4319. if (ssl->ctx->DhAgreeCb) {
  4320. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  4321. WOLFSSL_MSG("Calling DhAgree Callback Function");
  4322. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  4323. otherPub, otherPubSz, agree, agreeSz, ctx);
  4324. }
  4325. else
  4326. #endif
  4327. {
  4328. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  4329. ret = wc_DhCheckPubValue(ssl->buffers.serverDH_P.buffer,
  4330. ssl->buffers.serverDH_P.length, otherPub, otherPubSz);
  4331. if (ret != 0) {
  4332. #ifdef OPENSSL_EXTRA
  4333. SendAlert(ssl, alert_fatal, illegal_parameter);
  4334. #endif
  4335. }
  4336. else
  4337. #endif
  4338. {
  4339. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  4340. otherPubSz);
  4341. }
  4342. }
  4343. /* Handle async pending response */
  4344. #ifdef WOLFSSL_ASYNC_CRYPT
  4345. if (ret == WC_PENDING_E) {
  4346. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  4347. }
  4348. #endif /* WOLFSSL_ASYNC_CRYPT */
  4349. WOLFSSL_LEAVE("DhAgree", ret);
  4350. return ret;
  4351. }
  4352. #endif /* !NO_DH */
  4353. #endif /* !NO_CERTS || !NO_PSK */
  4354. #endif /* !WOLFSSL_NO_TLS12 */
  4355. #ifdef HAVE_PK_CALLBACKS
  4356. int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
  4357. {
  4358. int pkcbset = 0;
  4359. (void)ssl;
  4360. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  4361. !defined(NO_RSA)
  4362. if (0
  4363. #ifdef HAVE_ECC
  4364. || (ssl->ctx->EccSignCb != NULL &&
  4365. ssl->buffers.keyType == ecc_dsa_sa_algo)
  4366. #endif
  4367. #ifdef HAVE_ED25519
  4368. || (ssl->ctx->Ed25519SignCb != NULL &&
  4369. ssl->buffers.keyType == ed25519_sa_algo)
  4370. #endif
  4371. #ifdef HAVE_ED448
  4372. || (ssl->ctx->Ed448SignCb != NULL &&
  4373. ssl->buffers.keyType == ed448_sa_algo)
  4374. #endif
  4375. #ifndef NO_RSA
  4376. || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
  4377. || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
  4378. #ifdef WC_RSA_PSS
  4379. || (ssl->ctx->RsaPssSignCb != NULL &&
  4380. ssl->buffers.keyType == rsa_pss_sa_algo)
  4381. #endif
  4382. #endif
  4383. ) {
  4384. pkcbset = 1;
  4385. }
  4386. #endif
  4387. return pkcbset;
  4388. }
  4389. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  4390. {
  4391. int pkcbset = 0;
  4392. (void)ctx;
  4393. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  4394. !defined(NO_RSA)
  4395. if (0
  4396. #ifdef HAVE_ECC
  4397. || ctx->EccSignCb != NULL
  4398. #endif
  4399. #ifdef HAVE_ED25519
  4400. || ctx->Ed25519SignCb != NULL
  4401. #endif
  4402. #ifdef HAVE_ED448
  4403. || ctx->Ed448SignCb != NULL
  4404. #endif
  4405. #ifndef NO_RSA
  4406. || ctx->RsaSignCb != NULL
  4407. || ctx->RsaDecCb != NULL
  4408. #ifdef WC_RSA_PSS
  4409. || ctx->RsaPssSignCb != NULL
  4410. #endif
  4411. #endif
  4412. ) {
  4413. pkcbset = 1;
  4414. }
  4415. #endif
  4416. return pkcbset;
  4417. }
  4418. #endif /* HAVE_PK_CALLBACKS */
  4419. int InitSSL_Suites(WOLFSSL* ssl)
  4420. {
  4421. int keySz = 0;
  4422. byte havePSK = 0;
  4423. byte haveAnon = 0;
  4424. byte haveRSA = 0;
  4425. byte haveMcast = 0;
  4426. (void)haveAnon; /* Squash unused var warnings */
  4427. (void)haveMcast;
  4428. if (!ssl)
  4429. return BAD_FUNC_ARG;
  4430. #ifndef NO_RSA
  4431. haveRSA = 1;
  4432. #endif
  4433. #ifndef NO_PSK
  4434. havePSK = (byte)ssl->options.havePSK;
  4435. #endif /* NO_PSK */
  4436. #ifdef HAVE_ANON
  4437. haveAnon = (byte)ssl->options.haveAnon;
  4438. #endif /* HAVE_ANON*/
  4439. #ifdef WOLFSSL_MULTICAST
  4440. haveMcast = (byte)ssl->options.haveMcast;
  4441. #endif /* WOLFSSL_MULTICAST */
  4442. #ifdef WOLFSSL_EARLY_DATA
  4443. if (ssl->options.side == WOLFSSL_SERVER_END)
  4444. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  4445. #endif
  4446. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  4447. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  4448. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  4449. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  4450. ssl->buffers.keyType == ed25519_sa_algo ||
  4451. ssl->buffers.keyType == ed448_sa_algo;
  4452. #endif
  4453. #ifndef NO_CERTS
  4454. keySz = ssl->buffers.keySz;
  4455. #endif
  4456. /* make sure server has DH parms, and add PSK if there, add NTRU too */
  4457. if (ssl->options.side == WOLFSSL_SERVER_END) {
  4458. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  4459. ssl->options.haveDH, ssl->options.haveNTRU,
  4460. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4461. ssl->options.haveStaticECC, ssl->options.side);
  4462. }
  4463. else {
  4464. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  4465. TRUE, ssl->options.haveNTRU,
  4466. ssl->options.haveECDSAsig, ssl->options.haveECC,
  4467. ssl->options.haveStaticECC, ssl->options.side);
  4468. }
  4469. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  4470. /* make sure server has cert and key unless using PSK, Anon, or
  4471. * Multicast. This should be true even if just switching ssl ctx */
  4472. if (ssl->options.side == WOLFSSL_SERVER_END &&
  4473. !havePSK && !haveAnon && !haveMcast) {
  4474. /* server certificate must be loaded */
  4475. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  4476. WOLFSSL_MSG("Server missing certificate");
  4477. return NO_PRIVATE_KEY;
  4478. }
  4479. /* allow no private key if using PK callbacks and CB is set */
  4480. #ifdef HAVE_PK_CALLBACKS
  4481. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  4482. WOLFSSL_MSG("Using PK for server private key");
  4483. }
  4484. else
  4485. #endif
  4486. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  4487. WOLFSSL_MSG("Server missing private key");
  4488. return NO_PRIVATE_KEY;
  4489. }
  4490. }
  4491. #endif
  4492. return WOLFSSL_SUCCESS;
  4493. }
  4494. /* returns new reference count. Arg incr positive=up or negative=down */
  4495. int SSL_CTX_RefCount(WOLFSSL_CTX* ctx, int incr)
  4496. {
  4497. int refCount;
  4498. if (ctx == NULL) {
  4499. return BAD_FUNC_ARG;
  4500. }
  4501. if (wc_LockMutex(&ctx->countMutex) != 0) {
  4502. WOLFSSL_MSG("Couldn't lock CTX count mutex");
  4503. return BAD_MUTEX_E;
  4504. }
  4505. ctx->refCount += incr;
  4506. /* make sure refCount is never negative */
  4507. if (ctx->refCount < 0) {
  4508. ctx->refCount = 0;
  4509. }
  4510. refCount = ctx->refCount;
  4511. wc_UnLockMutex(&ctx->countMutex);
  4512. return refCount;
  4513. }
  4514. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  4515. It is used during initialization and to switch an ssl's CTX with
  4516. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  4517. unless writeDup is on.
  4518. ssl object to initialize
  4519. ctx parent factory
  4520. writeDup flag indicating this is a write dup only
  4521. WOLFSSL_SUCCESS return value on success */
  4522. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  4523. {
  4524. int ret;
  4525. byte newSSL;
  4526. if (!ssl || !ctx)
  4527. return BAD_FUNC_ARG;
  4528. #ifndef SINGLE_THREADED
  4529. if (ssl->suites == NULL && !writeDup)
  4530. return BAD_FUNC_ARG;
  4531. #endif
  4532. newSSL = ssl->ctx == NULL; /* Assign after null check */
  4533. #ifndef NO_PSK
  4534. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  4535. return BAD_FUNC_ARG; /* needed for copy below */
  4536. }
  4537. #endif
  4538. /* decrement previous CTX reference count if exists.
  4539. * This should only happen if switching ctxs!*/
  4540. if (!newSSL) {
  4541. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  4542. wolfSSL_CTX_free(ssl->ctx);
  4543. }
  4544. /* increment CTX reference count */
  4545. if ((ret = SSL_CTX_RefCount(ctx, 1)) < 0) {
  4546. return ret;
  4547. }
  4548. ret = WOLFSSL_SUCCESS; /* set default ret */
  4549. ssl->ctx = ctx; /* only for passing to calls, options could change */
  4550. ssl->version = ctx->method->version;
  4551. #ifdef HAVE_ECC
  4552. ssl->eccTempKeySz = ctx->eccTempKeySz;
  4553. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  4554. #endif
  4555. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  4556. ssl->pkCurveOID = ctx->pkCurveOID;
  4557. #endif
  4558. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  4559. ssl->options.mask = ctx->mask;
  4560. #endif
  4561. #ifdef OPENSSL_EXTRA
  4562. ssl->CBIS = ctx->CBIS;
  4563. #endif
  4564. ssl->timeout = ctx->timeout;
  4565. ssl->verifyCallback = ctx->verifyCallback;
  4566. ssl->options.side = ctx->method->side;
  4567. ssl->options.downgrade = ctx->method->downgrade;
  4568. ssl->options.minDowngrade = ctx->minDowngrade;
  4569. ssl->options.haveDH = ctx->haveDH;
  4570. ssl->options.haveNTRU = ctx->haveNTRU;
  4571. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  4572. ssl->options.haveECC = ctx->haveECC;
  4573. ssl->options.haveStaticECC = ctx->haveStaticECC;
  4574. #ifndef NO_PSK
  4575. ssl->options.havePSK = ctx->havePSK;
  4576. ssl->options.client_psk_cb = ctx->client_psk_cb;
  4577. ssl->options.server_psk_cb = ctx->server_psk_cb;
  4578. ssl->options.psk_ctx = ctx->psk_ctx;
  4579. #ifdef WOLFSSL_TLS13
  4580. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  4581. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  4582. #endif
  4583. #endif /* NO_PSK */
  4584. #ifdef WOLFSSL_EARLY_DATA
  4585. if (ssl->options.side == WOLFSSL_SERVER_END)
  4586. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  4587. #endif
  4588. #ifdef HAVE_ANON
  4589. ssl->options.haveAnon = ctx->haveAnon;
  4590. #endif
  4591. #ifndef NO_DH
  4592. ssl->options.minDhKeySz = ctx->minDhKeySz;
  4593. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  4594. #endif
  4595. #ifndef NO_RSA
  4596. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  4597. #endif
  4598. #ifdef HAVE_ECC
  4599. ssl->options.minEccKeySz = ctx->minEccKeySz;
  4600. #endif
  4601. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  4602. ssl->options.verifyDepth = ctx->verifyDepth;
  4603. #endif
  4604. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  4605. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  4606. #ifdef HAVE_EXT_CACHE
  4607. ssl->options.internalCacheOff = ctx->internalCacheOff;
  4608. #endif
  4609. ssl->options.verifyPeer = ctx->verifyPeer;
  4610. ssl->options.verifyNone = ctx->verifyNone;
  4611. ssl->options.failNoCert = ctx->failNoCert;
  4612. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  4613. ssl->options.sendVerify = ctx->sendVerify;
  4614. ssl->options.partialWrite = ctx->partialWrite;
  4615. ssl->options.quietShutdown = ctx->quietShutdown;
  4616. ssl->options.groupMessages = ctx->groupMessages;
  4617. #ifndef NO_DH
  4618. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  4619. !defined(HAVE_SELFTEST)
  4620. ssl->options.dhKeyTested = ctx->dhKeyTested;
  4621. #endif
  4622. ssl->buffers.serverDH_P = ctx->serverDH_P;
  4623. ssl->buffers.serverDH_G = ctx->serverDH_G;
  4624. #endif
  4625. #ifndef NO_CERTS
  4626. /* ctx still owns certificate, certChain, key, dh, and cm */
  4627. ssl->buffers.certificate = ctx->certificate;
  4628. ssl->buffers.certChain = ctx->certChain;
  4629. #ifdef WOLFSSL_TLS13
  4630. ssl->buffers.certChainCnt = ctx->certChainCnt;
  4631. #endif
  4632. ssl->buffers.key = ctx->privateKey;
  4633. ssl->buffers.keyType = ctx->privateKeyType;
  4634. ssl->buffers.keyId = ctx->privateKeyId;
  4635. ssl->buffers.keySz = ctx->privateKeySz;
  4636. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  4637. #endif
  4638. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  4639. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  4640. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  4641. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  4642. ssl->buffers.keyType == ed25519_sa_algo ||
  4643. ssl->buffers.keyType == ed448_sa_algo;
  4644. #endif
  4645. #ifdef WOLFSSL_ASYNC_CRYPT
  4646. ssl->devId = ctx->devId;
  4647. #endif
  4648. if (writeDup == 0) {
  4649. #ifndef NO_PSK
  4650. if (ctx->server_hint[0]) { /* set in CTX */
  4651. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  4652. sizeof(ssl->arrays->server_hint));
  4653. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  4654. }
  4655. #endif /* NO_PSK */
  4656. if (ctx->suites) {
  4657. #ifndef SINGLE_THREADED
  4658. *ssl->suites = *ctx->suites;
  4659. #else
  4660. ssl->suites = ctx->suites;
  4661. #endif
  4662. }
  4663. else {
  4664. XMEMSET(ssl->suites, 0, sizeof(Suites));
  4665. }
  4666. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  4667. /* Defer initializing suites until accept or connect */
  4668. ret = InitSSL_Suites(ssl);
  4669. }
  4670. } /* writeDup check */
  4671. #ifdef WOLFSSL_SESSION_EXPORT
  4672. #ifdef WOLFSSL_DTLS
  4673. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  4674. #endif
  4675. #endif
  4676. ssl->CBIORecv = ctx->CBIORecv;
  4677. ssl->CBIOSend = ctx->CBIOSend;
  4678. #ifdef OPENSSL_EXTRA
  4679. ssl->readAhead = ctx->readAhead;
  4680. #endif
  4681. ssl->verifyDepth = ctx->verifyDepth;
  4682. return ret;
  4683. }
  4684. int InitHandshakeHashes(WOLFSSL* ssl)
  4685. {
  4686. int ret;
  4687. /* make sure existing handshake hashes are free'd */
  4688. if (ssl->hsHashes != NULL) {
  4689. FreeHandshakeHashes(ssl);
  4690. }
  4691. /* allocate handshake hashes */
  4692. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  4693. DYNAMIC_TYPE_HASHES);
  4694. if (ssl->hsHashes == NULL) {
  4695. WOLFSSL_MSG("HS_Hashes Memory error");
  4696. return MEMORY_E;
  4697. }
  4698. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  4699. #ifndef NO_OLD_TLS
  4700. #ifndef NO_MD5
  4701. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  4702. if (ret != 0)
  4703. return ret;
  4704. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4705. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  4706. #endif
  4707. #endif
  4708. #ifndef NO_SHA
  4709. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  4710. if (ret != 0)
  4711. return ret;
  4712. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4713. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  4714. #endif
  4715. #endif
  4716. #endif /* !NO_OLD_TLS */
  4717. #ifndef NO_SHA256
  4718. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  4719. if (ret != 0)
  4720. return ret;
  4721. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4722. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  4723. #endif
  4724. #endif
  4725. #ifdef WOLFSSL_SHA384
  4726. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  4727. if (ret != 0)
  4728. return ret;
  4729. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4730. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  4731. #endif
  4732. #endif
  4733. #ifdef WOLFSSL_SHA512
  4734. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  4735. if (ret != 0)
  4736. return ret;
  4737. #if defined(WOLFSSL_HASH_FLAGS) || defined(WOLF_CRYPTO_CB)
  4738. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  4739. #endif
  4740. #endif
  4741. return ret;
  4742. }
  4743. void FreeHandshakeHashes(WOLFSSL* ssl)
  4744. {
  4745. if (ssl->hsHashes) {
  4746. #ifndef NO_OLD_TLS
  4747. #ifndef NO_MD5
  4748. wc_Md5Free(&ssl->hsHashes->hashMd5);
  4749. #endif
  4750. #ifndef NO_SHA
  4751. wc_ShaFree(&ssl->hsHashes->hashSha);
  4752. #endif
  4753. #endif /* !NO_OLD_TLS */
  4754. #ifndef NO_SHA256
  4755. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  4756. #endif
  4757. #ifdef WOLFSSL_SHA384
  4758. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  4759. #endif
  4760. #ifdef WOLFSSL_SHA512
  4761. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  4762. #endif
  4763. #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \
  4764. !defined(WOLFSSL_NO_CLIENT_AUTH)
  4765. if (ssl->hsHashes->messages != NULL) {
  4766. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  4767. ssl->hsHashes->messages = NULL;
  4768. }
  4769. #endif
  4770. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  4771. ssl->hsHashes = NULL;
  4772. }
  4773. }
  4774. /* init everything to 0, NULL, default values before calling anything that may
  4775. fail so that destructor has a "good" state to cleanup
  4776. ssl object to initialize
  4777. ctx parent factory
  4778. writeDup flag indicating this is a write dup only
  4779. 0 on success */
  4780. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  4781. {
  4782. int ret;
  4783. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  4784. #if defined(WOLFSSL_STATIC_MEMORY)
  4785. if (ctx->heap != NULL) {
  4786. WOLFSSL_HEAP_HINT* ssl_hint;
  4787. WOLFSSL_HEAP_HINT* ctx_hint;
  4788. /* avoid dereferencing a test value */
  4789. #ifdef WOLFSSL_HEAP_TEST
  4790. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  4791. ssl->heap = ctx->heap;
  4792. }
  4793. else {
  4794. #endif
  4795. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  4796. ctx->heap, DYNAMIC_TYPE_SSL);
  4797. if (ssl->heap == NULL) {
  4798. return MEMORY_E;
  4799. }
  4800. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  4801. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  4802. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  4803. /* lock and check IO count / handshake count */
  4804. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  4805. WOLFSSL_MSG("Bad memory_mutex lock");
  4806. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  4807. ssl->heap = NULL; /* free and set to NULL for IO counter */
  4808. return BAD_MUTEX_E;
  4809. }
  4810. if (ctx_hint->memory->maxHa > 0 &&
  4811. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  4812. WOLFSSL_MSG("At max number of handshakes for static memory");
  4813. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4814. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  4815. ssl->heap = NULL; /* free and set to NULL for IO counter */
  4816. return MEMORY_E;
  4817. }
  4818. if (ctx_hint->memory->maxIO > 0 &&
  4819. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  4820. WOLFSSL_MSG("At max number of IO allowed for static memory");
  4821. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4822. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  4823. ssl->heap = NULL; /* free and set to NULL for IO counter */
  4824. return MEMORY_E;
  4825. }
  4826. ctx_hint->memory->curIO++;
  4827. ctx_hint->memory->curHa++;
  4828. ssl_hint->memory = ctx_hint->memory;
  4829. ssl_hint->haFlag = 1;
  4830. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4831. /* check if tracking stats */
  4832. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  4833. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  4834. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  4835. if (ssl_hint->stats == NULL) {
  4836. return MEMORY_E;
  4837. }
  4838. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  4839. }
  4840. /* check if using fixed IO buffers */
  4841. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  4842. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  4843. WOLFSSL_MSG("Bad memory_mutex lock");
  4844. return BAD_MUTEX_E;
  4845. }
  4846. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  4847. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4848. return MEMORY_E;
  4849. }
  4850. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  4851. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4852. return MEMORY_E;
  4853. }
  4854. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  4855. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  4856. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4857. return MEMORY_E;
  4858. }
  4859. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  4860. }
  4861. #ifdef WOLFSSL_HEAP_TEST
  4862. }
  4863. #endif
  4864. }
  4865. else {
  4866. ssl->heap = ctx->heap;
  4867. }
  4868. #else
  4869. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  4870. #endif /* WOLFSSL_STATIC_MEMORY */
  4871. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  4872. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  4873. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  4874. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  4875. #ifdef KEEP_PEER_CERT
  4876. InitX509(&ssl->peerCert, 0, ssl->heap);
  4877. #endif
  4878. ssl->rfd = -1; /* set to invalid descriptor */
  4879. ssl->wfd = -1;
  4880. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  4881. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  4882. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  4883. #ifdef HAVE_NETX
  4884. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  4885. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  4886. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  4887. ssl->mnCtx = mynewt_ctx_new();
  4888. if(!ssl->mnCtx) {
  4889. return MEMORY_E;
  4890. }
  4891. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  4892. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  4893. #elif defined (WOLFSSL_GNRC)
  4894. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  4895. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  4896. #endif
  4897. /* initialize states */
  4898. ssl->options.serverState = NULL_STATE;
  4899. ssl->options.clientState = NULL_STATE;
  4900. ssl->options.connectState = CONNECT_BEGIN;
  4901. ssl->options.acceptState = ACCEPT_BEGIN;
  4902. ssl->options.handShakeState = NULL_STATE;
  4903. ssl->options.processReply = doProcessInit;
  4904. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  4905. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  4906. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  4907. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  4908. #ifndef NO_DH
  4909. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  4910. !defined(HAVE_SELFTEST)
  4911. ssl->options.dhDoKeyTest = 1;
  4912. #endif
  4913. #endif
  4914. #ifdef WOLFSSL_DTLS
  4915. #ifdef WOLFSSL_SCTP
  4916. ssl->options.dtlsSctp = ctx->dtlsSctp;
  4917. #endif
  4918. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  4919. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  4920. ssl->dtls_expected_rx = ssl->dtlsMtuSz;
  4921. #else
  4922. ssl->dtls_expected_rx = MAX_MTU;
  4923. #endif
  4924. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  4925. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  4926. ssl->dtls_timeout = ssl->dtls_timeout_init;
  4927. ssl->buffers.dtlsCtx.rfd = -1;
  4928. ssl->buffers.dtlsCtx.wfd = -1;
  4929. #endif
  4930. #ifndef WOLFSSL_AEAD_ONLY
  4931. #ifndef NO_OLD_TLS
  4932. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  4933. #elif !defined(WOLFSSL_NO_TLS12)
  4934. ssl->hmac = TLS_hmac;
  4935. #endif
  4936. #endif
  4937. ssl->cipher.ssl = ssl;
  4938. #ifdef HAVE_EXTENDED_MASTER
  4939. ssl->options.haveEMS = ctx->haveEMS;
  4940. #endif
  4941. ssl->options.useClientOrder = ctx->useClientOrder;
  4942. ssl->options.mutualAuth = ctx->mutualAuth;
  4943. #ifdef WOLFSSL_STATIC_EPHEMERAL
  4944. ssl->staticKE = ctx->staticKE;
  4945. #endif
  4946. #ifdef WOLFSSL_TLS13
  4947. #ifdef HAVE_SESSION_TICKET
  4948. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  4949. #endif
  4950. ssl->options.noPskDheKe = ctx->noPskDheKe;
  4951. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  4952. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  4953. #endif
  4954. if (ctx->numGroups > 0) {
  4955. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  4956. ssl->numGroups = ctx->numGroups;
  4957. }
  4958. #endif
  4959. #ifdef HAVE_TLS_EXTENSIONS
  4960. #ifdef HAVE_MAX_FRAGMENT
  4961. ssl->max_fragment = MAX_RECORD_SIZE;
  4962. #endif
  4963. #ifdef HAVE_ALPN
  4964. ssl->alpn_client_list = NULL;
  4965. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  4966. ssl->alpnSelect = ctx->alpnSelect;
  4967. ssl->alpnSelectArg = ctx->alpnSelectArg;
  4968. #endif
  4969. #endif
  4970. #ifdef HAVE_SUPPORTED_CURVES
  4971. ssl->options.userCurves = ctx->userCurves;
  4972. #endif
  4973. #endif /* HAVE_TLS_EXTENSIONS */
  4974. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  4975. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  4976. #endif
  4977. /* default alert state (none) */
  4978. ssl->alert_history.last_rx.code = -1;
  4979. ssl->alert_history.last_rx.level = -1;
  4980. ssl->alert_history.last_tx.code = -1;
  4981. ssl->alert_history.last_tx.level = -1;
  4982. #ifdef OPENSSL_EXTRA
  4983. /* copy over application session context ID */
  4984. ssl->sessionCtxSz = ctx->sessionCtxSz;
  4985. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  4986. ssl->cbioFlag = ctx->cbioFlag;
  4987. #endif
  4988. InitCiphers(ssl);
  4989. InitCipherSpecs(&ssl->specs);
  4990. /* all done with init, now can return errors, call other stuff */
  4991. if (!writeDup) {
  4992. /* arrays */
  4993. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  4994. DYNAMIC_TYPE_ARRAYS);
  4995. if (ssl->arrays == NULL) {
  4996. WOLFSSL_MSG("Arrays Memory error");
  4997. return MEMORY_E;
  4998. }
  4999. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  5000. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  5001. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  5002. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  5003. DYNAMIC_TYPE_SECRET);
  5004. if (ssl->arrays->preMasterSecret == NULL) {
  5005. return MEMORY_E;
  5006. }
  5007. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  5008. #endif
  5009. #ifdef OPENSSL_EXTRA
  5010. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  5011. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  5012. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  5013. WOLFSSL_MSG("ssl->param memory error");
  5014. return MEMORY_E;
  5015. }
  5016. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  5017. #endif
  5018. #ifdef SINGLE_THREADED
  5019. if (ctx->suites == NULL)
  5020. #endif
  5021. {
  5022. /* suites */
  5023. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  5024. DYNAMIC_TYPE_SUITES);
  5025. if (ssl->suites == NULL) {
  5026. WOLFSSL_MSG("Suites Memory error");
  5027. return MEMORY_E;
  5028. }
  5029. #ifdef OPENSSL_ALL
  5030. ssl->suites->stack = NULL;
  5031. #endif
  5032. #ifdef SINGLE_THREADED
  5033. ssl->options.ownSuites = 1;
  5034. #endif
  5035. }
  5036. #ifdef SINGLE_THREADED
  5037. else {
  5038. ssl->options.ownSuites = 0;
  5039. }
  5040. #endif
  5041. }
  5042. /* Initialize SSL with the appropriate fields from it's ctx */
  5043. /* requires valid arrays and suites unless writeDup ing */
  5044. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS)
  5045. return ret;
  5046. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  5047. #ifdef SINGLE_THREADED
  5048. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  5049. #endif
  5050. if (ssl->rng == NULL) {
  5051. /* RNG */
  5052. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  5053. if (ssl->rng == NULL) {
  5054. WOLFSSL_MSG("RNG Memory error");
  5055. return MEMORY_E;
  5056. }
  5057. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  5058. ssl->options.weOwnRng = 1;
  5059. /* FIPS RNG API does not accept a heap hint */
  5060. #ifndef HAVE_FIPS
  5061. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  5062. WOLFSSL_MSG("RNG Init error");
  5063. return ret;
  5064. }
  5065. #else
  5066. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  5067. WOLFSSL_MSG("RNG Init error");
  5068. return ret;
  5069. }
  5070. #endif
  5071. }
  5072. #ifdef HAVE_WRITE_DUP
  5073. if (writeDup) {
  5074. /* all done */
  5075. return 0;
  5076. }
  5077. #endif
  5078. /* hsHashes */
  5079. ret = InitHandshakeHashes(ssl);
  5080. if (ret != 0)
  5081. return ret;
  5082. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  5083. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  5084. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  5085. if (ret != 0) {
  5086. WOLFSSL_MSG("DTLS Cookie Secret error");
  5087. return ret;
  5088. }
  5089. }
  5090. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  5091. #ifdef HAVE_SECRET_CALLBACK
  5092. ssl->sessionSecretCb = NULL;
  5093. ssl->sessionSecretCtx = NULL;
  5094. #ifdef WOLFSSL_TLS13
  5095. ssl->tls13SecretCb = NULL;
  5096. ssl->tls13SecretCtx = NULL;
  5097. #endif
  5098. #endif
  5099. #ifdef HAVE_SESSION_TICKET
  5100. ssl->session.ticket = ssl->session.staticTicket;
  5101. #endif
  5102. #ifdef WOLFSSL_MULTICAST
  5103. if (ctx->haveMcast) {
  5104. int i;
  5105. ssl->options.haveMcast = 1;
  5106. ssl->options.mcastID = ctx->mcastID;
  5107. /* Force the state to look like handshake has completed. */
  5108. /* Keying material is supplied externally. */
  5109. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  5110. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  5111. ssl->options.connectState = SECOND_REPLY_DONE;
  5112. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  5113. ssl->options.handShakeState = HANDSHAKE_DONE;
  5114. ssl->options.handShakeDone = 1;
  5115. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  5116. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  5117. }
  5118. #endif
  5119. #ifdef HAVE_SECURE_RENEGOTIATION
  5120. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5121. int useSecureReneg = ssl->ctx->useSecureReneg;
  5122. /* use secure renegotiation by default (not recommend) */
  5123. #ifdef WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT
  5124. useSecureReneg = 1;
  5125. #endif
  5126. if (useSecureReneg) {
  5127. ret = wolfSSL_UseSecureRenegotiation(ssl);
  5128. if (ret != WOLFSSL_SUCCESS)
  5129. return ret;
  5130. }
  5131. }
  5132. #endif /* HAVE_SECURE_RENEGOTIATION */
  5133. return 0;
  5134. }
  5135. /* free use of temporary arrays */
  5136. void FreeArrays(WOLFSSL* ssl, int keep)
  5137. {
  5138. if (ssl->arrays) {
  5139. if (keep) {
  5140. /* keeps session id for user retrieval */
  5141. XMEMCPY(ssl->session.sessionID, ssl->arrays->sessionID, ID_LEN);
  5142. ssl->session.sessionIDSz = ssl->arrays->sessionIDSz;
  5143. }
  5144. if (ssl->arrays->preMasterSecret) {
  5145. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  5146. ssl->arrays->preMasterSecret = NULL;
  5147. }
  5148. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  5149. ssl->arrays->pendingMsg = NULL;
  5150. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  5151. }
  5152. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  5153. ssl->arrays = NULL;
  5154. }
  5155. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  5156. {
  5157. if (ssl && pKey && *pKey) {
  5158. switch (type) {
  5159. #ifndef NO_RSA
  5160. case DYNAMIC_TYPE_RSA:
  5161. wc_FreeRsaKey((RsaKey*)*pKey);
  5162. break;
  5163. #endif /* ! NO_RSA */
  5164. #ifdef HAVE_ECC
  5165. case DYNAMIC_TYPE_ECC:
  5166. wc_ecc_free((ecc_key*)*pKey);
  5167. break;
  5168. #endif /* HAVE_ECC */
  5169. #ifdef HAVE_ED25519
  5170. case DYNAMIC_TYPE_ED25519:
  5171. wc_ed25519_free((ed25519_key*)*pKey);
  5172. break;
  5173. #endif /* HAVE_ED25519 */
  5174. #ifdef HAVE_CURVE25519
  5175. case DYNAMIC_TYPE_CURVE25519:
  5176. wc_curve25519_free((curve25519_key*)*pKey);
  5177. break;
  5178. #endif /* HAVE_CURVE25519 */
  5179. #ifdef HAVE_ED448
  5180. case DYNAMIC_TYPE_ED448:
  5181. wc_ed448_free((ed448_key*)*pKey);
  5182. break;
  5183. #endif /* HAVE_ED448 */
  5184. #ifdef HAVE_CURVE448
  5185. case DYNAMIC_TYPE_CURVE448:
  5186. wc_curve448_free((curve448_key*)*pKey);
  5187. break;
  5188. #endif /* HAVE_CURVE448 */
  5189. #ifndef NO_DH
  5190. case DYNAMIC_TYPE_DH:
  5191. wc_FreeDhKey((DhKey*)*pKey);
  5192. break;
  5193. #endif /* !NO_DH */
  5194. default:
  5195. break;
  5196. }
  5197. XFREE(*pKey, ssl->heap, type);
  5198. /* Reset pointer */
  5199. *pKey = NULL;
  5200. }
  5201. }
  5202. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  5203. {
  5204. int ret = BAD_FUNC_ARG;
  5205. int sz = 0;
  5206. if (ssl == NULL || pKey == NULL) {
  5207. return BAD_FUNC_ARG;
  5208. }
  5209. /* Sanity check key destination */
  5210. if (*pKey != NULL) {
  5211. WOLFSSL_MSG("Key already present!");
  5212. return BAD_STATE_E;
  5213. }
  5214. /* Determine size */
  5215. switch (type) {
  5216. #ifndef NO_RSA
  5217. case DYNAMIC_TYPE_RSA:
  5218. sz = sizeof(RsaKey);
  5219. break;
  5220. #endif /* ! NO_RSA */
  5221. #ifdef HAVE_ECC
  5222. case DYNAMIC_TYPE_ECC:
  5223. sz = sizeof(ecc_key);
  5224. break;
  5225. #endif /* HAVE_ECC */
  5226. #ifdef HAVE_ED25519
  5227. case DYNAMIC_TYPE_ED25519:
  5228. sz = sizeof(ed25519_key);
  5229. break;
  5230. #endif /* HAVE_ED25519 */
  5231. #ifdef HAVE_CURVE25519
  5232. case DYNAMIC_TYPE_CURVE25519:
  5233. sz = sizeof(curve25519_key);
  5234. break;
  5235. #endif /* HAVE_CURVE25519 */
  5236. #ifdef HAVE_ED448
  5237. case DYNAMIC_TYPE_ED448:
  5238. sz = sizeof(ed448_key);
  5239. break;
  5240. #endif /* HAVE_ED448 */
  5241. #ifdef HAVE_CURVE448
  5242. case DYNAMIC_TYPE_CURVE448:
  5243. sz = sizeof(curve448_key);
  5244. break;
  5245. #endif /* HAVE_CURVE448 */
  5246. #ifndef NO_DH
  5247. case DYNAMIC_TYPE_DH:
  5248. sz = sizeof(DhKey);
  5249. break;
  5250. #endif /* !NO_DH */
  5251. default:
  5252. return BAD_FUNC_ARG;
  5253. }
  5254. if (sz == 0) {
  5255. return NOT_COMPILED_IN;
  5256. }
  5257. /* Allocate memory for key */
  5258. *pKey = XMALLOC(sz, ssl->heap, type);
  5259. if (*pKey == NULL) {
  5260. return MEMORY_E;
  5261. }
  5262. /* Initialize key */
  5263. switch (type) {
  5264. #ifndef NO_RSA
  5265. case DYNAMIC_TYPE_RSA:
  5266. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  5267. break;
  5268. #endif /* ! NO_RSA */
  5269. #ifdef HAVE_ECC
  5270. case DYNAMIC_TYPE_ECC:
  5271. ret = wc_ecc_init_ex((ecc_key*)*pKey, ssl->heap, ssl->devId);
  5272. break;
  5273. #endif /* HAVE_ECC */
  5274. #ifdef HAVE_ED25519
  5275. case DYNAMIC_TYPE_ED25519:
  5276. wc_ed25519_init((ed25519_key*)*pKey);
  5277. ret = 0;
  5278. break;
  5279. #endif /* HAVE_CURVE25519 */
  5280. #ifdef HAVE_CURVE25519
  5281. case DYNAMIC_TYPE_CURVE25519:
  5282. wc_curve25519_init((curve25519_key*)*pKey);
  5283. ret = 0;
  5284. break;
  5285. #endif /* HAVE_CURVE25519 */
  5286. #ifdef HAVE_ED448
  5287. case DYNAMIC_TYPE_ED448:
  5288. wc_ed448_init((ed448_key*)*pKey);
  5289. ret = 0;
  5290. break;
  5291. #endif /* HAVE_CURVE448 */
  5292. #ifdef HAVE_CURVE448
  5293. case DYNAMIC_TYPE_CURVE448:
  5294. wc_curve448_init((curve448_key*)*pKey);
  5295. ret = 0;
  5296. break;
  5297. #endif /* HAVE_CURVE448 */
  5298. #ifndef NO_DH
  5299. case DYNAMIC_TYPE_DH:
  5300. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  5301. break;
  5302. #endif /* !NO_DH */
  5303. default:
  5304. return BAD_FUNC_ARG;
  5305. }
  5306. /* On error free handshake key */
  5307. if (ret != 0) {
  5308. FreeKey(ssl, type, pKey);
  5309. }
  5310. return ret;
  5311. }
  5312. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  5313. defined(HAVE_CURVE25519) || defined(HHAVE_ED448) || defined(HAVE_CURVE448)
  5314. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  5315. {
  5316. int ret = 0;
  5317. (void)ssl;
  5318. switch (type) {
  5319. #ifndef NO_RSA
  5320. case DYNAMIC_TYPE_RSA:
  5321. wc_FreeRsaKey((RsaKey*)pKey);
  5322. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  5323. break;
  5324. #endif /* ! NO_RSA */
  5325. #ifdef HAVE_ECC
  5326. case DYNAMIC_TYPE_ECC:
  5327. wc_ecc_free((ecc_key*)pKey);
  5328. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  5329. break;
  5330. #endif /* HAVE_ECC */
  5331. #ifdef HAVE_ED25519
  5332. case DYNAMIC_TYPE_ED25519:
  5333. wc_ed25519_free((ed25519_key*)pKey);
  5334. ret = wc_ed25519_init((ed25519_key*)pKey);
  5335. break;
  5336. #endif /* HAVE_CURVE25519 */
  5337. #ifdef HAVE_CURVE25519
  5338. case DYNAMIC_TYPE_CURVE25519:
  5339. wc_curve25519_free((curve25519_key*)pKey);
  5340. ret = wc_curve25519_init((curve25519_key*)pKey);
  5341. break;
  5342. #endif /* HAVE_CURVE25519 */
  5343. #ifdef HAVE_ED448
  5344. case DYNAMIC_TYPE_ED448:
  5345. wc_ed448_free((ed448_key*)pKey);
  5346. ret = wc_ed448_init((ed448_key*)pKey);
  5347. break;
  5348. #endif /* HAVE_CURVE448 */
  5349. #ifdef HAVE_CURVE448
  5350. case DYNAMIC_TYPE_CURVE448:
  5351. wc_curve448_free((curve448_key*)pKey);
  5352. ret = wc_curve448_init((curve448_key*)pKey);
  5353. break;
  5354. #endif /* HAVE_CURVE448 */
  5355. #ifndef NO_DH
  5356. case DYNAMIC_TYPE_DH:
  5357. wc_FreeDhKey((DhKey*)pKey);
  5358. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  5359. break;
  5360. #endif /* !NO_DH */
  5361. default:
  5362. return BAD_FUNC_ARG;
  5363. }
  5364. return ret;
  5365. }
  5366. #endif
  5367. void FreeKeyExchange(WOLFSSL* ssl)
  5368. {
  5369. /* Cleanup signature buffer */
  5370. if (ssl->buffers.sig.buffer) {
  5371. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  5372. ssl->buffers.sig.buffer = NULL;
  5373. ssl->buffers.sig.length = 0;
  5374. }
  5375. /* Cleanup digest buffer */
  5376. if (ssl->buffers.digest.buffer) {
  5377. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  5378. ssl->buffers.digest.buffer = NULL;
  5379. ssl->buffers.digest.length = 0;
  5380. }
  5381. /* Free handshake key */
  5382. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  5383. #ifndef NO_DH
  5384. /* Free temp DH key */
  5385. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  5386. #endif
  5387. /* Cleanup async */
  5388. #ifdef WOLFSSL_ASYNC_CRYPT
  5389. if (ssl->async.freeArgs) {
  5390. ssl->async.freeArgs(ssl, ssl->async.args);
  5391. ssl->async.freeArgs = NULL;
  5392. }
  5393. FreeBuildMsgArgs(ssl, &ssl->async.buildArgs);
  5394. #endif
  5395. }
  5396. /* Free up all memory used by Suites structure from WOLFSSL */
  5397. void FreeSuites(WOLFSSL* ssl)
  5398. {
  5399. #ifdef SINGLE_THREADED
  5400. if (ssl->options.ownSuites)
  5401. #endif
  5402. {
  5403. #ifdef OPENSSL_ALL
  5404. wolfSSL_sk_SSL_CIPHER_free(ssl->suites->stack);
  5405. #endif
  5406. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  5407. }
  5408. ssl->suites = NULL;
  5409. }
  5410. /* In case holding SSL object in array and don't want to free actual ssl */
  5411. void SSL_ResourceFree(WOLFSSL* ssl)
  5412. {
  5413. /* Note: any resources used during the handshake should be released in the
  5414. * function FreeHandshakeResources(). Be careful with the special cases
  5415. * like the RNG which may optionally be kept for the whole session. (For
  5416. * example with the RNG, it isn't used beyond the handshake except when
  5417. * using stream ciphers where it is retained. */
  5418. FreeCiphers(ssl);
  5419. FreeArrays(ssl, 0);
  5420. FreeKeyExchange(ssl);
  5421. if (ssl->options.weOwnRng) {
  5422. wc_FreeRng(ssl->rng);
  5423. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  5424. }
  5425. FreeSuites(ssl);
  5426. FreeHandshakeHashes(ssl);
  5427. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  5428. /* clear keys struct after session */
  5429. ForceZero(&ssl->keys, sizeof(Keys));
  5430. #ifdef WOLFSSL_TLS13
  5431. if (ssl->options.tls1_3) {
  5432. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  5433. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  5434. }
  5435. #endif
  5436. #ifndef NO_DH
  5437. if (ssl->buffers.serverDH_Priv.buffer) {
  5438. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  5439. ssl->buffers.serverDH_Priv.length);
  5440. }
  5441. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5442. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5443. /* parameters (p,g) may be owned by ctx */
  5444. if (ssl->buffers.weOwnDH) {
  5445. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5446. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5447. }
  5448. #endif /* !NO_DH */
  5449. #ifndef NO_CERTS
  5450. ssl->keepCert = 0; /* make sure certificate is free'd */
  5451. wolfSSL_UnloadCertsKeys(ssl);
  5452. #endif
  5453. #ifndef NO_RSA
  5454. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  5455. ssl->peerRsaKeyPresent = 0;
  5456. #endif
  5457. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  5458. XFREE(ssl->peerTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
  5459. #endif
  5460. if (ssl->buffers.inputBuffer.dynamicFlag)
  5461. ShrinkInputBuffer(ssl, FORCED_FREE);
  5462. if (ssl->buffers.outputBuffer.dynamicFlag)
  5463. ShrinkOutputBuffer(ssl);
  5464. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  5465. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  5466. DYNAMIC_TYPE_COOKIE_PWD);
  5467. #endif
  5468. #ifdef WOLFSSL_DTLS
  5469. DtlsMsgPoolReset(ssl);
  5470. if (ssl->dtls_rx_msg_list != NULL) {
  5471. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  5472. ssl->dtls_rx_msg_list = NULL;
  5473. ssl->dtls_rx_msg_list_sz = 0;
  5474. }
  5475. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  5476. ssl->buffers.dtlsCtx.peer.sa = NULL;
  5477. #ifndef NO_WOLFSSL_SERVER
  5478. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  5479. DYNAMIC_TYPE_COOKIE_PWD);
  5480. #endif
  5481. #endif /* WOLFSSL_DTLS */
  5482. #ifdef OPENSSL_EXTRA
  5483. if (ssl->biord != ssl->biowr) /* only free write if different */
  5484. wolfSSL_BIO_free(ssl->biowr);
  5485. wolfSSL_BIO_free(ssl->biord); /* always free read bio */
  5486. ssl->biowr = NULL;
  5487. ssl->biord = NULL;
  5488. #endif
  5489. #ifdef HAVE_LIBZ
  5490. FreeStreams(ssl);
  5491. #endif
  5492. #ifdef HAVE_ECC
  5493. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  5494. ssl->peerEccKeyPresent = 0;
  5495. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  5496. ssl->peerEccDsaKeyPresent = 0;
  5497. #endif
  5498. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
  5499. {
  5500. int dtype = 0;
  5501. #ifdef HAVE_ECC
  5502. dtype = DYNAMIC_TYPE_ECC;
  5503. #endif
  5504. #ifdef HAVE_CURVE25519
  5505. if (ssl->peerX25519KeyPresent
  5506. #ifdef HAVE_ECC
  5507. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
  5508. #endif /* HAVE_ECC */
  5509. )
  5510. {
  5511. dtype = DYNAMIC_TYPE_CURVE25519;
  5512. }
  5513. #endif /* HAVE_CURVE25519 */
  5514. #ifdef HAVE_CURVE448
  5515. if (ssl->peerX448KeyPresent
  5516. #ifdef HAVE_ECC
  5517. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
  5518. #endif /* HAVE_ECC */
  5519. )
  5520. {
  5521. dtype = DYNAMIC_TYPE_CURVE448;
  5522. }
  5523. #endif /* HAVE_CURVE448 */
  5524. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  5525. ssl->eccTempKeyPresent = 0;
  5526. }
  5527. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  5528. #ifdef HAVE_CURVE25519
  5529. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  5530. ssl->peerX25519KeyPresent = 0;
  5531. #endif
  5532. #ifdef HAVE_ED25519
  5533. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  5534. ssl->peerEd25519KeyPresent = 0;
  5535. #ifdef HAVE_PK_CALLBACKS
  5536. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  5537. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  5538. DYNAMIC_TYPE_ED25519);
  5539. ssl->buffers.peerEd25519Key.buffer = NULL;
  5540. }
  5541. #endif
  5542. #endif
  5543. #ifdef HAVE_CURVE448
  5544. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  5545. ssl->peerX448KeyPresent = 0;
  5546. #endif
  5547. #ifdef HAVE_ED448
  5548. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  5549. ssl->peerEd448KeyPresent = 0;
  5550. #ifdef HAVE_PK_CALLBACKS
  5551. if (ssl->buffers.peerEd448Key.buffer != NULL) {
  5552. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
  5553. DYNAMIC_TYPE_ED448);
  5554. ssl->buffers.peerEd448Key.buffer = NULL;
  5555. }
  5556. #endif
  5557. #endif
  5558. #ifdef HAVE_PK_CALLBACKS
  5559. #ifdef HAVE_ECC
  5560. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  5561. #endif /* HAVE_ECC */
  5562. #ifndef NO_RSA
  5563. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  5564. #endif /* NO_RSA */
  5565. #endif /* HAVE_PK_CALLBACKS */
  5566. #ifdef HAVE_TLS_EXTENSIONS
  5567. TLSX_FreeAll(ssl->extensions, ssl->heap);
  5568. #ifdef HAVE_ALPN
  5569. if (ssl->alpn_client_list != NULL) {
  5570. XFREE(ssl->alpn_client_list, ssl->heap, DYNAMIC_TYPE_ALPN);
  5571. ssl->alpn_client_list = NULL;
  5572. }
  5573. #endif
  5574. #endif /* HAVE_TLS_EXTENSIONS */
  5575. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  5576. if (ssl->mnCtx) {
  5577. mynewt_ctx_clear(ssl->mnCtx);
  5578. ssl->mnCtx = NULL;
  5579. }
  5580. #endif
  5581. #ifdef HAVE_NETX
  5582. if (ssl->nxCtx.nxPacket)
  5583. nx_packet_release(ssl->nxCtx.nxPacket);
  5584. #endif
  5585. #ifdef KEEP_PEER_CERT
  5586. FreeX509(&ssl->peerCert);
  5587. #endif
  5588. #ifdef HAVE_SESSION_TICKET
  5589. if (ssl->session.isDynamic) {
  5590. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  5591. ssl->session.ticket = ssl->session.staticTicket;
  5592. ssl->session.isDynamic = 0;
  5593. ssl->session.ticketLen = 0;
  5594. }
  5595. #endif
  5596. #ifdef HAVE_EXT_CACHE
  5597. wolfSSL_SESSION_free(ssl->extSession);
  5598. #endif
  5599. #ifdef HAVE_WRITE_DUP
  5600. if (ssl->dupWrite) {
  5601. FreeWriteDup(ssl);
  5602. }
  5603. #endif
  5604. #ifdef OPENSSL_EXTRA
  5605. if (ssl->param) {
  5606. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  5607. }
  5608. #endif
  5609. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5610. while (ssl->certReqCtx != NULL) {
  5611. CertReqCtx* curr = ssl->certReqCtx;
  5612. ssl->certReqCtx = curr->next;
  5613. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  5614. }
  5615. #endif
  5616. #ifdef WOLFSSL_STATIC_EPHEMERAL
  5617. if (ssl->staticKE.key != NULL && ssl->staticKE.key != ssl->ctx->staticKE.key) {
  5618. FreeDer(&ssl->staticKE.key);
  5619. }
  5620. #endif
  5621. #ifdef WOLFSSL_STATIC_MEMORY
  5622. /* check if using fixed io buffers and free them */
  5623. if (ssl->heap != NULL) {
  5624. #ifdef WOLFSSL_HEAP_TEST
  5625. /* avoid dereferencing a test value */
  5626. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  5627. #endif
  5628. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  5629. WOLFSSL_HEAP* ctx_heap;
  5630. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  5631. ctx_heap = ssl_hint->memory;
  5632. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  5633. WOLFSSL_MSG("Bad memory_mutex lock");
  5634. }
  5635. ctx_heap->curIO--;
  5636. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  5637. WOLFSSL_MSG("Error freeing fixed output buffer");
  5638. }
  5639. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  5640. WOLFSSL_MSG("Error freeing fixed output buffer");
  5641. }
  5642. if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/
  5643. ctx_heap->curHa--;
  5644. }
  5645. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  5646. /* check if tracking stats */
  5647. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  5648. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  5649. }
  5650. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  5651. #ifdef WOLFSSL_HEAP_TEST
  5652. }
  5653. #endif
  5654. }
  5655. #endif /* WOLFSSL_STATIC_MEMORY */
  5656. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  5657. wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
  5658. wolfSSL_sk_X509_free(ssl->peerCertChain);
  5659. #endif
  5660. }
  5661. /* Free any handshake resources no longer needed */
  5662. void FreeHandshakeResources(WOLFSSL* ssl)
  5663. {
  5664. #ifdef HAVE_SECURE_RENEGOTIATION
  5665. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  5666. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  5667. return;
  5668. }
  5669. #endif
  5670. /* input buffer */
  5671. if (ssl->buffers.inputBuffer.dynamicFlag)
  5672. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  5673. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5674. if (!ssl->options.tls1_3)
  5675. #endif
  5676. {
  5677. #ifndef OPENSSL_ALL
  5678. /* free suites unless using compatibility layer */
  5679. FreeSuites(ssl);
  5680. #endif
  5681. /* hsHashes */
  5682. FreeHandshakeHashes(ssl);
  5683. }
  5684. /* RNG */
  5685. if (ssl->options.tls1_1 == 0
  5686. #ifndef WOLFSSL_AEAD_ONLY
  5687. || ssl->specs.cipher_type == stream
  5688. #endif
  5689. #if defined(WOLFSSL_TLS13)
  5690. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5691. || ssl->options.tls1_3
  5692. #elif !defined(HAVE_SESSION_TICKET)
  5693. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  5694. #endif
  5695. #endif
  5696. ) {
  5697. if (ssl->options.weOwnRng) {
  5698. wc_FreeRng(ssl->rng);
  5699. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  5700. ssl->rng = NULL;
  5701. ssl->options.weOwnRng = 0;
  5702. }
  5703. }
  5704. #ifdef WOLFSSL_DTLS
  5705. /* DTLS_POOL */
  5706. if (ssl->options.dtls) {
  5707. DtlsMsgPoolReset(ssl);
  5708. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  5709. ssl->dtls_rx_msg_list = NULL;
  5710. ssl->dtls_rx_msg_list_sz = 0;
  5711. }
  5712. #endif
  5713. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  5714. defined(HAVE_SESSION_TICKET)
  5715. if (!ssl->options.tls1_3)
  5716. #endif
  5717. /* arrays */
  5718. if (ssl->options.saveArrays == 0)
  5719. FreeArrays(ssl, 1);
  5720. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5721. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  5722. #endif
  5723. {
  5724. #ifndef NO_RSA
  5725. /* peerRsaKey */
  5726. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  5727. ssl->peerRsaKeyPresent = 0;
  5728. #endif
  5729. #ifdef HAVE_ECC
  5730. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  5731. ssl->peerEccDsaKeyPresent = 0;
  5732. #endif /* HAVE_ECC */
  5733. #ifdef HAVE_ED25519
  5734. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  5735. ssl->peerEd25519KeyPresent = 0;
  5736. #endif /* HAVE_ED25519 */
  5737. #ifdef HAVE_ED448
  5738. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  5739. ssl->peerEd448KeyPresent = 0;
  5740. #endif /* HAVE_ED448 */
  5741. }
  5742. #ifdef HAVE_ECC
  5743. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  5744. ssl->peerEccKeyPresent = 0;
  5745. #endif
  5746. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  5747. {
  5748. int dtype;
  5749. #ifdef HAVE_ECC
  5750. dtype = DYNAMIC_TYPE_ECC;
  5751. #endif
  5752. #ifdef HAVE_CURVE25519
  5753. #ifdef HAVE_ECC
  5754. if (ssl->peerX25519KeyPresent ||
  5755. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  5756. #endif /* HAVE_ECC */
  5757. {
  5758. dtype = DYNAMIC_TYPE_CURVE25519;
  5759. }
  5760. #endif /* HAVE_CURVE25519 */
  5761. #ifdef HAVE_CURVE448
  5762. #ifdef HAVE_ECC
  5763. if (ssl->peerX448KeyPresent ||
  5764. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
  5765. #endif /* HAVE_ECC */
  5766. {
  5767. dtype = DYNAMIC_TYPE_CURVE448;
  5768. }
  5769. #endif /* HAVE_CURVE448 */
  5770. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  5771. ssl->eccTempKeyPresent = 0;
  5772. }
  5773. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  5774. #ifdef HAVE_CURVE25519
  5775. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  5776. ssl->peerX25519KeyPresent = 0;
  5777. #endif
  5778. #ifdef HAVE_CURVE448
  5779. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  5780. ssl->peerX448KeyPresent = 0;
  5781. #endif
  5782. #ifndef NO_DH
  5783. if (ssl->buffers.serverDH_Priv.buffer) {
  5784. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  5785. ssl->buffers.serverDH_Priv.length);
  5786. }
  5787. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  5788. ssl->buffers.serverDH_Priv.buffer = NULL;
  5789. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5790. ssl->buffers.serverDH_Pub.buffer = NULL;
  5791. /* parameters (p,g) may be owned by ctx */
  5792. if (ssl->buffers.weOwnDH) {
  5793. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5794. ssl->buffers.serverDH_G.buffer = NULL;
  5795. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  5796. ssl->buffers.serverDH_P.buffer = NULL;
  5797. }
  5798. #endif /* !NO_DH */
  5799. #ifndef NO_CERTS
  5800. wolfSSL_UnloadCertsKeys(ssl);
  5801. #endif
  5802. #ifdef HAVE_PK_CALLBACKS
  5803. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5804. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  5805. #endif
  5806. {
  5807. #ifdef HAVE_ECC
  5808. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  5809. ssl->buffers.peerEccDsaKey.buffer = NULL;
  5810. #endif /* HAVE_ECC */
  5811. #ifndef NO_RSA
  5812. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  5813. ssl->buffers.peerRsaKey.buffer = NULL;
  5814. #endif /* NO_RSA */
  5815. #ifdef HAVE_ED25519
  5816. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  5817. DYNAMIC_TYPE_ED25519);
  5818. ssl->buffers.peerEd25519Key.buffer = NULL;
  5819. #endif
  5820. #ifdef HAVE_ED448
  5821. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
  5822. ssl->buffers.peerEd448Key.buffer = NULL;
  5823. #endif
  5824. }
  5825. #endif /* HAVE_PK_CALLBACKS */
  5826. #ifdef HAVE_QSH
  5827. QSH_FreeAll(ssl);
  5828. #endif
  5829. #ifdef HAVE_SESSION_TICKET
  5830. if (ssl->session.isDynamic) {
  5831. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  5832. ssl->session.ticket = ssl->session.staticTicket;
  5833. ssl->session.isDynamic = 0;
  5834. ssl->session.ticketLen = 0;
  5835. }
  5836. #endif
  5837. #if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \
  5838. !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5839. /* Some extensions need to be kept for post-handshake querying. */
  5840. TLSX_FreeAll(ssl->extensions, ssl->heap);
  5841. ssl->extensions = NULL;
  5842. #endif
  5843. #ifdef WOLFSSL_STATIC_MEMORY
  5844. /* when done with handshake decrement current handshake count */
  5845. if (ssl->heap != NULL) {
  5846. #ifdef WOLFSSL_HEAP_TEST
  5847. /* avoid dereferencing a test value */
  5848. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  5849. #endif
  5850. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  5851. WOLFSSL_HEAP* ctx_heap;
  5852. ctx_heap = ssl_hint->memory;
  5853. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  5854. WOLFSSL_MSG("Bad memory_mutex lock");
  5855. }
  5856. ctx_heap->curHa--;
  5857. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  5858. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  5859. #ifdef WOLFSSL_HEAP_TEST
  5860. }
  5861. #endif
  5862. }
  5863. #endif /* WOLFSSL_STATIC_MEMORY */
  5864. }
  5865. /* heap argument is the heap hint used when creating SSL */
  5866. void FreeSSL(WOLFSSL* ssl, void* heap)
  5867. {
  5868. if (ssl->ctx) {
  5869. FreeSSL_Ctx(ssl->ctx); /* will decrement and free underlying CTX if 0 */
  5870. }
  5871. SSL_ResourceFree(ssl);
  5872. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  5873. (void)heap;
  5874. }
  5875. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  5876. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \
  5877. && defined(HAVE_AEAD))
  5878. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  5879. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  5880. {
  5881. if (verify) {
  5882. seq[0] = ssl->keys.peer_sequence_number_hi;
  5883. seq[1] = ssl->keys.peer_sequence_number_lo++;
  5884. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  5885. /* handle rollover */
  5886. ssl->keys.peer_sequence_number_hi++;
  5887. }
  5888. }
  5889. else {
  5890. seq[0] = ssl->keys.sequence_number_hi;
  5891. seq[1] = ssl->keys.sequence_number_lo++;
  5892. if (seq[1] > ssl->keys.sequence_number_lo) {
  5893. /* handle rollover */
  5894. ssl->keys.sequence_number_hi++;
  5895. }
  5896. }
  5897. }
  5898. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  5899. #ifdef WOLFSSL_DTLS
  5900. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  5901. {
  5902. #ifdef HAVE_SECURE_RENEGOTIATION
  5903. order = DtlsCheckOrder(ssl, order);
  5904. #endif
  5905. if (order == PREV_ORDER) {
  5906. /* Previous epoch case */
  5907. if (ssl->options.haveMcast) {
  5908. #ifdef WOLFSSL_MULTICAST
  5909. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  5910. (ssl->options.mcastID << 8) |
  5911. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  5912. #endif
  5913. }
  5914. else
  5915. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  5916. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  5917. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  5918. }
  5919. else if (order == PEER_ORDER) {
  5920. if (ssl->options.haveMcast) {
  5921. #ifdef WOLFSSL_MULTICAST
  5922. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  5923. (ssl->keys.curPeerId << 8) |
  5924. (ssl->keys.curSeq_hi & 0xFF);
  5925. #endif
  5926. }
  5927. else
  5928. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  5929. (ssl->keys.curSeq_hi & 0xFFFF);
  5930. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  5931. }
  5932. else {
  5933. if (ssl->options.haveMcast) {
  5934. #ifdef WOLFSSL_MULTICAST
  5935. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  5936. (ssl->options.mcastID << 8) |
  5937. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  5938. #endif
  5939. }
  5940. else
  5941. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  5942. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  5943. seq[1] = ssl->keys.dtls_sequence_number_lo;
  5944. }
  5945. }
  5946. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  5947. {
  5948. word32 seq;
  5949. #ifdef HAVE_SECURE_RENEGOTIATION
  5950. order = DtlsCheckOrder(ssl, order);
  5951. #endif
  5952. if (order == PREV_ORDER) {
  5953. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  5954. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  5955. /* handle rollover */
  5956. ssl->keys.dtls_prev_sequence_number_hi++;
  5957. }
  5958. }
  5959. else if (order == PEER_ORDER) {
  5960. seq = ssl->keys.peer_sequence_number_lo++;
  5961. if (seq > ssl->keys.peer_sequence_number_lo) {
  5962. /* handle rollover */
  5963. ssl->keys.peer_sequence_number_hi++;
  5964. }
  5965. }
  5966. else {
  5967. seq = ssl->keys.dtls_sequence_number_lo++;
  5968. if (seq > ssl->keys.dtls_sequence_number_lo) {
  5969. /* handle rollover */
  5970. ssl->keys.dtls_sequence_number_hi++;
  5971. }
  5972. }
  5973. }
  5974. #endif /* WOLFSSL_DTLS */
  5975. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  5976. void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  5977. {
  5978. word32 seq[2] = {0, 0};
  5979. if (!ssl->options.dtls) {
  5980. GetSEQIncrement(ssl, verifyOrder, seq);
  5981. }
  5982. else {
  5983. #ifdef WOLFSSL_DTLS
  5984. DtlsGetSEQ(ssl, verifyOrder, seq);
  5985. #endif
  5986. }
  5987. c32toa(seq[0], out);
  5988. c32toa(seq[1], out + OPAQUE32_LEN);
  5989. }
  5990. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  5991. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS ||
  5992. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */
  5993. #ifdef WOLFSSL_DTLS
  5994. /* functions for managing DTLS datagram reordering */
  5995. /* Need to allocate space for the handshake message header. The hashing
  5996. * routines assume the message pointer is still within the buffer that
  5997. * has the headers, and will include those headers in the hash. The store
  5998. * routines need to take that into account as well. New will allocate
  5999. * extra space for the headers. */
  6000. DtlsMsg* DtlsMsgNew(word32 sz, void* heap)
  6001. {
  6002. DtlsMsg* msg;
  6003. (void)heap;
  6004. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  6005. if (msg != NULL) {
  6006. XMEMSET(msg, 0, sizeof(DtlsMsg));
  6007. msg->buf = (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ,
  6008. heap, DYNAMIC_TYPE_DTLS_BUFFER);
  6009. if (msg->buf != NULL) {
  6010. msg->sz = sz;
  6011. msg->type = no_shake;
  6012. msg->msg = msg->buf + DTLS_HANDSHAKE_HEADER_SZ;
  6013. }
  6014. else {
  6015. XFREE(msg, heap, DYNAMIC_TYPE_DTLS_MSG);
  6016. msg = NULL;
  6017. }
  6018. }
  6019. return msg;
  6020. }
  6021. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  6022. {
  6023. (void)heap;
  6024. if (item != NULL) {
  6025. DtlsFrag* cur = item->fragList;
  6026. while (cur != NULL) {
  6027. DtlsFrag* next = cur->next;
  6028. XFREE(cur, heap, DYNAMIC_TYPE_DTLS_FRAG);
  6029. cur = next;
  6030. }
  6031. if (item->buf != NULL)
  6032. XFREE(item->buf, heap, DYNAMIC_TYPE_DTLS_BUFFER);
  6033. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  6034. }
  6035. }
  6036. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  6037. {
  6038. DtlsMsg* next;
  6039. while (head) {
  6040. next = head->next;
  6041. DtlsMsgDelete(head, heap);
  6042. head = next;
  6043. }
  6044. }
  6045. /**
  6046. * Drop messages when they are no longer going to be retransmitted
  6047. */
  6048. void DtlsTxMsgListClean(WOLFSSL* ssl)
  6049. {
  6050. DtlsMsg* head = ssl->dtls_tx_msg_list;
  6051. DtlsMsg* next;
  6052. while (head) {
  6053. next = head->next;
  6054. if (VerifyForTxDtlsMsgDelete(ssl, head))
  6055. DtlsMsgDelete(head, ssl->heap);
  6056. else
  6057. /* Stored packets should be in order so break on first failed
  6058. * verify */
  6059. break;
  6060. ssl->dtls_tx_msg_list_sz--;
  6061. /* Reset timer as deleting a node means that state has progressed */
  6062. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6063. head = next;
  6064. }
  6065. ssl->dtls_tx_msg_list = head;
  6066. }
  6067. /* Create a DTLS Fragment from *begin - end, adjust new *begin and bytesLeft */
  6068. static DtlsFrag* CreateFragment(word32* begin, word32 end, const byte* data,
  6069. byte* buf, word32* bytesLeft, void* heap)
  6070. {
  6071. DtlsFrag* newFrag;
  6072. word32 added = end - *begin + 1;
  6073. (void)heap;
  6074. newFrag = (DtlsFrag*)XMALLOC(sizeof(DtlsFrag), heap,
  6075. DYNAMIC_TYPE_DTLS_FRAG);
  6076. if (newFrag != NULL) {
  6077. newFrag->next = NULL;
  6078. newFrag->begin = *begin;
  6079. newFrag->end = end;
  6080. XMEMCPY(buf + *begin, data, added);
  6081. *bytesLeft -= added;
  6082. *begin = newFrag->end + 1;
  6083. }
  6084. return newFrag;
  6085. }
  6086. int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
  6087. word32 fragOffset, word32 fragSz, void* heap)
  6088. {
  6089. if (msg != NULL && data != NULL && msg->fragSz <= msg->sz &&
  6090. (fragOffset + fragSz) <= msg->sz) {
  6091. DtlsFrag* cur = msg->fragList;
  6092. DtlsFrag* prev = cur;
  6093. DtlsFrag* newFrag;
  6094. word32 bytesLeft = fragSz; /* could be overlapping fragment */
  6095. word32 startOffset = fragOffset;
  6096. word32 added;
  6097. msg->seq = seq;
  6098. msg->epoch = epoch;
  6099. msg->type = type;
  6100. if (fragOffset == 0) {
  6101. XMEMCPY(msg->buf, data - DTLS_HANDSHAKE_HEADER_SZ,
  6102. DTLS_HANDSHAKE_HEADER_SZ);
  6103. c32to24(msg->sz, msg->msg - DTLS_HANDSHAKE_FRAG_SZ);
  6104. }
  6105. /* if no message data, just return */
  6106. if (fragSz == 0)
  6107. return 0;
  6108. /* if list is empty add full fragment to front */
  6109. if (cur == NULL) {
  6110. newFrag = CreateFragment(&fragOffset, fragOffset + fragSz - 1, data,
  6111. msg->msg, &bytesLeft, heap);
  6112. if (newFrag == NULL)
  6113. return MEMORY_E;
  6114. msg->fragSz = fragSz;
  6115. msg->fragList = newFrag;
  6116. return 0;
  6117. }
  6118. /* add to front if before current front, up to next->begin */
  6119. if (fragOffset < cur->begin) {
  6120. word32 end = fragOffset + fragSz - 1;
  6121. if (end >= cur->begin)
  6122. end = cur->begin - 1;
  6123. added = end - fragOffset + 1;
  6124. newFrag = CreateFragment(&fragOffset, end, data, msg->msg,
  6125. &bytesLeft, heap);
  6126. if (newFrag == NULL)
  6127. return MEMORY_E;
  6128. msg->fragSz += added;
  6129. newFrag->next = cur;
  6130. msg->fragList = newFrag;
  6131. }
  6132. /* while we have bytes left, try to find a gap to fill */
  6133. while (bytesLeft > 0) {
  6134. /* get previous packet in list */
  6135. while (cur && (fragOffset >= cur->begin)) {
  6136. prev = cur;
  6137. cur = cur->next;
  6138. }
  6139. /* don't add duplicate data */
  6140. if (prev->end >= fragOffset) {
  6141. if ( (fragOffset + bytesLeft - 1) <= prev->end)
  6142. return 0;
  6143. fragOffset = prev->end + 1;
  6144. bytesLeft = startOffset + fragSz - fragOffset;
  6145. }
  6146. if (cur == NULL)
  6147. /* we're at the end */
  6148. added = bytesLeft;
  6149. else
  6150. /* we're in between two frames */
  6151. added = min(bytesLeft, cur->begin - fragOffset);
  6152. /* data already there */
  6153. if (added == 0)
  6154. continue;
  6155. newFrag = CreateFragment(&fragOffset, fragOffset + added - 1,
  6156. data + fragOffset - startOffset,
  6157. msg->msg, &bytesLeft, heap);
  6158. if (newFrag == NULL)
  6159. return MEMORY_E;
  6160. msg->fragSz += added;
  6161. newFrag->next = prev->next;
  6162. prev->next = newFrag;
  6163. }
  6164. }
  6165. return 0;
  6166. }
  6167. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word32 epoch, word32 seq)
  6168. {
  6169. while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
  6170. head = head->next;
  6171. }
  6172. return head;
  6173. }
  6174. void DtlsMsgStore(WOLFSSL* ssl, word32 epoch, word32 seq, const byte* data,
  6175. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  6176. {
  6177. /* See if seq exists in the list. If it isn't in the list, make
  6178. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  6179. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  6180. * the seq is in the list and it isn't full, copy fragSz bytes from
  6181. * data to msg->msg starting at offset fragOffset, and add fragSz to
  6182. * msg->fragSz. Insertions take into account data already in the list
  6183. * in case there are overlaps in the handshake message due to retransmit
  6184. * messages. The new item should be inserted into the list in its
  6185. * proper position.
  6186. *
  6187. * 1. Find seq in list, or where seq should go in list. If seq not in
  6188. * list, create new item and insert into list. Either case, keep
  6189. * pointer to item.
  6190. * 2. Copy the data from the message to the stored message where it
  6191. * belongs without overlaps.
  6192. */
  6193. DtlsMsg* head = ssl->dtls_rx_msg_list;
  6194. if (head != NULL) {
  6195. DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
  6196. if (cur == NULL) {
  6197. cur = DtlsMsgNew(dataSz, heap);
  6198. if (cur != NULL) {
  6199. if (DtlsMsgSet(cur, seq, epoch, data, type,
  6200. fragOffset, fragSz, heap) < 0) {
  6201. DtlsMsgDelete(cur, heap);
  6202. }
  6203. else {
  6204. ssl->dtls_rx_msg_list_sz++;
  6205. head = DtlsMsgInsert(head, cur);
  6206. }
  6207. }
  6208. }
  6209. else {
  6210. /* If this fails, the data is just dropped. */
  6211. DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
  6212. fragSz, heap);
  6213. }
  6214. }
  6215. else {
  6216. head = DtlsMsgNew(dataSz, heap);
  6217. if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
  6218. fragSz, heap) < 0) {
  6219. DtlsMsgDelete(head, heap);
  6220. head = NULL;
  6221. }
  6222. else {
  6223. ssl->dtls_rx_msg_list_sz++;
  6224. }
  6225. }
  6226. ssl->dtls_rx_msg_list = head;
  6227. }
  6228. /* DtlsMsgInsert() is an in-order insert. */
  6229. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  6230. {
  6231. if (head == NULL || (item->epoch <= head->epoch &&
  6232. item->seq < head->seq)) {
  6233. item->next = head;
  6234. head = item;
  6235. }
  6236. else if (head->next == NULL) {
  6237. head->next = item;
  6238. }
  6239. else {
  6240. DtlsMsg* cur = head->next;
  6241. DtlsMsg* prev = head;
  6242. while (cur) {
  6243. if (item->epoch <= head->epoch &&
  6244. item->seq < head->seq) {
  6245. item->next = cur;
  6246. prev->next = item;
  6247. break;
  6248. }
  6249. prev = cur;
  6250. cur = cur->next;
  6251. }
  6252. if (cur == NULL) {
  6253. prev->next = item;
  6254. }
  6255. }
  6256. return head;
  6257. }
  6258. /**
  6259. * DtlsMsgPoolSave() adds the message to the end of the stored transmit
  6260. * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
  6261. * anything else that increments ssl->keys.dtls_handshake_number.
  6262. */
  6263. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
  6264. enum HandShakeType type)
  6265. {
  6266. DtlsMsg* item;
  6267. int ret = 0;
  6268. WOLFSSL_ENTER("DtlsMsgPoolSave()");
  6269. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  6270. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  6271. return DTLS_POOL_SZ_E;
  6272. }
  6273. item = DtlsMsgNew(dataSz, ssl->heap);
  6274. if (item != NULL) {
  6275. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  6276. XMEMCPY(item->buf, data, dataSz);
  6277. item->sz = dataSz;
  6278. item->epoch = ssl->keys.dtls_epoch;
  6279. item->seq = ssl->keys.dtls_handshake_number;
  6280. item->type = type;
  6281. if (cur == NULL)
  6282. ssl->dtls_tx_msg_list = item;
  6283. else {
  6284. while (cur->next)
  6285. cur = cur->next;
  6286. cur->next = item;
  6287. }
  6288. ssl->dtls_tx_msg_list_sz++;
  6289. }
  6290. else
  6291. ret = MEMORY_E;
  6292. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  6293. return ret;
  6294. }
  6295. /* DtlsMsgPoolTimeout() updates the timeout time. */
  6296. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  6297. {
  6298. int result = -1;
  6299. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  6300. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  6301. result = 0;
  6302. }
  6303. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  6304. return result;
  6305. }
  6306. /* DtlsMsgPoolReset() deletes the stored transmit list and resets the timeout
  6307. * value. */
  6308. void DtlsMsgPoolReset(WOLFSSL* ssl)
  6309. {
  6310. WOLFSSL_ENTER("DtlsMsgPoolReset()");
  6311. if (ssl->dtls_tx_msg_list) {
  6312. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  6313. ssl->dtls_tx_msg_list = NULL;
  6314. ssl->dtls_tx_msg = NULL;
  6315. ssl->dtls_tx_msg_list_sz = 0;
  6316. }
  6317. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6318. }
  6319. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  6320. {
  6321. /**
  6322. * only the first message from previous flight should be valid
  6323. * to be used for triggering retransmission of whole DtlsMsgPool.
  6324. * change cipher suite type is not verified here
  6325. */
  6326. return ((fragOffset == 0) &&
  6327. (((ssl->options.side == WOLFSSL_SERVER_END) &&
  6328. ((type == client_hello) ||
  6329. ((ssl->options.verifyPeer) && (type == certificate)) ||
  6330. ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
  6331. ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  6332. (type == server_hello))));
  6333. }
  6334. /**
  6335. * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
  6336. * depending on the current state of the handshake negotiation.
  6337. */
  6338. int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
  6339. {
  6340. if (item->epoch < ssl->keys.dtls_epoch - 1)
  6341. /* Messages not from current or previous epoch can be deleted */
  6342. return 1;
  6343. switch (ssl->options.side) {
  6344. case WOLFSSL_CLIENT_END:
  6345. if (item->type == client_hello &&
  6346. ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
  6347. return 1; /* client can forget first client_hello if received full
  6348. * flight of packets from server */
  6349. else
  6350. return 0;
  6351. case WOLFSSL_SERVER_END:
  6352. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
  6353. item->type <= server_hello_done)
  6354. return 1; /* server can forget everything up to ServerHelloDone if
  6355. * a client finished message has been received and
  6356. * successfully processed */
  6357. else
  6358. return 0;
  6359. default:
  6360. return 0;
  6361. }
  6362. }
  6363. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  6364. * updated with new sequence numbers, and will be re-encrypted if needed. */
  6365. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  6366. {
  6367. int ret = 0;
  6368. DtlsMsg* pool;
  6369. int epochOrder;
  6370. WOLFSSL_ENTER("DtlsMsgPoolSend()");
  6371. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  6372. if (pool != NULL) {
  6373. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  6374. !(ssl->options.acceptState == SERVER_HELLO_DONE ||
  6375. ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
  6376. ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
  6377. (ssl->options.side == WOLFSSL_CLIENT_END &&
  6378. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  6379. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  6380. ssl->options.connectState == FINISHED_DONE ||
  6381. ssl->options.connectState == SECOND_REPLY_DONE))) {
  6382. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  6383. ssl->error = DTLS_RETX_OVER_TX;
  6384. return WOLFSSL_FATAL_ERROR;
  6385. }
  6386. while (pool != NULL) {
  6387. if (pool->epoch == 0) {
  6388. DtlsRecordLayerHeader* dtls;
  6389. dtls = (DtlsRecordLayerHeader*)pool->buf;
  6390. /* If the stored record's epoch is 0, and the currently set
  6391. * epoch is 0, use the "current order" sequence number.
  6392. * If the stored record's epoch is 0 and the currently set
  6393. * epoch is not 0, the stored record is considered a "previous
  6394. * order" sequence number. */
  6395. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  6396. CUR_ORDER : PREV_ORDER;
  6397. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  6398. DtlsSEQIncrement(ssl, epochOrder);
  6399. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  6400. WOLFSSL_ERROR(ret);
  6401. return ret;
  6402. }
  6403. XMEMCPY(ssl->buffers.outputBuffer.buffer +
  6404. ssl->buffers.outputBuffer.idx +
  6405. ssl->buffers.outputBuffer.length,
  6406. pool->buf, pool->sz);
  6407. ssl->buffers.outputBuffer.length += pool->sz;
  6408. }
  6409. else {
  6410. /* Handle sending packets from previous epoch */
  6411. byte* input;
  6412. byte* output;
  6413. int inputSz, sendSz;
  6414. input = pool->buf;
  6415. inputSz = pool->sz;
  6416. sendSz = inputSz + MAX_MSG_EXTRA;
  6417. #ifdef HAVE_SECURE_RENEGOTIATION
  6418. /*
  6419. * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
  6420. * ssl->keys otherwise
  6421. * PREV_ORDER will always use ssl->keys
  6422. */
  6423. if (DtlsSCRKeysSet(ssl)) {
  6424. if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  6425. epochOrder = CUR_ORDER;
  6426. else
  6427. epochOrder = PREV_ORDER;
  6428. }
  6429. else {
  6430. epochOrder = CUR_ORDER;
  6431. }
  6432. #else
  6433. epochOrder = CUR_ORDER;
  6434. #endif
  6435. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  6436. WOLFSSL_ERROR(ret);
  6437. return ret;
  6438. }
  6439. output = ssl->buffers.outputBuffer.buffer +
  6440. ssl->buffers.outputBuffer.length;
  6441. if (inputSz != ENUM_LEN)
  6442. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  6443. handshake, 0, 0, 0, epochOrder);
  6444. else
  6445. /* inputSz == ENUM_LEN must mean that this is a change cipher
  6446. * spec message */
  6447. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  6448. change_cipher_spec, 0, 0, 0, epochOrder);
  6449. if (sendSz < 0) {
  6450. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  6451. return BUILD_MSG_ERROR;
  6452. }
  6453. ssl->buffers.outputBuffer.length += sendSz;
  6454. }
  6455. if (!ssl->options.groupMessages)
  6456. ret = SendBuffered(ssl);
  6457. /**
  6458. * on server side, retransmission is being triggered only by sending
  6459. * first message of given flight, in order to trigger client
  6460. * to retransmit its whole flight. Sending the whole previous flight
  6461. * could lead to retransmission of previous client flight for each
  6462. * server message from previous flight. Therefore one message should
  6463. * be enough to do the trick.
  6464. */
  6465. if (sendOnlyFirstPacket &&
  6466. ssl->options.side == WOLFSSL_SERVER_END)
  6467. pool = NULL;
  6468. else
  6469. pool = pool->next;
  6470. ssl->dtls_tx_msg = pool;
  6471. }
  6472. if (ret == 0 && ssl->options.groupMessages)
  6473. ret = SendBuffered(ssl);
  6474. }
  6475. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  6476. return ret;
  6477. }
  6478. #endif /* WOLFSSL_DTLS */
  6479. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  6480. ProtocolVersion MakeSSLv3(void)
  6481. {
  6482. ProtocolVersion pv;
  6483. pv.major = SSLv3_MAJOR;
  6484. pv.minor = SSLv3_MINOR;
  6485. return pv;
  6486. }
  6487. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  6488. #ifdef WOLFSSL_DTLS
  6489. ProtocolVersion MakeDTLSv1(void)
  6490. {
  6491. ProtocolVersion pv;
  6492. pv.major = DTLS_MAJOR;
  6493. pv.minor = DTLS_MINOR;
  6494. return pv;
  6495. }
  6496. #ifndef WOLFSSL_NO_TLS12
  6497. ProtocolVersion MakeDTLSv1_2(void)
  6498. {
  6499. ProtocolVersion pv;
  6500. pv.major = DTLS_MAJOR;
  6501. pv.minor = DTLSv1_2_MINOR;
  6502. return pv;
  6503. }
  6504. #endif /* !WOLFSSL_NO_TLS12 */
  6505. #endif /* WOLFSSL_DTLS */
  6506. #ifndef NO_ASN_TIME
  6507. #if defined(USER_TICKS)
  6508. #if 0
  6509. word32 LowResTimer(void)
  6510. {
  6511. /*
  6512. write your own clock tick function if don't want time(0)
  6513. needs second accuracy but doesn't have to correlated to EPOCH
  6514. */
  6515. }
  6516. #endif
  6517. #elif defined(TIME_OVERRIDES)
  6518. /* use same asn time overrides unless user wants tick override above */
  6519. #ifndef HAVE_TIME_T_TYPE
  6520. typedef long time_t;
  6521. #endif
  6522. extern time_t XTIME(time_t * timer);
  6523. word32 LowResTimer(void)
  6524. {
  6525. return (word32) XTIME(0);
  6526. }
  6527. #elif defined(USE_WINDOWS_API)
  6528. word32 LowResTimer(void)
  6529. {
  6530. static int init = 0;
  6531. static LARGE_INTEGER freq;
  6532. LARGE_INTEGER count;
  6533. if (!init) {
  6534. QueryPerformanceFrequency(&freq);
  6535. init = 1;
  6536. }
  6537. QueryPerformanceCounter(&count);
  6538. return (word32)(count.QuadPart / freq.QuadPart);
  6539. }
  6540. #elif defined(HAVE_RTP_SYS)
  6541. #include "rtptime.h"
  6542. word32 LowResTimer(void)
  6543. {
  6544. return (word32)rtp_get_system_sec();
  6545. }
  6546. #elif defined(WOLFSSL_DEOS)
  6547. word32 LowResTimer(void)
  6548. {
  6549. const uint32_t systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  6550. uint32_t *systemTickPtr = systemTickPointer();
  6551. return (word32) *systemTickPtr/systemTickTimeInHz;
  6552. }
  6553. #elif defined(MICRIUM)
  6554. word32 LowResTimer(void)
  6555. {
  6556. OS_TICK ticks = 0;
  6557. OS_ERR err;
  6558. ticks = OSTimeGet(&err);
  6559. return (word32) (ticks / OSCfg_TickRate_Hz);
  6560. }
  6561. #elif defined(MICROCHIP_TCPIP_V5)
  6562. word32 LowResTimer(void)
  6563. {
  6564. return (word32) (TickGet() / TICKS_PER_SECOND);
  6565. }
  6566. #elif defined(MICROCHIP_TCPIP)
  6567. #if defined(MICROCHIP_MPLAB_HARMONY)
  6568. #include <system/tmr/sys_tmr.h>
  6569. word32 LowResTimer(void)
  6570. {
  6571. return (word32) (SYS_TMR_TickCountGet() /
  6572. SYS_TMR_TickCounterFrequencyGet());
  6573. }
  6574. #else
  6575. word32 LowResTimer(void)
  6576. {
  6577. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  6578. }
  6579. #endif
  6580. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  6581. word32 LowResTimer(void)
  6582. {
  6583. TIME_STRUCT mqxTime;
  6584. _time_get_elapsed(&mqxTime);
  6585. return (word32) mqxTime.SECONDS;
  6586. }
  6587. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  6588. #include "include/task.h"
  6589. unsigned int LowResTimer(void)
  6590. {
  6591. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  6592. }
  6593. #elif defined(FREERTOS)
  6594. #include "task.h"
  6595. unsigned int LowResTimer(void)
  6596. {
  6597. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  6598. }
  6599. #elif defined(FREESCALE_KSDK_BM)
  6600. #include "lwip/sys.h" /* lwIP */
  6601. word32 LowResTimer(void)
  6602. {
  6603. return sys_now()/1000;
  6604. }
  6605. #elif defined(WOLFSSL_TIRTOS)
  6606. word32 LowResTimer(void)
  6607. {
  6608. return (word32) Seconds_get();
  6609. }
  6610. #elif defined(WOLFSSL_XILINX)
  6611. #include "xrtcpsu.h"
  6612. word32 LowResTimer(void)
  6613. {
  6614. XRtcPsu_Config* con;
  6615. XRtcPsu rtc;
  6616. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  6617. if (con != NULL) {
  6618. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  6619. == XST_SUCCESS) {
  6620. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  6621. }
  6622. else {
  6623. WOLFSSL_MSG("Unable to initialize RTC");
  6624. }
  6625. }
  6626. return 0;
  6627. }
  6628. #elif defined(WOLFSSL_UTASKER)
  6629. word32 LowResTimer(void)
  6630. {
  6631. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  6632. }
  6633. #elif defined(WOLFSSL_NUCLEUS_1_2)
  6634. #define NU_TICKS_PER_SECOND 100
  6635. word32 LowResTimer(void)
  6636. {
  6637. /* returns number of 10ms ticks, so 100 ticks/sec */
  6638. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  6639. }
  6640. #elif defined(WOLFSSL_APACHE_MYNEWT)
  6641. #include "os/os_time.h"
  6642. word32 LowResTimer(void)
  6643. {
  6644. word32 now;
  6645. struct os_timeval tv;
  6646. os_gettimeofday(&tv, NULL);
  6647. now = (word32)tv.tv_sec;
  6648. return now;
  6649. }
  6650. #elif defined(WOLFSSL_ZEPHYR)
  6651. word32 LowResTimer(void)
  6652. {
  6653. return k_uptime_get() / 1000;
  6654. }
  6655. #else
  6656. /* Posix style time */
  6657. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  6658. #include <time.h>
  6659. #endif
  6660. word32 LowResTimer(void)
  6661. {
  6662. return (word32)XTIME(0);
  6663. }
  6664. #endif
  6665. #endif /* !NO_ASN_TIME */
  6666. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  6667. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  6668. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  6669. /* Store the message for use with CertificateVerify using EdDSA.
  6670. *
  6671. * ssl SSL/TLS object.
  6672. * data Message to store.
  6673. * sz Size of message to store.
  6674. * returns MEMORY_E if not able to reallocate, otherwise 0.
  6675. */
  6676. static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
  6677. {
  6678. int ret = 0;
  6679. byte* msgs;
  6680. if (ssl->options.cacheMessages) {
  6681. msgs = (byte*)XREALLOC(ssl->hsHashes->messages,
  6682. ssl->hsHashes->length + sz,
  6683. ssl->heap, DYNAMIC_TYPE_HASHES);
  6684. if (msgs == NULL)
  6685. ret = MEMORY_E;
  6686. if (ret == 0) {
  6687. ssl->hsHashes->messages = msgs;
  6688. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  6689. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  6690. ssl->hsHashes->length += sz;
  6691. }
  6692. }
  6693. return ret;
  6694. }
  6695. #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  6696. int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
  6697. {
  6698. int ret = 0;
  6699. (void)data;
  6700. (void)sz;
  6701. if (ssl->hsHashes == NULL) {
  6702. return BAD_FUNC_ARG;
  6703. }
  6704. #ifndef NO_OLD_TLS
  6705. #ifndef NO_SHA
  6706. wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
  6707. #endif
  6708. #ifndef NO_MD5
  6709. wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
  6710. #endif
  6711. #endif /* NO_OLD_TLS */
  6712. if (IsAtLeastTLSv1_2(ssl)) {
  6713. #ifndef NO_SHA256
  6714. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
  6715. if (ret != 0)
  6716. return ret;
  6717. #endif
  6718. #ifdef WOLFSSL_SHA384
  6719. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
  6720. if (ret != 0)
  6721. return ret;
  6722. #endif
  6723. #ifdef WOLFSSL_SHA512
  6724. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
  6725. if (ret != 0)
  6726. return ret;
  6727. #endif
  6728. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  6729. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  6730. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  6731. ret = EdDSA_Update(ssl, data, sz);
  6732. if (ret != 0)
  6733. return ret;
  6734. #endif
  6735. }
  6736. return ret;
  6737. }
  6738. /* add output to md5 and sha handshake hashes, exclude record header */
  6739. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  6740. {
  6741. const byte* adj;
  6742. if (ssl->hsHashes == NULL)
  6743. return BAD_FUNC_ARG;
  6744. adj = output + RECORD_HEADER_SZ + ivSz;
  6745. sz -= RECORD_HEADER_SZ;
  6746. #ifdef HAVE_FUZZER
  6747. if (ssl->fuzzerCb)
  6748. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  6749. #endif
  6750. #ifdef WOLFSSL_DTLS
  6751. if (ssl->options.dtls) {
  6752. adj += DTLS_RECORD_EXTRA;
  6753. sz -= DTLS_RECORD_EXTRA;
  6754. }
  6755. #endif
  6756. return HashRaw(ssl, adj, sz);
  6757. }
  6758. /* add input to md5 and sha handshake hashes, include handshake header */
  6759. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  6760. {
  6761. const byte* adj;
  6762. if (ssl->hsHashes == NULL) {
  6763. return BAD_FUNC_ARG;
  6764. }
  6765. adj = input - HANDSHAKE_HEADER_SZ;
  6766. sz += HANDSHAKE_HEADER_SZ;
  6767. #ifdef WOLFSSL_DTLS
  6768. if (ssl->options.dtls) {
  6769. adj -= DTLS_HANDSHAKE_EXTRA;
  6770. sz += DTLS_HANDSHAKE_EXTRA;
  6771. }
  6772. #endif
  6773. return HashRaw(ssl, adj, sz);
  6774. }
  6775. /* add record layer header for message */
  6776. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
  6777. {
  6778. RecordLayerHeader* rl;
  6779. (void)epochOrder;
  6780. /* record layer header */
  6781. rl = (RecordLayerHeader*)output;
  6782. if (rl == NULL) {
  6783. return;
  6784. }
  6785. rl->type = type;
  6786. rl->pvMajor = ssl->version.major; /* type and version same in each */
  6787. #ifdef WOLFSSL_TLS13
  6788. if (IsAtLeastTLSv1_3(ssl->version)) {
  6789. rl->pvMinor = TLSv1_2_MINOR;
  6790. }
  6791. else
  6792. #endif
  6793. rl->pvMinor = ssl->version.minor;
  6794. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  6795. if (ssl->options.side == WOLFSSL_CLIENT_END
  6796. && ssl->options.connectState == CONNECT_BEGIN
  6797. && !ssl->options.resuming) {
  6798. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  6799. : ssl->version.minor;
  6800. }
  6801. #endif
  6802. if (!ssl->options.dtls) {
  6803. c16toa((word16)length, rl->length);
  6804. }
  6805. else {
  6806. #ifdef WOLFSSL_DTLS
  6807. DtlsRecordLayerHeader* dtls;
  6808. /* dtls record layer header extensions */
  6809. dtls = (DtlsRecordLayerHeader*)output;
  6810. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  6811. c16toa((word16)length, dtls->length);
  6812. #endif
  6813. }
  6814. }
  6815. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  6816. !defined(NO_WOLFSSL_SERVER))
  6817. /* add handshake header for message */
  6818. static void AddHandShakeHeader(byte* output, word32 length,
  6819. word32 fragOffset, word32 fragLength,
  6820. byte type, WOLFSSL* ssl)
  6821. {
  6822. HandShakeHeader* hs;
  6823. (void)fragOffset;
  6824. (void)fragLength;
  6825. (void)ssl;
  6826. /* handshake header */
  6827. hs = (HandShakeHeader*)output;
  6828. if (hs == NULL)
  6829. return;
  6830. hs->type = type;
  6831. c32to24(length, hs->length); /* type and length same for each */
  6832. #ifdef WOLFSSL_DTLS
  6833. if (ssl->options.dtls) {
  6834. DtlsHandShakeHeader* dtls;
  6835. /* dtls handshake header extensions */
  6836. dtls = (DtlsHandShakeHeader*)output;
  6837. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  6838. c32to24(fragOffset, dtls->fragment_offset);
  6839. c32to24(fragLength, dtls->fragment_length);
  6840. }
  6841. #endif
  6842. }
  6843. /* add both headers for handshake message */
  6844. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  6845. {
  6846. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  6847. word32 outputAdj = RECORD_HEADER_SZ;
  6848. #ifdef WOLFSSL_DTLS
  6849. if (ssl->options.dtls) {
  6850. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  6851. outputAdj += DTLS_RECORD_EXTRA;
  6852. }
  6853. #endif
  6854. AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
  6855. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  6856. }
  6857. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  6858. #ifndef WOLFSSL_NO_TLS12
  6859. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
  6860. !defined(WOLFSSL_NO_CLIENT_AUTH))
  6861. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  6862. word32 length, byte type, WOLFSSL* ssl)
  6863. {
  6864. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  6865. word32 outputAdj = RECORD_HEADER_SZ;
  6866. (void)fragSz;
  6867. #ifdef WOLFSSL_DTLS
  6868. if (ssl->options.dtls) {
  6869. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  6870. outputAdj += DTLS_RECORD_EXTRA;
  6871. }
  6872. #endif
  6873. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
  6874. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  6875. }
  6876. #endif /* NO_CERTS */
  6877. #endif /* !WOLFSSL_NO_TLS12 */
  6878. /* return bytes received, -1 on error */
  6879. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  6880. {
  6881. int recvd;
  6882. if (ssl->CBIORecv == NULL) {
  6883. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  6884. return -1;
  6885. }
  6886. retry:
  6887. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  6888. if (recvd < 0) {
  6889. switch (recvd) {
  6890. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  6891. #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)
  6892. if (ssl->biord) {
  6893. /* If retry and read flags are set, return WANT_READ */
  6894. if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
  6895. (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
  6896. return WANT_READ;
  6897. }
  6898. }
  6899. #endif
  6900. return -1;
  6901. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  6902. return WANT_READ;
  6903. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  6904. #ifdef USE_WINDOWS_API
  6905. if (ssl->options.dtls) {
  6906. goto retry;
  6907. }
  6908. #endif
  6909. ssl->options.connReset = 1;
  6910. return -1;
  6911. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  6912. /* see if we got our timeout */
  6913. #ifdef WOLFSSL_CALLBACKS
  6914. if (ssl->toInfoOn) {
  6915. struct itimerval timeout;
  6916. getitimer(ITIMER_REAL, &timeout);
  6917. if (timeout.it_value.tv_sec == 0 &&
  6918. timeout.it_value.tv_usec == 0) {
  6919. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  6920. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  6921. ssl->timeoutInfo.timeoutName[
  6922. MAX_TIMEOUT_NAME_SZ] = '\0';
  6923. WOLFSSL_MSG("Got our timeout");
  6924. return WANT_READ;
  6925. }
  6926. }
  6927. #endif
  6928. goto retry;
  6929. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  6930. ssl->options.isClosed = 1;
  6931. return -1;
  6932. case WOLFSSL_CBIO_ERR_TIMEOUT:
  6933. #ifdef WOLFSSL_DTLS
  6934. if (IsDtlsNotSctpMode(ssl) &&
  6935. ssl->options.handShakeState != HANDSHAKE_DONE &&
  6936. DtlsMsgPoolTimeout(ssl) == 0 &&
  6937. DtlsMsgPoolSend(ssl, 0) == 0) {
  6938. /* retry read for DTLS during handshake only */
  6939. goto retry;
  6940. }
  6941. #endif
  6942. return -1;
  6943. default:
  6944. WOLFSSL_MSG("Unexpected recv return code");
  6945. return recvd;
  6946. }
  6947. }
  6948. return recvd;
  6949. }
  6950. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  6951. void ShrinkOutputBuffer(WOLFSSL* ssl)
  6952. {
  6953. WOLFSSL_MSG("Shrinking output buffer\n");
  6954. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  6955. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  6956. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  6957. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  6958. ssl->buffers.outputBuffer.dynamicFlag = 0;
  6959. ssl->buffers.outputBuffer.offset = 0;
  6960. }
  6961. /* Switch dynamic input buffer back to static, keep any remaining input */
  6962. /* forced free means cleaning up */
  6963. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  6964. {
  6965. int usedLength = ssl->buffers.inputBuffer.length -
  6966. ssl->buffers.inputBuffer.idx;
  6967. if (!forcedFree && usedLength > STATIC_BUFFER_LEN)
  6968. return;
  6969. WOLFSSL_MSG("Shrinking input buffer\n");
  6970. if (!forcedFree && usedLength > 0)
  6971. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  6972. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  6973. usedLength);
  6974. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  6975. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  6976. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  6977. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  6978. ssl->buffers.inputBuffer.dynamicFlag = 0;
  6979. ssl->buffers.inputBuffer.offset = 0;
  6980. ssl->buffers.inputBuffer.idx = 0;
  6981. ssl->buffers.inputBuffer.length = usedLength;
  6982. }
  6983. int SendBuffered(WOLFSSL* ssl)
  6984. {
  6985. if (ssl->CBIOSend == NULL) {
  6986. WOLFSSL_MSG("Your IO Send callback is null, please set");
  6987. return SOCKET_ERROR_E;
  6988. }
  6989. #ifdef WOLFSSL_DEBUG_TLS
  6990. if (ssl->buffers.outputBuffer.idx == 0) {
  6991. WOLFSSL_MSG("Data to send");
  6992. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  6993. ssl->buffers.outputBuffer.length);
  6994. }
  6995. #endif
  6996. while (ssl->buffers.outputBuffer.length > 0) {
  6997. int sent = ssl->CBIOSend(ssl,
  6998. (char*)ssl->buffers.outputBuffer.buffer +
  6999. ssl->buffers.outputBuffer.idx,
  7000. (int)ssl->buffers.outputBuffer.length,
  7001. ssl->IOCB_WriteCtx);
  7002. if (sent < 0) {
  7003. switch (sent) {
  7004. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  7005. return WANT_WRITE;
  7006. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  7007. ssl->options.connReset = 1;
  7008. break;
  7009. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  7010. /* see if we got our timeout */
  7011. #ifdef WOLFSSL_CALLBACKS
  7012. if (ssl->toInfoOn) {
  7013. struct itimerval timeout;
  7014. getitimer(ITIMER_REAL, &timeout);
  7015. if (timeout.it_value.tv_sec == 0 &&
  7016. timeout.it_value.tv_usec == 0) {
  7017. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  7018. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  7019. ssl->timeoutInfo.timeoutName[
  7020. MAX_TIMEOUT_NAME_SZ] = '\0';
  7021. WOLFSSL_MSG("Got our timeout");
  7022. return WANT_WRITE;
  7023. }
  7024. }
  7025. #endif
  7026. continue;
  7027. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  7028. ssl->options.connReset = 1; /* treat same as reset */
  7029. break;
  7030. default:
  7031. return SOCKET_ERROR_E;
  7032. }
  7033. return SOCKET_ERROR_E;
  7034. }
  7035. if (sent > (int)ssl->buffers.outputBuffer.length) {
  7036. WOLFSSL_MSG("SendBuffered() out of bounds read");
  7037. return SEND_OOB_READ_E;
  7038. }
  7039. ssl->buffers.outputBuffer.idx += sent;
  7040. ssl->buffers.outputBuffer.length -= sent;
  7041. }
  7042. ssl->buffers.outputBuffer.idx = 0;
  7043. if (ssl->buffers.outputBuffer.dynamicFlag)
  7044. ShrinkOutputBuffer(ssl);
  7045. return 0;
  7046. }
  7047. /* Grow the output buffer */
  7048. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  7049. {
  7050. byte* tmp;
  7051. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7052. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  7053. RECORD_HEADER_SZ;
  7054. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7055. #else
  7056. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7057. #endif
  7058. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7059. /* the encrypted data will be offset from the front of the buffer by
  7060. the header, if the user wants encrypted alignment they need
  7061. to define their alignment requirement */
  7062. if (align) {
  7063. while (align < hdrSz)
  7064. align *= 2;
  7065. }
  7066. #endif
  7067. tmp = (byte*)XMALLOC(size + ssl->buffers.outputBuffer.length + align,
  7068. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  7069. WOLFSSL_MSG("growing output buffer\n");
  7070. if (tmp == NULL)
  7071. return MEMORY_E;
  7072. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7073. if (align)
  7074. tmp += align - hdrSz;
  7075. #endif
  7076. #ifdef WOLFSSL_STATIC_MEMORY
  7077. /* can be from IO memory pool which does not need copy if same buffer */
  7078. if (ssl->buffers.outputBuffer.length &&
  7079. tmp == ssl->buffers.outputBuffer.buffer) {
  7080. ssl->buffers.outputBuffer.bufferSize =
  7081. size + ssl->buffers.outputBuffer.length;
  7082. return 0;
  7083. }
  7084. #endif
  7085. if (ssl->buffers.outputBuffer.length)
  7086. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  7087. ssl->buffers.outputBuffer.length);
  7088. if (ssl->buffers.outputBuffer.dynamicFlag)
  7089. XFREE(ssl->buffers.outputBuffer.buffer -
  7090. ssl->buffers.outputBuffer.offset, ssl->heap,
  7091. DYNAMIC_TYPE_OUT_BUFFER);
  7092. ssl->buffers.outputBuffer.dynamicFlag = 1;
  7093. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  7094. if (align)
  7095. ssl->buffers.outputBuffer.offset = align - hdrSz;
  7096. else
  7097. #endif
  7098. ssl->buffers.outputBuffer.offset = 0;
  7099. ssl->buffers.outputBuffer.buffer = tmp;
  7100. ssl->buffers.outputBuffer.bufferSize = size +
  7101. ssl->buffers.outputBuffer.length;
  7102. return 0;
  7103. }
  7104. /* Grow the input buffer, should only be to read cert or big app data */
  7105. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  7106. {
  7107. byte* tmp;
  7108. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7109. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  7110. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  7111. #else
  7112. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  7113. #endif
  7114. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7115. /* the encrypted data will be offset from the front of the buffer by
  7116. the dtls record header, if the user wants encrypted alignment they need
  7117. to define their alignment requirement. in tls we read record header
  7118. to get size of record and put actual data back at front, so don't need */
  7119. if (align) {
  7120. while (align < hdrSz)
  7121. align *= 2;
  7122. }
  7123. #endif
  7124. if (usedLength < 0 || size < 0) {
  7125. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  7126. return BAD_FUNC_ARG;
  7127. }
  7128. tmp = (byte*)XMALLOC(size + usedLength + align,
  7129. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  7130. WOLFSSL_MSG("growing input buffer\n");
  7131. if (tmp == NULL)
  7132. return MEMORY_E;
  7133. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7134. if (align)
  7135. tmp += align - hdrSz;
  7136. #endif
  7137. #ifdef WOLFSSL_STATIC_MEMORY
  7138. /* can be from IO memory pool which does not need copy if same buffer */
  7139. if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
  7140. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  7141. ssl->buffers.inputBuffer.idx = 0;
  7142. ssl->buffers.inputBuffer.length = usedLength;
  7143. return 0;
  7144. }
  7145. #endif
  7146. if (usedLength)
  7147. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  7148. ssl->buffers.inputBuffer.idx, usedLength);
  7149. if (ssl->buffers.inputBuffer.dynamicFlag)
  7150. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  7151. ssl->heap,DYNAMIC_TYPE_IN_BUFFER);
  7152. ssl->buffers.inputBuffer.dynamicFlag = 1;
  7153. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  7154. if (align)
  7155. ssl->buffers.inputBuffer.offset = align - hdrSz;
  7156. else
  7157. #endif
  7158. ssl->buffers.inputBuffer.offset = 0;
  7159. ssl->buffers.inputBuffer.buffer = tmp;
  7160. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  7161. ssl->buffers.inputBuffer.idx = 0;
  7162. ssl->buffers.inputBuffer.length = usedLength;
  7163. return 0;
  7164. }
  7165. /* Check available size into output buffer, make room if needed.
  7166. * This function needs to be called before anything gets put
  7167. * into the output buffers since it flushes pending data if it
  7168. * predicts that the msg will exceed MTU. */
  7169. int CheckAvailableSize(WOLFSSL *ssl, int size)
  7170. {
  7171. if (size < 0) {
  7172. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  7173. return BAD_FUNC_ARG;
  7174. }
  7175. #ifdef WOLFSSL_DTLS
  7176. if (ssl->options.dtls &&
  7177. size + ssl->buffers.outputBuffer.length -
  7178. ssl->buffers.outputBuffer.idx > ssl->dtls_expected_rx) {
  7179. int ret;
  7180. WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
  7181. "to make room for new message");
  7182. if ((ret = SendBuffered(ssl)) != 0) {
  7183. return ret;
  7184. }
  7185. }
  7186. #endif
  7187. if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
  7188. < (word32)size) {
  7189. if (GrowOutputBuffer(ssl, size) < 0)
  7190. return MEMORY_E;
  7191. }
  7192. return 0;
  7193. }
  7194. /* do all verify and sanity checks on record header */
  7195. static int GetRecordHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  7196. RecordLayerHeader* rh, word16 *size)
  7197. {
  7198. if (!ssl->options.dtls) {
  7199. #ifdef HAVE_FUZZER
  7200. if (ssl->fuzzerCb)
  7201. ssl->fuzzerCb(ssl, input + *inOutIdx, RECORD_HEADER_SZ, FUZZ_HEAD,
  7202. ssl->fuzzerCtx);
  7203. #endif
  7204. XMEMCPY(rh, input + *inOutIdx, RECORD_HEADER_SZ);
  7205. *inOutIdx += RECORD_HEADER_SZ;
  7206. ato16(rh->length, size);
  7207. }
  7208. else {
  7209. #ifdef WOLFSSL_DTLS
  7210. #ifdef HAVE_FUZZER
  7211. if (ssl->fuzzerCb)
  7212. ssl->fuzzerCb(ssl, input + *inOutIdx, DTLS_RECORD_HEADER_SZ,
  7213. FUZZ_HEAD, ssl->fuzzerCtx);
  7214. #endif
  7215. /* type and version in same sport */
  7216. XMEMCPY(rh, input + *inOutIdx, ENUM_LEN + VERSION_SZ);
  7217. *inOutIdx += ENUM_LEN + VERSION_SZ;
  7218. ato16(input + *inOutIdx, &ssl->keys.curEpoch);
  7219. *inOutIdx += OPAQUE16_LEN;
  7220. if (ssl->options.haveMcast) {
  7221. #ifdef WOLFSSL_MULTICAST
  7222. ssl->keys.curPeerId = input[*inOutIdx];
  7223. ssl->keys.curSeq_hi = input[*inOutIdx+1];
  7224. #endif
  7225. }
  7226. else
  7227. ato16(input + *inOutIdx, &ssl->keys.curSeq_hi);
  7228. *inOutIdx += OPAQUE16_LEN;
  7229. ato32(input + *inOutIdx, &ssl->keys.curSeq_lo);
  7230. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  7231. ato16(input + *inOutIdx, size);
  7232. *inOutIdx += LENGTH_SZ;
  7233. #endif
  7234. }
  7235. #ifdef WOLFSSL_DTLS
  7236. if (IsDtlsNotSctpMode(ssl) && !DtlsCheckWindow(ssl)) {
  7237. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  7238. return SEQUENCE_ERROR;
  7239. }
  7240. #endif
  7241. /* catch version mismatch */
  7242. #ifndef WOLFSSL_TLS13
  7243. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  7244. #else
  7245. if (rh->pvMajor != ssl->version.major ||
  7246. (rh->pvMinor != ssl->version.minor &&
  7247. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_2_MINOR)
  7248. ))
  7249. #endif
  7250. {
  7251. if (ssl->options.side == WOLFSSL_SERVER_END &&
  7252. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  7253. WOLFSSL_MSG("Client attempting to connect with different version");
  7254. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  7255. ssl->options.downgrade &&
  7256. ssl->options.connectState < FIRST_REPLY_DONE)
  7257. WOLFSSL_MSG("Server attempting to accept with different version");
  7258. else if (ssl->options.dtls && rh->type == handshake)
  7259. /* Check the DTLS handshake message RH version later. */
  7260. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  7261. else {
  7262. WOLFSSL_MSG("SSL version error");
  7263. /* send alert per RFC5246 Appendix E. Backward Compatibility */
  7264. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  7265. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  7266. SendAlert(ssl, alert_fatal, wc_protocol_version);
  7267. #else
  7268. SendAlert(ssl, alert_fatal, protocol_version);
  7269. #endif
  7270. }
  7271. return VERSION_ERROR; /* only use requested version */
  7272. }
  7273. }
  7274. /* record layer length check */
  7275. #ifdef HAVE_MAX_FRAGMENT
  7276. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  7277. SendAlert(ssl, alert_fatal, record_overflow);
  7278. return LENGTH_ERROR;
  7279. }
  7280. #else
  7281. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA))
  7282. return LENGTH_ERROR;
  7283. #endif
  7284. /* verify record type here as well */
  7285. switch (rh->type) {
  7286. case handshake:
  7287. case change_cipher_spec:
  7288. case application_data:
  7289. case alert:
  7290. break;
  7291. case no_type:
  7292. default:
  7293. WOLFSSL_MSG("Unknown Record Type");
  7294. return UNKNOWN_RECORD_TYPE;
  7295. }
  7296. /* haven't decrypted this record yet */
  7297. ssl->keys.decryptedCur = 0;
  7298. return 0;
  7299. }
  7300. #ifndef WOLFSSL_NO_TLS12
  7301. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  7302. byte *type, word32 *size, word32 totalSz)
  7303. {
  7304. const byte *ptr = input + *inOutIdx;
  7305. (void)ssl;
  7306. *inOutIdx += HANDSHAKE_HEADER_SZ;
  7307. if (*inOutIdx > totalSz)
  7308. return BUFFER_E;
  7309. *type = ptr[0];
  7310. c24to32(&ptr[1], size);
  7311. return 0;
  7312. }
  7313. #endif
  7314. #ifdef WOLFSSL_DTLS
  7315. static int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  7316. word32* inOutIdx, byte *type, word32 *size,
  7317. word32 *fragOffset, word32 *fragSz,
  7318. word32 totalSz)
  7319. {
  7320. word32 idx = *inOutIdx;
  7321. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  7322. if (*inOutIdx > totalSz) {
  7323. WOLFSSL_ERROR(BUFFER_E);
  7324. return BUFFER_E;
  7325. }
  7326. *type = input[idx++];
  7327. c24to32(input + idx, size);
  7328. idx += OPAQUE24_LEN;
  7329. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  7330. idx += DTLS_HANDSHAKE_SEQ_SZ;
  7331. c24to32(input + idx, fragOffset);
  7332. idx += DTLS_HANDSHAKE_FRAG_SZ;
  7333. c24to32(input + idx, fragSz);
  7334. if (ssl->curRL.pvMajor != ssl->version.major ||
  7335. ssl->curRL.pvMinor != ssl->version.minor) {
  7336. if (*type != client_hello && *type != hello_verify_request) {
  7337. WOLFSSL_ERROR(VERSION_ERROR);
  7338. return VERSION_ERROR;
  7339. }
  7340. else {
  7341. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  7342. }
  7343. }
  7344. return 0;
  7345. }
  7346. #endif
  7347. #if !defined(NO_OLD_TLS) || \
  7348. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  7349. /* fill with MD5 pad size since biggest required */
  7350. static const byte PAD1[PAD_MD5] =
  7351. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7352. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7353. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7354. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7355. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  7356. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  7357. };
  7358. static const byte PAD2[PAD_MD5] =
  7359. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7360. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7361. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7362. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7363. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  7364. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  7365. };
  7366. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  7367. #ifndef NO_OLD_TLS
  7368. /* calculate MD5 hash for finished */
  7369. #ifdef WOLFSSL_TI_HASH
  7370. #include <wolfssl/wolfcrypt/hash.h>
  7371. #endif
  7372. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  7373. {
  7374. int ret;
  7375. byte md5_result[WC_MD5_DIGEST_SIZE];
  7376. #ifdef WOLFSSL_SMALL_STACK
  7377. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7378. if (md5 == NULL)
  7379. return MEMORY_E;
  7380. #else
  7381. wc_Md5 md5[1];
  7382. #endif
  7383. /* make md5 inner */
  7384. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  7385. if (ret == 0)
  7386. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  7387. if (ret == 0)
  7388. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  7389. if (ret == 0)
  7390. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  7391. if (ret == 0)
  7392. ret = wc_Md5Final(md5, md5_result);
  7393. /* make md5 outer */
  7394. if (ret == 0) {
  7395. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  7396. if (ret == 0) {
  7397. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  7398. if (ret == 0)
  7399. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  7400. if (ret == 0)
  7401. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  7402. if (ret == 0)
  7403. ret = wc_Md5Final(md5, hashes->md5);
  7404. wc_Md5Free(md5);
  7405. }
  7406. }
  7407. #ifdef WOLFSSL_SMALL_STACK
  7408. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7409. #endif
  7410. return ret;
  7411. }
  7412. /* calculate SHA hash for finished */
  7413. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  7414. {
  7415. int ret;
  7416. byte sha_result[WC_SHA_DIGEST_SIZE];
  7417. #ifdef WOLFSSL_SMALL_STACK
  7418. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7419. if (sha == NULL)
  7420. return MEMORY_E;
  7421. #else
  7422. wc_Sha sha[1];
  7423. #endif
  7424. /* make sha inner */
  7425. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  7426. if (ret == 0)
  7427. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  7428. if (ret == 0)
  7429. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  7430. if (ret == 0)
  7431. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  7432. if (ret == 0)
  7433. ret = wc_ShaFinal(sha, sha_result);
  7434. /* make sha outer */
  7435. if (ret == 0) {
  7436. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  7437. if (ret == 0) {
  7438. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  7439. if (ret == 0)
  7440. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  7441. if (ret == 0)
  7442. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  7443. if (ret == 0)
  7444. ret = wc_ShaFinal(sha, hashes->sha);
  7445. wc_ShaFree(sha);
  7446. }
  7447. }
  7448. #ifdef WOLFSSL_SMALL_STACK
  7449. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  7450. #endif
  7451. return ret;
  7452. }
  7453. #endif
  7454. #ifndef WOLFSSL_NO_TLS12
  7455. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  7456. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  7457. {
  7458. int ret = 0;
  7459. if (ssl == NULL)
  7460. return BAD_FUNC_ARG;
  7461. #ifndef NO_TLS
  7462. if (ssl->options.tls) {
  7463. ret = BuildTlsFinished(ssl, hashes, sender);
  7464. }
  7465. #endif
  7466. #ifndef NO_OLD_TLS
  7467. if (!ssl->options.tls) {
  7468. ret = BuildMD5(ssl, hashes, sender);
  7469. if (ret == 0) {
  7470. ret = BuildSHA(ssl, hashes, sender);
  7471. }
  7472. }
  7473. #endif
  7474. return ret;
  7475. }
  7476. #endif /* WOLFSSL_NO_TLS12 */
  7477. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  7478. /* cipher requirements */
  7479. enum {
  7480. REQUIRES_RSA,
  7481. REQUIRES_DHE,
  7482. REQUIRES_ECC,
  7483. REQUIRES_ECC_STATIC,
  7484. REQUIRES_PSK,
  7485. REQUIRES_NTRU,
  7486. REQUIRES_RSA_SIG,
  7487. REQUIRES_AEAD
  7488. };
  7489. /* Does this cipher suite (first, second) have the requirement
  7490. an ephemeral key exchange will still require the key for signing
  7491. the key exchange so ECHDE_RSA requires an rsa key thus rsa_kea */
  7492. static int CipherRequires(byte first, byte second, int requirement)
  7493. {
  7494. (void)requirement;
  7495. #ifndef WOLFSSL_NO_TLS12
  7496. #ifdef HAVE_CHACHA
  7497. if (first == CHACHA_BYTE) {
  7498. switch (second) {
  7499. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  7500. if (requirement == REQUIRES_RSA)
  7501. return 1;
  7502. break;
  7503. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  7504. if (requirement == REQUIRES_ECC)
  7505. return 1;
  7506. break;
  7507. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  7508. if (requirement == REQUIRES_RSA)
  7509. return 1;
  7510. if (requirement == REQUIRES_DHE)
  7511. return 1;
  7512. break;
  7513. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  7514. if (requirement == REQUIRES_RSA)
  7515. return 1;
  7516. break;
  7517. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  7518. if (requirement == REQUIRES_ECC)
  7519. return 1;
  7520. break;
  7521. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  7522. if (requirement == REQUIRES_RSA)
  7523. return 1;
  7524. if (requirement == REQUIRES_DHE)
  7525. return 1;
  7526. break;
  7527. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  7528. if (requirement == REQUIRES_PSK)
  7529. return 1;
  7530. break;
  7531. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  7532. if (requirement == REQUIRES_PSK)
  7533. return 1;
  7534. break;
  7535. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  7536. if (requirement == REQUIRES_PSK)
  7537. return 1;
  7538. if (requirement == REQUIRES_DHE)
  7539. return 1;
  7540. break;
  7541. }
  7542. if (requirement == REQUIRES_AEAD)
  7543. return 1;
  7544. }
  7545. #endif /* HAVE_CHACHA */
  7546. /* ECC extensions */
  7547. if (first == ECC_BYTE) {
  7548. switch (second) {
  7549. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7550. #ifndef NO_RSA
  7551. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  7552. if (requirement == REQUIRES_RSA)
  7553. return 1;
  7554. break;
  7555. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  7556. if (requirement == REQUIRES_ECC_STATIC)
  7557. return 1;
  7558. if (requirement == REQUIRES_RSA_SIG)
  7559. return 1;
  7560. break;
  7561. #ifndef NO_DES3
  7562. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  7563. if (requirement == REQUIRES_RSA)
  7564. return 1;
  7565. break;
  7566. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  7567. if (requirement == REQUIRES_ECC_STATIC)
  7568. return 1;
  7569. if (requirement == REQUIRES_RSA_SIG)
  7570. return 1;
  7571. break;
  7572. #endif /* !NO_DES3 */
  7573. #ifndef NO_RC4
  7574. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  7575. if (requirement == REQUIRES_RSA)
  7576. return 1;
  7577. break;
  7578. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  7579. if (requirement == REQUIRES_ECC_STATIC)
  7580. return 1;
  7581. if (requirement == REQUIRES_RSA_SIG)
  7582. return 1;
  7583. break;
  7584. #endif /* !NO_RC4 */
  7585. #endif /* NO_RSA */
  7586. #ifndef NO_DES3
  7587. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  7588. if (requirement == REQUIRES_ECC)
  7589. return 1;
  7590. break;
  7591. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  7592. if (requirement == REQUIRES_ECC_STATIC)
  7593. return 1;
  7594. break;
  7595. #endif /* !NO_DES3 */
  7596. #ifndef NO_RC4
  7597. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  7598. if (requirement == REQUIRES_ECC)
  7599. return 1;
  7600. break;
  7601. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  7602. if (requirement == REQUIRES_ECC_STATIC)
  7603. return 1;
  7604. break;
  7605. #endif /* !NO_RC4 */
  7606. #ifndef NO_RSA
  7607. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  7608. if (requirement == REQUIRES_RSA)
  7609. return 1;
  7610. break;
  7611. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  7612. if (requirement == REQUIRES_ECC_STATIC)
  7613. return 1;
  7614. if (requirement == REQUIRES_RSA_SIG)
  7615. return 1;
  7616. break;
  7617. #endif /* !NO_RSA */
  7618. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  7619. if (requirement == REQUIRES_ECC)
  7620. return 1;
  7621. break;
  7622. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  7623. if (requirement == REQUIRES_ECC_STATIC)
  7624. return 1;
  7625. break;
  7626. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  7627. if (requirement == REQUIRES_ECC)
  7628. return 1;
  7629. break;
  7630. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  7631. if (requirement == REQUIRES_ECC_STATIC)
  7632. return 1;
  7633. break;
  7634. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  7635. if (requirement == REQUIRES_ECC)
  7636. return 1;
  7637. if (requirement == REQUIRES_AEAD)
  7638. return 1;
  7639. break;
  7640. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  7641. if (requirement == REQUIRES_ECC)
  7642. return 1;
  7643. if (requirement == REQUIRES_AEAD)
  7644. return 1;
  7645. break;
  7646. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  7647. if (requirement == REQUIRES_ECC_STATIC)
  7648. return 1;
  7649. if (requirement == REQUIRES_AEAD)
  7650. return 1;
  7651. break;
  7652. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  7653. if (requirement == REQUIRES_ECC_STATIC)
  7654. return 1;
  7655. if (requirement == REQUIRES_AEAD)
  7656. return 1;
  7657. break;
  7658. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7659. #ifndef NO_RSA
  7660. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7661. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  7662. if (requirement == REQUIRES_RSA)
  7663. return 1;
  7664. if (requirement == REQUIRES_AEAD)
  7665. return 1;
  7666. break;
  7667. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  7668. if (requirement == REQUIRES_RSA)
  7669. return 1;
  7670. if (requirement == REQUIRES_AEAD)
  7671. return 1;
  7672. break;
  7673. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  7674. if (requirement == REQUIRES_ECC_STATIC)
  7675. return 1;
  7676. if (requirement == REQUIRES_RSA_SIG)
  7677. return 1;
  7678. if (requirement == REQUIRES_AEAD)
  7679. return 1;
  7680. break;
  7681. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  7682. if (requirement == REQUIRES_ECC_STATIC)
  7683. return 1;
  7684. if (requirement == REQUIRES_RSA_SIG)
  7685. return 1;
  7686. if (requirement == REQUIRES_AEAD)
  7687. return 1;
  7688. break;
  7689. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7690. #ifdef HAVE_AESCCM
  7691. case TLS_RSA_WITH_AES_128_CCM_8 :
  7692. case TLS_RSA_WITH_AES_256_CCM_8 :
  7693. if (requirement == REQUIRES_RSA)
  7694. return 1;
  7695. if (requirement == REQUIRES_RSA_SIG)
  7696. return 1;
  7697. if (requirement == REQUIRES_AEAD)
  7698. return 1;
  7699. break;
  7700. #endif /* HAVE_AESCCM */
  7701. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7702. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  7703. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  7704. if (requirement == REQUIRES_RSA)
  7705. return 1;
  7706. break;
  7707. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  7708. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  7709. if (requirement == REQUIRES_RSA_SIG)
  7710. return 1;
  7711. if (requirement == REQUIRES_ECC_STATIC)
  7712. return 1;
  7713. break;
  7714. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7715. #endif /* !NO_RSA */
  7716. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7717. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  7718. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  7719. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  7720. if (requirement == REQUIRES_ECC)
  7721. return 1;
  7722. if (requirement == REQUIRES_AEAD)
  7723. return 1;
  7724. break;
  7725. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  7726. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  7727. if (requirement == REQUIRES_ECC)
  7728. return 1;
  7729. break;
  7730. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  7731. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  7732. if (requirement == REQUIRES_ECC)
  7733. return 1;
  7734. if (requirement == REQUIRES_ECC_STATIC)
  7735. return 1;
  7736. break;
  7737. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7738. #ifndef NO_PSK
  7739. case TLS_PSK_WITH_AES_128_CCM:
  7740. case TLS_PSK_WITH_AES_256_CCM:
  7741. case TLS_PSK_WITH_AES_128_CCM_8:
  7742. case TLS_PSK_WITH_AES_256_CCM_8:
  7743. if (requirement == REQUIRES_PSK)
  7744. return 1;
  7745. if (requirement == REQUIRES_AEAD)
  7746. return 1;
  7747. break;
  7748. case TLS_DHE_PSK_WITH_AES_128_CCM:
  7749. case TLS_DHE_PSK_WITH_AES_256_CCM:
  7750. if (requirement == REQUIRES_PSK)
  7751. return 1;
  7752. if (requirement == REQUIRES_DHE)
  7753. return 1;
  7754. if (requirement == REQUIRES_AEAD)
  7755. return 1;
  7756. break;
  7757. #endif /* !NO_PSK */
  7758. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7759. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  7760. if (requirement == REQUIRES_ECC)
  7761. return 1;
  7762. break;
  7763. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  7764. if (requirement == REQUIRES_PSK)
  7765. return 1;
  7766. break;
  7767. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  7768. if (requirement == REQUIRES_PSK)
  7769. return 1;
  7770. break;
  7771. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7772. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  7773. case TLS_SHA256_SHA256:
  7774. break;
  7775. case TLS_SHA384_SHA384:
  7776. break;
  7777. #endif
  7778. default:
  7779. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  7780. return 0;
  7781. } /* switch */
  7782. } /* if */
  7783. #endif /* !WOLFSSL_NO_TLS12 */
  7784. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  7785. if (first == TLS13_BYTE) {
  7786. switch (second) {
  7787. #ifdef WOLFSSL_TLS13
  7788. case TLS_AES_128_GCM_SHA256:
  7789. case TLS_AES_256_GCM_SHA384:
  7790. case TLS_CHACHA20_POLY1305_SHA256:
  7791. case TLS_AES_128_CCM_SHA256:
  7792. case TLS_AES_128_CCM_8_SHA256:
  7793. break;
  7794. #endif
  7795. default:
  7796. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  7797. "TLS v1.3");
  7798. return 0;
  7799. }
  7800. }
  7801. #ifndef WOLFSSL_NO_TLS12
  7802. if (first != ECC_BYTE && first != CHACHA_BYTE &&
  7803. first != TLS13_BYTE) { /* normal suites */
  7804. switch (second) {
  7805. #ifndef NO_RSA
  7806. #ifndef NO_RC4
  7807. case SSL_RSA_WITH_RC4_128_SHA :
  7808. if (requirement == REQUIRES_RSA)
  7809. return 1;
  7810. break;
  7811. case SSL_RSA_WITH_RC4_128_MD5 :
  7812. if (requirement == REQUIRES_RSA)
  7813. return 1;
  7814. break;
  7815. #endif /* NO_RC4 */
  7816. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  7817. if (requirement == REQUIRES_RSA)
  7818. return 1;
  7819. break;
  7820. #ifdef HAVE_NTRU
  7821. case TLS_NTRU_RSA_WITH_RC4_128_SHA :
  7822. if (requirement == REQUIRES_NTRU)
  7823. return 1;
  7824. break;
  7825. #endif /* HAVE_NTRU */
  7826. case TLS_RSA_WITH_AES_128_CBC_SHA :
  7827. if (requirement == REQUIRES_RSA)
  7828. return 1;
  7829. break;
  7830. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  7831. if (requirement == REQUIRES_RSA)
  7832. return 1;
  7833. break;
  7834. #ifdef HAVE_NTRU
  7835. case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA :
  7836. if (requirement == REQUIRES_NTRU)
  7837. return 1;
  7838. break;
  7839. #endif /* HAVE_NTRU */
  7840. case TLS_RSA_WITH_AES_256_CBC_SHA :
  7841. if (requirement == REQUIRES_RSA)
  7842. return 1;
  7843. break;
  7844. #ifdef HAVE_NTRU
  7845. case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA :
  7846. if (requirement == REQUIRES_NTRU)
  7847. return 1;
  7848. break;
  7849. #endif /* HAVE_NTRU */
  7850. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  7851. if (requirement == REQUIRES_RSA)
  7852. return 1;
  7853. break;
  7854. case TLS_RSA_WITH_NULL_MD5 :
  7855. case TLS_RSA_WITH_NULL_SHA :
  7856. case TLS_RSA_WITH_NULL_SHA256 :
  7857. if (requirement == REQUIRES_RSA)
  7858. return 1;
  7859. break;
  7860. #ifdef HAVE_NTRU
  7861. case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA :
  7862. if (requirement == REQUIRES_NTRU)
  7863. return 1;
  7864. break;
  7865. #endif /* HAVE_NTRU */
  7866. #ifdef HAVE_IDEA
  7867. case SSL_RSA_WITH_IDEA_CBC_SHA :
  7868. if (requirement == REQUIRES_RSA)
  7869. return 1;
  7870. break;
  7871. #endif /* HAVE_IDEA */
  7872. #endif /* !NO_RSA */
  7873. #ifndef NO_PSK
  7874. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  7875. if (requirement == REQUIRES_PSK)
  7876. return 1;
  7877. if (requirement == REQUIRES_AEAD)
  7878. return 1;
  7879. break;
  7880. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  7881. if (requirement == REQUIRES_PSK)
  7882. return 1;
  7883. if (requirement == REQUIRES_AEAD)
  7884. return 1;
  7885. break;
  7886. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  7887. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  7888. case TLS_PSK_WITH_AES_128_CBC_SHA :
  7889. case TLS_PSK_WITH_AES_256_CBC_SHA :
  7890. case TLS_PSK_WITH_NULL_SHA384 :
  7891. case TLS_PSK_WITH_NULL_SHA256 :
  7892. case TLS_PSK_WITH_NULL_SHA :
  7893. if (requirement == REQUIRES_PSK)
  7894. return 1;
  7895. break;
  7896. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  7897. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  7898. if (requirement == REQUIRES_DHE)
  7899. return 1;
  7900. if (requirement == REQUIRES_PSK)
  7901. return 1;
  7902. if (requirement == REQUIRES_AEAD)
  7903. return 1;
  7904. break;
  7905. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  7906. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  7907. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  7908. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  7909. if (requirement == REQUIRES_DHE)
  7910. return 1;
  7911. if (requirement == REQUIRES_PSK)
  7912. return 1;
  7913. break;
  7914. #endif /* NO_PSK */
  7915. #ifndef NO_RSA
  7916. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  7917. if (requirement == REQUIRES_RSA)
  7918. return 1;
  7919. if (requirement == REQUIRES_DHE)
  7920. return 1;
  7921. break;
  7922. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  7923. if (requirement == REQUIRES_RSA)
  7924. return 1;
  7925. if (requirement == REQUIRES_DHE)
  7926. return 1;
  7927. break;
  7928. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  7929. if (requirement == REQUIRES_RSA)
  7930. return 1;
  7931. if (requirement == REQUIRES_DHE)
  7932. return 1;
  7933. break;
  7934. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  7935. if (requirement == REQUIRES_RSA)
  7936. return 1;
  7937. if (requirement == REQUIRES_DHE)
  7938. return 1;
  7939. break;
  7940. #ifndef NO_HC128
  7941. case TLS_RSA_WITH_HC_128_MD5 :
  7942. if (requirement == REQUIRES_RSA)
  7943. return 1;
  7944. break;
  7945. case TLS_RSA_WITH_HC_128_SHA :
  7946. if (requirement == REQUIRES_RSA)
  7947. return 1;
  7948. break;
  7949. #endif /* NO_HC128 */
  7950. #ifndef NO_RABBIT
  7951. case TLS_RSA_WITH_RABBIT_SHA :
  7952. if (requirement == REQUIRES_RSA)
  7953. return 1;
  7954. break;
  7955. #endif /* !NO_RABBIT */
  7956. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  7957. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  7958. if (requirement == REQUIRES_RSA)
  7959. return 1;
  7960. if (requirement == REQUIRES_AEAD)
  7961. return 1;
  7962. break;
  7963. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  7964. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  7965. if (requirement == REQUIRES_RSA)
  7966. return 1;
  7967. if (requirement == REQUIRES_DHE)
  7968. return 1;
  7969. if (requirement == REQUIRES_AEAD)
  7970. return 1;
  7971. break;
  7972. #ifdef HAVE_CAMELLIA
  7973. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  7974. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  7975. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  7976. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  7977. if (requirement == REQUIRES_RSA)
  7978. return 1;
  7979. break;
  7980. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  7981. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  7982. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  7983. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  7984. if (requirement == REQUIRES_RSA)
  7985. return 1;
  7986. if (requirement == REQUIRES_RSA_SIG)
  7987. return 1;
  7988. if (requirement == REQUIRES_DHE)
  7989. return 1;
  7990. break;
  7991. #endif /* HAVE_CAMELLIA */
  7992. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  7993. if (requirement == REQUIRES_RSA)
  7994. return 1;
  7995. if (requirement == REQUIRES_RSA_SIG)
  7996. return 1;
  7997. if (requirement == REQUIRES_DHE)
  7998. return 1;
  7999. break;
  8000. #endif
  8001. #ifdef HAVE_ANON
  8002. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  8003. if (requirement == REQUIRES_DHE)
  8004. return 1;
  8005. break;
  8006. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  8007. if (requirement == REQUIRES_DHE)
  8008. return 1;
  8009. if (requirement == REQUIRES_AEAD)
  8010. return 1;
  8011. break;
  8012. #endif
  8013. #ifdef WOLFSSL_MULTICAST
  8014. case WDM_WITH_NULL_SHA256 :
  8015. break;
  8016. #endif
  8017. default:
  8018. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  8019. return 0;
  8020. } /* switch */
  8021. } /* if ECC / Normal suites else */
  8022. #endif /* !WOLFSSL_NO_TLS12 */
  8023. return 0;
  8024. }
  8025. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  8026. #ifndef NO_CERTS
  8027. /* Match names with wildcards, each wildcard can represent a single name
  8028. component or fragment but not multiple names, i.e.,
  8029. *.z.com matches y.z.com but not x.y.z.com
  8030. return 1 on success */
  8031. int MatchDomainName(const char* pattern, int len, const char* str)
  8032. {
  8033. int ret = 0;
  8034. char p, s;
  8035. if (pattern == NULL || str == NULL || len <= 0)
  8036. return 0;
  8037. while (len > 0) {
  8038. p = (char)XTOLOWER((unsigned char)*pattern++);
  8039. if (p == '\0')
  8040. break;
  8041. if (p == '*') {
  8042. while (--len > 0 &&
  8043. (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') {
  8044. }
  8045. if (len == 0)
  8046. p = '\0';
  8047. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  8048. if (s == p)
  8049. break;
  8050. if (s == '.')
  8051. return 0;
  8052. str++;
  8053. }
  8054. }
  8055. else {
  8056. if (p != (char)XTOLOWER((unsigned char) *str))
  8057. return 0;
  8058. }
  8059. if (len > 0) {
  8060. str++;
  8061. len--;
  8062. }
  8063. }
  8064. if (*str == '\0' && len == 0) {
  8065. ret = 1; /* success */
  8066. }
  8067. return ret;
  8068. }
  8069. /* Check that alternative names, if they exists, match the domain.
  8070. * Fail if there are wild patterns and they didn't match.
  8071. * Check the common name if no alternative names matched.
  8072. *
  8073. * dCert Decoded cert to get the alternative names from.
  8074. * domain Domain name to compare against.
  8075. * checkCN Whether to check the common name.
  8076. * returns 1 : match was found.
  8077. * 0 : no match found.
  8078. * -1 : No matches and wild pattern match failed.
  8079. */
  8080. int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
  8081. {
  8082. int match = 0;
  8083. DNS_entry* altName = NULL;
  8084. char *buf;
  8085. word32 len;
  8086. WOLFSSL_MSG("Checking AltNames");
  8087. if (dCert)
  8088. altName = dCert->altNames;
  8089. if (checkCN != NULL) {
  8090. *checkCN = altName == NULL;
  8091. }
  8092. while (altName) {
  8093. WOLFSSL_MSG("\tindividual AltName check");
  8094. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  8095. char name[WOLFSSL_MAX_IPSTR] = {0};
  8096. /* check if alt name is stored as IP addr octet */
  8097. if (altName->type == ASN_IP_TYPE) {
  8098. char tmp[4];
  8099. int i;
  8100. word32 idx = 0;
  8101. for (i = 0; (idx < WOLFSSL_MAX_IPSTR) && (i < altName->len); i++) {
  8102. XMEMSET(tmp, 0, sizeof(tmp));
  8103. XSNPRINTF(tmp, sizeof(tmp), (altName->len <= 4) ? "%u" : "%02X",
  8104. altName->name[i]);
  8105. idx += XSTRLEN(tmp);
  8106. XSTRNCAT(name, tmp, (altName->len <= 4) ? 3 : 2);
  8107. if ((idx < WOLFSSL_MAX_IPSTR ) && ((i + 1) < altName->len)) {
  8108. name[idx++] = (altName->len <= 4) ? '.' : ':';
  8109. }
  8110. }
  8111. if (idx >= WOLFSSL_MAX_IPSTR) {
  8112. idx = WOLFSSL_MAX_IPSTR -1;
  8113. }
  8114. name[idx] = '\0';
  8115. buf = name;
  8116. len = (word32)XSTRLEN(name);
  8117. }
  8118. else
  8119. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  8120. {
  8121. buf = altName->name;
  8122. len = altName->len;
  8123. }
  8124. if (MatchDomainName(buf, len, domain)) {
  8125. match = 1;
  8126. if (checkCN != NULL) {
  8127. *checkCN = 0;
  8128. }
  8129. WOLFSSL_MSG("\tmatch found");
  8130. break;
  8131. }
  8132. /* No matches and wild pattern match failed. */
  8133. else if (buf && (len >=1) && (buf[0] == '*')) {
  8134. match = -1;
  8135. WOLFSSL_MSG("\twildcard match failed");
  8136. }
  8137. altName = altName->next;
  8138. }
  8139. return match;
  8140. }
  8141. /* Check the domain name matches the subject alternative name or the subject
  8142. * name.
  8143. *
  8144. * dcert Decoded certificate.
  8145. * domainName The domain name.
  8146. * domainNameLen The length of the domain name.
  8147. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  8148. */
  8149. int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
  8150. {
  8151. int checkCN;
  8152. /* Assume name is NUL terminated. */
  8153. (void)domainNameLen;
  8154. if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
  8155. WOLFSSL_MSG("DomainName match on alt names failed too");
  8156. return DOMAIN_NAME_MISMATCH;
  8157. }
  8158. if (checkCN == 1) {
  8159. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  8160. domainName) == 0) {
  8161. WOLFSSL_MSG("DomainName match on common name failed");
  8162. return DOMAIN_NAME_MISMATCH;
  8163. }
  8164. }
  8165. return 0;
  8166. }
  8167. int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
  8168. {
  8169. WOLFSSL_MSG("Checking IPAddr");
  8170. return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
  8171. }
  8172. #ifdef SESSION_CERTS
  8173. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  8174. byte* certBuf, word32 certSz)
  8175. {
  8176. if (chain->count < MAX_CHAIN_DEPTH &&
  8177. certSz < MAX_X509_SIZE) {
  8178. chain->certs[chain->count].length = certSz;
  8179. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  8180. chain->count++;
  8181. }
  8182. else {
  8183. WOLFSSL_MSG("Couldn't store chain cert for session");
  8184. }
  8185. }
  8186. #endif
  8187. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  8188. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8189. /* Copy parts X509 needs from Decoded cert, 0 on success */
  8190. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  8191. * altNames pointers could be free'd by second x509 still active by first */
  8192. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  8193. {
  8194. int ret = 0;
  8195. if (x509 == NULL || dCert == NULL ||
  8196. dCert->subjectCNLen < 0)
  8197. return BAD_FUNC_ARG;
  8198. if (x509->issuer.name == NULL || x509->subject.name == NULL) {
  8199. WOLFSSL_MSG("Either init was not called on X509 or programming error");
  8200. return BAD_FUNC_ARG;
  8201. }
  8202. x509->version = dCert->version + 1;
  8203. XSTRNCPY(x509->issuer.name, dCert->issuer, ASN_NAME_MAX);
  8204. x509->issuer.name[ASN_NAME_MAX - 1] = '\0';
  8205. x509->issuer.sz = (int)XSTRLEN(x509->issuer.name) + 1;
  8206. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8207. if (dCert->issuerName != NULL) {
  8208. wolfSSL_X509_set_issuer_name(x509,
  8209. (WOLFSSL_X509_NAME*)dCert->issuerName);
  8210. x509->issuer.x509 = x509;
  8211. }
  8212. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8213. XSTRNCPY(x509->subject.name, dCert->subject, ASN_NAME_MAX);
  8214. x509->subject.name[ASN_NAME_MAX - 1] = '\0';
  8215. x509->subject.sz = (int)XSTRLEN(x509->subject.name) + 1;
  8216. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8217. if (dCert->subjectName != NULL) {
  8218. wolfSSL_X509_set_subject_name(x509,
  8219. (WOLFSSL_X509_NAME*)dCert->subjectName);
  8220. x509->subject.x509 = x509;
  8221. }
  8222. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8223. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  8224. x509->subject.rawLen = min(dCert->subjectRawLen, sizeof(x509->subject.raw));
  8225. XMEMCPY(x509->subject.raw, dCert->subjectRaw, x509->subject.rawLen);
  8226. #ifdef WOLFSSL_CERT_EXT
  8227. x509->issuer.rawLen = min(dCert->issuerRawLen, sizeof(x509->issuer.raw));
  8228. XMEMCPY(x509->issuer.raw, dCert->issuerRaw, x509->issuer.rawLen);
  8229. #endif
  8230. #endif
  8231. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  8232. x509->serialSz = dCert->serialSz;
  8233. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  8234. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  8235. x509->subjectCN[dCert->subjectCNLen] = '\0';
  8236. }
  8237. else
  8238. x509->subjectCN[0] = '\0';
  8239. #ifdef WOLFSSL_SEP
  8240. {
  8241. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  8242. if (minSz > 0) {
  8243. x509->deviceTypeSz = minSz;
  8244. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  8245. }
  8246. else
  8247. x509->deviceTypeSz = 0;
  8248. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  8249. if (minSz > 0) {
  8250. x509->hwTypeSz = minSz;
  8251. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  8252. }
  8253. else
  8254. x509->hwTypeSz = 0;
  8255. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  8256. if (minSz > 0) {
  8257. x509->hwSerialNumSz = minSz;
  8258. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  8259. }
  8260. else
  8261. x509->hwSerialNumSz = 0;
  8262. }
  8263. #endif /* WOLFSSL_SEP */
  8264. {
  8265. int minSz;
  8266. if (dCert->beforeDateLen > 0) {
  8267. minSz = min(dCert->beforeDate[1], MAX_DATE_SZ);
  8268. x509->notBefore.type = dCert->beforeDate[0];
  8269. x509->notBefore.length = minSz;
  8270. XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
  8271. }
  8272. else
  8273. x509->notBefore.length = 0;
  8274. if (dCert->afterDateLen > 0) {
  8275. minSz = min(dCert->afterDate[1], MAX_DATE_SZ);
  8276. x509->notAfter.type = dCert->afterDate[0];
  8277. x509->notAfter.length = minSz;
  8278. XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
  8279. }
  8280. else
  8281. x509->notAfter.length = 0;
  8282. }
  8283. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  8284. x509->pubKey.buffer = (byte*)XMALLOC(
  8285. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  8286. if (x509->pubKey.buffer != NULL) {
  8287. x509->pubKeyOID = dCert->keyOID;
  8288. x509->pubKey.length = dCert->pubKeySize;
  8289. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  8290. }
  8291. else
  8292. ret = MEMORY_E;
  8293. #if defined(OPENSSL_ALL)
  8294. if (ret == 0) {
  8295. x509->key.pubKeyOID = dCert->keyOID;
  8296. if (!x509->key.algor) {
  8297. x509->key.algor = wolfSSL_X509_ALGOR_new();
  8298. } else {
  8299. wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
  8300. }
  8301. if (!(x509->key.algor->algorithm =
  8302. wolfSSL_OBJ_nid2obj(dCert->keyOID))) {
  8303. ret = PUBLIC_KEY_E;
  8304. }
  8305. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  8306. if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
  8307. &dCert->publicKey,
  8308. dCert->pubKeySize))) {
  8309. ret = PUBLIC_KEY_E;
  8310. }
  8311. }
  8312. #endif
  8313. }
  8314. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  8315. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  8316. x509->sig.buffer = (byte*)XMALLOC(
  8317. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  8318. if (x509->sig.buffer == NULL) {
  8319. ret = MEMORY_E;
  8320. }
  8321. else {
  8322. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  8323. x509->sig.length = dCert->sigLength;
  8324. x509->sigOID = dCert->signatureOID;
  8325. }
  8326. #if defined(OPENSSL_ALL)
  8327. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  8328. if (!(x509->algor.algorithm =
  8329. wolfSSL_OBJ_nid2obj(dCert->signatureOID))) {
  8330. ret = PUBLIC_KEY_E;
  8331. }
  8332. #endif
  8333. }
  8334. /* store cert for potential retrieval */
  8335. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap) == 0) {
  8336. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  8337. }
  8338. else {
  8339. ret = MEMORY_E;
  8340. }
  8341. x509->altNames = dCert->altNames;
  8342. dCert->weOwnAltNames = 0;
  8343. x509->altNamesNext = x509->altNames; /* index hint */
  8344. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  8345. !defined(IGNORE_NAME_CONSTRAINTS)
  8346. /* add copies of alternate emails from dCert to X509 */
  8347. if (dCert->altEmailNames != NULL) {
  8348. DNS_entry* cur = dCert->altEmailNames;
  8349. while (cur != NULL) {
  8350. if (cur->type == ASN_RFC822_TYPE) {
  8351. DNS_entry* dnsEntry;
  8352. int strLen = cur->len;
  8353. dnsEntry = (DNS_entry*)XMALLOC(sizeof(DNS_entry), x509->heap,
  8354. DYNAMIC_TYPE_ALTNAME);
  8355. if (dnsEntry == NULL) {
  8356. WOLFSSL_MSG("\tOut of Memory");
  8357. return MEMORY_E;
  8358. }
  8359. dnsEntry->type = ASN_RFC822_TYPE;
  8360. dnsEntry->name = (char*)XMALLOC(strLen + 1, x509->heap,
  8361. DYNAMIC_TYPE_ALTNAME);
  8362. if (dnsEntry->name == NULL) {
  8363. WOLFSSL_MSG("\tOut of Memory");
  8364. XFREE(dnsEntry, x509->heap, DYNAMIC_TYPE_ALTNAME);
  8365. return MEMORY_E;
  8366. }
  8367. dnsEntry->len = strLen;
  8368. XMEMCPY(dnsEntry->name, cur->name, strLen);
  8369. dnsEntry->name[strLen] = '\0';
  8370. dnsEntry->next = x509->altNames;
  8371. x509->altNames = dnsEntry;
  8372. }
  8373. cur = cur->next;
  8374. }
  8375. }
  8376. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8377. x509->isCa = dCert->isCA;
  8378. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8379. x509->pathLength = dCert->pathLength;
  8380. x509->keyUsage = dCert->extKeyUsage;
  8381. x509->CRLdistSet = dCert->extCRLdistSet;
  8382. x509->CRLdistCrit = dCert->extCRLdistCrit;
  8383. x509->CRLInfo = dCert->extCrlInfo;
  8384. x509->CRLInfoSz = dCert->extCrlInfoSz;
  8385. x509->authInfoSet = dCert->extAuthInfoSet;
  8386. x509->authInfoCrit = dCert->extAuthInfoCrit;
  8387. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  8388. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  8389. DYNAMIC_TYPE_X509_EXT);
  8390. if (x509->authInfo != NULL) {
  8391. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  8392. x509->authInfoSz = dCert->extAuthInfoSz;
  8393. }
  8394. else {
  8395. ret = MEMORY_E;
  8396. }
  8397. }
  8398. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  8399. if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
  8400. x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
  8401. DYNAMIC_TYPE_X509_EXT);
  8402. if (x509->authInfoCaIssuer != NULL) {
  8403. XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
  8404. x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
  8405. }
  8406. else {
  8407. ret = MEMORY_E;
  8408. }
  8409. }
  8410. #endif
  8411. x509->basicConstSet = dCert->extBasicConstSet;
  8412. x509->basicConstCrit = dCert->extBasicConstCrit;
  8413. x509->basicConstPlSet = dCert->pathLengthSet;
  8414. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  8415. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  8416. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  8417. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  8418. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  8419. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  8420. DYNAMIC_TYPE_X509_EXT);
  8421. if (x509->authKeyId != NULL) {
  8422. XMEMCPY(x509->authKeyId,
  8423. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  8424. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  8425. }
  8426. else
  8427. ret = MEMORY_E;
  8428. }
  8429. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  8430. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  8431. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  8432. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  8433. DYNAMIC_TYPE_X509_EXT);
  8434. if (x509->subjKeyId != NULL) {
  8435. XMEMCPY(x509->subjKeyId,
  8436. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  8437. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  8438. }
  8439. else
  8440. ret = MEMORY_E;
  8441. }
  8442. x509->keyUsageSet = dCert->extKeyUsageSet;
  8443. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  8444. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  8445. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  8446. x509->heap, DYNAMIC_TYPE_X509_EXT);
  8447. if (x509->extKeyUsageSrc != NULL) {
  8448. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  8449. dCert->extExtKeyUsageSz);
  8450. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  8451. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  8452. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  8453. }
  8454. else {
  8455. ret = MEMORY_E;
  8456. }
  8457. }
  8458. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  8459. x509->certPolicySet = dCert->extCertPolicySet;
  8460. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  8461. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  8462. #ifdef WOLFSSL_CERT_EXT
  8463. {
  8464. int i;
  8465. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  8466. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  8467. MAX_CERTPOL_SZ);
  8468. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  8469. }
  8470. #endif /* WOLFSSL_CERT_EXT */
  8471. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  8472. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  8473. x509->pkCurveOID = dCert->pkCurveOID;
  8474. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8475. return ret;
  8476. }
  8477. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  8478. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  8479. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  8480. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  8481. word32 status_length)
  8482. {
  8483. int ret = 0;
  8484. OcspRequest* request;
  8485. #ifdef WOLFSSL_SMALL_STACK
  8486. CertStatus* status;
  8487. OcspResponse* response;
  8488. #else
  8489. CertStatus status[1];
  8490. OcspResponse response[1];
  8491. #endif
  8492. do {
  8493. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  8494. if (ssl->status_request) {
  8495. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  8496. ssl->status_request = 0;
  8497. break;
  8498. }
  8499. #endif
  8500. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  8501. if (ssl->status_request_v2) {
  8502. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  8503. WOLFSSL_CSR2_OCSP, 0);
  8504. ssl->status_request_v2 = 0;
  8505. break;
  8506. }
  8507. #endif
  8508. return BUFFER_ERROR;
  8509. } while(0);
  8510. if (request == NULL)
  8511. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  8512. #ifdef WOLFSSL_SMALL_STACK
  8513. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  8514. DYNAMIC_TYPE_OCSP_STATUS);
  8515. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  8516. DYNAMIC_TYPE_OCSP_REQUEST);
  8517. if (status == NULL || response == NULL) {
  8518. if (status)
  8519. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  8520. if (response)
  8521. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  8522. return MEMORY_ERROR;
  8523. }
  8524. #endif
  8525. InitOcspResponse(response, status, input +*inOutIdx, status_length);
  8526. if (OcspResponseDecode(response, ssl->ctx->cm, ssl->heap, 0) != 0)
  8527. ret = BAD_CERTIFICATE_STATUS_ERROR;
  8528. else if (CompareOcspReqResp(request, response) != 0)
  8529. ret = BAD_CERTIFICATE_STATUS_ERROR;
  8530. else if (response->responseStatus != OCSP_SUCCESSFUL)
  8531. ret = BAD_CERTIFICATE_STATUS_ERROR;
  8532. else if (response->status->status == CERT_REVOKED)
  8533. ret = OCSP_CERT_REVOKED;
  8534. else if (response->status->status != CERT_GOOD)
  8535. ret = BAD_CERTIFICATE_STATUS_ERROR;
  8536. *inOutIdx += status_length;
  8537. #ifdef WOLFSSL_SMALL_STACK
  8538. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  8539. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  8540. #endif
  8541. return ret;
  8542. }
  8543. #endif
  8544. #ifdef HAVE_PK_CALLBACKS
  8545. #ifdef HAVE_ECC
  8546. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  8547. const unsigned char* hash, unsigned int hashSz,
  8548. const unsigned char* keyDer, unsigned int keySz,
  8549. int* result, void* ctx)
  8550. {
  8551. int ret = NOT_COMPILED_IN;
  8552. WOLFSSL* ssl = (WOLFSSL*)ctx;
  8553. if (ssl && ssl->ctx->EccVerifyCb) {
  8554. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  8555. keyDer, keySz, result, ssl->EccVerifyCtx);
  8556. }
  8557. return ret;
  8558. }
  8559. #endif
  8560. #ifndef NO_RSA
  8561. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  8562. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  8563. void* ctx)
  8564. {
  8565. int ret = NOT_COMPILED_IN;
  8566. WOLFSSL* ssl = (WOLFSSL*)ctx;
  8567. if (ssl && ssl->ctx->RsaVerifyCb) {
  8568. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  8569. ssl->RsaVerifyCtx);
  8570. }
  8571. return ret;
  8572. }
  8573. #endif
  8574. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  8575. {
  8576. if (ssl == NULL || sigCtx == NULL)
  8577. return BAD_FUNC_ARG;
  8578. /* only setup the verify callback if a PK is set */
  8579. #ifdef HAVE_ECC
  8580. if (ssl->ctx->EccVerifyCb) {
  8581. sigCtx->pkCbEcc = SigPkCbEccVerify;
  8582. sigCtx->pkCtxEcc = ssl;
  8583. }
  8584. #endif
  8585. #ifndef NO_RSA
  8586. /* only setup the verify callback if a PK is set */
  8587. if (ssl->ctx->RsaVerifyCb) {
  8588. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  8589. sigCtx->pkCtxRsa = ssl;
  8590. }
  8591. #endif
  8592. return 0;
  8593. }
  8594. #endif /* HAVE_PK_CALLBACKS */
  8595. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  8596. static void DoCertFatalAlert(WOLFSSL* ssl, int ret)
  8597. {
  8598. int alertWhy;
  8599. if (ssl == NULL || ret == 0) {
  8600. return;
  8601. }
  8602. /* Determine alert reason */
  8603. alertWhy = bad_certificate;
  8604. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
  8605. alertWhy = certificate_expired;
  8606. } else if (ret == ASN_NO_SIGNER_E) {
  8607. alertWhy = unknown_ca;
  8608. }
  8609. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD))
  8610. else if (ret == CRL_CERT_REVOKED) {
  8611. alertWhy = certificate_revoked;
  8612. }
  8613. #endif
  8614. else if (ret == NO_PEER_CERT) {
  8615. #ifdef WOLFSSL_TLS13
  8616. if (ssl->options.tls1_3) {
  8617. alertWhy = certificate_required;
  8618. }
  8619. else
  8620. #endif
  8621. {
  8622. alertWhy = handshake_failure;
  8623. }
  8624. }
  8625. /* send fatal alert and mark connection closed */
  8626. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  8627. ssl->options.isClosed = 1;
  8628. }
  8629. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  8630. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  8631. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  8632. * The intermediates are done first then peer leaf cert last. Use the
  8633. * store->error_depth member to determine index (0=peer, >1 intermediates)
  8634. */
  8635. int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret,
  8636. ProcPeerCertArgs* args)
  8637. {
  8638. int verify_ok = 0, use_cb = 0;
  8639. void *heap = (ssl != NULL) ? ssl->heap : cm->heap;
  8640. /* Determine if verify was okay */
  8641. if (ret == 0) {
  8642. verify_ok = 1;
  8643. use_cb = 1; /* use verify callback on success, in case callback
  8644. * could force fail a cert */
  8645. }
  8646. /* Determine if verify callback should be used */
  8647. if (ret != 0) {
  8648. if ((ssl != NULL) && (!ssl->options.verifyNone)) {
  8649. use_cb = 1; /* always report errors */
  8650. }
  8651. }
  8652. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  8653. /* always use verify callback on peer leaf cert */
  8654. if (args->certIdx == 0) {
  8655. use_cb = 1;
  8656. }
  8657. #endif
  8658. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  8659. /* perform verify callback on other intermediate certs (not just peer) */
  8660. if (args->certIdx > 0) {
  8661. use_cb = 1;
  8662. }
  8663. #endif
  8664. #if defined(OPENSSL_EXTRA)
  8665. /* perform domain name check on the peer certificate */
  8666. if (args->dCertInit && args->dCert && (ssl != NULL) &&
  8667. ssl->param && ssl->param->hostName[0]) {
  8668. /* If altNames names is present, then subject common name is ignored */
  8669. if (args->dCert->altNames != NULL) {
  8670. if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
  8671. if (ret == 0) {
  8672. ret = DOMAIN_NAME_MISMATCH;
  8673. }
  8674. }
  8675. }
  8676. else {
  8677. if (args->dCert->subjectCN) {
  8678. if (MatchDomainName(args->dCert->subjectCN,
  8679. args->dCert->subjectCNLen,
  8680. ssl->param->hostName) == 0) {
  8681. if (ret == 0) {
  8682. ret = DOMAIN_NAME_MISMATCH;
  8683. }
  8684. }
  8685. }
  8686. }
  8687. }
  8688. /* perform IP address check on the peer certificate */
  8689. if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
  8690. (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
  8691. if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
  8692. if (ret == 0) {
  8693. ret = IPADDR_MISMATCH;
  8694. }
  8695. }
  8696. }
  8697. #endif
  8698. /* if verify callback has been set */
  8699. if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
  8700. #ifdef OPENSSL_ALL
  8701. || (ssl->ctx->verifyCertCb != NULL)
  8702. #endif
  8703. ))
  8704. #ifndef NO_WOLFSSL_CM_VERIFY
  8705. || (cm->verifyCallback != NULL)
  8706. #endif
  8707. ) {
  8708. int verifyFail = 0;
  8709. #ifdef WOLFSSL_SMALL_STACK
  8710. WOLFSSL_X509_STORE_CTX* store;
  8711. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8712. WOLFSSL_X509* x509;
  8713. #endif
  8714. char* domain = NULL;
  8715. #else
  8716. WOLFSSL_X509_STORE_CTX store[1];
  8717. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8718. WOLFSSL_X509 x509[1];
  8719. #endif
  8720. char domain[ASN_NAME_MAX];
  8721. #endif
  8722. #ifdef WOLFSSL_SMALL_STACK
  8723. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  8724. sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE);
  8725. if (store == NULL) {
  8726. return MEMORY_E;
  8727. }
  8728. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8729. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  8730. DYNAMIC_TYPE_X509);
  8731. if (x509 == NULL) {
  8732. XFREE(store, heap, DYNAMIC_TYPE_X509);
  8733. return MEMORY_E;
  8734. }
  8735. #endif
  8736. domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
  8737. if (domain == NULL) {
  8738. XFREE(store, heap, DYNAMIC_TYPE_X509);
  8739. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8740. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  8741. #endif
  8742. return MEMORY_E;
  8743. }
  8744. #endif /* WOLFSSL_SMALL_STACK */
  8745. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  8746. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8747. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  8748. #endif
  8749. domain[0] = '\0';
  8750. /* build subject CN as string to return in store */
  8751. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  8752. int subjectCNLen = args->dCert->subjectCNLen;
  8753. if (subjectCNLen > ASN_NAME_MAX-1)
  8754. subjectCNLen = ASN_NAME_MAX-1;
  8755. if (subjectCNLen > 0) {
  8756. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  8757. domain[subjectCNLen] = '\0';
  8758. }
  8759. }
  8760. store->error = ret;
  8761. store->error_depth = args->certIdx;
  8762. store->discardSessionCerts = 0;
  8763. store->domain = domain;
  8764. store->userCtx = (ssl != NULL) ? ssl->verifyCbCtx : cm;
  8765. store->certs = args->certs;
  8766. store->totalCerts = args->totalCerts;
  8767. #if (defined(HAVE_EX_DATA) || defined(FORTRESS)) && \
  8768. (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  8769. if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
  8770. != WOLFSSL_SUCCESS) {
  8771. WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
  8772. }
  8773. #endif
  8774. if (ssl != NULL) {
  8775. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  8776. if (ssl->ctx->x509_store_pt != NULL) {
  8777. store->store = ssl->ctx->x509_store_pt;
  8778. }
  8779. else {
  8780. store->store = &ssl->ctx->x509_store;
  8781. }
  8782. #if defined(OPENSSL_EXTRA)
  8783. store->depth = args->count;
  8784. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  8785. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  8786. heap, DYNAMIC_TYPE_OPENSSL);
  8787. if (store->param == NULL) {
  8788. #ifdef WOLFSSL_SMALL_STACK
  8789. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  8790. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8791. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  8792. #endif
  8793. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  8794. #endif
  8795. return MEMORY_E;
  8796. }
  8797. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  8798. /* Overwrite with non-default param values in SSL */
  8799. if (ssl->param) {
  8800. if (ssl->param->check_time)
  8801. store->param->check_time = ssl->param->check_time;
  8802. if (ssl->param->flags)
  8803. store->param->flags = ssl->param->flags;
  8804. if (ssl->param->hostName[0])
  8805. XMEMCPY(store->param->hostName, ssl->param->hostName,
  8806. WOLFSSL_HOST_NAME_MAX);
  8807. }
  8808. #endif /* defined(OPENSSL_EXTRA) */
  8809. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  8810. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8811. #ifdef KEEP_PEER_CERT
  8812. if (args->certIdx == 0) {
  8813. store->current_cert = &ssl->peerCert; /* use existing X509 */
  8814. }
  8815. else
  8816. #endif
  8817. {
  8818. InitX509(x509, 0, heap);
  8819. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  8820. store->current_cert = x509;
  8821. }
  8822. else {
  8823. FreeX509(x509);
  8824. }
  8825. }
  8826. #endif
  8827. #ifdef SESSION_CERTS
  8828. store->sesChain = &ssl->session.chain;
  8829. #endif
  8830. }
  8831. #ifndef NO_WOLFSSL_CM_VERIFY
  8832. /* non-zero return code indicates failure override */
  8833. if ((cm != NULL) && (cm->verifyCallback != NULL)) {
  8834. store->userCtx = cm;
  8835. if (cm->verifyCallback(verify_ok, store)) {
  8836. if (ret != 0) {
  8837. WOLFSSL_MSG("Verify CM callback overriding error!");
  8838. ret = 0;
  8839. }
  8840. }
  8841. else {
  8842. verifyFail = 1;
  8843. }
  8844. }
  8845. #endif
  8846. if (ssl != NULL) {
  8847. #ifdef OPENSSL_ALL
  8848. /* non-zero return code indicates failure override */
  8849. if (ssl->ctx->verifyCertCb) {
  8850. if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
  8851. if (ret != 0) {
  8852. WOLFSSL_MSG("Verify Cert callback overriding error!");
  8853. ret = 0;
  8854. }
  8855. }
  8856. else {
  8857. verifyFail = 1;
  8858. }
  8859. }
  8860. #endif
  8861. /* non-zero return code indicates failure override */
  8862. if (ssl->verifyCallback) {
  8863. if (ssl->verifyCallback(verify_ok, store)) {
  8864. if (ret != 0) {
  8865. WOLFSSL_MSG("Verify callback overriding error!");
  8866. ret = 0;
  8867. }
  8868. }
  8869. else {
  8870. verifyFail = 1;
  8871. }
  8872. }
  8873. }
  8874. if (verifyFail) {
  8875. /* induce error if one not present */
  8876. if (ret == 0) {
  8877. ret = VERIFY_CERT_ERROR;
  8878. }
  8879. /* mark as verify error */
  8880. args->verifyErr = 1;
  8881. }
  8882. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8883. if (args->certIdx > 0)
  8884. FreeX509(x509);
  8885. #endif
  8886. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  8887. wolfSSL_sk_X509_free(store->chain);
  8888. store->chain = NULL;
  8889. #endif
  8890. #ifdef SESSION_CERTS
  8891. if ((ssl != NULL) && (store->discardSessionCerts)) {
  8892. WOLFSSL_MSG("Verify callback requested discard sess certs");
  8893. ssl->session.chain.count = 0;
  8894. #ifdef WOLFSSL_ALT_CERT_CHAINS
  8895. ssl->session.altChain.count = 0;
  8896. #endif
  8897. }
  8898. #endif /* SESSION_CERTS */
  8899. #ifdef OPENSSL_EXTRA
  8900. if ((ssl != NULL) && (store->param)) {
  8901. XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL);
  8902. }
  8903. #endif
  8904. #ifdef WOLFSSL_SMALL_STACK
  8905. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  8906. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  8907. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  8908. #endif
  8909. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  8910. #endif
  8911. }
  8912. (void)heap;
  8913. return ret;
  8914. }
  8915. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  8916. {
  8917. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  8918. (void)ssl;
  8919. if (args->certs) {
  8920. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  8921. args->certs = NULL;
  8922. }
  8923. #ifdef WOLFSSL_TLS13
  8924. if (args->exts) {
  8925. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  8926. args->exts = NULL;
  8927. }
  8928. #endif
  8929. if (args->dCert) {
  8930. if (args->dCertInit) {
  8931. FreeDecodedCert(args->dCert);
  8932. args->dCertInit = 0;
  8933. }
  8934. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  8935. args->dCert = NULL;
  8936. }
  8937. }
  8938. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  8939. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  8940. {
  8941. int ret = 0;
  8942. buffer* cert;
  8943. byte* subjectHash = NULL;
  8944. int alreadySigner = 0;
  8945. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  8946. int sigRet = 0;
  8947. #endif
  8948. if (ssl == NULL || args == NULL)
  8949. return BAD_FUNC_ARG;
  8950. /* check to make sure certificate index is valid */
  8951. if (args->certIdx > args->count)
  8952. return BUFFER_E;
  8953. /* check if returning from non-blocking OCSP */
  8954. /* skip this section because cert is already initialized and parsed */
  8955. #ifdef WOLFSSL_NONBLOCK_OCSP
  8956. if (args->lastErr == OCSP_WANT_READ) {
  8957. args->lastErr = 0; /* clear error */
  8958. return 0;
  8959. }
  8960. #endif
  8961. #ifdef WOLFSSL_TRUST_PEER_CERT
  8962. /* we have trusted peer */
  8963. if (args->haveTrustPeer) {
  8964. return 0;
  8965. }
  8966. #endif
  8967. /* get certificate buffer */
  8968. cert = &args->certs[args->certIdx];
  8969. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  8970. if (verify == VERIFY) {
  8971. /* for small cert verify, release decoded cert during signature check to
  8972. reduce peak memory usage */
  8973. if (args->dCert != NULL) {
  8974. if (args->dCertInit) {
  8975. FreeDecodedCert(args->dCert);
  8976. args->dCertInit = 0;
  8977. }
  8978. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  8979. args->dCert = NULL;
  8980. }
  8981. /* perform cert parsing and signature check */
  8982. sigRet = CheckCertSignature(cert->buffer, cert->length,
  8983. ssl->heap, ssl->ctx->cm);
  8984. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  8985. /* verify name only in ParseCertRelative below, signature check done */
  8986. verify = VERIFY_NAME;
  8987. }
  8988. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  8989. /* make sure the decoded cert structure is allocated and initialized */
  8990. if (!args->dCertInit
  8991. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  8992. || args->dCert == NULL
  8993. #endif
  8994. ) {
  8995. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  8996. if (args->dCert == NULL) {
  8997. args->dCert = (DecodedCert*)XMALLOC(
  8998. sizeof(DecodedCert), ssl->heap,
  8999. DYNAMIC_TYPE_DCERT);
  9000. if (args->dCert == NULL) {
  9001. return MEMORY_E;
  9002. }
  9003. }
  9004. #endif
  9005. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  9006. args->dCertInit = 1;
  9007. args->dCert->sigCtx.devId = ssl->devId;
  9008. #ifdef WOLFSSL_ASYNC_CRYPT
  9009. args->dCert->sigCtx.asyncCtx = ssl;
  9010. #endif
  9011. #ifdef HAVE_PK_CALLBACKS
  9012. /* setup the PK callback context */
  9013. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  9014. if (ret != 0)
  9015. return ret;
  9016. #endif
  9017. }
  9018. /* Parse Certificate */
  9019. ret = ParseCertRelative(args->dCert, certType, verify, ssl->ctx->cm);
  9020. /* perform below checks for date failure cases */
  9021. if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) {
  9022. /* get subject and determine if already loaded */
  9023. #ifndef NO_SKID
  9024. if (args->dCert->extAuthKeyIdSet)
  9025. subjectHash = args->dCert->extSubjKeyId;
  9026. else
  9027. #endif
  9028. subjectHash = args->dCert->subjectHash;
  9029. alreadySigner = AlreadySigner(ssl->ctx->cm, subjectHash);
  9030. }
  9031. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  9032. /* get signature check failures from above */
  9033. if (ret == 0)
  9034. ret = sigRet;
  9035. #endif
  9036. if (pSubjectHash)
  9037. *pSubjectHash = subjectHash;
  9038. if (pAlreadySigner)
  9039. *pAlreadySigner = alreadySigner;
  9040. #ifdef WOLFSSL_ASYNC_CRYPT
  9041. if (ret == WC_PENDING_E) {
  9042. ret = wolfSSL_AsyncPush(ssl,
  9043. args->dCert->sigCtx.asyncDev);
  9044. }
  9045. #endif
  9046. return ret;
  9047. }
  9048. /* Check key sizes for certs. Is redundant check since
  9049. ProcessBuffer also performs this check. */
  9050. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  9051. {
  9052. int ret = 0;
  9053. if (ssl->options.verifyNone) {
  9054. return ret;
  9055. }
  9056. switch (args->dCert->keyOID) {
  9057. #ifndef NO_RSA
  9058. case RSAk:
  9059. if (ssl->options.minRsaKeySz < 0 ||
  9060. args->dCert->pubKeySize <
  9061. (word16)ssl->options.minRsaKeySz) {
  9062. WOLFSSL_MSG(
  9063. "RSA key size in cert chain error");
  9064. ret = RSA_KEY_SIZE_E;
  9065. }
  9066. break;
  9067. #endif /* !NO_RSA */
  9068. #ifdef HAVE_ECC
  9069. case ECDSAk:
  9070. if (ssl->options.minEccKeySz < 0 ||
  9071. args->dCert->pubKeySize <
  9072. (word16)ssl->options.minEccKeySz) {
  9073. WOLFSSL_MSG(
  9074. "ECC key size in cert chain error");
  9075. ret = ECC_KEY_SIZE_E;
  9076. }
  9077. break;
  9078. #endif /* HAVE_ECC */
  9079. #ifdef HAVE_ED25519
  9080. case ED25519k:
  9081. if (ssl->options.minEccKeySz < 0 ||
  9082. ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  9083. WOLFSSL_MSG(
  9084. "ECC key size in cert chain error");
  9085. ret = ECC_KEY_SIZE_E;
  9086. }
  9087. break;
  9088. #endif /* HAVE_ED25519 */
  9089. #ifdef HAVE_ED448
  9090. case ED448k:
  9091. if (ssl->options.minEccKeySz < 0 ||
  9092. ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  9093. WOLFSSL_MSG(
  9094. "ECC key size in cert chain error");
  9095. ret = ECC_KEY_SIZE_E;
  9096. }
  9097. break;
  9098. #endif /* HAVE_ED448 */
  9099. default:
  9100. WOLFSSL_MSG("Key size not checked");
  9101. /* key not being checked for size if not in
  9102. switch */
  9103. break;
  9104. }
  9105. return ret;
  9106. }
  9107. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  9108. word32 totalSz)
  9109. {
  9110. int ret = 0;
  9111. #ifdef WOLFSSL_ASYNC_CRYPT
  9112. ProcPeerCertArgs* args = (ProcPeerCertArgs*)ssl->async.args;
  9113. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  9114. (void)sizeof(args_test);
  9115. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  9116. ProcPeerCertArgs* args = ssl->nonblockarg;
  9117. #elif defined(WOLFSSL_SMALL_STACK)
  9118. ProcPeerCertArgs* args = NULL;
  9119. #else
  9120. ProcPeerCertArgs args[1];
  9121. #endif
  9122. byte* subjectHash = NULL;
  9123. int alreadySigner = 0;
  9124. WOLFSSL_ENTER("ProcessPeerCerts");
  9125. #ifdef WOLFSSL_ASYNC_CRYPT
  9126. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  9127. if (ret != WC_NOT_PENDING_E) {
  9128. /* Check for error */
  9129. if (ret < 0)
  9130. goto exit_ppc;
  9131. }
  9132. else
  9133. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  9134. if (args == NULL) {
  9135. args = (ProcPeerCertArgs*)XMALLOC(
  9136. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9137. if (args == NULL) {
  9138. ERROR_OUT(MEMORY_E, exit_ppc);
  9139. }
  9140. }
  9141. if (ssl->nonblockarg == NULL) /* new args */
  9142. #elif defined(WOLFSSL_SMALL_STACK)
  9143. args = (ProcPeerCertArgs*)XMALLOC(
  9144. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  9145. if (args == NULL) {
  9146. ERROR_OUT(MEMORY_E, exit_ppc);
  9147. }
  9148. #endif
  9149. {
  9150. /* Reset state */
  9151. ret = 0;
  9152. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  9153. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  9154. args->idx = *inOutIdx;
  9155. args->begin = *inOutIdx;
  9156. #ifdef WOLFSSL_ASYNC_CRYPT
  9157. ssl->async.freeArgs = FreeProcPeerCertArgs;
  9158. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  9159. ssl->nonblockarg = args;
  9160. #endif
  9161. }
  9162. switch (ssl->options.asyncState)
  9163. {
  9164. case TLS_ASYNC_BEGIN:
  9165. {
  9166. word32 listSz;
  9167. #ifdef WOLFSSL_CALLBACKS
  9168. if (ssl->hsInfoOn)
  9169. AddPacketName(ssl, "Certificate");
  9170. if (ssl->toInfoOn)
  9171. AddLateName("Certificate", &ssl->timeoutInfo);
  9172. #endif
  9173. #ifdef WOLFSSL_TLS13
  9174. if (ssl->options.tls1_3) {
  9175. byte ctxSz;
  9176. /* Certificate Request Context */
  9177. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  9178. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9179. ctxSz = *(input + args->idx);
  9180. args->idx++;
  9181. if ((args->idx - args->begin) + ctxSz > totalSz)
  9182. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9183. #ifndef NO_WOLFSSL_CLIENT
  9184. /* Must be empty when received from server. */
  9185. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9186. if (ctxSz != 0) {
  9187. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  9188. }
  9189. }
  9190. #endif
  9191. #ifndef NO_WOLFSSL_SERVER
  9192. /* Must contain value sent in request. */
  9193. if (ssl->options.side == WOLFSSL_SERVER_END) {
  9194. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  9195. ctxSz != 0) {
  9196. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  9197. }
  9198. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  9199. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  9200. CertReqCtx* curr = ssl->certReqCtx;
  9201. CertReqCtx* prev = NULL;
  9202. while (curr != NULL) {
  9203. if ((ctxSz == curr->len) &&
  9204. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  9205. == 0) {
  9206. if (prev != NULL)
  9207. prev->next = curr->next;
  9208. else
  9209. ssl->certReqCtx = curr->next;
  9210. XFREE(curr, ssl->heap,
  9211. DYNAMIC_TYPE_TMP_BUFFER);
  9212. break;
  9213. }
  9214. prev = curr;
  9215. curr = curr->next;
  9216. }
  9217. if (curr == NULL)
  9218. #endif
  9219. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  9220. }
  9221. }
  9222. #endif
  9223. args->idx += ctxSz;
  9224. #ifdef OPENSSL_EXTRA
  9225. /* allocate buffer for cert extensions */
  9226. args->exts = (buffer*)XMALLOC(sizeof(buffer) *
  9227. (ssl->verifyDepth + 1), ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  9228. if (args->exts == NULL) {
  9229. ERROR_OUT(MEMORY_E, exit_ppc);
  9230. }
  9231. #else
  9232. /* allocate buffer for cert extensions */
  9233. args->exts = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  9234. ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  9235. if (args->exts == NULL) {
  9236. ERROR_OUT(MEMORY_E, exit_ppc);
  9237. }
  9238. #endif
  9239. }
  9240. #endif
  9241. /* allocate buffer for certs */
  9242. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9243. args->certs = (buffer*)XMALLOC(sizeof(buffer) *
  9244. (ssl->verifyDepth + 1), ssl->heap, DYNAMIC_TYPE_DER);
  9245. if (args->certs == NULL) {
  9246. ERROR_OUT(MEMORY_E, exit_ppc);
  9247. }
  9248. XMEMSET(args->certs, 0, sizeof(buffer) * (ssl->verifyDepth + 1));
  9249. #else
  9250. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  9251. ssl->heap, DYNAMIC_TYPE_DER);
  9252. if (args->certs == NULL) {
  9253. ERROR_OUT(MEMORY_E, exit_ppc);
  9254. }
  9255. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  9256. #endif /* OPENSSL_EXTRA */
  9257. /* Certificate List */
  9258. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  9259. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9260. }
  9261. c24to32(input + args->idx, &listSz);
  9262. args->idx += OPAQUE24_LEN;
  9263. if (listSz > MAX_CERTIFICATE_SZ) {
  9264. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9265. }
  9266. if ((args->idx - args->begin) + listSz != totalSz) {
  9267. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9268. }
  9269. WOLFSSL_MSG("Loading peer's cert chain");
  9270. /* first put cert chain into buffer so can verify top down
  9271. we're sent bottom up */
  9272. while (listSz) {
  9273. word32 certSz;
  9274. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9275. if (args->totalCerts > ssl->verifyDepth) {
  9276. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  9277. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  9278. }
  9279. #else
  9280. if (args->totalCerts >= ssl->verifyDepth ||
  9281. args->totalCerts >= MAX_CHAIN_DEPTH) {
  9282. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  9283. }
  9284. #endif
  9285. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  9286. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9287. }
  9288. c24to32(input + args->idx, &certSz);
  9289. args->idx += OPAQUE24_LEN;
  9290. if ((args->idx - args->begin) + certSz > totalSz) {
  9291. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9292. }
  9293. args->certs[args->totalCerts].length = certSz;
  9294. args->certs[args->totalCerts].buffer = input + args->idx;
  9295. #ifdef SESSION_CERTS
  9296. AddSessionCertToChain(&ssl->session.chain,
  9297. input + args->idx, certSz);
  9298. #endif /* SESSION_CERTS */
  9299. args->idx += certSz;
  9300. listSz -= certSz + CERT_HEADER_SZ;
  9301. #ifdef WOLFSSL_TLS13
  9302. /* Extensions */
  9303. if (ssl->options.tls1_3) {
  9304. word16 extSz;
  9305. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  9306. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9307. }
  9308. ato16(input + args->idx, &extSz);
  9309. args->idx += OPAQUE16_LEN;
  9310. if ((args->idx - args->begin) + extSz > totalSz) {
  9311. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  9312. }
  9313. /* Store extension data info for later processing. */
  9314. args->exts[args->totalCerts].length = extSz;
  9315. args->exts[args->totalCerts].buffer = input + args->idx;
  9316. args->idx += extSz;
  9317. listSz -= extSz + OPAQUE16_LEN;
  9318. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  9319. args->exts[args->totalCerts].length, certificate, NULL);
  9320. if (ret < 0) {
  9321. ERROR_OUT(ret, exit_ppc);
  9322. }
  9323. }
  9324. #endif
  9325. args->totalCerts++;
  9326. WOLFSSL_MSG("\tPut another cert into chain");
  9327. } /* while (listSz) */
  9328. args->count = args->totalCerts;
  9329. args->certIdx = 0; /* select peer cert (first one) */
  9330. if (args->count == 0 && (ssl->options.mutualAuth ||
  9331. (ssl->options.failNoCert && IsAtLeastTLSv1_3(ssl->version))) &&
  9332. ssl->options.side == WOLFSSL_SERVER_END) {
  9333. ret = NO_PEER_CERT;
  9334. DoCertFatalAlert(ssl, ret);
  9335. }
  9336. args->dCertInit = 0;
  9337. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  9338. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  9339. DYNAMIC_TYPE_DCERT);
  9340. if (args->dCert == NULL) {
  9341. ERROR_OUT(MEMORY_E, exit_ppc);
  9342. }
  9343. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  9344. #endif
  9345. /* Advance state and proceed */
  9346. ssl->options.asyncState = TLS_ASYNC_BUILD;
  9347. } /* case TLS_ASYNC_BEGIN */
  9348. FALL_THROUGH;
  9349. case TLS_ASYNC_BUILD:
  9350. {
  9351. if (args->count > 0) {
  9352. /* check for trusted peer and get untrustedDepth */
  9353. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  9354. if (args->certIdx == 0) {
  9355. #ifdef WOLFSSL_TRUST_PEER_CERT
  9356. TrustedPeerCert* tp;
  9357. int matchType = WC_MATCH_NAME;
  9358. #endif
  9359. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  9360. &subjectHash, &alreadySigner);
  9361. if (ret != 0)
  9362. goto exit_ppc;
  9363. #ifdef OPENSSL_EXTRA
  9364. /* Determine untrusted depth */
  9365. if (!alreadySigner && (!args->dCert ||
  9366. !args->dCertInit || !args->dCert->selfSigned)) {
  9367. args->untrustedDepth = 1;
  9368. }
  9369. #endif
  9370. #ifdef WOLFSSL_TRUST_PEER_CERT
  9371. #ifndef NO_SKID
  9372. if (args->dCert->extAuthKeyIdSet)
  9373. matchType = WC_MATCH_SKID;
  9374. #endif
  9375. tp = GetTrustedPeer(ssl->ctx->cm, subjectHash, matchType);
  9376. WOLFSSL_MSG("Checking for trusted peer cert");
  9377. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  9378. WOLFSSL_MSG("Found matching trusted peer cert");
  9379. args->haveTrustPeer = 1;
  9380. }
  9381. else if (tp == NULL) {
  9382. /* no trusted peer cert */
  9383. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  9384. }
  9385. else {
  9386. WOLFSSL_MSG("Trusted peer cert did not match!");
  9387. }
  9388. if (!args->haveTrustPeer)
  9389. #endif
  9390. {
  9391. /* free cert if not trusted peer */
  9392. FreeDecodedCert(args->dCert);
  9393. args->dCertInit = 0;
  9394. }
  9395. }
  9396. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  9397. /* check certificate up to peer's first */
  9398. /* do not verify chain if trusted peer cert found */
  9399. while (args->count > 1
  9400. #ifdef WOLFSSL_TRUST_PEER_CERT
  9401. && !args->haveTrustPeer
  9402. #endif /* WOLFSSL_TRUST_PEER_CERT */
  9403. ) {
  9404. int skipAddCA = 0;
  9405. /* select last certificate */
  9406. args->certIdx = args->count - 1;
  9407. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  9408. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  9409. &subjectHash, &alreadySigner);
  9410. #ifdef WOLFSSL_ASYNC_CRYPT
  9411. if (ret == WC_PENDING_E)
  9412. goto exit_ppc;
  9413. #endif
  9414. if (ret == 0) {
  9415. ret = ProcessPeerCertCheckKey(ssl, args);
  9416. }
  9417. if (ret == 0 && args->dCert->isCA == 0) {
  9418. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  9419. }
  9420. else if (ret == 0 && ssl->options.verifyNone) {
  9421. WOLFSSL_MSG("Chain cert not verified by option, "
  9422. "not adding as CA");
  9423. }
  9424. else if (ret == 0) {
  9425. #ifdef OPENSSL_EXTRA
  9426. if (args->certIdx > args->untrustedDepth) {
  9427. args->untrustedDepth = (char)args->certIdx + 1;
  9428. }
  9429. #endif
  9430. if (alreadySigner) {
  9431. WOLFSSL_MSG("Verified CA from chain and already had it");
  9432. }
  9433. }
  9434. else {
  9435. WOLFSSL_MSG("Failed to verify CA from chain");
  9436. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9437. ssl->peerVerifyRet = X509_V_ERR_INVALID_CA;
  9438. #endif
  9439. }
  9440. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  9441. if (ret == 0) {
  9442. int doCrlLookup = 1;
  9443. #ifdef HAVE_OCSP
  9444. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  9445. if (ssl->status_request_v2) {
  9446. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  9447. args->dCert, 0, ssl->heap);
  9448. }
  9449. else /* skips OCSP and force CRL check */
  9450. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  9451. if (ssl->ctx->cm->ocspEnabled &&
  9452. ssl->ctx->cm->ocspCheckAll) {
  9453. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  9454. ret = CheckCertOCSP_ex(ssl->ctx->cm->ocsp,
  9455. args->dCert, NULL, ssl);
  9456. #ifdef WOLFSSL_NONBLOCK_OCSP
  9457. if (ret == OCSP_WANT_READ) {
  9458. args->lastErr = ret;
  9459. goto exit_ppc;
  9460. }
  9461. #endif
  9462. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  9463. if (ret != 0) {
  9464. doCrlLookup = 0;
  9465. WOLFSSL_MSG("\tOCSP Lookup not ok");
  9466. }
  9467. }
  9468. #endif /* HAVE_OCSP */
  9469. #ifdef HAVE_CRL
  9470. if (ret == 0 && doCrlLookup &&
  9471. ssl->ctx->cm->crlEnabled &&
  9472. ssl->ctx->cm->crlCheckAll) {
  9473. WOLFSSL_MSG("Doing Non Leaf CRL check");
  9474. ret = CheckCertCRL(ssl->ctx->cm->crl, args->dCert);
  9475. #ifdef WOLFSSL_NONBLOCK_OCSP
  9476. if (ret == OCSP_WANT_READ) {
  9477. args->lastErr = ret;
  9478. goto exit_ppc;
  9479. }
  9480. #endif
  9481. if (ret != 0) {
  9482. WOLFSSL_MSG("\tCRL check not ok");
  9483. }
  9484. }
  9485. #endif /* HAVE_CRL */
  9486. (void)doCrlLookup;
  9487. }
  9488. #endif /* HAVE_OCSP || HAVE_CRL */
  9489. /* Do verify callback */
  9490. ret = DoVerifyCallback(ssl->ctx->cm, ssl, ret, args);
  9491. if (ssl->options.verifyNone &&
  9492. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED)) {
  9493. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  9494. ret = ssl->error = 0;
  9495. }
  9496. #ifdef WOLFSSL_ALT_CERT_CHAINS
  9497. /* For alternate cert chain, its okay for a CA cert to fail
  9498. with ASN_NO_SIGNER_E here. The "alternate" certificate
  9499. chain mode only requires that the peer certificate
  9500. validate to a trusted CA */
  9501. if (ret != 0 && args->dCert->isCA) {
  9502. if (ret == ASN_NO_SIGNER_E) {
  9503. if (!ssl->options.usingAltCertChain) {
  9504. WOLFSSL_MSG("Trying alternate cert chain");
  9505. ssl->options.usingAltCertChain = 1;
  9506. }
  9507. ret = 0; /* clear errors and continue */
  9508. args->verifyErr = 0;
  9509. }
  9510. /* do not add to certificate manager */
  9511. skipAddCA = 1;
  9512. }
  9513. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  9514. /* If valid CA then add to Certificate Manager */
  9515. if (ret == 0 && args->dCert->isCA &&
  9516. !ssl->options.verifyNone && !skipAddCA) {
  9517. buffer* cert = &args->certs[args->certIdx];
  9518. /* Is valid CA */
  9519. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  9520. /* if using alternate chain, store the cert used */
  9521. if (ssl->options.usingAltCertChain) {
  9522. AddSessionCertToChain(&ssl->session.altChain,
  9523. cert->buffer, cert->length);
  9524. }
  9525. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  9526. if (!alreadySigner) {
  9527. DerBuffer* add = NULL;
  9528. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  9529. if (ret < 0)
  9530. goto exit_ppc;
  9531. XMEMCPY(add->buffer, cert->buffer, cert->length);
  9532. /* CA already verified above in ParseCertRelative */
  9533. WOLFSSL_MSG("Adding CA from chain");
  9534. ret = AddCA(ssl->ctx->cm, &add, WOLFSSL_CHAIN_CA,
  9535. NO_VERIFY);
  9536. if (ret == WOLFSSL_SUCCESS) {
  9537. ret = 0;
  9538. }
  9539. }
  9540. }
  9541. /* Handle error codes */
  9542. if (ret != 0) {
  9543. if (!ssl->options.verifyNone) {
  9544. DoCertFatalAlert(ssl, ret);
  9545. }
  9546. ssl->error = ret; /* Report SSL error */
  9547. if (args->lastErr == 0) {
  9548. args->lastErr = ret; /* save error from last time */
  9549. ret = 0; /* reset error */
  9550. }
  9551. }
  9552. FreeDecodedCert(args->dCert);
  9553. args->dCertInit = 0;
  9554. args->count--;
  9555. } /* while (count > 0 && !args->haveTrustPeer) */
  9556. } /* if (count > 0) */
  9557. /* Check for error */
  9558. if (ret != 0) {
  9559. goto exit_ppc;
  9560. }
  9561. /* Advance state and proceed */
  9562. ssl->options.asyncState = TLS_ASYNC_DO;
  9563. } /* case TLS_ASYNC_BUILD */
  9564. FALL_THROUGH;
  9565. case TLS_ASYNC_DO:
  9566. {
  9567. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  9568. if (args->count > 0) {
  9569. WOLFSSL_MSG("Verifying Peer's cert");
  9570. /* select peer cert (first one) */
  9571. args->certIdx = 0;
  9572. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  9573. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  9574. &subjectHash, &alreadySigner);
  9575. #ifdef WOLFSSL_ASYNC_CRYPT
  9576. if (ret == WC_PENDING_E)
  9577. goto exit_ppc;
  9578. #endif
  9579. if (ret == 0) {
  9580. WOLFSSL_MSG("Verified Peer's cert");
  9581. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9582. ssl->peerVerifyRet = X509_V_OK;
  9583. #endif
  9584. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  9585. /* if using alternate chain, store the cert used */
  9586. if (ssl->options.usingAltCertChain) {
  9587. buffer* cert = &args->certs[args->certIdx];
  9588. AddSessionCertToChain(&ssl->session.altChain,
  9589. cert->buffer, cert->length);
  9590. }
  9591. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  9592. /* check if fatal error */
  9593. if (args->verifyErr) {
  9594. args->fatal = 1;
  9595. if (ret == 0) {
  9596. ret = args->lastErr;
  9597. }
  9598. }
  9599. else {
  9600. args->fatal = 0;
  9601. }
  9602. }
  9603. else if (ret == ASN_PARSE_E || ret == BUFFER_E) {
  9604. WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR");
  9605. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
  9606. defined(OPENSSL_EXTRA_X509_SMALL)
  9607. DoCertFatalAlert(ssl, ret);
  9608. #endif
  9609. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9610. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  9611. #endif
  9612. args->fatal = 1;
  9613. }
  9614. else {
  9615. WOLFSSL_MSG("Failed to verify Peer's cert");
  9616. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9617. ssl->peerVerifyRet = X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  9618. #endif
  9619. if (ssl->verifyCallback) {
  9620. WOLFSSL_MSG(
  9621. "\tCallback override available, will continue");
  9622. /* check if fatal error */
  9623. args->fatal = (args->verifyErr) ? 1 : 0;
  9624. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  9625. defined(OPENSSL_EXTRA) || \
  9626. defined(OPENSSL_EXTRA_X509_SMALL)
  9627. if (args->fatal)
  9628. DoCertFatalAlert(ssl, ret);
  9629. #endif
  9630. }
  9631. else {
  9632. WOLFSSL_MSG("\tNo callback override available, fatal");
  9633. args->fatal = 1;
  9634. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  9635. defined(OPENSSL_EXTRA) || \
  9636. defined(OPENSSL_EXTRA_X509_SMALL)
  9637. DoCertFatalAlert(ssl, ret);
  9638. #endif
  9639. }
  9640. }
  9641. #ifdef HAVE_SECURE_RENEGOTIATION
  9642. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  9643. && ssl->secure_renegotiation
  9644. && ssl->secure_renegotiation->enabled) {
  9645. if (IsEncryptionOn(ssl, 0)) {
  9646. /* compare against previous time */
  9647. if (ssl->secure_renegotiation->subject_hash_set) {
  9648. if (XMEMCMP(args->dCert->subjectHash,
  9649. ssl->secure_renegotiation->subject_hash,
  9650. KEYID_SIZE) != 0) {
  9651. WOLFSSL_MSG(
  9652. "Peer sent different cert during scr, fatal");
  9653. args->fatal = 1;
  9654. ret = SCR_DIFFERENT_CERT_E;
  9655. }
  9656. }
  9657. }
  9658. /* cache peer's hash */
  9659. if (args->fatal == 0) {
  9660. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  9661. args->dCert->subjectHash, KEYID_SIZE);
  9662. ssl->secure_renegotiation->subject_hash_set = 1;
  9663. }
  9664. }
  9665. #endif /* HAVE_SECURE_RENEGOTIATION */
  9666. } /* if (count > 0) */
  9667. /* Check for error */
  9668. if (args->fatal && ret != 0) {
  9669. goto exit_ppc;
  9670. }
  9671. /* Advance state and proceed */
  9672. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  9673. } /* case TLS_ASYNC_DO */
  9674. FALL_THROUGH;
  9675. case TLS_ASYNC_VERIFY:
  9676. {
  9677. if (args->count > 0) {
  9678. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  9679. if (args->fatal == 0) {
  9680. int doLookup = 1;
  9681. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9682. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  9683. if (ssl->status_request) {
  9684. args->fatal = TLSX_CSR_InitRequest(ssl->extensions,
  9685. args->dCert, ssl->heap);
  9686. doLookup = 0;
  9687. #if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
  9688. if (ssl->options.tls1_3) {
  9689. TLSX* ext = TLSX_Find(ssl->extensions,
  9690. TLSX_STATUS_REQUEST);
  9691. if (ext != NULL) {
  9692. word32 idx = 0;
  9693. CertificateStatusRequest* csr =
  9694. (CertificateStatusRequest*)ext->data;
  9695. ret = ProcessCSR(ssl, csr->response.buffer,
  9696. &idx, csr->response.length);
  9697. if (ret < 0)
  9698. goto exit_ppc;
  9699. }
  9700. }
  9701. #endif
  9702. }
  9703. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  9704. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  9705. if (ssl->status_request_v2) {
  9706. args->fatal = TLSX_CSR2_InitRequests(ssl->extensions,
  9707. args->dCert, 1, ssl->heap);
  9708. doLookup = 0;
  9709. }
  9710. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  9711. }
  9712. #ifdef HAVE_OCSP
  9713. if (doLookup && ssl->ctx->cm->ocspEnabled) {
  9714. WOLFSSL_MSG("Doing Leaf OCSP check");
  9715. ret = CheckCertOCSP_ex(ssl->ctx->cm->ocsp,
  9716. args->dCert, NULL, ssl);
  9717. #ifdef WOLFSSL_NONBLOCK_OCSP
  9718. if (ret == OCSP_WANT_READ) {
  9719. goto exit_ppc;
  9720. }
  9721. #endif
  9722. doLookup = (ret == OCSP_CERT_UNKNOWN);
  9723. if (ret != 0) {
  9724. WOLFSSL_MSG("\tOCSP Lookup not ok");
  9725. args->fatal = 0;
  9726. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9727. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  9728. #endif
  9729. }
  9730. }
  9731. #endif /* HAVE_OCSP */
  9732. #ifdef HAVE_CRL
  9733. if (doLookup && ssl->ctx->cm->crlEnabled) {
  9734. WOLFSSL_MSG("Doing Leaf CRL check");
  9735. ret = CheckCertCRL(ssl->ctx->cm->crl, args->dCert);
  9736. #ifdef WOLFSSL_NONBLOCK_OCSP
  9737. if (ret == OCSP_WANT_READ) {
  9738. goto exit_ppc;
  9739. }
  9740. #endif
  9741. if (ret != 0) {
  9742. WOLFSSL_MSG("\tCRL check not ok");
  9743. args->fatal = 0;
  9744. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9745. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  9746. #endif
  9747. }
  9748. }
  9749. #endif /* HAVE_CRL */
  9750. (void)doLookup;
  9751. }
  9752. #endif /* HAVE_OCSP || HAVE_CRL */
  9753. #ifdef KEEP_PEER_CERT
  9754. if (args->fatal == 0) {
  9755. int copyRet = 0;
  9756. #ifdef HAVE_SECURE_RENEGOTIATION
  9757. if (ssl->secure_renegotiation &&
  9758. ssl->secure_renegotiation->enabled) {
  9759. /* free old peer cert */
  9760. FreeX509(&ssl->peerCert);
  9761. InitX509(&ssl->peerCert, 0, ssl->heap);
  9762. }
  9763. #endif
  9764. /* set X509 format for peer cert */
  9765. copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
  9766. if (copyRet == MEMORY_E) {
  9767. args->fatal = 1;
  9768. }
  9769. }
  9770. #endif /* KEEP_PEER_CERT */
  9771. #ifndef IGNORE_KEY_EXTENSIONS
  9772. #if defined(OPENSSL_EXTRA)
  9773. /* when compatibility layer is turned on and no verify is
  9774. * set then ignore the certificate key extension */
  9775. if (args->dCert->extKeyUsageSet &&
  9776. args->dCert->extKeyUsageCrit == 0 &&
  9777. ssl->options.verifyNone) {
  9778. WOLFSSL_MSG("Not verifying certificate key usage");
  9779. }
  9780. else
  9781. #endif
  9782. if (args->dCert->extKeyUsageSet) {
  9783. if ((ssl->specs.kea == rsa_kea) &&
  9784. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  9785. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  9786. ret = KEYUSE_ENCIPHER_E;
  9787. }
  9788. if ((ssl->specs.sig_algo == rsa_sa_algo ||
  9789. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  9790. !ssl->specs.static_ecdh)) &&
  9791. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  9792. WOLFSSL_MSG("KeyUse Digital Sig not set");
  9793. ret = KEYUSE_SIGNATURE_E;
  9794. }
  9795. }
  9796. #if defined(OPENSSL_EXTRA)
  9797. /* when compatibility layer is turned on and no verify is
  9798. * set then ignore the certificate key extension */
  9799. if (args->dCert->extExtKeyUsageSet &&
  9800. args->dCert->extExtKeyUsageCrit == 0 &&
  9801. ssl->options.verifyNone) {
  9802. WOLFSSL_MSG("Not verifying certificate ext key usage");
  9803. }
  9804. else
  9805. #endif
  9806. if (args->dCert->extExtKeyUsageSet) {
  9807. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  9808. if ((args->dCert->extExtKeyUsage &
  9809. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  9810. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  9811. ret = EXTKEYUSE_AUTH_E;
  9812. }
  9813. }
  9814. else {
  9815. if ((args->dCert->extExtKeyUsage &
  9816. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  9817. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  9818. ret = EXTKEYUSE_AUTH_E;
  9819. }
  9820. }
  9821. }
  9822. #endif /* IGNORE_KEY_EXTENSIONS */
  9823. if (args->fatal) {
  9824. ssl->error = ret;
  9825. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9826. SendAlert(ssl, alert_fatal, bad_certificate);
  9827. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  9828. #endif
  9829. goto exit_ppc;
  9830. }
  9831. ssl->options.havePeerCert = 1;
  9832. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  9833. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  9834. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  9835. * are to be bound into a certificate, the subject
  9836. * alternative name extension MUST be used." */
  9837. if (args->dCert->altNames) {
  9838. if (CheckForAltNames(args->dCert,
  9839. (char*)ssl->buffers.domainName.buffer,
  9840. NULL) != 1) {
  9841. WOLFSSL_MSG("DomainName match on alt names failed");
  9842. /* try to get peer key still */
  9843. ret = DOMAIN_NAME_MISMATCH;
  9844. }
  9845. }
  9846. else {
  9847. if (MatchDomainName(
  9848. args->dCert->subjectCN,
  9849. args->dCert->subjectCNLen,
  9850. (char*)ssl->buffers.domainName.buffer) == 0) {
  9851. WOLFSSL_MSG("DomainName match on common name failed");
  9852. ret = DOMAIN_NAME_MISMATCH;
  9853. }
  9854. }
  9855. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  9856. /* Old behavior. */
  9857. if (MatchDomainName(args->dCert->subjectCN,
  9858. args->dCert->subjectCNLen,
  9859. (char*)ssl->buffers.domainName.buffer) == 0) {
  9860. WOLFSSL_MSG("DomainName match on common name failed");
  9861. if (CheckForAltNames(args->dCert,
  9862. (char*)ssl->buffers.domainName.buffer,
  9863. NULL) != 1) {
  9864. WOLFSSL_MSG(
  9865. "DomainName match on alt names failed too");
  9866. /* try to get peer key still */
  9867. ret = DOMAIN_NAME_MISMATCH;
  9868. }
  9869. }
  9870. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  9871. }
  9872. /* decode peer key */
  9873. switch (args->dCert->keyOID) {
  9874. #ifndef NO_RSA
  9875. case RSAk:
  9876. {
  9877. word32 keyIdx = 0;
  9878. int keyRet = 0;
  9879. if (ssl->peerRsaKey == NULL) {
  9880. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  9881. (void**)&ssl->peerRsaKey);
  9882. } else if (ssl->peerRsaKeyPresent) {
  9883. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  9884. ssl->peerRsaKey);
  9885. ssl->peerRsaKeyPresent = 0;
  9886. }
  9887. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  9888. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  9889. args->dCert->pubKeySize) != 0) {
  9890. ret = PEER_KEY_ERROR;
  9891. }
  9892. else {
  9893. ssl->peerRsaKeyPresent = 1;
  9894. #ifdef WOLFSSL_RENESAS_TSIP_TLS
  9895. /* copy encrypted tsip key index into ssl object */
  9896. if (args->dCert->tsip_encRsaKeyIdx) {
  9897. if (!ssl->peerTsipEncRsaKeyIndex) {
  9898. ssl->peerTsipEncRsaKeyIndex = (byte*)XMALLOC(
  9899. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  9900. ssl->heap, DYNAMIC_TYPE_RSA);
  9901. if (!ssl->peerTsipEncRsaKeyIndex) {
  9902. args->lastErr = MEMORY_E;
  9903. goto exit_ppc;
  9904. }
  9905. }
  9906. XMEMCPY(ssl->peerTsipEncRsaKeyIndex,
  9907. args->dCert->tsip_encRsaKeyIdx,
  9908. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  9909. }
  9910. #endif
  9911. #ifdef HAVE_PK_CALLBACKS
  9912. #ifndef NO_RSA
  9913. #ifdef HAVE_SECURE_RENEGOTIATION
  9914. if (ssl->buffers.peerRsaKey.buffer) {
  9915. XFREE(ssl->buffers.peerRsaKey.buffer,
  9916. ssl->heap, DYNAMIC_TYPE_RSA);
  9917. ssl->buffers.peerRsaKey.buffer = NULL;
  9918. }
  9919. #endif
  9920. ssl->buffers.peerRsaKey.buffer =
  9921. (byte*)XMALLOC(args->dCert->pubKeySize,
  9922. ssl->heap, DYNAMIC_TYPE_RSA);
  9923. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  9924. ret = MEMORY_ERROR;
  9925. }
  9926. else {
  9927. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  9928. args->dCert->publicKey,
  9929. args->dCert->pubKeySize);
  9930. ssl->buffers.peerRsaKey.length =
  9931. args->dCert->pubKeySize;
  9932. }
  9933. #endif /* NO_RSA */
  9934. #endif /* HAVE_PK_CALLBACKS */
  9935. }
  9936. /* check size of peer RSA key */
  9937. if (ret == 0 && ssl->peerRsaKeyPresent &&
  9938. !ssl->options.verifyNone &&
  9939. wc_RsaEncryptSize(ssl->peerRsaKey)
  9940. < ssl->options.minRsaKeySz) {
  9941. ret = RSA_KEY_SIZE_E;
  9942. WOLFSSL_MSG("Peer RSA key is too small");
  9943. }
  9944. break;
  9945. }
  9946. #endif /* NO_RSA */
  9947. #ifdef HAVE_NTRU
  9948. case NTRUk:
  9949. {
  9950. if (args->dCert->pubKeySize > sizeof(ssl->peerNtruKey)) {
  9951. ret = PEER_KEY_ERROR;
  9952. }
  9953. else {
  9954. XMEMCPY(ssl->peerNtruKey, args->dCert->publicKey,
  9955. args->dCert->pubKeySize);
  9956. ssl->peerNtruKeyLen =
  9957. (word16)args->dCert->pubKeySize;
  9958. ssl->peerNtruKeyPresent = 1;
  9959. }
  9960. break;
  9961. }
  9962. #endif /* HAVE_NTRU */
  9963. #ifdef HAVE_ECC
  9964. case ECDSAk:
  9965. {
  9966. int keyRet = 0;
  9967. word32 idx = 0;
  9968. if (ssl->peerEccDsaKey == NULL) {
  9969. /* alloc/init on demand */
  9970. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  9971. (void**)&ssl->peerEccDsaKey);
  9972. } else if (ssl->peerEccDsaKeyPresent) {
  9973. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  9974. ssl->peerEccDsaKey);
  9975. ssl->peerEccDsaKeyPresent = 0;
  9976. }
  9977. if (keyRet != 0 ||
  9978. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  9979. ssl->peerEccDsaKey,
  9980. args->dCert->pubKeySize) != 0) {
  9981. ret = PEER_KEY_ERROR;
  9982. }
  9983. else {
  9984. ssl->peerEccDsaKeyPresent = 1;
  9985. #ifdef HAVE_PK_CALLBACKS
  9986. ssl->buffers.peerEccDsaKey.buffer =
  9987. (byte*)XMALLOC(args->dCert->pubKeySize,
  9988. ssl->heap, DYNAMIC_TYPE_ECC);
  9989. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  9990. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  9991. }
  9992. else {
  9993. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  9994. args->dCert->publicKey,
  9995. args->dCert->pubKeySize);
  9996. ssl->buffers.peerEccDsaKey.length =
  9997. args->dCert->pubKeySize;
  9998. }
  9999. #endif /* HAVE_PK_CALLBACKS */
  10000. }
  10001. /* check size of peer ECC key */
  10002. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  10003. !ssl->options.verifyNone &&
  10004. wc_ecc_size(ssl->peerEccDsaKey)
  10005. < ssl->options.minEccKeySz) {
  10006. ret = ECC_KEY_SIZE_E;
  10007. WOLFSSL_MSG("Peer ECC key is too small");
  10008. }
  10009. break;
  10010. }
  10011. #endif /* HAVE_ECC */
  10012. #ifdef HAVE_ED25519
  10013. case ED25519k:
  10014. {
  10015. int keyRet = 0;
  10016. if (ssl->peerEd25519Key == NULL) {
  10017. /* alloc/init on demand */
  10018. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  10019. (void**)&ssl->peerEd25519Key);
  10020. } else if (ssl->peerEd25519KeyPresent) {
  10021. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  10022. ssl->peerEd25519Key);
  10023. ssl->peerEd25519KeyPresent = 0;
  10024. }
  10025. if (keyRet != 0 ||
  10026. wc_ed25519_import_public(args->dCert->publicKey,
  10027. args->dCert->pubKeySize,
  10028. ssl->peerEd25519Key)
  10029. != 0) {
  10030. ret = PEER_KEY_ERROR;
  10031. }
  10032. else {
  10033. ssl->peerEd25519KeyPresent = 1;
  10034. #ifdef HAVE_PK_CALLBACKS
  10035. ssl->buffers.peerEd25519Key.buffer =
  10036. (byte*)XMALLOC(args->dCert->pubKeySize,
  10037. ssl->heap, DYNAMIC_TYPE_ED25519);
  10038. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  10039. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  10040. }
  10041. else {
  10042. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  10043. args->dCert->publicKey,
  10044. args->dCert->pubKeySize);
  10045. ssl->buffers.peerEd25519Key.length =
  10046. args->dCert->pubKeySize;
  10047. }
  10048. #endif /*HAVE_PK_CALLBACKS */
  10049. }
  10050. /* check size of peer ECC key */
  10051. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  10052. !ssl->options.verifyNone &&
  10053. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  10054. ret = ECC_KEY_SIZE_E;
  10055. WOLFSSL_MSG("Peer ECC key is too small");
  10056. }
  10057. break;
  10058. }
  10059. #endif /* HAVE_ED25519 */
  10060. #ifdef HAVE_ED448
  10061. case ED448k:
  10062. {
  10063. int keyRet = 0;
  10064. if (ssl->peerEd448Key == NULL) {
  10065. /* alloc/init on demand */
  10066. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
  10067. (void**)&ssl->peerEd448Key);
  10068. } else if (ssl->peerEd448KeyPresent) {
  10069. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
  10070. ssl->peerEd448Key);
  10071. ssl->peerEd448KeyPresent = 0;
  10072. }
  10073. if (keyRet != 0 ||
  10074. wc_ed448_import_public(args->dCert->publicKey,
  10075. args->dCert->pubKeySize,
  10076. ssl->peerEd448Key) != 0) {
  10077. ret = PEER_KEY_ERROR;
  10078. }
  10079. else {
  10080. ssl->peerEd448KeyPresent = 1;
  10081. #ifdef HAVE_PK_CALLBACKS
  10082. ssl->buffers.peerEd448Key.buffer =
  10083. (byte*)XMALLOC(args->dCert->pubKeySize,
  10084. ssl->heap, DYNAMIC_TYPE_ED448);
  10085. if (ssl->buffers.peerEd448Key.buffer == NULL) {
  10086. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  10087. }
  10088. else {
  10089. XMEMCPY(ssl->buffers.peerEd448Key.buffer,
  10090. args->dCert->publicKey,
  10091. args->dCert->pubKeySize);
  10092. ssl->buffers.peerEd448Key.length =
  10093. args->dCert->pubKeySize;
  10094. }
  10095. #endif /*HAVE_PK_CALLBACKS */
  10096. }
  10097. /* check size of peer ECC key */
  10098. if (ret == 0 && ssl->peerEd448KeyPresent &&
  10099. !ssl->options.verifyNone &&
  10100. ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  10101. ret = ECC_KEY_SIZE_E;
  10102. WOLFSSL_MSG("Peer ECC key is too small");
  10103. }
  10104. break;
  10105. }
  10106. #endif /* HAVE_ED448 */
  10107. default:
  10108. break;
  10109. }
  10110. /* args->dCert free'd in function cleanup after callback */
  10111. } /* if (count > 0) */
  10112. /* Check for error */
  10113. if (args->fatal && ret != 0) {
  10114. goto exit_ppc;
  10115. }
  10116. /* Advance state and proceed */
  10117. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  10118. } /* case TLS_ASYNC_VERIFY */
  10119. FALL_THROUGH;
  10120. case TLS_ASYNC_FINALIZE:
  10121. {
  10122. /* load last error */
  10123. if (args->lastErr != 0 && ret == 0) {
  10124. ret = args->lastErr;
  10125. }
  10126. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10127. if (args->untrustedDepth > ssl->options.verifyDepth) {
  10128. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  10129. ret = MAX_CHAIN_ERROR;
  10130. }
  10131. #endif
  10132. /* Do verify callback */
  10133. ret = DoVerifyCallback(ssl->ctx->cm, ssl, ret, args);
  10134. if (ssl->options.verifyNone &&
  10135. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED)) {
  10136. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  10137. ret = ssl->error = 0;
  10138. }
  10139. if (ret != 0) {
  10140. if (!ssl->options.verifyNone) {
  10141. DoCertFatalAlert(ssl, ret);
  10142. }
  10143. ssl->error = ret; /* Report SSL error */
  10144. }
  10145. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  10146. ssl->options.serverState = SERVER_CERT_COMPLETE;
  10147. }
  10148. if (IsEncryptionOn(ssl, 0)) {
  10149. args->idx += ssl->keys.padSz;
  10150. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10151. if (ssl->options.startedETMRead)
  10152. args->idx += MacSize(ssl);
  10153. #endif
  10154. }
  10155. /* Advance state and proceed */
  10156. ssl->options.asyncState = TLS_ASYNC_END;
  10157. } /* case TLS_ASYNC_FINALIZE */
  10158. FALL_THROUGH;
  10159. case TLS_ASYNC_END:
  10160. {
  10161. /* Set final index */
  10162. *inOutIdx = args->idx;
  10163. break;
  10164. }
  10165. default:
  10166. ret = INPUT_CASE_ERROR;
  10167. break;
  10168. } /* switch(ssl->options.asyncState) */
  10169. exit_ppc:
  10170. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  10171. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  10172. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  10173. /* Mark message as not received so it can process again */
  10174. ssl->msgsReceived.got_certificate = 0;
  10175. return ret;
  10176. }
  10177. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  10178. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) || \
  10179. defined(WOLFSSL_SMALL_STACK)
  10180. if (args)
  10181. {
  10182. FreeProcPeerCertArgs(ssl, args);
  10183. }
  10184. #else
  10185. FreeProcPeerCertArgs(ssl, args);
  10186. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
  10187. #if defined(WOLFSSL_ASYNC_CRYPT)
  10188. #elif defined(WOLFSSL_NONBLOCK_OCSP)
  10189. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  10190. ssl->nonblockarg = NULL;
  10191. #elif defined(WOLFSSL_SMALL_STACK)
  10192. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  10193. #endif
  10194. FreeKeyExchange(ssl);
  10195. return ret;
  10196. }
  10197. #endif
  10198. #ifndef WOLFSSL_NO_TLS12
  10199. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  10200. /* handle processing of certificate (11) */
  10201. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10202. word32 size)
  10203. {
  10204. int ret;
  10205. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  10206. WOLFSSL_ENTER("DoCertificate");
  10207. #ifdef SESSION_CERTS
  10208. /* Reset the session cert chain count in case the session resume failed. */
  10209. ssl->session.chain.count = 0;
  10210. #ifdef WOLFSSL_ALT_CERT_CHAINS
  10211. ssl->session.altChain.count = 0;
  10212. #endif
  10213. #endif /* SESSION_CERTS */
  10214. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  10215. #ifdef WOLFSSL_EXTRA_ALERTS
  10216. if (ret == BUFFER_ERROR || ret == ASN_PARSE_E)
  10217. SendAlert(ssl, alert_fatal, decode_error);
  10218. #endif
  10219. #ifdef OPENSSL_EXTRA
  10220. ssl->options.serverState = SERVER_CERT_COMPLETE;
  10221. #endif
  10222. WOLFSSL_LEAVE("DoCertificate", ret);
  10223. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  10224. return ret;
  10225. }
  10226. /* handle processing of certificate_status (22) */
  10227. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10228. word32 size)
  10229. {
  10230. int ret = 0;
  10231. byte status_type;
  10232. word32 status_length;
  10233. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  10234. WOLFSSL_ENTER("DoCertificateStatus");
  10235. if (size < ENUM_LEN + OPAQUE24_LEN)
  10236. return BUFFER_ERROR;
  10237. status_type = input[(*inOutIdx)++];
  10238. c24to32(input + *inOutIdx, &status_length);
  10239. *inOutIdx += OPAQUE24_LEN;
  10240. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  10241. return BUFFER_ERROR;
  10242. switch (status_type) {
  10243. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  10244. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  10245. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  10246. case WOLFSSL_CSR2_OCSP:
  10247. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  10248. break;
  10249. #endif
  10250. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  10251. case WOLFSSL_CSR2_OCSP_MULTI: {
  10252. OcspRequest* request;
  10253. word32 list_length = status_length;
  10254. byte idx = 0;
  10255. #ifdef WOLFSSL_SMALL_STACK
  10256. CertStatus* status;
  10257. OcspResponse* response;
  10258. #else
  10259. CertStatus status[1];
  10260. OcspResponse response[1];
  10261. #endif
  10262. do {
  10263. if (ssl->status_request_v2) {
  10264. ssl->status_request_v2 = 0;
  10265. break;
  10266. }
  10267. return BUFFER_ERROR;
  10268. } while(0);
  10269. #ifdef WOLFSSL_SMALL_STACK
  10270. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  10271. DYNAMIC_TYPE_OCSP_STATUS);
  10272. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  10273. DYNAMIC_TYPE_OCSP_REQUEST);
  10274. if (status == NULL || response == NULL) {
  10275. if (status)
  10276. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  10277. if (response)
  10278. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  10279. return MEMORY_ERROR;
  10280. }
  10281. #endif
  10282. while (list_length && ret == 0) {
  10283. if (OPAQUE24_LEN > list_length) {
  10284. ret = BUFFER_ERROR;
  10285. break;
  10286. }
  10287. c24to32(input + *inOutIdx, &status_length);
  10288. *inOutIdx += OPAQUE24_LEN;
  10289. list_length -= OPAQUE24_LEN;
  10290. if (status_length > list_length) {
  10291. ret = BUFFER_ERROR;
  10292. break;
  10293. }
  10294. if (status_length) {
  10295. InitOcspResponse(response, status, input +*inOutIdx,
  10296. status_length);
  10297. if ((OcspResponseDecode(response, ssl->ctx->cm, ssl->heap,
  10298. 0) != 0)
  10299. || (response->responseStatus != OCSP_SUCCESSFUL)
  10300. || (response->status->status != CERT_GOOD))
  10301. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10302. while (ret == 0) {
  10303. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  10304. ssl->extensions, status_type, idx++);
  10305. if (request == NULL)
  10306. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10307. else if (CompareOcspReqResp(request, response) == 0)
  10308. break;
  10309. else if (idx == 1) /* server cert must be OK */
  10310. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10311. }
  10312. *inOutIdx += status_length;
  10313. list_length -= status_length;
  10314. }
  10315. }
  10316. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  10317. ssl->status_request_v2 = 0;
  10318. #endif
  10319. #ifdef WOLFSSL_SMALL_STACK
  10320. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  10321. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  10322. #endif
  10323. }
  10324. break;
  10325. #endif
  10326. default:
  10327. ret = BUFFER_ERROR;
  10328. }
  10329. if (ret != 0)
  10330. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  10331. if (IsEncryptionOn(ssl, 0)) {
  10332. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10333. if (ssl->options.startedETMRead) {
  10334. word32 digestSz = MacSize(ssl);
  10335. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  10336. return BUFFER_E;
  10337. *inOutIdx += ssl->keys.padSz + digestSz;
  10338. }
  10339. else
  10340. #endif
  10341. {
  10342. if (*inOutIdx + ssl->keys.padSz > size)
  10343. return BUFFER_E;
  10344. *inOutIdx += ssl->keys.padSz;
  10345. }
  10346. }
  10347. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  10348. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  10349. return ret;
  10350. }
  10351. #endif
  10352. #endif /* !WOLFSSL_NO_TLS12 */
  10353. #endif /* !NO_CERTS */
  10354. #ifndef WOLFSSL_NO_TLS12
  10355. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  10356. word32 size, word32 totalSz)
  10357. {
  10358. (void)input;
  10359. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  10360. WOLFSSL_ENTER("DoHelloRequest");
  10361. if (size) /* must be 0 */
  10362. return BUFFER_ERROR;
  10363. if (IsEncryptionOn(ssl, 0)) {
  10364. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  10365. * about padding */
  10366. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10367. if (ssl->options.startedETMRead) {
  10368. word32 digestSz = MacSize(ssl);
  10369. if (size != totalSz &&
  10370. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  10371. return BUFFER_E;
  10372. *inOutIdx += ssl->keys.padSz + digestSz;
  10373. }
  10374. else
  10375. #endif
  10376. {
  10377. /* access beyond input + size should be checked against totalSz */
  10378. if (size != totalSz &&
  10379. *inOutIdx + ssl->keys.padSz > totalSz)
  10380. return BUFFER_E;
  10381. *inOutIdx += ssl->keys.padSz;
  10382. }
  10383. }
  10384. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10385. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  10386. return FATAL_ERROR;
  10387. }
  10388. #ifdef HAVE_SECURE_RENEGOTIATION
  10389. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  10390. ssl->secure_renegotiation->startScr = 1;
  10391. WOLFSSL_LEAVE("DoHelloRequest", 0);
  10392. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  10393. return 0;
  10394. }
  10395. #endif
  10396. else {
  10397. return SendAlert(ssl, alert_warning, no_renegotiation);
  10398. }
  10399. }
  10400. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  10401. word32 totalSz, int sniff)
  10402. {
  10403. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  10404. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  10405. WOLFSSL_ENTER("DoFinished");
  10406. if (finishedSz != size)
  10407. return BUFFER_ERROR;
  10408. /* check against totalSz
  10409. * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
  10410. * padding */
  10411. if (size != totalSz) {
  10412. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10413. if (ssl->options.startedETMRead) {
  10414. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  10415. return BUFFER_E;
  10416. }
  10417. else
  10418. #endif
  10419. {
  10420. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  10421. return BUFFER_E;
  10422. }
  10423. }
  10424. #ifdef WOLFSSL_CALLBACKS
  10425. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  10426. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  10427. #endif
  10428. if (sniff == NO_SNIFF) {
  10429. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  10430. WOLFSSL_MSG("Verify finished error on hashes");
  10431. #ifdef WOLFSSL_EXTRA_ALERTS
  10432. SendAlert(ssl, alert_fatal, decrypt_error);
  10433. #endif
  10434. return VERIFY_FINISHED_ERROR;
  10435. }
  10436. }
  10437. #ifdef HAVE_SECURE_RENEGOTIATION
  10438. if (ssl->secure_renegotiation) {
  10439. /* save peer's state */
  10440. if (ssl->options.side == WOLFSSL_CLIENT_END)
  10441. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  10442. input + *inOutIdx, TLS_FINISHED_SZ);
  10443. else
  10444. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  10445. input + *inOutIdx, TLS_FINISHED_SZ);
  10446. ssl->secure_renegotiation->verifySet = 1;
  10447. }
  10448. #endif
  10449. /* force input exhaustion at ProcessReply consuming padSz */
  10450. *inOutIdx += size + ssl->keys.padSz;
  10451. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10452. if (ssl->options.startedETMRead)
  10453. *inOutIdx += MacSize(ssl);
  10454. #endif
  10455. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10456. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  10457. #ifdef OPENSSL_EXTRA
  10458. ssl->cbmode = SSL_CB_MODE_WRITE;
  10459. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  10460. #endif
  10461. if (!ssl->options.resuming) {
  10462. #ifdef OPENSSL_EXTRA
  10463. if (ssl->CBIS != NULL) {
  10464. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  10465. }
  10466. #endif
  10467. ssl->options.handShakeState = HANDSHAKE_DONE;
  10468. ssl->options.handShakeDone = 1;
  10469. }
  10470. }
  10471. else {
  10472. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  10473. #ifdef OPENSSL_EXTRA
  10474. ssl->cbmode = SSL_CB_MODE_READ;
  10475. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  10476. #endif
  10477. if (ssl->options.resuming) {
  10478. #ifdef OPENSSL_EXTRA
  10479. if (ssl->CBIS != NULL) {
  10480. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  10481. }
  10482. #endif
  10483. ssl->options.handShakeState = HANDSHAKE_DONE;
  10484. ssl->options.handShakeDone = 1;
  10485. }
  10486. }
  10487. #ifdef WOLFSSL_DTLS
  10488. if (ssl->options.dtls) {
  10489. if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
  10490. (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
  10491. DtlsMsgPoolReset(ssl);
  10492. ssl->keys.dtls_handshake_number = 0;
  10493. ssl->keys.dtls_expected_peer_handshake_number = 0;
  10494. }
  10495. }
  10496. #endif
  10497. WOLFSSL_LEAVE("DoFinished", 0);
  10498. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  10499. return 0;
  10500. }
  10501. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  10502. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  10503. {
  10504. /* verify not a duplicate, mark received, check state */
  10505. switch (type) {
  10506. #ifndef NO_WOLFSSL_CLIENT
  10507. case hello_request:
  10508. if (ssl->msgsReceived.got_hello_request) {
  10509. WOLFSSL_MSG("Duplicate HelloRequest received");
  10510. return DUPLICATE_MSG_E;
  10511. }
  10512. ssl->msgsReceived.got_hello_request = 1;
  10513. break;
  10514. #endif
  10515. #ifndef NO_WOLFSSL_SERVER
  10516. case client_hello:
  10517. if (ssl->msgsReceived.got_client_hello) {
  10518. WOLFSSL_MSG("Duplicate ClientHello received");
  10519. #ifdef WOLFSSL_EXTRA_ALERTS
  10520. SendAlert(ssl, alert_fatal, unexpected_message);
  10521. #endif
  10522. return DUPLICATE_MSG_E;
  10523. }
  10524. ssl->msgsReceived.got_client_hello = 1;
  10525. break;
  10526. #endif
  10527. #ifndef NO_WOLFSSL_CLIENT
  10528. case server_hello:
  10529. if (ssl->msgsReceived.got_server_hello) {
  10530. WOLFSSL_MSG("Duplicate ServerHello received");
  10531. return DUPLICATE_MSG_E;
  10532. }
  10533. ssl->msgsReceived.got_server_hello = 1;
  10534. break;
  10535. #endif
  10536. #ifndef NO_WOLFSSL_CLIENT
  10537. case hello_verify_request:
  10538. if (ssl->msgsReceived.got_hello_verify_request) {
  10539. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  10540. return DUPLICATE_MSG_E;
  10541. }
  10542. ssl->msgsReceived.got_hello_verify_request = 1;
  10543. break;
  10544. #endif
  10545. #ifndef NO_WOLFSSL_CLIENT
  10546. case session_ticket:
  10547. if (ssl->msgsReceived.got_session_ticket) {
  10548. WOLFSSL_MSG("Duplicate SessionTicket received");
  10549. return DUPLICATE_MSG_E;
  10550. }
  10551. ssl->msgsReceived.got_session_ticket = 1;
  10552. break;
  10553. #endif
  10554. case certificate:
  10555. if (ssl->msgsReceived.got_certificate) {
  10556. WOLFSSL_MSG("Duplicate Certificate received");
  10557. return DUPLICATE_MSG_E;
  10558. }
  10559. ssl->msgsReceived.got_certificate = 1;
  10560. #ifndef NO_WOLFSSL_CLIENT
  10561. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10562. if ( ssl->msgsReceived.got_server_hello == 0) {
  10563. WOLFSSL_MSG("No ServerHello before Cert");
  10564. return OUT_OF_ORDER_E;
  10565. }
  10566. }
  10567. #endif
  10568. #ifndef NO_WOLFSSL_SERVER
  10569. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10570. if ( ssl->msgsReceived.got_client_hello == 0) {
  10571. WOLFSSL_MSG("No ClientHello before Cert");
  10572. return OUT_OF_ORDER_E;
  10573. }
  10574. }
  10575. #endif
  10576. break;
  10577. #ifndef NO_WOLFSSL_CLIENT
  10578. case certificate_status:
  10579. if (ssl->msgsReceived.got_certificate_status) {
  10580. WOLFSSL_MSG("Duplicate CertificateSatatus received");
  10581. return DUPLICATE_MSG_E;
  10582. }
  10583. ssl->msgsReceived.got_certificate_status = 1;
  10584. if (ssl->msgsReceived.got_certificate == 0) {
  10585. WOLFSSL_MSG("No Certificate before CertificateStatus");
  10586. return OUT_OF_ORDER_E;
  10587. }
  10588. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  10589. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  10590. return OUT_OF_ORDER_E;
  10591. }
  10592. break;
  10593. #endif
  10594. #ifndef NO_WOLFSSL_CLIENT
  10595. case server_key_exchange:
  10596. if (ssl->msgsReceived.got_server_key_exchange) {
  10597. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  10598. return DUPLICATE_MSG_E;
  10599. }
  10600. ssl->msgsReceived.got_server_key_exchange = 1;
  10601. if (ssl->msgsReceived.got_server_hello == 0) {
  10602. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  10603. return OUT_OF_ORDER_E;
  10604. }
  10605. if (ssl->msgsReceived.got_certificate_status == 0) {
  10606. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  10607. if (ssl->status_request) {
  10608. int ret;
  10609. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  10610. if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0)
  10611. return ret;
  10612. }
  10613. #endif
  10614. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10615. if (ssl->status_request_v2) {
  10616. int ret;
  10617. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  10618. if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0)
  10619. return ret;
  10620. }
  10621. #endif
  10622. }
  10623. break;
  10624. #endif
  10625. #ifndef NO_WOLFSSL_CLIENT
  10626. case certificate_request:
  10627. if (ssl->msgsReceived.got_certificate_request) {
  10628. WOLFSSL_MSG("Duplicate CertificateRequest received");
  10629. return DUPLICATE_MSG_E;
  10630. }
  10631. ssl->msgsReceived.got_certificate_request = 1;
  10632. break;
  10633. #endif
  10634. #ifndef NO_WOLFSSL_CLIENT
  10635. case server_hello_done:
  10636. if (ssl->msgsReceived.got_server_hello_done) {
  10637. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  10638. return DUPLICATE_MSG_E;
  10639. }
  10640. ssl->msgsReceived.got_server_hello_done = 1;
  10641. if (ssl->msgsReceived.got_certificate == 0) {
  10642. if (ssl->specs.kea == psk_kea ||
  10643. ssl->specs.kea == dhe_psk_kea ||
  10644. ssl->specs.kea == ecdhe_psk_kea ||
  10645. ssl->options.usingAnon_cipher) {
  10646. WOLFSSL_MSG("No Cert required");
  10647. } else {
  10648. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  10649. return OUT_OF_ORDER_E;
  10650. }
  10651. }
  10652. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  10653. int pskNoServerHint = 0; /* not required in this case */
  10654. #ifndef NO_PSK
  10655. if (ssl->specs.kea == psk_kea &&
  10656. ssl->arrays != NULL &&
  10657. ssl->arrays->server_hint[0] == 0)
  10658. pskNoServerHint = 1;
  10659. #endif
  10660. if (ssl->specs.static_ecdh == 1 ||
  10661. ssl->specs.kea == rsa_kea ||
  10662. ssl->specs.kea == ntru_kea ||
  10663. pskNoServerHint) {
  10664. WOLFSSL_MSG("No KeyExchange required");
  10665. } else {
  10666. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  10667. return OUT_OF_ORDER_E;
  10668. }
  10669. }
  10670. break;
  10671. #endif
  10672. #ifndef NO_WOLFSSL_SERVER
  10673. case certificate_verify:
  10674. if (ssl->msgsReceived.got_certificate_verify) {
  10675. WOLFSSL_MSG("Duplicate CertificateVerify received");
  10676. return DUPLICATE_MSG_E;
  10677. }
  10678. ssl->msgsReceived.got_certificate_verify = 1;
  10679. if ( ssl->msgsReceived.got_certificate == 0) {
  10680. WOLFSSL_MSG("No Cert before CertVerify");
  10681. return OUT_OF_ORDER_E;
  10682. }
  10683. break;
  10684. #endif
  10685. #ifndef NO_WOLFSSL_SERVER
  10686. case client_key_exchange:
  10687. if (ssl->msgsReceived.got_client_key_exchange) {
  10688. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  10689. #ifdef WOLFSSL_EXTRA_ALERTS
  10690. SendAlert(ssl, alert_fatal, unexpected_message);
  10691. #endif
  10692. return DUPLICATE_MSG_E;
  10693. }
  10694. ssl->msgsReceived.got_client_key_exchange = 1;
  10695. if (ssl->msgsReceived.got_client_hello == 0) {
  10696. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  10697. return OUT_OF_ORDER_E;
  10698. }
  10699. break;
  10700. #endif
  10701. case finished:
  10702. if (ssl->msgsReceived.got_finished) {
  10703. WOLFSSL_MSG("Duplicate Finished received");
  10704. return DUPLICATE_MSG_E;
  10705. }
  10706. ssl->msgsReceived.got_finished = 1;
  10707. if (ssl->msgsReceived.got_change_cipher == 0) {
  10708. WOLFSSL_MSG("Finished received before ChangeCipher");
  10709. #ifdef WOLFSSL_EXTRA_ALERTS
  10710. SendAlert(ssl, alert_fatal, unexpected_message);
  10711. #endif
  10712. return NO_CHANGE_CIPHER_E;
  10713. }
  10714. break;
  10715. case change_cipher_hs:
  10716. if (ssl->msgsReceived.got_change_cipher) {
  10717. WOLFSSL_MSG("Duplicate ChangeCipher received");
  10718. return DUPLICATE_MSG_E;
  10719. }
  10720. /* DTLS is going to ignore the CCS message if the client key
  10721. * exchange message wasn't received yet. */
  10722. if (!ssl->options.dtls)
  10723. ssl->msgsReceived.got_change_cipher = 1;
  10724. #ifndef NO_WOLFSSL_CLIENT
  10725. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10726. if (!ssl->options.resuming) {
  10727. if (ssl->msgsReceived.got_server_hello_done == 0) {
  10728. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  10729. return OUT_OF_ORDER_E;
  10730. }
  10731. }
  10732. else {
  10733. if (ssl->msgsReceived.got_server_hello == 0) {
  10734. WOLFSSL_MSG("No ServerHello before ChangeCipher on Resume");
  10735. return OUT_OF_ORDER_E;
  10736. }
  10737. }
  10738. #ifdef HAVE_SESSION_TICKET
  10739. if (ssl->expect_session_ticket) {
  10740. WOLFSSL_MSG("Expected session ticket missing");
  10741. #ifdef WOLFSSL_DTLS
  10742. if (ssl->options.dtls)
  10743. return OUT_OF_ORDER_E;
  10744. #endif
  10745. return SESSION_TICKET_EXPECT_E;
  10746. }
  10747. #endif
  10748. }
  10749. #endif
  10750. #ifndef NO_WOLFSSL_SERVER
  10751. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10752. if (!ssl->options.resuming &&
  10753. ssl->msgsReceived.got_client_key_exchange == 0) {
  10754. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  10755. #ifdef WOLFSSL_EXTRA_ALERTS
  10756. SendAlert(ssl, alert_fatal, unexpected_message);
  10757. #endif
  10758. return OUT_OF_ORDER_E;
  10759. }
  10760. #ifndef NO_CERTS
  10761. if (ssl->options.verifyPeer &&
  10762. ssl->options.havePeerCert) {
  10763. if (!ssl->options.havePeerVerify ||
  10764. !ssl->msgsReceived.got_certificate_verify) {
  10765. WOLFSSL_MSG("client didn't send cert verify");
  10766. #ifdef WOLFSSL_DTLS
  10767. if (ssl->options.dtls)
  10768. return OUT_OF_ORDER_E;
  10769. #endif
  10770. return NO_PEER_VERIFY;
  10771. }
  10772. }
  10773. #endif
  10774. }
  10775. #endif
  10776. if (ssl->options.dtls)
  10777. ssl->msgsReceived.got_change_cipher = 1;
  10778. break;
  10779. default:
  10780. WOLFSSL_MSG("Unknown message type");
  10781. return SANITY_MSG_E;
  10782. }
  10783. return 0;
  10784. }
  10785. static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10786. byte type, word32 size, word32 totalSz)
  10787. {
  10788. int ret = 0;
  10789. word32 expectedIdx;
  10790. WOLFSSL_ENTER("DoHandShakeMsgType");
  10791. #ifdef WOLFSSL_TLS13
  10792. if (type == hello_retry_request) {
  10793. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  10794. totalSz);
  10795. }
  10796. #endif
  10797. /* make sure can read the message */
  10798. if (*inOutIdx + size > totalSz) {
  10799. WOLFSSL_MSG("Incomplete Data");
  10800. return INCOMPLETE_DATA;
  10801. }
  10802. expectedIdx = *inOutIdx + size +
  10803. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  10804. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10805. if (ssl->options.startedETMRead && ssl->keys.encryptionOn)
  10806. expectedIdx += MacSize(ssl);
  10807. #endif
  10808. #if !defined(NO_WOLFSSL_SERVER) && \
  10809. defined(HAVE_SECURE_RENEGOTIATION) && \
  10810. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  10811. if (ssl->options.handShakeDone && type == client_hello &&
  10812. ssl->secure_renegotiation &&
  10813. ssl->secure_renegotiation->enabled)
  10814. {
  10815. WOLFSSL_MSG("Reset handshake state");
  10816. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  10817. ssl->options.serverState = NULL_STATE;
  10818. ssl->options.clientState = NULL_STATE;
  10819. ssl->options.connectState = CONNECT_BEGIN;
  10820. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  10821. ssl->options.handShakeState = NULL_STATE;
  10822. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  10823. ret = InitHandshakeHashes(ssl);
  10824. if (ret != 0)
  10825. return ret;
  10826. }
  10827. #endif
  10828. /* sanity check msg received */
  10829. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  10830. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  10831. return ret;
  10832. }
  10833. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  10834. /* add name later, add on record and handshake header part back on */
  10835. if (ssl->toInfoOn) {
  10836. int add = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  10837. AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - add,
  10838. size + add, READ_PROTO, ssl->heap);
  10839. #ifdef WOLFSSL_CALLBACKS
  10840. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  10841. #endif
  10842. }
  10843. #endif
  10844. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  10845. WOLFSSL_MSG("HandShake message after handshake complete");
  10846. SendAlert(ssl, alert_fatal, unexpected_message);
  10847. return OUT_OF_ORDER_E;
  10848. }
  10849. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  10850. ssl->options.serverState == NULL_STATE && type != server_hello) {
  10851. WOLFSSL_MSG("First server message not server hello");
  10852. SendAlert(ssl, alert_fatal, unexpected_message);
  10853. return OUT_OF_ORDER_E;
  10854. }
  10855. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  10856. type == server_hello_done &&
  10857. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  10858. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  10859. SendAlert(ssl, alert_fatal, unexpected_message);
  10860. return OUT_OF_ORDER_E;
  10861. }
  10862. if (ssl->options.side == WOLFSSL_SERVER_END &&
  10863. ssl->options.clientState == NULL_STATE && type != client_hello) {
  10864. WOLFSSL_MSG("First client message not client hello");
  10865. SendAlert(ssl, alert_fatal, unexpected_message);
  10866. return OUT_OF_ORDER_E;
  10867. }
  10868. /* above checks handshake state */
  10869. /* hello_request not hashed */
  10870. /* Also, skip hashing the client_hello message here for DTLS. It will be
  10871. * hashed later if the DTLS cookie is correct. */
  10872. if (type != hello_request &&
  10873. !(IsDtlsNotSctpMode(ssl) && type == client_hello)
  10874. #ifdef WOLFSSL_ASYNC_CRYPT
  10875. && ssl->error != WC_PENDING_E
  10876. #endif
  10877. #ifdef WOLFSSL_NONBLOCK_OCSP
  10878. && ssl->error != OCSP_WANT_READ
  10879. #endif
  10880. ) {
  10881. ret = HashInput(ssl, input + *inOutIdx, size);
  10882. if (ret != 0) {
  10883. WOLFSSL_MSG("Incomplete handshake hashes");
  10884. return ret;
  10885. }
  10886. }
  10887. #ifdef OPENSSL_EXTRA
  10888. if (ssl->CBIS != NULL){
  10889. ssl->cbmode = SSL_CB_MODE_READ;
  10890. ssl->cbtype = type;
  10891. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  10892. }
  10893. #endif
  10894. switch (type) {
  10895. case hello_request:
  10896. WOLFSSL_MSG("processing hello request");
  10897. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  10898. break;
  10899. #ifndef NO_WOLFSSL_CLIENT
  10900. case hello_verify_request:
  10901. WOLFSSL_MSG("processing hello verify request");
  10902. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  10903. if (IsEncryptionOn(ssl, 0)) {
  10904. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10905. if (ssl->options.startedETMRead) {
  10906. word32 digestSz = MacSize(ssl);
  10907. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  10908. return BUFFER_E;
  10909. *inOutIdx += ssl->keys.padSz + digestSz;
  10910. }
  10911. else
  10912. #endif
  10913. {
  10914. /* access beyond input + size should be checked against totalSz
  10915. */
  10916. if (*inOutIdx + ssl->keys.padSz > totalSz)
  10917. return BUFFER_E;
  10918. *inOutIdx += ssl->keys.padSz;
  10919. }
  10920. }
  10921. break;
  10922. case server_hello:
  10923. WOLFSSL_MSG("processing server hello");
  10924. ret = DoServerHello(ssl, input, inOutIdx, size);
  10925. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  10926. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  10927. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  10928. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  10929. IsAtLeastTLSv1_3(ssl->version)) {
  10930. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  10931. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  10932. #endif
  10933. {
  10934. ssl->options.cacheMessages = 0;
  10935. if (ssl->hsHashes->messages != NULL) {
  10936. XFREE(ssl->hsHashes->messages, ssl->heap,
  10937. DYNAMIC_TYPE_HASHES);
  10938. ssl->hsHashes->messages = NULL;
  10939. }
  10940. }
  10941. }
  10942. #endif
  10943. break;
  10944. #ifndef NO_CERTS
  10945. case certificate_request:
  10946. WOLFSSL_MSG("processing certificate request");
  10947. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  10948. break;
  10949. #endif
  10950. case server_key_exchange:
  10951. WOLFSSL_MSG("processing server key exchange");
  10952. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  10953. break;
  10954. #ifdef HAVE_SESSION_TICKET
  10955. case session_ticket:
  10956. WOLFSSL_MSG("processing session ticket");
  10957. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  10958. break;
  10959. #endif /* HAVE_SESSION_TICKET */
  10960. #endif
  10961. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  10962. !defined(WOLFSSL_NO_CLIENT_AUTH))
  10963. case certificate:
  10964. WOLFSSL_MSG("processing certificate");
  10965. ret = DoCertificate(ssl, input, inOutIdx, size);
  10966. break;
  10967. case certificate_status:
  10968. WOLFSSL_MSG("processing certificate status");
  10969. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  10970. break;
  10971. #endif
  10972. case server_hello_done:
  10973. WOLFSSL_MSG("processing server hello done");
  10974. #ifdef WOLFSSL_CALLBACKS
  10975. if (ssl->hsInfoOn)
  10976. AddPacketName(ssl, "ServerHelloDone");
  10977. if (ssl->toInfoOn)
  10978. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  10979. #endif
  10980. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  10981. if (IsEncryptionOn(ssl, 0)) {
  10982. *inOutIdx += ssl->keys.padSz;
  10983. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  10984. if (ssl->options.startedETMRead)
  10985. *inOutIdx += MacSize(ssl);
  10986. #endif
  10987. }
  10988. if (ssl->options.resuming) {
  10989. WOLFSSL_MSG("Not resuming as thought");
  10990. ssl->options.resuming = 0;
  10991. }
  10992. break;
  10993. case finished:
  10994. WOLFSSL_MSG("processing finished");
  10995. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  10996. break;
  10997. #ifndef NO_WOLFSSL_SERVER
  10998. case client_hello:
  10999. WOLFSSL_MSG("processing client hello");
  11000. ret = DoClientHello(ssl, input, inOutIdx, size);
  11001. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  11002. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  11003. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  11004. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  11005. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  11006. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11007. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  11008. #endif
  11009. {
  11010. ssl->options.cacheMessages = 0;
  11011. if (ssl->hsHashes->messages != NULL) {
  11012. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  11013. ssl->hsHashes->messages = NULL;
  11014. }
  11015. }
  11016. }
  11017. #endif
  11018. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  11019. * about padding */
  11020. if (IsEncryptionOn(ssl, 0)) {
  11021. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11022. if (ssl->options.startedETMRead) {
  11023. word32 digestSz = MacSize(ssl);
  11024. if (size != totalSz &&
  11025. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11026. return BUFFER_E;
  11027. *inOutIdx += ssl->keys.padSz + digestSz;
  11028. }
  11029. else
  11030. #endif
  11031. {
  11032. /* access beyond input + size should be checked against totalSz
  11033. */
  11034. if (size != totalSz &&
  11035. *inOutIdx + ssl->keys.padSz > totalSz)
  11036. return BUFFER_E;
  11037. *inOutIdx += ssl->keys.padSz;
  11038. }
  11039. }
  11040. break;
  11041. case client_key_exchange:
  11042. WOLFSSL_MSG("processing client key exchange");
  11043. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  11044. break;
  11045. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  11046. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  11047. case certificate_verify:
  11048. WOLFSSL_MSG("processing certificate verify");
  11049. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  11050. break;
  11051. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  11052. #endif /* !NO_WOLFSSL_SERVER */
  11053. default:
  11054. WOLFSSL_MSG("Unknown handshake message type");
  11055. ret = UNKNOWN_HANDSHAKE_TYPE;
  11056. break;
  11057. }
  11058. if (ret == 0 && expectedIdx != *inOutIdx) {
  11059. WOLFSSL_MSG("Extra data in handshake message");
  11060. if (!ssl->options.dtls)
  11061. SendAlert(ssl, alert_fatal, decode_error);
  11062. ret = DECODE_E;
  11063. }
  11064. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag
  11065. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11066. /* do not shrink input for async or non-block */
  11067. && ssl->error != WC_PENDING_E && ssl->error != OCSP_WANT_READ
  11068. #endif
  11069. ) {
  11070. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  11071. }
  11072. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11073. /* if async, offset index so this msg will be processed again */
  11074. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  11075. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  11076. #ifdef WOLFSSL_DTLS
  11077. if (ssl->options.dtls) {
  11078. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  11079. }
  11080. #endif
  11081. }
  11082. /* make sure async error is cleared */
  11083. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  11084. ssl->error = 0;
  11085. }
  11086. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  11087. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  11088. return ret;
  11089. }
  11090. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11091. word32 totalSz)
  11092. {
  11093. int ret = 0;
  11094. word32 inputLength;
  11095. WOLFSSL_ENTER("DoHandShakeMsg()");
  11096. if (ssl->arrays == NULL) {
  11097. byte type;
  11098. word32 size;
  11099. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0)
  11100. return PARSE_ERROR;
  11101. ssl->options.handShakeState = type;
  11102. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  11103. }
  11104. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  11105. /* If there is a pending fragmented handshake message,
  11106. * pending message size will be non-zero. */
  11107. if (ssl->arrays->pendingMsgSz == 0) {
  11108. byte type;
  11109. word32 size;
  11110. if (GetHandShakeHeader(ssl,input, inOutIdx, &type, &size, totalSz) != 0)
  11111. return PARSE_ERROR;
  11112. /* Cap the maximum size of a handshake message to something reasonable.
  11113. * By default is the maximum size of a certificate message assuming
  11114. * nine 2048-bit RSA certificates in the chain. */
  11115. if (size > MAX_HANDSHAKE_SZ) {
  11116. WOLFSSL_MSG("Handshake message too large");
  11117. return HANDSHAKE_SIZE_ERROR;
  11118. }
  11119. /* size is the size of the certificate message payload */
  11120. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  11121. ssl->arrays->pendingMsgType = type;
  11122. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  11123. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  11124. ssl->heap,
  11125. DYNAMIC_TYPE_ARRAYS);
  11126. if (ssl->arrays->pendingMsg == NULL)
  11127. return MEMORY_E;
  11128. XMEMCPY(ssl->arrays->pendingMsg,
  11129. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  11130. inputLength);
  11131. ssl->arrays->pendingMsgOffset = inputLength;
  11132. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  11133. return 0;
  11134. }
  11135. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  11136. }
  11137. else {
  11138. word32 pendSz =
  11139. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  11140. /* Catch the case where there may be the remainder of a fragmented
  11141. * handshake message and the next handshake message in the same
  11142. * record. */
  11143. if (inputLength > pendSz)
  11144. inputLength = pendSz;
  11145. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  11146. input + *inOutIdx, inputLength);
  11147. ssl->arrays->pendingMsgOffset += inputLength;
  11148. *inOutIdx += inputLength;
  11149. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  11150. {
  11151. word32 idx = HANDSHAKE_HEADER_SZ;
  11152. ret = DoHandShakeMsgType(ssl,
  11153. ssl->arrays->pendingMsg,
  11154. &idx, ssl->arrays->pendingMsgType,
  11155. ssl->arrays->pendingMsgSz - idx,
  11156. ssl->arrays->pendingMsgSz);
  11157. #ifdef WOLFSSL_ASYNC_CRYPT
  11158. if (ret == WC_PENDING_E) {
  11159. /* setup to process fragment again */
  11160. ssl->arrays->pendingMsgOffset -= inputLength;
  11161. *inOutIdx -= inputLength;
  11162. }
  11163. else
  11164. #endif
  11165. {
  11166. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  11167. ssl->arrays->pendingMsg = NULL;
  11168. ssl->arrays->pendingMsgSz = 0;
  11169. }
  11170. }
  11171. }
  11172. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  11173. return ret;
  11174. }
  11175. #endif /* !WOLFSSL_NO_TLS12 */
  11176. #ifdef WOLFSSL_DTLS
  11177. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl)
  11178. {
  11179. word32* window;
  11180. word16 cur_hi, next_hi;
  11181. word32 cur_lo, next_lo, diff;
  11182. int curLT;
  11183. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  11184. if (!ssl->options.haveMcast)
  11185. peerSeq = ssl->keys.peerSeq;
  11186. else {
  11187. #ifdef WOLFSSL_MULTICAST
  11188. WOLFSSL_DTLS_PEERSEQ* p;
  11189. int i;
  11190. for (i = 0, p = ssl->keys.peerSeq;
  11191. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  11192. i++, p++) {
  11193. if (p->peerId == ssl->keys.curPeerId) {
  11194. peerSeq = p;
  11195. break;
  11196. }
  11197. }
  11198. #endif
  11199. }
  11200. if (peerSeq == NULL) {
  11201. WOLFSSL_MSG("Could not find peer sequence");
  11202. return 0;
  11203. }
  11204. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  11205. next_hi = peerSeq->nextSeq_hi;
  11206. next_lo = peerSeq->nextSeq_lo;
  11207. window = peerSeq->window;
  11208. }
  11209. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  11210. next_hi = peerSeq->prevSeq_hi;
  11211. next_lo = peerSeq->prevSeq_lo;
  11212. window = peerSeq->prevWindow;
  11213. }
  11214. else {
  11215. return 0;
  11216. }
  11217. cur_hi = ssl->keys.curSeq_hi;
  11218. cur_lo = ssl->keys.curSeq_lo;
  11219. /* If the difference between next and cur is > 2^32, way outside window. */
  11220. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  11221. WOLFSSL_MSG("Current record from way too far in the future.");
  11222. return 0;
  11223. }
  11224. if (cur_hi == next_hi) {
  11225. curLT = cur_lo < next_lo;
  11226. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  11227. }
  11228. else {
  11229. curLT = cur_hi < next_hi;
  11230. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  11231. }
  11232. /* Check to see that the next value is greater than the number of messages
  11233. * trackable in the window, and that the difference between the next
  11234. * expected sequence number and the received sequence number is inside the
  11235. * window. */
  11236. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  11237. curLT && (diff > DTLS_SEQ_BITS)) {
  11238. WOLFSSL_MSG("Current record sequence number from the past.");
  11239. return 0;
  11240. }
  11241. #ifndef WOLFSSL_DTLS_ALLOW_FUTURE
  11242. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  11243. WOLFSSL_MSG("Rejecting message too far into the future.");
  11244. return 0;
  11245. }
  11246. #endif
  11247. else if (curLT) {
  11248. word32 idx = diff / DTLS_WORD_BITS;
  11249. word32 newDiff = diff % DTLS_WORD_BITS;
  11250. /* verify idx is valid for window array */
  11251. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  11252. WOLFSSL_MSG("Invalid DTLS windows index");
  11253. return 0;
  11254. }
  11255. if (window[idx] & (1 << newDiff)) {
  11256. WOLFSSL_MSG("Current record sequence number already received.");
  11257. return 0;
  11258. }
  11259. }
  11260. return 1;
  11261. }
  11262. #ifdef WOLFSSL_MULTICAST
  11263. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  11264. word32 second, word32 max)
  11265. {
  11266. word32 newCur = 0;
  11267. if (cur < first)
  11268. newCur = first;
  11269. else if (cur < second)
  11270. newCur = second;
  11271. else if (cur < max)
  11272. newCur = max;
  11273. return newCur;
  11274. }
  11275. #endif /* WOLFSSL_MULTICAST */
  11276. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl)
  11277. {
  11278. word32* window;
  11279. word32* next_lo;
  11280. word16* next_hi;
  11281. int curLT;
  11282. word32 cur_lo, diff;
  11283. word16 cur_hi;
  11284. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  11285. cur_hi = ssl->keys.curSeq_hi;
  11286. cur_lo = ssl->keys.curSeq_lo;
  11287. #ifdef WOLFSSL_MULTICAST
  11288. if (ssl->options.haveMcast) {
  11289. WOLFSSL_DTLS_PEERSEQ* p;
  11290. int i;
  11291. peerSeq = NULL;
  11292. for (i = 0, p = ssl->keys.peerSeq;
  11293. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  11294. i++, p++) {
  11295. if (p->peerId == ssl->keys.curPeerId) {
  11296. peerSeq = p;
  11297. break;
  11298. }
  11299. }
  11300. if (peerSeq == NULL) {
  11301. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  11302. return 0;
  11303. }
  11304. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  11305. int cbError = 0;
  11306. if (ssl->ctx->mcastHwCb)
  11307. cbError = ssl->ctx->mcastHwCb(p->peerId,
  11308. ssl->ctx->mcastMaxSeq,
  11309. cur_lo, ssl->mcastHwCbCtx);
  11310. if (cbError) {
  11311. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  11312. return MCAST_HIGHWATER_CB_E;
  11313. }
  11314. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  11315. ssl->ctx->mcastFirstSeq,
  11316. ssl->ctx->mcastSecondSeq,
  11317. ssl->ctx->mcastMaxSeq);
  11318. }
  11319. }
  11320. #endif
  11321. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  11322. next_hi = &peerSeq->nextSeq_hi;
  11323. next_lo = &peerSeq->nextSeq_lo;
  11324. window = peerSeq->window;
  11325. }
  11326. else {
  11327. next_hi = &peerSeq->prevSeq_hi;
  11328. next_lo = &peerSeq->prevSeq_lo;
  11329. window = peerSeq->prevWindow;
  11330. }
  11331. if (cur_hi == *next_hi) {
  11332. curLT = cur_lo < *next_lo;
  11333. diff = curLT ? *next_lo - cur_lo : cur_lo - *next_lo;
  11334. }
  11335. else {
  11336. curLT = cur_hi < *next_hi;
  11337. diff = curLT ? cur_lo - *next_lo : *next_lo - cur_lo;
  11338. }
  11339. if (curLT) {
  11340. word32 idx = diff / DTLS_WORD_BITS;
  11341. word32 newDiff = diff % DTLS_WORD_BITS;
  11342. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  11343. window[idx] |= (1 << newDiff);
  11344. }
  11345. else {
  11346. if (diff >= DTLS_SEQ_BITS)
  11347. XMEMSET(window, 0, DTLS_SEQ_SZ);
  11348. else {
  11349. word32 idx, newDiff, temp, i;
  11350. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  11351. temp = 0;
  11352. diff++;
  11353. idx = diff / DTLS_WORD_BITS;
  11354. newDiff = diff % DTLS_WORD_BITS;
  11355. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  11356. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  11357. if (i < idx)
  11358. window[i] = 0;
  11359. else {
  11360. temp |= (oldWindow[i-idx] << newDiff);
  11361. window[i] = temp;
  11362. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - newDiff - 1);
  11363. }
  11364. }
  11365. }
  11366. window[0] |= 1;
  11367. *next_lo = cur_lo + 1;
  11368. if (*next_lo < cur_lo)
  11369. (*next_hi)++;
  11370. }
  11371. return 1;
  11372. }
  11373. static int DtlsMsgDrain(WOLFSSL* ssl)
  11374. {
  11375. DtlsMsg* item = ssl->dtls_rx_msg_list;
  11376. int ret = 0;
  11377. WOLFSSL_ENTER("DtlsMsgDrain()");
  11378. /* While there is an item in the store list, and it is the expected
  11379. * message, and it is complete, and there hasn't been an error in the
  11380. * last message... */
  11381. while (item != NULL &&
  11382. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  11383. item->fragSz == item->sz &&
  11384. ret == 0) {
  11385. word32 idx = 0;
  11386. if ((ret = DoHandShakeMsgType(ssl, item->msg, &idx, item->type,
  11387. item->sz, item->sz)) == 0) {
  11388. if (item->type != finished)
  11389. ssl->keys.dtls_expected_peer_handshake_number++;
  11390. DtlsTxMsgListClean(ssl);
  11391. }
  11392. #ifdef WOLFSSL_ASYNC_CRYPT
  11393. if (ret == WC_PENDING_E) {
  11394. break;
  11395. }
  11396. #endif
  11397. ssl->dtls_rx_msg_list = item->next;
  11398. DtlsMsgDelete(item, ssl->heap);
  11399. item = ssl->dtls_rx_msg_list;
  11400. ssl->dtls_rx_msg_list_sz--;
  11401. }
  11402. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  11403. return ret;
  11404. }
  11405. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11406. word32 totalSz)
  11407. {
  11408. byte type;
  11409. word32 size;
  11410. word32 fragOffset, fragSz;
  11411. int ret = 0;
  11412. int ignoreFinished = 0;
  11413. WOLFSSL_ENTER("DoDtlsHandShakeMsg()");
  11414. /* parse header */
  11415. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  11416. &size, &fragOffset, &fragSz, totalSz) != 0) {
  11417. WOLFSSL_ERROR(PARSE_ERROR);
  11418. return PARSE_ERROR;
  11419. }
  11420. /* Cap the maximum size of a handshake message to something reasonable.
  11421. * By default is the maximum size of a certificate message assuming
  11422. * nine 2048-bit RSA certificates in the chain. */
  11423. if (size > MAX_HANDSHAKE_SZ) {
  11424. WOLFSSL_MSG("Handshake message too large");
  11425. return HANDSHAKE_SIZE_ERROR;
  11426. }
  11427. /* check that we have complete fragment */
  11428. if (*inOutIdx + fragSz > totalSz) {
  11429. WOLFSSL_ERROR(INCOMPLETE_DATA);
  11430. return INCOMPLETE_DATA;
  11431. }
  11432. if (type == finished && ssl->keys.dtls_peer_handshake_number >=
  11433. ssl->keys.dtls_expected_peer_handshake_number &&
  11434. ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
  11435. /* finished msg should be ignore from the current epoch
  11436. * if it comes from a previous handshake */
  11437. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11438. ignoreFinished = ssl->options.connectState < FINISHED_DONE;
  11439. }
  11440. else {
  11441. ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
  11442. }
  11443. }
  11444. /* Check the handshake sequence number first. If out of order,
  11445. * add the current message to the list. If the message is in order,
  11446. * but it is a fragment, add the current message to the list, then
  11447. * check the head of the list to see if it is complete, if so, pop
  11448. * it out as the current message. If the message is complete and in
  11449. * order, process it. Check the head of the list to see if it is in
  11450. * order, if so, process it. (Repeat until list exhausted.) If the
  11451. * head is out of order, return for more processing.
  11452. */
  11453. if (ssl->keys.dtls_peer_handshake_number >
  11454. ssl->keys.dtls_expected_peer_handshake_number &&
  11455. /* Only client_hello shouldn't be ignored if the handshake
  11456. * num is greater */
  11457. (type == client_hello ||
  11458. ssl->options.handShakeState != HANDSHAKE_DONE) &&
  11459. !ignoreFinished) {
  11460. /* Current message is out of order. It will get stored in the list.
  11461. * Storing also takes care of defragmentation. If the messages is a
  11462. * client hello, we need to process this out of order; the server
  11463. * is not supposed to keep state, but the second client hello will
  11464. * have a different handshake sequence number than is expected, and
  11465. * the server shouldn't be expecting any particular handshake sequence
  11466. * number. (If the cookie changes multiple times in quick succession,
  11467. * the client could be sending multiple new client hello messages
  11468. * with newer and newer cookies.) */
  11469. WOLFSSL_MSG("Current message is out of order");
  11470. if (type != client_hello) {
  11471. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  11472. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  11473. ssl->keys.dtls_peer_handshake_number,
  11474. input + *inOutIdx, size, type,
  11475. fragOffset, fragSz, ssl->heap);
  11476. }
  11477. *inOutIdx += fragSz;
  11478. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11479. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  11480. word32 digestSz = MacSize(ssl);
  11481. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11482. return BUFFER_E;
  11483. *inOutIdx += digestSz;
  11484. }
  11485. else
  11486. #endif
  11487. {
  11488. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  11489. WOLFSSL_ERROR(BUFFER_E);
  11490. return BUFFER_E;
  11491. }
  11492. }
  11493. *inOutIdx += ssl->keys.padSz;
  11494. ret = 0;
  11495. }
  11496. else {
  11497. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  11498. if (ret == 0) {
  11499. ssl->keys.dtls_expected_peer_handshake_number =
  11500. ssl->keys.dtls_peer_handshake_number + 1;
  11501. }
  11502. }
  11503. }
  11504. else if (ssl->keys.dtls_peer_handshake_number <
  11505. ssl->keys.dtls_expected_peer_handshake_number ||
  11506. /* ignore all handshake messages if we are done with the
  11507. * handshake */
  11508. (ssl->keys.dtls_peer_handshake_number >
  11509. ssl->keys.dtls_expected_peer_handshake_number &&
  11510. ssl->options.handShakeState == HANDSHAKE_DONE) ||
  11511. ignoreFinished) {
  11512. /* Already saw this message and processed it. It can be ignored. */
  11513. WOLFSSL_MSG("Already saw this message and processed it");
  11514. *inOutIdx += fragSz;
  11515. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11516. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  11517. word32 digestSz = MacSize(ssl);
  11518. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  11519. return BUFFER_E;
  11520. *inOutIdx += digestSz;
  11521. }
  11522. else
  11523. #endif
  11524. {
  11525. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  11526. WOLFSSL_ERROR(BUFFER_E);
  11527. return BUFFER_E;
  11528. }
  11529. }
  11530. if (IsDtlsNotSctpMode(ssl) &&
  11531. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  11532. ret = DtlsMsgPoolSend(ssl, 0);
  11533. }
  11534. *inOutIdx += ssl->keys.padSz;
  11535. }
  11536. else if (fragSz < size) {
  11537. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  11538. * be pointing to the message with this fragment in it. Check it to see
  11539. * if it is completed. */
  11540. WOLFSSL_MSG("Branch is in order, but fragmented");
  11541. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  11542. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  11543. ssl->keys.dtls_peer_handshake_number,
  11544. input + *inOutIdx, size, type,
  11545. fragOffset, fragSz, ssl->heap);
  11546. }
  11547. *inOutIdx += fragSz;
  11548. *inOutIdx += ssl->keys.padSz;
  11549. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11550. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  11551. word32 digestSz = MacSize(ssl);
  11552. if (*inOutIdx + digestSz > totalSz)
  11553. return BUFFER_E;
  11554. *inOutIdx += digestSz;
  11555. }
  11556. #endif
  11557. ret = 0;
  11558. if (ssl->dtls_rx_msg_list != NULL &&
  11559. ssl->dtls_rx_msg_list->fragSz >= ssl->dtls_rx_msg_list->sz)
  11560. ret = DtlsMsgDrain(ssl);
  11561. }
  11562. else {
  11563. /* This branch is in order next, and a complete message. On success
  11564. * clean the tx list. */
  11565. #ifdef WOLFSSL_ASYNC_CRYPT
  11566. word32 idx = *inOutIdx;
  11567. #endif
  11568. WOLFSSL_MSG("Branch is in order and a complete message");
  11569. #ifdef WOLFSSL_ASYNC_CRYPT
  11570. /* In async mode always store the message and process it with
  11571. * DtlsMsgDrain because in case of a WC_PENDING_E it will be
  11572. * easier this way. */
  11573. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  11574. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  11575. ssl->keys.dtls_peer_handshake_number,
  11576. input + idx, size, type,
  11577. fragOffset, fragSz, ssl->heap);
  11578. }
  11579. if (idx + fragSz + ssl->keys.padSz > totalSz)
  11580. return BUFFER_E;
  11581. *inOutIdx = idx + fragSz + ssl->keys.padSz;
  11582. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11583. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  11584. word32 digestSz = MacSize(ssl);
  11585. if (*inOutIdx + digestSz > totalSz)
  11586. return BUFFER_E;
  11587. *inOutIdx += digestSz;
  11588. }
  11589. #endif
  11590. ret = DtlsMsgDrain(ssl);
  11591. #else
  11592. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  11593. if (ret == 0) {
  11594. DtlsTxMsgListClean(ssl);
  11595. if (type != finished)
  11596. ssl->keys.dtls_expected_peer_handshake_number++;
  11597. if (ssl->dtls_rx_msg_list != NULL) {
  11598. ret = DtlsMsgDrain(ssl);
  11599. }
  11600. }
  11601. #endif
  11602. }
  11603. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  11604. return ret;
  11605. }
  11606. #endif
  11607. #ifndef WOLFSSL_NO_TLS12
  11608. #ifdef HAVE_AEAD
  11609. #if (!defined(NO_PUBLIC_GCM_SET_IV) && \
  11610. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  11611. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
  11612. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
  11613. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  11614. {
  11615. int i;
  11616. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  11617. if (++ssl->keys.aead_exp_IV[i]) return;
  11618. }
  11619. }
  11620. #endif
  11621. #if defined(HAVE_POLY1305) && defined(HAVE_CHACHA)
  11622. /* Used for the older version of creating AEAD tags with Poly1305 */
  11623. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  11624. byte* cipher, word16 sz, byte* tag)
  11625. {
  11626. int ret = 0;
  11627. int msglen = (sz - ssl->specs.aead_mac_size);
  11628. word32 keySz = 32;
  11629. byte padding[8]; /* used to temporarily store lengths */
  11630. #ifdef CHACHA_AEAD_TEST
  11631. printf("Using old version of poly1305 input.\n");
  11632. #endif
  11633. if (msglen < 0)
  11634. return INPUT_CASE_ERROR;
  11635. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  11636. return ret;
  11637. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  11638. AEAD_AUTH_DATA_SZ)) != 0)
  11639. return ret;
  11640. /* length of additional input plus padding */
  11641. XMEMSET(padding, 0, sizeof(padding));
  11642. padding[0] = AEAD_AUTH_DATA_SZ;
  11643. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  11644. sizeof(padding))) != 0)
  11645. return ret;
  11646. /* add cipher info and then its length */
  11647. XMEMSET(padding, 0, sizeof(padding));
  11648. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  11649. return ret;
  11650. /* 32 bit size of cipher to 64 bit endian */
  11651. padding[0] = msglen & 0xff;
  11652. padding[1] = (msglen >> 8) & 0xff;
  11653. padding[2] = ((word32)msglen >> 16) & 0xff;
  11654. padding[3] = ((word32)msglen >> 24) & 0xff;
  11655. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  11656. != 0)
  11657. return ret;
  11658. /* generate tag */
  11659. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  11660. return ret;
  11661. return ret;
  11662. }
  11663. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  11664. * the implementation follows an older draft for creating the nonce and MAC.
  11665. * The flag oldPoly gets set automatically depending on what cipher suite was
  11666. * negotiated in the handshake. This is able to be done because the IDs for the
  11667. * cipher suites was updated in RFC7905 giving unique values for the older
  11668. * draft in comparison to the more recent RFC.
  11669. *
  11670. * ssl WOLFSSL structure to get cipher and TLS state from
  11671. * out output buffer to hold encrypted data
  11672. * input data to encrypt
  11673. * sz size of input
  11674. *
  11675. * Return 0 on success negative values in error case
  11676. */
  11677. static int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  11678. word16 sz)
  11679. {
  11680. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  11681. int ret = 0;
  11682. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  11683. byte tag[POLY1305_AUTH_SZ];
  11684. byte add[AEAD_AUTH_DATA_SZ];
  11685. byte nonce[CHACHA20_NONCE_SZ];
  11686. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  11687. #ifdef CHACHA_AEAD_TEST
  11688. int i;
  11689. #endif
  11690. XMEMSET(tag, 0, sizeof(tag));
  11691. XMEMSET(nonce, 0, sizeof(nonce));
  11692. XMEMSET(poly, 0, sizeof(poly));
  11693. XMEMSET(add, 0, sizeof(add));
  11694. /* opaque SEQ number stored for AD */
  11695. WriteSEQ(ssl, CUR_ORDER, add);
  11696. if (ssl->options.oldPoly != 0) {
  11697. /* get nonce. SEQ should not be incremented again here */
  11698. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  11699. }
  11700. /* Store the type, version. Unfortunately, they are in
  11701. * the input buffer ahead of the plaintext. */
  11702. #ifdef WOLFSSL_DTLS
  11703. if (ssl->options.dtls) {
  11704. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  11705. }
  11706. #endif
  11707. /* add TLS message size to additional data */
  11708. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  11709. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  11710. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  11711. #ifdef CHACHA_AEAD_TEST
  11712. printf("Encrypt Additional : ");
  11713. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  11714. printf("%02x", add[i]);
  11715. }
  11716. printf("\n\n");
  11717. printf("input before encryption :\n");
  11718. for (i = 0; i < sz; i++) {
  11719. printf("%02x", input[i]);
  11720. if ((i + 1) % 16 == 0)
  11721. printf("\n");
  11722. }
  11723. printf("\n");
  11724. #endif
  11725. if (ssl->options.oldPoly == 0) {
  11726. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  11727. * record sequence number XORed with client_write_IV/server_write_IV */
  11728. XMEMCPY(nonce, ssl->keys.aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  11729. nonce[4] ^= add[0];
  11730. nonce[5] ^= add[1];
  11731. nonce[6] ^= add[2];
  11732. nonce[7] ^= add[3];
  11733. nonce[8] ^= add[4];
  11734. nonce[9] ^= add[5];
  11735. nonce[10] ^= add[6];
  11736. nonce[11] ^= add[7];
  11737. }
  11738. /* set the nonce for chacha and get poly1305 key */
  11739. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  11740. ForceZero(nonce, CHACHA20_NONCE_SZ);
  11741. return ret;
  11742. }
  11743. /* create Poly1305 key using chacha20 keystream */
  11744. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  11745. poly, sizeof(poly))) != 0) {
  11746. ForceZero(nonce, CHACHA20_NONCE_SZ);
  11747. return ret;
  11748. }
  11749. /* set the counter after getting poly1305 key */
  11750. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
  11751. ForceZero(nonce, CHACHA20_NONCE_SZ);
  11752. return ret;
  11753. }
  11754. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  11755. /* encrypt the plain text */
  11756. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  11757. input, msgLen)) != 0) {
  11758. ForceZero(poly, sizeof(poly));
  11759. return ret;
  11760. }
  11761. /* get the poly1305 tag using either old padding scheme or more recent */
  11762. if (ssl->options.oldPoly != 0) {
  11763. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  11764. poly, sz, tag)) != 0) {
  11765. ForceZero(poly, sizeof(poly));
  11766. return ret;
  11767. }
  11768. }
  11769. else {
  11770. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  11771. sizeof(poly))) != 0) {
  11772. ForceZero(poly, sizeof(poly));
  11773. return ret;
  11774. }
  11775. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  11776. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  11777. ForceZero(poly, sizeof(poly));
  11778. return ret;
  11779. }
  11780. }
  11781. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  11782. /* append tag to ciphertext */
  11783. XMEMCPY(out + msgLen, tag, sizeof(tag));
  11784. AeadIncrementExpIV(ssl);
  11785. #ifdef CHACHA_AEAD_TEST
  11786. printf("mac tag :\n");
  11787. for (i = 0; i < 16; i++) {
  11788. printf("%02x", tag[i]);
  11789. if ((i + 1) % 16 == 0)
  11790. printf("\n");
  11791. }
  11792. printf("\n\noutput after encrypt :\n");
  11793. for (i = 0; i < sz; i++) {
  11794. printf("%02x", out[i]);
  11795. if ((i + 1) % 16 == 0)
  11796. printf("\n");
  11797. }
  11798. printf("\n");
  11799. #endif
  11800. return ret;
  11801. }
  11802. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  11803. * the implementation follows an older draft for creating the nonce and MAC.
  11804. * The flag oldPoly gets set automatically depending on what cipher suite was
  11805. * negotiated in the handshake. This is able to be done because the IDs for the
  11806. * cipher suites was updated in RFC7905 giving unique values for the older
  11807. * draft in comparison to the more recent RFC.
  11808. *
  11809. * ssl WOLFSSL structure to get cipher and TLS state from
  11810. * plain output buffer to hold decrypted data
  11811. * input data to decrypt
  11812. * sz size of input
  11813. *
  11814. * Return 0 on success negative values in error case
  11815. */
  11816. static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  11817. word16 sz)
  11818. {
  11819. byte add[AEAD_AUTH_DATA_SZ];
  11820. byte nonce[CHACHA20_NONCE_SZ];
  11821. byte tag[POLY1305_AUTH_SZ];
  11822. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  11823. int ret = 0;
  11824. int msgLen = (sz - ssl->specs.aead_mac_size);
  11825. #ifdef CHACHA_AEAD_TEST
  11826. int i;
  11827. printf("input before decrypt :\n");
  11828. for (i = 0; i < sz; i++) {
  11829. printf("%02x", input[i]);
  11830. if ((i + 1) % 16 == 0)
  11831. printf("\n");
  11832. }
  11833. printf("\n");
  11834. #endif
  11835. XMEMSET(tag, 0, sizeof(tag));
  11836. XMEMSET(poly, 0, sizeof(poly));
  11837. XMEMSET(nonce, 0, sizeof(nonce));
  11838. XMEMSET(add, 0, sizeof(add));
  11839. /* sequence number field is 64-bits */
  11840. WriteSEQ(ssl, PEER_ORDER, add);
  11841. if (ssl->options.oldPoly != 0) {
  11842. /* get nonce, SEQ should not be incremented again here */
  11843. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  11844. }
  11845. /* get AD info */
  11846. /* Store the type, version. */
  11847. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  11848. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  11849. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  11850. /* add TLS message size to additional data */
  11851. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  11852. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  11853. #ifdef CHACHA_AEAD_TEST
  11854. printf("Decrypt Additional : ");
  11855. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  11856. printf("%02x", add[i]);
  11857. }
  11858. printf("\n\n");
  11859. #endif
  11860. if (ssl->options.oldPoly == 0) {
  11861. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  11862. * record sequence number XORed with client_write_IV/server_write_IV */
  11863. XMEMCPY(nonce, ssl->keys.aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  11864. nonce[4] ^= add[0];
  11865. nonce[5] ^= add[1];
  11866. nonce[6] ^= add[2];
  11867. nonce[7] ^= add[3];
  11868. nonce[8] ^= add[4];
  11869. nonce[9] ^= add[5];
  11870. nonce[10] ^= add[6];
  11871. nonce[11] ^= add[7];
  11872. }
  11873. /* set nonce and get poly1305 key */
  11874. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  11875. ForceZero(nonce, CHACHA20_NONCE_SZ);
  11876. return ret;
  11877. }
  11878. /* use chacha20 keystream to get poly1305 key for tag */
  11879. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  11880. poly, sizeof(poly))) != 0) {
  11881. ForceZero(nonce, CHACHA20_NONCE_SZ);
  11882. return ret;
  11883. }
  11884. /* set counter after getting poly1305 key */
  11885. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
  11886. ForceZero(nonce, CHACHA20_NONCE_SZ);
  11887. return ret;
  11888. }
  11889. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  11890. /* get the tag using Poly1305 */
  11891. if (ssl->options.oldPoly != 0) {
  11892. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  11893. ForceZero(poly, sizeof(poly));
  11894. return ret;
  11895. }
  11896. }
  11897. else {
  11898. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  11899. sizeof(poly))) != 0) {
  11900. ForceZero(poly, sizeof(poly));
  11901. return ret;
  11902. }
  11903. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  11904. sizeof(add), (byte*)input, msgLen, tag, sizeof(tag))) != 0) {
  11905. ForceZero(poly, sizeof(poly));
  11906. return ret;
  11907. }
  11908. }
  11909. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  11910. /* check tag sent along with packet */
  11911. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  11912. WOLFSSL_MSG("MAC did not match");
  11913. if (!ssl->options.dtls)
  11914. SendAlert(ssl, alert_fatal, bad_record_mac);
  11915. return VERIFY_MAC_ERROR;
  11916. }
  11917. /* if the tag was good decrypt message */
  11918. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  11919. input, msgLen)) != 0)
  11920. return ret;
  11921. #ifdef CHACHA_AEAD_TEST
  11922. printf("plain after decrypt :\n");
  11923. for (i = 0; i < sz; i++) {
  11924. printf("%02x", plain[i]);
  11925. if ((i + 1) % 16 == 0)
  11926. printf("\n");
  11927. }
  11928. printf("\n");
  11929. #endif
  11930. return ret;
  11931. }
  11932. #endif /* HAVE_CHACHA && HAVE_POLY1305 */
  11933. #endif /* HAVE_AEAD */
  11934. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  11935. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  11936. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  11937. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  11938. /* The following type is used to share code between AES-GCM and AES-CCM. */
  11939. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  11940. const byte* in, word32 sz,
  11941. byte* iv, word32 ivSz,
  11942. byte* authTag, word32 authTagSz,
  11943. const byte* authIn, word32 authInSz);
  11944. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  11945. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  11946. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  11947. #else
  11948. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  11949. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  11950. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  11951. #endif
  11952. #endif
  11953. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  11954. word16 sz, int asyncOkay)
  11955. {
  11956. int ret = 0;
  11957. #ifdef WOLFSSL_ASYNC_CRYPT
  11958. WC_ASYNC_DEV* asyncDev = NULL;
  11959. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  11960. #else
  11961. (void)asyncOkay;
  11962. #endif
  11963. (void)out;
  11964. (void)input;
  11965. (void)sz;
  11966. switch (ssl->specs.bulk_cipher_algorithm) {
  11967. #ifdef BUILD_ARC4
  11968. case wolfssl_rc4:
  11969. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  11970. break;
  11971. #endif
  11972. #ifdef BUILD_DES3
  11973. case wolfssl_triple_des:
  11974. #ifdef WOLFSSL_ASYNC_CRYPT
  11975. /* initialize event */
  11976. asyncDev = &ssl->encrypt.des3->asyncDev;
  11977. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  11978. if (ret != 0)
  11979. break;
  11980. #endif
  11981. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  11982. #ifdef WOLFSSL_ASYNC_CRYPT
  11983. if (ret == WC_PENDING_E && asyncOkay) {
  11984. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  11985. }
  11986. #endif
  11987. break;
  11988. #endif
  11989. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  11990. case wolfssl_aes:
  11991. #ifdef WOLFSSL_ASYNC_CRYPT
  11992. /* initialize event */
  11993. asyncDev = &ssl->encrypt.aes->asyncDev;
  11994. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  11995. if (ret != 0)
  11996. break;
  11997. #endif
  11998. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  11999. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  12000. if (tsip_useable(ssl)) {
  12001. ret = wc_tsip_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  12002. } else
  12003. #endif
  12004. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  12005. #ifdef WOLFSSL_ASYNC_CRYPT
  12006. if (ret == WC_PENDING_E && asyncOkay) {
  12007. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  12008. }
  12009. #endif
  12010. break;
  12011. #endif
  12012. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12013. case wolfssl_aes_gcm:
  12014. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  12015. {
  12016. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  12017. const byte* additionalSrc;
  12018. #ifdef WOLFSSL_ASYNC_CRYPT
  12019. /* initialize event */
  12020. asyncDev = &ssl->encrypt.aes->asyncDev;
  12021. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  12022. if (ret != 0)
  12023. break;
  12024. #endif
  12025. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  12026. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  12027. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  12028. #elif defined(BUILD_AESGCM)
  12029. aes_auth_fn = AES_GCM_ENCRYPT;
  12030. #else
  12031. aes_auth_fn = AES_CCM_ENCRYPT;
  12032. #endif
  12033. additionalSrc = input - 5;
  12034. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  12035. /* sequence number field is 64-bits */
  12036. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  12037. /* Store the type, version. Unfortunately, they are in
  12038. * the input buffer ahead of the plaintext. */
  12039. #ifdef WOLFSSL_DTLS
  12040. if (ssl->options.dtls) {
  12041. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  12042. }
  12043. #endif
  12044. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  12045. additionalSrc, 3);
  12046. /* Store the length of the plain text minus the explicit
  12047. * IV length minus the authentication tag size. */
  12048. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  12049. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  12050. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  12051. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  12052. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  12053. XMEMCPY(ssl->encrypt.nonce,
  12054. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  12055. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  12056. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  12057. #endif
  12058. ret = aes_auth_fn(ssl->encrypt.aes,
  12059. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  12060. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  12061. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  12062. out + sz - ssl->specs.aead_mac_size,
  12063. ssl->specs.aead_mac_size,
  12064. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  12065. #ifdef WOLFSSL_ASYNC_CRYPT
  12066. if (ret == WC_PENDING_E && asyncOkay) {
  12067. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  12068. }
  12069. #endif
  12070. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  12071. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  12072. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  12073. XMEMCPY(out,
  12074. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  12075. #endif
  12076. }
  12077. break;
  12078. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12079. #ifdef HAVE_CAMELLIA
  12080. case wolfssl_camellia:
  12081. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  12082. break;
  12083. #endif
  12084. #ifdef HAVE_HC128
  12085. case wolfssl_hc128:
  12086. ret = wc_Hc128_Process(ssl->encrypt.hc128, out, input, sz);
  12087. break;
  12088. #endif
  12089. #ifdef BUILD_RABBIT
  12090. case wolfssl_rabbit:
  12091. ret = wc_RabbitProcess(ssl->encrypt.rabbit, out, input, sz);
  12092. break;
  12093. #endif
  12094. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  12095. case wolfssl_chacha:
  12096. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  12097. break;
  12098. #endif
  12099. #ifdef HAVE_NULL_CIPHER
  12100. case wolfssl_cipher_null:
  12101. if (input != out) {
  12102. XMEMMOVE(out, input, sz);
  12103. }
  12104. break;
  12105. #endif
  12106. #ifdef HAVE_IDEA
  12107. case wolfssl_idea:
  12108. ret = wc_IdeaCbcEncrypt(ssl->encrypt.idea, out, input, sz);
  12109. break;
  12110. #endif
  12111. default:
  12112. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  12113. ret = ENCRYPT_ERROR;
  12114. }
  12115. #ifdef WOLFSSL_ASYNC_CRYPT
  12116. /* if async is not okay, then block */
  12117. if (ret == WC_PENDING_E && !asyncOkay) {
  12118. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  12119. }
  12120. #endif
  12121. return ret;
  12122. }
  12123. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz,
  12124. int asyncOkay)
  12125. {
  12126. int ret = 0;
  12127. #ifdef WOLFSSL_ASYNC_CRYPT
  12128. if (ssl->error == WC_PENDING_E) {
  12129. ssl->error = 0; /* clear async */
  12130. }
  12131. #endif
  12132. switch (ssl->encrypt.state) {
  12133. case CIPHER_STATE_BEGIN:
  12134. {
  12135. if (ssl->encrypt.setup == 0) {
  12136. WOLFSSL_MSG("Encrypt ciphers not setup");
  12137. return ENCRYPT_ERROR;
  12138. }
  12139. #ifdef HAVE_FUZZER
  12140. if (ssl->fuzzerCb)
  12141. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  12142. #endif
  12143. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12144. /* make sure AES GCM/CCM memory is allocated */
  12145. /* free for these happens in FreeCiphers */
  12146. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  12147. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  12148. /* make sure auth iv and auth are allocated */
  12149. if (ssl->encrypt.additional == NULL)
  12150. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  12151. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  12152. if (ssl->encrypt.nonce == NULL)
  12153. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  12154. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  12155. if (ssl->encrypt.additional == NULL ||
  12156. ssl->encrypt.nonce == NULL) {
  12157. return MEMORY_E;
  12158. }
  12159. }
  12160. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12161. /* Advance state and proceed */
  12162. ssl->encrypt.state = CIPHER_STATE_DO;
  12163. }
  12164. FALL_THROUGH;
  12165. case CIPHER_STATE_DO:
  12166. {
  12167. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  12168. /* Advance state */
  12169. ssl->encrypt.state = CIPHER_STATE_END;
  12170. #ifdef WOLFSSL_ASYNC_CRYPT
  12171. /* If pending, then leave and return will resume below */
  12172. if (ret == WC_PENDING_E) {
  12173. return ret;
  12174. }
  12175. #endif
  12176. }
  12177. FALL_THROUGH;
  12178. case CIPHER_STATE_END:
  12179. {
  12180. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12181. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  12182. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  12183. {
  12184. /* finalize authentication cipher */
  12185. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  12186. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  12187. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  12188. AeadIncrementExpIV(ssl);
  12189. #endif
  12190. if (ssl->encrypt.nonce)
  12191. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  12192. }
  12193. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12194. break;
  12195. }
  12196. }
  12197. /* Reset state */
  12198. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  12199. return ret;
  12200. }
  12201. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  12202. word16 sz)
  12203. {
  12204. int ret = 0;
  12205. (void)plain;
  12206. (void)input;
  12207. (void)sz;
  12208. switch (ssl->specs.bulk_cipher_algorithm)
  12209. {
  12210. #ifdef BUILD_ARC4
  12211. case wolfssl_rc4:
  12212. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  12213. break;
  12214. #endif
  12215. #ifdef BUILD_DES3
  12216. case wolfssl_triple_des:
  12217. #ifdef WOLFSSL_ASYNC_CRYPT
  12218. /* initialize event */
  12219. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  12220. WC_ASYNC_FLAG_CALL_AGAIN);
  12221. if (ret != 0)
  12222. break;
  12223. #endif
  12224. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  12225. #ifdef WOLFSSL_ASYNC_CRYPT
  12226. if (ret == WC_PENDING_E) {
  12227. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  12228. }
  12229. #endif
  12230. break;
  12231. #endif
  12232. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  12233. case wolfssl_aes:
  12234. #ifdef WOLFSSL_ASYNC_CRYPT
  12235. /* initialize event */
  12236. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  12237. WC_ASYNC_FLAG_CALL_AGAIN);
  12238. if (ret != 0)
  12239. break;
  12240. #endif
  12241. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  12242. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  12243. if (tsip_useable(ssl)) {
  12244. ret = wc_tsip_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  12245. } else
  12246. #endif
  12247. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  12248. #ifdef WOLFSSL_ASYNC_CRYPT
  12249. if (ret == WC_PENDING_E) {
  12250. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  12251. }
  12252. #endif
  12253. break;
  12254. #endif
  12255. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12256. case wolfssl_aes_gcm:
  12257. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  12258. {
  12259. wc_AesAuthDecryptFunc aes_auth_fn;
  12260. #ifdef WOLFSSL_ASYNC_CRYPT
  12261. /* initialize event */
  12262. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  12263. WC_ASYNC_FLAG_CALL_AGAIN);
  12264. if (ret != 0)
  12265. break;
  12266. #endif
  12267. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  12268. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  12269. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  12270. #elif defined(BUILD_AESGCM)
  12271. aes_auth_fn = wc_AesGcmDecrypt;
  12272. #else
  12273. aes_auth_fn = wc_AesCcmDecrypt;
  12274. #endif
  12275. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  12276. /* sequence number field is 64-bits */
  12277. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  12278. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  12279. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  12280. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  12281. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  12282. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  12283. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  12284. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  12285. XMEMCPY(ssl->decrypt.nonce,
  12286. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  12287. AESGCM_IMP_IV_SZ);
  12288. else
  12289. #endif
  12290. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  12291. AESGCM_IMP_IV_SZ);
  12292. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  12293. AESGCM_EXP_IV_SZ);
  12294. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  12295. plain + AESGCM_EXP_IV_SZ,
  12296. input + AESGCM_EXP_IV_SZ,
  12297. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  12298. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  12299. input + sz - ssl->specs.aead_mac_size,
  12300. ssl->specs.aead_mac_size,
  12301. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  12302. #ifdef WOLFSSL_ASYNC_CRYPT
  12303. if (ret == WC_PENDING_E) {
  12304. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  12305. }
  12306. #endif
  12307. }
  12308. }
  12309. break;
  12310. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12311. #ifdef HAVE_CAMELLIA
  12312. case wolfssl_camellia:
  12313. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  12314. break;
  12315. #endif
  12316. #ifdef HAVE_HC128
  12317. case wolfssl_hc128:
  12318. ret = wc_Hc128_Process(ssl->decrypt.hc128, plain, input, sz);
  12319. break;
  12320. #endif
  12321. #ifdef BUILD_RABBIT
  12322. case wolfssl_rabbit:
  12323. ret = wc_RabbitProcess(ssl->decrypt.rabbit, plain, input, sz);
  12324. break;
  12325. #endif
  12326. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  12327. case wolfssl_chacha:
  12328. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  12329. break;
  12330. #endif
  12331. #ifdef HAVE_NULL_CIPHER
  12332. case wolfssl_cipher_null:
  12333. if (input != plain) {
  12334. XMEMMOVE(plain, input, sz);
  12335. }
  12336. break;
  12337. #endif
  12338. #ifdef HAVE_IDEA
  12339. case wolfssl_idea:
  12340. ret = wc_IdeaCbcDecrypt(ssl->decrypt.idea, plain, input, sz);
  12341. break;
  12342. #endif
  12343. default:
  12344. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  12345. ret = DECRYPT_ERROR;
  12346. }
  12347. return ret;
  12348. }
  12349. static WC_INLINE int Decrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  12350. word16 sz)
  12351. {
  12352. int ret = 0;
  12353. #ifdef WOLFSSL_ASYNC_CRYPT
  12354. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  12355. if (ret != WC_NOT_PENDING_E) {
  12356. /* check for still pending */
  12357. if (ret == WC_PENDING_E)
  12358. return ret;
  12359. ssl->error = 0; /* clear async */
  12360. /* let failures through so CIPHER_STATE_END logic is run */
  12361. }
  12362. else
  12363. #endif
  12364. {
  12365. /* Reset state */
  12366. ret = 0;
  12367. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  12368. }
  12369. switch (ssl->decrypt.state) {
  12370. case CIPHER_STATE_BEGIN:
  12371. {
  12372. if (ssl->decrypt.setup == 0) {
  12373. WOLFSSL_MSG("Decrypt ciphers not setup");
  12374. return DECRYPT_ERROR;
  12375. }
  12376. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12377. /* make sure AES GCM/CCM memory is allocated */
  12378. /* free for these happens in FreeCiphers */
  12379. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  12380. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  12381. /* make sure auth iv and auth are allocated */
  12382. if (ssl->decrypt.additional == NULL)
  12383. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  12384. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  12385. if (ssl->decrypt.nonce == NULL)
  12386. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  12387. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  12388. if (ssl->decrypt.additional == NULL ||
  12389. ssl->decrypt.nonce == NULL) {
  12390. return MEMORY_E;
  12391. }
  12392. }
  12393. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12394. /* Advance state and proceed */
  12395. ssl->decrypt.state = CIPHER_STATE_DO;
  12396. }
  12397. FALL_THROUGH;
  12398. case CIPHER_STATE_DO:
  12399. {
  12400. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  12401. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  12402. /* For epochs >1 the current cipher parameters are located in
  12403. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  12404. * parameters and for epoch 1 use ssl->keys */
  12405. if (ssl->keys.curEpoch ==
  12406. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  12407. if (ssl->decrypt.src != SCR) {
  12408. ssl->secure_renegotiation->cache_status =
  12409. SCR_CACHE_NEEDED;
  12410. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  12411. break;
  12412. }
  12413. }
  12414. else {
  12415. if (ssl->decrypt.src != KEYS) {
  12416. ssl->secure_renegotiation->cache_status =
  12417. SCR_CACHE_NULL;
  12418. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  12419. break;
  12420. }
  12421. }
  12422. }
  12423. #endif
  12424. ret = DecryptDo(ssl, plain, input, sz);
  12425. /* Advance state */
  12426. ssl->decrypt.state = CIPHER_STATE_END;
  12427. #ifdef WOLFSSL_ASYNC_CRYPT
  12428. /* If pending, leave and return below */
  12429. if (ret == WC_PENDING_E) {
  12430. return ret;
  12431. }
  12432. #endif
  12433. }
  12434. FALL_THROUGH;
  12435. case CIPHER_STATE_END:
  12436. {
  12437. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  12438. /* make sure AES GCM/CCM nonce is cleared */
  12439. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  12440. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  12441. if (ssl->decrypt.nonce)
  12442. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  12443. if (ret < 0)
  12444. ret = VERIFY_MAC_ERROR;
  12445. }
  12446. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  12447. break;
  12448. }
  12449. }
  12450. /* Reset state */
  12451. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  12452. /* handle mac error case */
  12453. if (ret == VERIFY_MAC_ERROR) {
  12454. if (!ssl->options.dtls)
  12455. SendAlert(ssl, alert_fatal, bad_record_mac);
  12456. #ifdef WOLFSSL_DTLS_DROP_STATS
  12457. ssl->macDropCount++;
  12458. #endif /* WOLFSSL_DTLS_DROP_STATS */
  12459. }
  12460. return ret;
  12461. }
  12462. #endif /* !WOLFSSL_NO_TLS12 */
  12463. /* Check conditions for a cipher to have an explicit IV.
  12464. *
  12465. * ssl The SSL/TLS object.
  12466. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  12467. */
  12468. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  12469. {
  12470. #ifdef WOLFSSL_TLS13
  12471. if (ssl->options.tls1_3)
  12472. return 0;
  12473. #endif
  12474. return (ssl->specs.cipher_type == aead) &&
  12475. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  12476. }
  12477. /* check cipher text size for sanity */
  12478. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  12479. {
  12480. #ifdef HAVE_TRUNCATED_HMAC
  12481. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  12482. : ssl->specs.hash_size;
  12483. #else
  12484. word32 minLength = ssl->specs.hash_size; /* covers stream */
  12485. #endif
  12486. #ifndef WOLFSSL_AEAD_ONLY
  12487. if (ssl->specs.cipher_type == block) {
  12488. #ifdef HAVE_ENCRYPT_THEN_MAC
  12489. if (ssl->options.startedETMRead) {
  12490. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  12491. WOLFSSL_MSG("Block ciphertext not block size");
  12492. return SANITY_CIPHER_E;
  12493. }
  12494. }
  12495. else
  12496. #endif
  12497. if (encryptSz % ssl->specs.block_size) {
  12498. WOLFSSL_MSG("Block ciphertext not block size");
  12499. return SANITY_CIPHER_E;
  12500. }
  12501. minLength++; /* pad byte */
  12502. if (ssl->specs.block_size > minLength)
  12503. minLength = ssl->specs.block_size;
  12504. if (ssl->options.tls1_1)
  12505. minLength += ssl->specs.block_size; /* explicit IV */
  12506. }
  12507. else
  12508. #endif
  12509. if (ssl->specs.cipher_type == aead) {
  12510. minLength = ssl->specs.aead_mac_size; /* authTag size */
  12511. if (CipherHasExpIV(ssl))
  12512. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  12513. }
  12514. if (encryptSz < minLength) {
  12515. WOLFSSL_MSG("Ciphertext not minimum size");
  12516. return SANITY_CIPHER_E;
  12517. }
  12518. return 0;
  12519. }
  12520. #ifndef WOLFSSL_AEAD_ONLY
  12521. /* check all length bytes for the pad value, return 0 on success */
  12522. static int PadCheck(const byte* a, byte pad, int length)
  12523. {
  12524. int i;
  12525. int compareSum = 0;
  12526. for (i = 0; i < length; i++) {
  12527. compareSum |= a[i] ^ pad;
  12528. }
  12529. return compareSum;
  12530. }
  12531. /* Mask the padding bytes with the expected values.
  12532. * Constant time implementation - does maximum pad size possible.
  12533. *
  12534. * data Message data.
  12535. * sz Size of the message including MAC and padding and padding length.
  12536. * macSz Size of the MAC.
  12537. * returns 0 on success, otherwise failure.
  12538. */
  12539. static byte MaskPadding(const byte* data, int sz, int macSz)
  12540. {
  12541. int i;
  12542. int checkSz = sz - 1;
  12543. byte paddingSz = data[sz - 1];
  12544. byte mask;
  12545. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  12546. if (checkSz > TLS_MAX_PAD_SZ)
  12547. checkSz = TLS_MAX_PAD_SZ;
  12548. for (i = 0; i < checkSz; i++) {
  12549. mask = ctMaskLTE(i, paddingSz);
  12550. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  12551. }
  12552. return good;
  12553. }
  12554. /* Mask the MAC in the message with the MAC calculated.
  12555. * Constant time implementation - starts looking for MAC where maximum padding
  12556. * size has it.
  12557. *
  12558. * data Message data.
  12559. * sz Size of the message including MAC and padding and padding length.
  12560. * macSz Size of the MAC data.
  12561. * expMac Expected MAC value.
  12562. * returns 0 on success, otherwise failure.
  12563. */
  12564. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  12565. {
  12566. int i, j;
  12567. unsigned char mac[WC_MAX_DIGEST_SIZE];
  12568. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  12569. int macEnd = sz - 1 - data[sz - 1];
  12570. int macStart = macEnd - macSz;
  12571. int r = 0;
  12572. unsigned char started, notEnded;
  12573. unsigned char good = 0;
  12574. scanStart &= ctMaskIntGTE(scanStart, 0);
  12575. macStart &= ctMaskIntGTE(macStart, 0);
  12576. /* Div on Intel has different speeds depending on value.
  12577. * Use a bitwise AND or mod a specific value (converted to mul). */
  12578. if ((macSz & (macSz - 1)) == 0)
  12579. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  12580. #ifndef NO_SHA
  12581. else if (macSz == WC_SHA_DIGEST_SIZE)
  12582. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  12583. #endif
  12584. #ifdef WOLFSSL_SHA384
  12585. else if (macSz == WC_SHA384_DIGEST_SIZE)
  12586. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  12587. #endif
  12588. XMEMSET(mac, 0, macSz);
  12589. for (i = scanStart; i < sz; i += macSz) {
  12590. for (j = 0; j < macSz && j + i < sz; j++) {
  12591. started = ctMaskGTE(i + j, macStart);
  12592. notEnded = ctMaskLT(i + j, macEnd);
  12593. mac[j] |= started & notEnded & data[i + j];
  12594. }
  12595. }
  12596. if ((macSz & (macSz - 1)) == 0) {
  12597. for (i = 0; i < macSz; i++)
  12598. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  12599. }
  12600. #ifndef NO_SHA
  12601. else if (macSz == WC_SHA_DIGEST_SIZE) {
  12602. for (i = 0; i < macSz; i++)
  12603. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  12604. }
  12605. #endif
  12606. #ifdef WOLFSSL_SHA384
  12607. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  12608. for (i = 0; i < macSz; i++)
  12609. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  12610. }
  12611. #endif
  12612. return good;
  12613. }
  12614. /* timing resistant pad/verify check, return 0 on success */
  12615. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  12616. int pLen, int content)
  12617. {
  12618. byte verify[WC_MAX_DIGEST_SIZE];
  12619. byte good;
  12620. int ret = 0;
  12621. good = MaskPadding(input, pLen, macSz);
  12622. /* 4th argument has potential to underflow, ssl->hmac function should
  12623. * either increment the size by (macSz + padLen + 1) before use or check on
  12624. * the size to make sure is valid. */
  12625. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  12626. content, 1, PEER_ORDER);
  12627. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  12628. /* Non-zero on failure. */
  12629. good = (byte)~(word32)good;
  12630. good &= good >> 4;
  12631. good &= good >> 2;
  12632. good &= good >> 1;
  12633. /* Make ret negative on masking failure. */
  12634. ret -= 1 - good;
  12635. /* Treat any failure as verify MAC error. */
  12636. if (ret != 0)
  12637. ret = VERIFY_MAC_ERROR;
  12638. return ret;
  12639. }
  12640. #endif
  12641. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx)
  12642. {
  12643. word32 msgSz = ssl->keys.encryptSz;
  12644. word32 idx = *inOutIdx;
  12645. int dataSz;
  12646. int ivExtra = 0;
  12647. byte* rawData = input + idx; /* keep current for hmac */
  12648. #ifdef HAVE_LIBZ
  12649. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  12650. #endif
  12651. #ifdef WOLFSSL_EARLY_DATA
  12652. if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
  12653. if (ssl->options.side == WOLFSSL_SERVER_END &&
  12654. ssl->earlyData != no_early_data &&
  12655. ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
  12656. ssl->earlyDataSz += ssl->curSize;
  12657. if (ssl->earlyDataSz <= ssl->options.maxEarlyDataSz) {
  12658. WOLFSSL_MSG("Ignoring EarlyData!");
  12659. *inOutIdx = ssl->buffers.inputBuffer.length;
  12660. return 0;
  12661. }
  12662. WOLFSSL_MSG("Too much EarlyData!");
  12663. }
  12664. }
  12665. #endif
  12666. if (ssl->options.handShakeDone == 0) {
  12667. WOLFSSL_MSG("Received App data before a handshake completed");
  12668. SendAlert(ssl, alert_fatal, unexpected_message);
  12669. return OUT_OF_ORDER_E;
  12670. }
  12671. #ifndef WOLFSSL_AEAD_ONLY
  12672. if (ssl->specs.cipher_type == block) {
  12673. if (ssl->options.tls1_1)
  12674. ivExtra = ssl->specs.block_size;
  12675. }
  12676. else
  12677. #endif
  12678. if (ssl->specs.cipher_type == aead) {
  12679. if (CipherHasExpIV(ssl))
  12680. ivExtra = AESGCM_EXP_IV_SZ;
  12681. }
  12682. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  12683. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12684. if (ssl->options.startedETMRead)
  12685. dataSz -= MacSize(ssl);
  12686. #endif
  12687. if (dataSz < 0) {
  12688. WOLFSSL_MSG("App data buffer error, malicious input?");
  12689. SendAlert(ssl, alert_fatal, unexpected_message);
  12690. return BUFFER_ERROR;
  12691. }
  12692. #ifdef WOLFSSL_EARLY_DATA
  12693. if (ssl->earlyData > early_data_ext) {
  12694. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  12695. SendAlert(ssl, alert_fatal, unexpected_message);
  12696. return WOLFSSL_FATAL_ERROR;
  12697. }
  12698. ssl->earlyDataSz += dataSz;
  12699. }
  12700. #endif
  12701. /* read data */
  12702. if (dataSz) {
  12703. int rawSz = dataSz; /* keep raw size for idx adjustment */
  12704. #ifdef HAVE_LIBZ
  12705. if (ssl->options.usingCompression) {
  12706. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  12707. if (dataSz < 0) return dataSz;
  12708. }
  12709. #endif
  12710. idx += rawSz;
  12711. ssl->buffers.clearOutputBuffer.buffer = rawData;
  12712. ssl->buffers.clearOutputBuffer.length = dataSz;
  12713. }
  12714. idx += ssl->keys.padSz;
  12715. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12716. if (ssl->options.startedETMRead)
  12717. idx += MacSize(ssl);
  12718. #endif
  12719. #ifdef HAVE_LIBZ
  12720. /* decompress could be bigger, overwrite after verify */
  12721. if (ssl->options.usingCompression)
  12722. XMEMMOVE(rawData, decomp, dataSz);
  12723. #endif
  12724. *inOutIdx = idx;
  12725. return 0;
  12726. }
  12727. /* process alert, return level */
  12728. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type,
  12729. word32 totalSz)
  12730. {
  12731. byte level;
  12732. byte code;
  12733. word32 dataSz = totalSz - *inOutIdx;
  12734. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  12735. if (ssl->hsInfoOn)
  12736. AddPacketName(ssl, "Alert");
  12737. if (ssl->toInfoOn)
  12738. /* add record header back on to info + alert bytes level/code */
  12739. AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx -
  12740. RECORD_HEADER_SZ, RECORD_HEADER_SZ + ALERT_SIZE,
  12741. READ_PROTO, ssl->heap);
  12742. #endif
  12743. if (IsEncryptionOn(ssl, 0)) {
  12744. dataSz -= ssl->keys.padSz;
  12745. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12746. if (ssl->options.startedETMRead)
  12747. dataSz -= MacSize(ssl);
  12748. #endif
  12749. }
  12750. /* make sure can read the message */
  12751. if (dataSz != ALERT_SIZE) {
  12752. #ifdef WOLFSSL_EXTRA_ALERTS
  12753. SendAlert(ssl, alert_fatal, unexpected_message);
  12754. #endif
  12755. return BUFFER_E;
  12756. }
  12757. level = input[(*inOutIdx)++];
  12758. code = input[(*inOutIdx)++];
  12759. ssl->alert_history.last_rx.code = code;
  12760. ssl->alert_history.last_rx.level = level;
  12761. *type = code;
  12762. if (level == alert_fatal) {
  12763. ssl->options.isClosed = 1; /* Don't send close_notify */
  12764. }
  12765. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  12766. WOLFSSL_MSG("Alert count exceeded");
  12767. #ifdef WOLFSSL_EXTRA_ALERTS
  12768. if (level != alert_warning || code != close_notify)
  12769. SendAlert(ssl, alert_fatal, unexpected_message);
  12770. #endif
  12771. return ALERT_COUNT_E;
  12772. }
  12773. WOLFSSL_MSG("Got alert");
  12774. if (*type == close_notify) {
  12775. WOLFSSL_MSG("\tclose notify");
  12776. ssl->options.closeNotify = 1;
  12777. }
  12778. #ifdef WOLFSSL_TLS13
  12779. if (*type == decode_error) {
  12780. WOLFSSL_MSG("\tdecode error");
  12781. }
  12782. if (*type == illegal_parameter) {
  12783. WOLFSSL_MSG("\tillegal parameter");
  12784. }
  12785. #endif
  12786. WOLFSSL_ERROR(*type);
  12787. if (IsEncryptionOn(ssl, 0)) {
  12788. *inOutIdx += ssl->keys.padSz;
  12789. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12790. if (ssl->options.startedETMRead)
  12791. *inOutIdx += MacSize(ssl);
  12792. #endif
  12793. }
  12794. return level;
  12795. }
  12796. static int GetInputData(WOLFSSL *ssl, word32 size)
  12797. {
  12798. int in;
  12799. int inSz;
  12800. int maxLength;
  12801. int usedLength;
  12802. int dtlsExtra = 0;
  12803. /* check max input length */
  12804. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  12805. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  12806. inSz = (int)(size - usedLength); /* from last partial read */
  12807. #ifdef WOLFSSL_DTLS
  12808. if (ssl->options.dtls) {
  12809. if (size < ssl->dtls_expected_rx)
  12810. dtlsExtra = (int)(ssl->dtls_expected_rx - size);
  12811. inSz = ssl->dtls_expected_rx;
  12812. }
  12813. #endif
  12814. /* check that no lengths or size values are negative */
  12815. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  12816. return BUFFER_ERROR;
  12817. }
  12818. if (inSz > maxLength) {
  12819. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  12820. return MEMORY_E;
  12821. }
  12822. /* Put buffer data at start if not there */
  12823. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  12824. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  12825. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  12826. usedLength);
  12827. /* remove processed data */
  12828. ssl->buffers.inputBuffer.idx = 0;
  12829. ssl->buffers.inputBuffer.length = usedLength;
  12830. /* read data from network */
  12831. do {
  12832. in = wolfSSLReceive(ssl,
  12833. ssl->buffers.inputBuffer.buffer +
  12834. ssl->buffers.inputBuffer.length,
  12835. inSz);
  12836. if (in == WANT_READ)
  12837. return WANT_READ;
  12838. if (in < 0)
  12839. return SOCKET_ERROR_E;
  12840. if (in > inSz)
  12841. return RECV_OVERFLOW_E;
  12842. ssl->buffers.inputBuffer.length += in;
  12843. inSz -= in;
  12844. } while (ssl->buffers.inputBuffer.length < size);
  12845. #ifdef WOLFSSL_DEBUG_TLS
  12846. if (ssl->buffers.inputBuffer.idx == 0) {
  12847. WOLFSSL_MSG("Data received");
  12848. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  12849. ssl->buffers.inputBuffer.length);
  12850. }
  12851. #endif
  12852. return 0;
  12853. }
  12854. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12855. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  12856. int content)
  12857. {
  12858. int ret;
  12859. #ifdef HAVE_TRUNCATED_HMAC
  12860. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  12861. : ssl->specs.hash_size;
  12862. #else
  12863. word32 digestSz = ssl->specs.hash_size;
  12864. #endif
  12865. byte verify[WC_MAX_DIGEST_SIZE];
  12866. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  12867. if (msgSz < digestSz) {
  12868. return VERIFY_MAC_ERROR;
  12869. }
  12870. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
  12871. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  12872. if (ret != 0) {
  12873. return VERIFY_MAC_ERROR;
  12874. }
  12875. return 0;
  12876. }
  12877. #endif
  12878. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  12879. int content, word32* padSz)
  12880. {
  12881. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  12882. int ivExtra = 0;
  12883. int ret;
  12884. word32 pad = 0;
  12885. word32 padByte = 0;
  12886. #ifdef HAVE_TRUNCATED_HMAC
  12887. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  12888. : ssl->specs.hash_size;
  12889. #else
  12890. word32 digestSz = ssl->specs.hash_size;
  12891. #endif
  12892. byte verify[WC_MAX_DIGEST_SIZE];
  12893. if (ssl->specs.cipher_type == block) {
  12894. if (ssl->options.tls1_1)
  12895. ivExtra = ssl->specs.block_size;
  12896. pad = *(input + msgSz - ivExtra - 1);
  12897. padByte = 1;
  12898. if (ssl->options.tls) {
  12899. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  12900. content);
  12901. if (ret != 0)
  12902. return ret;
  12903. }
  12904. else { /* sslv3, some implementations have bad padding, but don't
  12905. * allow bad read */
  12906. int badPadLen = 0;
  12907. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  12908. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  12909. (void)dmy;
  12910. if (pad > (msgSz - digestSz - 1)) {
  12911. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  12912. pad = 0; /* no bad read */
  12913. badPadLen = 1;
  12914. }
  12915. PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  12916. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
  12917. pad, content, 1, PEER_ORDER);
  12918. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  12919. digestSz) != 0)
  12920. return VERIFY_MAC_ERROR;
  12921. if (ret != 0 || badPadLen)
  12922. return VERIFY_MAC_ERROR;
  12923. }
  12924. }
  12925. else if (ssl->specs.cipher_type == stream) {
  12926. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
  12927. PEER_ORDER);
  12928. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0){
  12929. return VERIFY_MAC_ERROR;
  12930. }
  12931. if (ret != 0)
  12932. return VERIFY_MAC_ERROR;
  12933. }
  12934. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  12935. if (ssl->specs.cipher_type == aead) {
  12936. *padSz = ssl->specs.aead_mac_size;
  12937. }
  12938. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  12939. else {
  12940. *padSz = digestSz + pad + padByte;
  12941. }
  12942. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  12943. (void)input;
  12944. (void)msgSz;
  12945. (void)content;
  12946. return 0;
  12947. }
  12948. /* process input requests, return 0 is done, 1 is call again to complete, and
  12949. negative number is error */
  12950. int ProcessReply(WOLFSSL* ssl)
  12951. {
  12952. int ret = 0, type, readSz;
  12953. int atomicUser = 0;
  12954. word32 startIdx = 0;
  12955. #if defined(WOLFSSL_DTLS)
  12956. int used;
  12957. #endif
  12958. #ifdef ATOMIC_USER
  12959. if (ssl->ctx->DecryptVerifyCb)
  12960. atomicUser = 1;
  12961. #endif
  12962. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  12963. #ifdef WOLFSSL_ASYNC_CRYPT
  12964. && ssl->error != WC_PENDING_E
  12965. #endif
  12966. #ifdef WOLFSSL_NONBLOCK_OCSP
  12967. && ssl->error != OCSP_WANT_READ
  12968. #endif
  12969. ) {
  12970. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  12971. return ssl->error;
  12972. }
  12973. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
  12974. /* process any pending DTLS messages - this flow can happen with async */
  12975. if (ssl->dtls_rx_msg_list != NULL) {
  12976. ret = DtlsMsgDrain(ssl);
  12977. if (ret != 0) {
  12978. WOLFSSL_ERROR(ret);
  12979. return ret;
  12980. }
  12981. }
  12982. #endif
  12983. for (;;) {
  12984. switch (ssl->options.processReply) {
  12985. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  12986. * old client hello */
  12987. case doProcessInit:
  12988. readSz = RECORD_HEADER_SZ;
  12989. #ifdef WOLFSSL_DTLS
  12990. if (ssl->options.dtls)
  12991. readSz = DTLS_RECORD_HEADER_SZ;
  12992. #endif
  12993. /* get header or return error */
  12994. if (!ssl->options.dtls) {
  12995. if ((ret = GetInputData(ssl, readSz)) < 0)
  12996. return ret;
  12997. } else {
  12998. #ifdef WOLFSSL_DTLS
  12999. /* read ahead may already have header */
  13000. used = ssl->buffers.inputBuffer.length -
  13001. ssl->buffers.inputBuffer.idx;
  13002. if (used < readSz) {
  13003. if ((ret = GetInputData(ssl, readSz)) < 0)
  13004. return ret;
  13005. }
  13006. #endif
  13007. }
  13008. #ifdef OLD_HELLO_ALLOWED
  13009. /* see if sending SSLv2 client hello */
  13010. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  13011. ssl->options.clientState == NULL_STATE &&
  13012. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  13013. != handshake) {
  13014. byte b0, b1;
  13015. ssl->options.processReply = runProcessOldClientHello;
  13016. /* sanity checks before getting size at front */
  13017. if (ssl->buffers.inputBuffer.buffer[
  13018. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  13019. WOLFSSL_MSG("Not a valid old client hello");
  13020. return PARSE_ERROR;
  13021. }
  13022. if (ssl->buffers.inputBuffer.buffer[
  13023. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  13024. ssl->buffers.inputBuffer.buffer[
  13025. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  13026. WOLFSSL_MSG("Not a valid version in old client hello");
  13027. return PARSE_ERROR;
  13028. }
  13029. /* how many bytes need ProcessOldClientHello */
  13030. b0 =
  13031. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  13032. b1 =
  13033. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  13034. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  13035. }
  13036. else {
  13037. ssl->options.processReply = getRecordLayerHeader;
  13038. continue;
  13039. }
  13040. FALL_THROUGH;
  13041. /* in the WOLFSSL_SERVER case, run the old client hello */
  13042. case runProcessOldClientHello:
  13043. /* get sz bytes or return error */
  13044. if (!ssl->options.dtls) {
  13045. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  13046. return ret;
  13047. } else {
  13048. #ifdef WOLFSSL_DTLS
  13049. /* read ahead may already have */
  13050. used = ssl->buffers.inputBuffer.length -
  13051. ssl->buffers.inputBuffer.idx;
  13052. if (used < ssl->curSize)
  13053. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  13054. return ret;
  13055. #endif /* WOLFSSL_DTLS */
  13056. }
  13057. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  13058. &ssl->buffers.inputBuffer.idx,
  13059. ssl->buffers.inputBuffer.length -
  13060. ssl->buffers.inputBuffer.idx,
  13061. ssl->curSize);
  13062. if (ret < 0)
  13063. return ret;
  13064. else if (ssl->buffers.inputBuffer.idx ==
  13065. ssl->buffers.inputBuffer.length) {
  13066. ssl->options.processReply = doProcessInit;
  13067. return 0;
  13068. }
  13069. #endif /* OLD_HELLO_ALLOWED */
  13070. FALL_THROUGH;
  13071. /* get the record layer header */
  13072. case getRecordLayerHeader:
  13073. ret = GetRecordHeader(ssl, ssl->buffers.inputBuffer.buffer,
  13074. &ssl->buffers.inputBuffer.idx,
  13075. &ssl->curRL, &ssl->curSize);
  13076. #ifdef WOLFSSL_DTLS
  13077. if (ssl->options.dtls && ret == SEQUENCE_ERROR) {
  13078. WOLFSSL_MSG("Silently dropping out of order DTLS message");
  13079. ssl->options.processReply = doProcessInit;
  13080. ssl->buffers.inputBuffer.length = 0;
  13081. ssl->buffers.inputBuffer.idx = 0;
  13082. #ifdef WOLFSSL_DTLS_DROP_STATS
  13083. ssl->replayDropCount++;
  13084. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13085. continue;
  13086. }
  13087. #endif
  13088. if (ret != 0)
  13089. return ret;
  13090. #ifdef WOLFSSL_TLS13
  13091. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  13092. ssl->curRL.type != application_data &&
  13093. ssl->curRL.type != change_cipher_spec) {
  13094. SendAlert(ssl, alert_fatal, unexpected_message);
  13095. return PARSE_ERROR;
  13096. }
  13097. #endif
  13098. ssl->options.processReply = getData;
  13099. FALL_THROUGH;
  13100. /* retrieve record layer data */
  13101. case getData:
  13102. /* get sz bytes or return error */
  13103. if (!ssl->options.dtls) {
  13104. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  13105. #ifdef WOLFSSL_EXTRA_ALERTS
  13106. if (ret != WANT_READ)
  13107. SendAlert(ssl, alert_fatal, bad_record_mac);
  13108. #endif
  13109. return ret;
  13110. }
  13111. }
  13112. else {
  13113. #ifdef WOLFSSL_DTLS
  13114. /* read ahead may already have */
  13115. used = ssl->buffers.inputBuffer.length -
  13116. ssl->buffers.inputBuffer.idx;
  13117. if (used < ssl->curSize)
  13118. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  13119. return ret;
  13120. #endif
  13121. }
  13122. if (IsEncryptionOn(ssl, 0)) {
  13123. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  13124. int tooLong = 0;
  13125. #endif
  13126. #ifdef WOLFSSL_TLS13
  13127. if (IsAtLeastTLSv1_3(ssl->version)) {
  13128. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  13129. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  13130. MAX_TLS13_PLAIN_SZ;
  13131. }
  13132. #endif
  13133. #ifdef WOLFSSL_EXTRA_ALERTS
  13134. if (!IsAtLeastTLSv1_3(ssl->version))
  13135. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  13136. #endif
  13137. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  13138. if (tooLong) {
  13139. WOLFSSL_MSG("Encrypted data too long");
  13140. SendAlert(ssl, alert_fatal, record_overflow);
  13141. return BUFFER_ERROR;
  13142. }
  13143. #endif
  13144. }
  13145. ssl->keys.padSz = 0;
  13146. ssl->options.processReply = verifyEncryptedMessage;
  13147. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  13148. FALL_THROUGH;
  13149. /* verify digest of encrypted message */
  13150. case verifyEncryptedMessage:
  13151. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13152. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  13153. !atomicUser && ssl->options.startedETMRead) {
  13154. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  13155. ssl->buffers.inputBuffer.idx,
  13156. ssl->curSize, ssl->curRL.type);
  13157. #ifdef WOLFSSL_ASYNC_CRYPT
  13158. if (ret == WC_PENDING_E)
  13159. return ret;
  13160. #endif
  13161. if (ret < 0) {
  13162. WOLFSSL_MSG("VerifyMacEnc failed");
  13163. WOLFSSL_ERROR(ret);
  13164. #ifdef WOLFSSL_DTLS
  13165. /* If in DTLS mode, if the decrypt fails for any
  13166. * reason, pretend the datagram never happened. */
  13167. if (ssl->options.dtls) {
  13168. ssl->options.processReply = doProcessInit;
  13169. ssl->buffers.inputBuffer.idx =
  13170. ssl->buffers.inputBuffer.length;
  13171. #ifdef WOLFSSL_DTLS_DROP_STATS
  13172. ssl->macDropCount++;
  13173. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13174. }
  13175. #endif /* WOLFSSL_DTLS */
  13176. #ifdef WOLFSSL_EXTRA_ALERTS
  13177. if (!ssl->options.dtls)
  13178. SendAlert(ssl, alert_fatal, bad_record_mac);
  13179. #endif
  13180. return DECRYPT_ERROR;
  13181. }
  13182. ssl->keys.encryptSz = ssl->curSize;
  13183. }
  13184. #endif
  13185. ssl->options.processReply = decryptMessage;
  13186. FALL_THROUGH;
  13187. /* decrypt message */
  13188. case decryptMessage:
  13189. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  13190. (!IsAtLeastTLSv1_3(ssl->version) ||
  13191. ssl->curRL.type != change_cipher_spec))
  13192. {
  13193. bufferStatic* in = &ssl->buffers.inputBuffer;
  13194. ret = SanityCheckCipherText(ssl, ssl->curSize);
  13195. if (ret < 0) {
  13196. #ifdef WOLFSSL_EXTRA_ALERTS
  13197. SendAlert(ssl, alert_fatal, bad_record_mac);
  13198. #endif
  13199. return ret;
  13200. }
  13201. if (atomicUser) {
  13202. #ifdef ATOMIC_USER
  13203. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13204. if (ssl->options.startedETMRead) {
  13205. ret = ssl->ctx->VerifyDecryptCb(ssl,
  13206. in->buffer + in->idx, in->buffer + in->idx,
  13207. ssl->curSize - MacSize(ssl),
  13208. ssl->curRL.type, 1, &ssl->keys.padSz,
  13209. ssl->DecryptVerifyCtx);
  13210. }
  13211. else
  13212. #endif
  13213. {
  13214. ret = ssl->ctx->DecryptVerifyCb(ssl,
  13215. in->buffer + in->idx,
  13216. in->buffer + in->idx,
  13217. ssl->curSize, ssl->curRL.type, 1,
  13218. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  13219. }
  13220. #endif /* ATOMIC_USER */
  13221. }
  13222. else {
  13223. if (!ssl->options.tls1_3) {
  13224. #ifndef WOLFSSL_NO_TLS12
  13225. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13226. if (ssl->options.startedETMRead) {
  13227. word32 digestSz = MacSize(ssl);
  13228. ret = Decrypt(ssl,
  13229. in->buffer + in->idx,
  13230. in->buffer + in->idx,
  13231. ssl->curSize - digestSz);
  13232. if (ret == 0) {
  13233. ssl->keys.padSz =
  13234. in->buffer[in->idx + ssl->curSize -
  13235. digestSz - 1];
  13236. ssl->keys.padSz += 1;
  13237. ssl->keys.decryptedCur = 1;
  13238. }
  13239. }
  13240. else
  13241. #endif
  13242. {
  13243. ret = Decrypt(ssl,
  13244. in->buffer + in->idx,
  13245. in->buffer + in->idx,
  13246. ssl->curSize);
  13247. }
  13248. #else
  13249. ret = DECRYPT_ERROR;
  13250. #endif
  13251. }
  13252. else
  13253. {
  13254. #ifdef WOLFSSL_TLS13
  13255. ret = DecryptTls13(ssl,
  13256. in->buffer + in->idx,
  13257. in->buffer + in->idx,
  13258. ssl->curSize,
  13259. (byte*)&ssl->curRL, RECORD_HEADER_SZ);
  13260. #else
  13261. ret = DECRYPT_ERROR;
  13262. #endif /* WOLFSSL_TLS13 */
  13263. }
  13264. }
  13265. #ifdef WOLFSSL_ASYNC_CRYPT
  13266. if (ret == WC_PENDING_E)
  13267. return ret;
  13268. #endif
  13269. if (ret >= 0) {
  13270. #ifndef WOLFSSL_NO_TLS12
  13271. /* handle success */
  13272. #ifndef WOLFSSL_AEAD_ONLY
  13273. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  13274. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  13275. #endif
  13276. /* go past TLSv1.1 IV */
  13277. if (CipherHasExpIV(ssl))
  13278. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  13279. #endif
  13280. }
  13281. else {
  13282. WOLFSSL_MSG("Decrypt failed");
  13283. WOLFSSL_ERROR(ret);
  13284. #ifdef WOLFSSL_EARLY_DATA
  13285. if (ssl->options.tls1_3) {
  13286. if (ssl->options.side == WOLFSSL_SERVER_END &&
  13287. ssl->earlyData != no_early_data &&
  13288. ssl->options.clientState <
  13289. CLIENT_FINISHED_COMPLETE) {
  13290. ssl->earlyDataSz += ssl->curSize;
  13291. if (ssl->earlyDataSz <=
  13292. ssl->options.maxEarlyDataSz) {
  13293. WOLFSSL_MSG("Ignoring EarlyData!");
  13294. if (ssl->keys.peer_sequence_number_lo-- == 0)
  13295. ssl->keys.peer_sequence_number_hi--;
  13296. ssl->options.processReply = doProcessInit;
  13297. ssl->buffers.inputBuffer.idx =
  13298. ssl->buffers.inputBuffer.length;
  13299. return 0;
  13300. }
  13301. WOLFSSL_MSG("Too much EarlyData!");
  13302. }
  13303. SendAlert(ssl, alert_fatal, bad_record_mac);
  13304. }
  13305. #endif
  13306. #ifdef WOLFSSL_DTLS
  13307. /* If in DTLS mode, if the decrypt fails for any
  13308. * reason, pretend the datagram never happened. */
  13309. if (ssl->options.dtls) {
  13310. ssl->options.processReply = doProcessInit;
  13311. ssl->buffers.inputBuffer.idx =
  13312. ssl->buffers.inputBuffer.length;
  13313. #ifdef WOLFSSL_DTLS_DROP_STATS
  13314. ssl->macDropCount++;
  13315. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13316. }
  13317. #endif /* WOLFSSL_DTLS */
  13318. return DECRYPT_ERROR;
  13319. }
  13320. }
  13321. ssl->options.processReply = verifyMessage;
  13322. FALL_THROUGH;
  13323. /* verify digest of message */
  13324. case verifyMessage:
  13325. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  13326. (!IsAtLeastTLSv1_3(ssl->version) ||
  13327. ssl->curRL.type != change_cipher_spec))
  13328. {
  13329. if (!atomicUser
  13330. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13331. && !ssl->options.startedETMRead
  13332. #endif
  13333. ) {
  13334. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  13335. ssl->buffers.inputBuffer.idx,
  13336. ssl->curSize, ssl->curRL.type,
  13337. &ssl->keys.padSz);
  13338. #ifdef WOLFSSL_ASYNC_CRYPT
  13339. if (ret == WC_PENDING_E)
  13340. return ret;
  13341. #endif
  13342. if (ret < 0) {
  13343. WOLFSSL_MSG("VerifyMac failed");
  13344. WOLFSSL_ERROR(ret);
  13345. #ifdef WOLFSSL_DTLS
  13346. /* If in DTLS mode, if the decrypt fails for any
  13347. * reason, pretend the datagram never happened. */
  13348. if (ssl->options.dtls) {
  13349. ssl->options.processReply = doProcessInit;
  13350. ssl->buffers.inputBuffer.idx =
  13351. ssl->buffers.inputBuffer.length;
  13352. #ifdef WOLFSSL_DTLS_DROP_STATS
  13353. ssl->macDropCount++;
  13354. #endif /* WOLFSSL_DTLS_DROP_STATS */
  13355. }
  13356. #endif /* WOLFSSL_DTLS */
  13357. #ifdef WOLFSSL_EXTRA_ALERTS
  13358. if (!ssl->options.dtls)
  13359. SendAlert(ssl, alert_fatal, bad_record_mac);
  13360. #endif
  13361. return DECRYPT_ERROR;
  13362. }
  13363. }
  13364. ssl->keys.encryptSz = ssl->curSize;
  13365. ssl->keys.decryptedCur = 1;
  13366. #ifdef WOLFSSL_TLS13
  13367. if (ssl->options.tls1_3) {
  13368. word16 i = (word16)(ssl->buffers.inputBuffer.length -
  13369. ssl->keys.padSz);
  13370. /* sanity check on underflow */
  13371. if (ssl->keys.padSz >= ssl->buffers.inputBuffer.length) {
  13372. WOLFSSL_ERROR(DECRYPT_ERROR);
  13373. return DECRYPT_ERROR;
  13374. }
  13375. /* Remove padding from end of plain text. */
  13376. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  13377. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  13378. break;
  13379. }
  13380. /* Get the real content type from the end of the data. */
  13381. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  13382. ssl->keys.padSz = ssl->buffers.inputBuffer.length - i;
  13383. }
  13384. #endif
  13385. }
  13386. ssl->options.processReply = runProcessingOneMessage;
  13387. FALL_THROUGH;
  13388. /* the record layer is here */
  13389. case runProcessingOneMessage:
  13390. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13391. if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
  13392. if ((ssl->buffers.inputBuffer.length -
  13393. ssl->keys.padSz -
  13394. MacSize(ssl) -
  13395. ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ)
  13396. #ifdef WOLFSSL_ASYNC_CRYPT
  13397. && ssl->buffers.inputBuffer.length !=
  13398. ssl->buffers.inputBuffer.idx
  13399. #endif
  13400. ) {
  13401. WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
  13402. #if defined(WOLFSSL_EXTRA_ALERTS)
  13403. SendAlert(ssl, alert_fatal, record_overflow);
  13404. #endif
  13405. return BUFFER_ERROR;
  13406. }
  13407. }
  13408. else
  13409. #endif
  13410. if (ssl->buffers.inputBuffer.length -
  13411. ssl->keys.padSz -
  13412. ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ
  13413. #ifdef WOLFSSL_ASYNC_CRYPT
  13414. && ssl->buffers.inputBuffer.length !=
  13415. ssl->buffers.inputBuffer.idx
  13416. #endif
  13417. ) {
  13418. WOLFSSL_MSG("Plaintext too long");
  13419. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  13420. SendAlert(ssl, alert_fatal, record_overflow);
  13421. #endif
  13422. return BUFFER_ERROR;
  13423. }
  13424. #ifdef WOLFSSL_DTLS
  13425. if (IsDtlsNotSctpMode(ssl)) {
  13426. DtlsUpdateWindow(ssl);
  13427. }
  13428. #endif /* WOLFSSL_DTLS */
  13429. WOLFSSL_MSG("received record layer msg");
  13430. switch (ssl->curRL.type) {
  13431. case handshake :
  13432. WOLFSSL_MSG("got HANDSHAKE");
  13433. /* debugging in DoHandShakeMsg */
  13434. if (ssl->options.dtls) {
  13435. #ifdef WOLFSSL_DTLS
  13436. ret = DoDtlsHandShakeMsg(ssl,
  13437. ssl->buffers.inputBuffer.buffer,
  13438. &ssl->buffers.inputBuffer.idx,
  13439. ssl->buffers.inputBuffer.length);
  13440. #endif
  13441. }
  13442. else if (!IsAtLeastTLSv1_3(ssl->version)) {
  13443. #ifndef WOLFSSL_NO_TLS12
  13444. ret = DoHandShakeMsg(ssl,
  13445. ssl->buffers.inputBuffer.buffer,
  13446. &ssl->buffers.inputBuffer.idx,
  13447. ssl->buffers.inputBuffer.length);
  13448. #else
  13449. ret = BUFFER_ERROR;
  13450. #endif
  13451. }
  13452. else {
  13453. #ifdef WOLFSSL_TLS13
  13454. ssl->msgsReceived.got_change_cipher = 0;
  13455. ret = DoTls13HandShakeMsg(ssl,
  13456. ssl->buffers.inputBuffer.buffer,
  13457. &ssl->buffers.inputBuffer.idx,
  13458. ssl->buffers.inputBuffer.length);
  13459. #ifdef WOLFSSL_EARLY_DATA
  13460. if (ret != 0)
  13461. return ret;
  13462. if (ssl->options.side == WOLFSSL_SERVER_END &&
  13463. ssl->earlyData > early_data_ext &&
  13464. ssl->options.handShakeState == HANDSHAKE_DONE) {
  13465. ssl->earlyData = no_early_data;
  13466. ssl->options.processReply = doProcessInit;
  13467. return ZERO_RETURN;
  13468. }
  13469. #endif
  13470. #else
  13471. ret = BUFFER_ERROR;
  13472. #endif
  13473. }
  13474. if (ret != 0
  13475. #ifdef WOLFSSL_ASYNC_CRYPT
  13476. /* In async case, on pending, move onto next message.
  13477. * Current message should have been DtlsMsgStore'ed and
  13478. * should be processed with DtlsMsgDrain */
  13479. && (!ssl->options.dtls
  13480. || ret != WC_PENDING_E)
  13481. #endif
  13482. ) {
  13483. WOLFSSL_ERROR(ret);
  13484. return ret;
  13485. }
  13486. break;
  13487. case change_cipher_spec:
  13488. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  13489. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13490. if (ssl->hsInfoOn)
  13491. AddPacketName(ssl, "ChangeCipher");
  13492. /* add record header back on info */
  13493. if (ssl->toInfoOn) {
  13494. AddPacketInfo(ssl, "ChangeCipher",
  13495. change_cipher_spec,
  13496. ssl->buffers.inputBuffer.buffer +
  13497. ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ -
  13498. (ssl->options.dtls ? DTLS_RECORD_EXTRA : 0),
  13499. 1 + RECORD_HEADER_SZ, READ_PROTO, ssl->heap);
  13500. #ifdef WOLFSSL_CALLBACKS
  13501. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  13502. #endif
  13503. }
  13504. #endif
  13505. #ifdef WOLFSSL_TLS13
  13506. if (IsAtLeastTLSv1_3(ssl->version)) {
  13507. word32 i = ssl->buffers.inputBuffer.idx;
  13508. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  13509. SendAlert(ssl, alert_fatal, unexpected_message);
  13510. return UNKNOWN_RECORD_TYPE;
  13511. }
  13512. if (ssl->curSize != 1 ||
  13513. ssl->buffers.inputBuffer.buffer[i] != 1) {
  13514. SendAlert(ssl, alert_fatal, illegal_parameter);
  13515. return UNKNOWN_RECORD_TYPE;
  13516. }
  13517. ssl->buffers.inputBuffer.idx++;
  13518. if (!ssl->msgsReceived.got_change_cipher) {
  13519. ssl->msgsReceived.got_change_cipher = 1;
  13520. }
  13521. else {
  13522. SendAlert(ssl, alert_fatal, illegal_parameter);
  13523. return UNKNOWN_RECORD_TYPE;
  13524. }
  13525. break;
  13526. }
  13527. #endif
  13528. #ifndef WOLFSSL_NO_TLS12
  13529. if (ssl->buffers.inputBuffer.buffer[
  13530. ssl->buffers.inputBuffer.idx] != 1) {
  13531. WOLFSSL_MSG("ChangeCipher msg wrong value");
  13532. return LENGTH_ERROR;
  13533. }
  13534. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  13535. #ifdef HAVE_AEAD
  13536. if (ssl->specs.cipher_type == aead) {
  13537. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  13538. ssl->curSize -= AESGCM_EXP_IV_SZ;
  13539. ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
  13540. ssl->curSize -= ssl->specs.aead_mac_size;
  13541. }
  13542. else
  13543. #endif
  13544. {
  13545. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  13546. ssl->curSize -= (word16)ssl->keys.padSz;
  13547. ssl->curSize -= ssl->specs.iv_size;
  13548. }
  13549. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13550. if (ssl->options.startedETMRead) {
  13551. word32 digestSz = MacSize(ssl);
  13552. ssl->buffers.inputBuffer.idx += digestSz;
  13553. ssl->curSize -= digestSz;
  13554. }
  13555. #endif
  13556. }
  13557. if (ssl->curSize != 1) {
  13558. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  13559. return LENGTH_ERROR;
  13560. }
  13561. ssl->buffers.inputBuffer.idx++;
  13562. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  13563. if (ret != 0) {
  13564. if (!ssl->options.dtls) {
  13565. return ret;
  13566. }
  13567. else {
  13568. #ifdef WOLFSSL_DTLS
  13569. /* Check for duplicate CCS message in DTLS mode.
  13570. * DTLS allows for duplicate messages, and it should be
  13571. * skipped. Also skip if out of order. */
  13572. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  13573. return ret;
  13574. /* Reset error */
  13575. ret = 0;
  13576. break;
  13577. #endif /* WOLFSSL_DTLS */
  13578. }
  13579. }
  13580. ssl->keys.encryptionOn = 1;
  13581. /* setup decrypt keys for following messages */
  13582. /* XXX This might not be what we want to do when
  13583. * receiving a CCS with multicast. We update the
  13584. * key when the application updates them. */
  13585. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  13586. return ret;
  13587. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13588. ssl->options.startedETMRead = ssl->options.encThenMac;
  13589. #endif
  13590. #ifdef WOLFSSL_DTLS
  13591. if (ssl->options.dtls) {
  13592. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  13593. #ifdef WOLFSSL_MULTICAST
  13594. if (ssl->options.haveMcast) {
  13595. peerSeq += ssl->keys.curPeerId;
  13596. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  13597. ssl->ctx->mcastFirstSeq,
  13598. ssl->ctx->mcastSecondSeq,
  13599. ssl->ctx->mcastMaxSeq);
  13600. }
  13601. #endif
  13602. peerSeq->nextEpoch++;
  13603. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  13604. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  13605. peerSeq->nextSeq_lo = 0;
  13606. peerSeq->nextSeq_hi = 0;
  13607. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  13608. DTLS_SEQ_SZ);
  13609. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  13610. }
  13611. #endif
  13612. #ifdef HAVE_LIBZ
  13613. if (ssl->options.usingCompression)
  13614. if ( (ret = InitStreams(ssl)) != 0)
  13615. return ret;
  13616. #endif
  13617. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  13618. ssl->options.side == WOLFSSL_CLIENT_END ?
  13619. server : client);
  13620. if (ret != 0)
  13621. return ret;
  13622. #endif /* !WOLFSSL_NO_TLS12 */
  13623. break;
  13624. case application_data:
  13625. WOLFSSL_MSG("got app DATA");
  13626. #ifdef WOLFSSL_DTLS
  13627. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  13628. FreeHandshakeResources(ssl);
  13629. ssl->options.dtlsHsRetain = 0;
  13630. }
  13631. #endif
  13632. #ifdef WOLFSSL_TLS13
  13633. if (ssl->keys.keyUpdateRespond) {
  13634. WOLFSSL_MSG("No KeyUpdate from peer seen");
  13635. return SANITY_MSG_E;
  13636. }
  13637. #endif
  13638. if ((ret = DoApplicationData(ssl,
  13639. ssl->buffers.inputBuffer.buffer,
  13640. &ssl->buffers.inputBuffer.idx))
  13641. != 0) {
  13642. WOLFSSL_ERROR(ret);
  13643. return ret;
  13644. }
  13645. break;
  13646. case alert:
  13647. WOLFSSL_MSG("got ALERT!");
  13648. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  13649. &ssl->buffers.inputBuffer.idx, &type,
  13650. ssl->buffers.inputBuffer.length);
  13651. if (ret == alert_fatal)
  13652. return FATAL_ERROR;
  13653. else if (ret < 0)
  13654. return ret;
  13655. /* catch warnings that are handled as errors */
  13656. if (type == close_notify)
  13657. return ssl->error = ZERO_RETURN;
  13658. if (type == decrypt_error)
  13659. return FATAL_ERROR;
  13660. /* Reset error if we got an alert level in ret */
  13661. if (ret > 0)
  13662. ret = 0;
  13663. break;
  13664. default:
  13665. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  13666. return UNKNOWN_RECORD_TYPE;
  13667. }
  13668. ssl->options.processReply = doProcessInit;
  13669. /* input exhausted */
  13670. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
  13671. #ifdef WOLFSSL_DTLS
  13672. /* If app data was processed then return now to avoid
  13673. * dropping any app data. */
  13674. || (ssl->options.dtls && ssl->curRL.type == application_data)
  13675. #endif
  13676. )
  13677. return ret;
  13678. /* more messages per record */
  13679. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  13680. WOLFSSL_MSG("More messages in record");
  13681. ssl->options.processReply = runProcessingOneMessage;
  13682. if (IsEncryptionOn(ssl, 0)) {
  13683. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  13684. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13685. if (ssl->options.startedETMRead) {
  13686. word32 digestSz = MacSize(ssl);
  13687. if (ssl->buffers.inputBuffer.idx >=
  13688. ssl->keys.padSz + digestSz) {
  13689. ssl->buffers.inputBuffer.idx -=
  13690. ssl->keys.padSz + digestSz;
  13691. }
  13692. else {
  13693. WOLFSSL_MSG("\tmiddle padding error");
  13694. return FATAL_ERROR;
  13695. }
  13696. }
  13697. else
  13698. #endif
  13699. {
  13700. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  13701. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  13702. }
  13703. else {
  13704. WOLFSSL_MSG("\tmiddle padding error");
  13705. return FATAL_ERROR;
  13706. }
  13707. }
  13708. }
  13709. }
  13710. /* more records */
  13711. else {
  13712. WOLFSSL_MSG("More records in input");
  13713. }
  13714. #ifdef WOLFSSL_ASYNC_CRYPT
  13715. /* We are setup to read next message/record but we had an error
  13716. * (probably WC_PENDING_E) so return that so it can be handled
  13717. * by higher layers. */
  13718. if (ret != 0)
  13719. return ret;
  13720. #endif
  13721. continue;
  13722. default:
  13723. WOLFSSL_MSG("Bad process input state, programming error");
  13724. return INPUT_CASE_ERROR;
  13725. }
  13726. }
  13727. }
  13728. int SendChangeCipher(WOLFSSL* ssl)
  13729. {
  13730. byte *output;
  13731. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  13732. int idx = RECORD_HEADER_SZ;
  13733. int ret;
  13734. #ifdef OPENSSL_EXTRA
  13735. ssl->cbmode = SSL_CB_MODE_WRITE;
  13736. if (ssl->options.side == WOLFSSL_SERVER_END){
  13737. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  13738. if (ssl->CBIS != NULL)
  13739. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  13740. }
  13741. else{
  13742. ssl->options.clientState =
  13743. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  13744. if (ssl->CBIS != NULL)
  13745. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  13746. }
  13747. #endif
  13748. #ifdef WOLFSSL_DTLS
  13749. if (ssl->options.dtls) {
  13750. sendSz += DTLS_RECORD_EXTRA;
  13751. idx += DTLS_RECORD_EXTRA;
  13752. }
  13753. #endif
  13754. /* are we in scr */
  13755. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  13756. sendSz += MAX_MSG_EXTRA;
  13757. }
  13758. /* check for available size */
  13759. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  13760. return ret;
  13761. /* get output buffer */
  13762. output = ssl->buffers.outputBuffer.buffer +
  13763. ssl->buffers.outputBuffer.length;
  13764. AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
  13765. output[idx] = 1; /* turn it on */
  13766. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  13767. byte input[ENUM_LEN];
  13768. int inputSz = ENUM_LEN;
  13769. input[0] = 1; /* turn it on */
  13770. #ifdef WOLFSSL_DTLS
  13771. if (IsDtlsNotSctpMode(ssl) &&
  13772. (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
  13773. return ret;
  13774. }
  13775. #endif
  13776. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  13777. change_cipher_spec, 0, 0, 0, CUR_ORDER);
  13778. if (sendSz < 0) {
  13779. return sendSz;
  13780. }
  13781. }
  13782. #ifdef WOLFSSL_DTLS
  13783. else {
  13784. if (IsDtlsNotSctpMode(ssl)) {
  13785. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
  13786. return ret;
  13787. DtlsSEQIncrement(ssl, CUR_ORDER);
  13788. }
  13789. }
  13790. #endif
  13791. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13792. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  13793. if (ssl->toInfoOn)
  13794. AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  13795. sendSz, WRITE_PROTO, ssl->heap);
  13796. #endif
  13797. ssl->buffers.outputBuffer.length += sendSz;
  13798. if (ssl->options.groupMessages)
  13799. return 0;
  13800. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  13801. else if (ssl->options.dtls) {
  13802. /* If using DTLS, force the ChangeCipherSpec message to be in the
  13803. * same datagram as the finished message. */
  13804. return 0;
  13805. }
  13806. #endif
  13807. else
  13808. return SendBuffered(ssl);
  13809. }
  13810. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  13811. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  13812. int padLen, int content, int verify, int epochOrder)
  13813. {
  13814. byte result[WC_MAX_DIGEST_SIZE];
  13815. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  13816. word32 padSz = ssl->specs.pad_size;
  13817. int ret = 0;
  13818. wc_Md5 md5;
  13819. wc_Sha sha;
  13820. /* data */
  13821. byte seq[SEQ_SZ];
  13822. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  13823. const byte* macSecret = NULL;
  13824. (void)padLen;
  13825. #ifdef HAVE_FUZZER
  13826. if (ssl->fuzzerCb)
  13827. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  13828. #endif
  13829. #ifdef WOLFSSL_DTLS
  13830. if (ssl->options.dtls)
  13831. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  13832. else
  13833. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  13834. #else
  13835. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  13836. #endif
  13837. XMEMSET(seq, 0, SEQ_SZ);
  13838. conLen[0] = (byte)content;
  13839. c16toa((word16)sz, &conLen[ENUM_LEN]);
  13840. WriteSEQ(ssl, epochOrder, seq);
  13841. if (ssl->specs.mac_algorithm == md5_mac) {
  13842. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  13843. if (ret != 0)
  13844. return ret;
  13845. /* inner */
  13846. ret = wc_Md5Update(&md5, macSecret, digestSz);
  13847. ret |= wc_Md5Update(&md5, PAD1, padSz);
  13848. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  13849. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  13850. /* in buffer */
  13851. ret |= wc_Md5Update(&md5, in, sz);
  13852. if (ret != 0)
  13853. return VERIFY_MAC_ERROR;
  13854. ret = wc_Md5Final(&md5, result);
  13855. #ifdef WOLFSSL_ASYNC_CRYPT
  13856. /* TODO: Make non-blocking */
  13857. if (ret == WC_PENDING_E) {
  13858. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  13859. }
  13860. #endif
  13861. if (ret != 0)
  13862. return VERIFY_MAC_ERROR;
  13863. /* outer */
  13864. ret = wc_Md5Update(&md5, macSecret, digestSz);
  13865. ret |= wc_Md5Update(&md5, PAD2, padSz);
  13866. ret |= wc_Md5Update(&md5, result, digestSz);
  13867. if (ret != 0)
  13868. return VERIFY_MAC_ERROR;
  13869. ret = wc_Md5Final(&md5, digest);
  13870. #ifdef WOLFSSL_ASYNC_CRYPT
  13871. /* TODO: Make non-blocking */
  13872. if (ret == WC_PENDING_E) {
  13873. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  13874. }
  13875. #endif
  13876. if (ret != 0)
  13877. return VERIFY_MAC_ERROR;
  13878. wc_Md5Free(&md5);
  13879. }
  13880. else {
  13881. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  13882. if (ret != 0)
  13883. return ret;
  13884. /* inner */
  13885. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  13886. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  13887. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  13888. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  13889. /* in buffer */
  13890. ret |= wc_ShaUpdate(&sha, in, sz);
  13891. if (ret != 0)
  13892. return VERIFY_MAC_ERROR;
  13893. ret = wc_ShaFinal(&sha, result);
  13894. #ifdef WOLFSSL_ASYNC_CRYPT
  13895. /* TODO: Make non-blocking */
  13896. if (ret == WC_PENDING_E) {
  13897. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  13898. }
  13899. #endif
  13900. if (ret != 0)
  13901. return VERIFY_MAC_ERROR;
  13902. /* outer */
  13903. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  13904. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  13905. ret |= wc_ShaUpdate(&sha, result, digestSz);
  13906. if (ret != 0)
  13907. return VERIFY_MAC_ERROR;
  13908. ret = wc_ShaFinal(&sha, digest);
  13909. #ifdef WOLFSSL_ASYNC_CRYPT
  13910. /* TODO: Make non-blocking */
  13911. if (ret == WC_PENDING_E) {
  13912. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  13913. }
  13914. #endif
  13915. if (ret != 0)
  13916. return VERIFY_MAC_ERROR;
  13917. wc_ShaFree(&sha);
  13918. }
  13919. return 0;
  13920. }
  13921. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  13922. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  13923. static int BuildMD5_CertVerify(WOLFSSL* ssl, byte* digest)
  13924. {
  13925. int ret;
  13926. byte md5_result[WC_MD5_DIGEST_SIZE];
  13927. #ifdef WOLFSSL_SMALL_STACK
  13928. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  13929. #else
  13930. wc_Md5 md5[1];
  13931. #endif
  13932. /* make md5 inner */
  13933. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  13934. if (ret == 0)
  13935. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  13936. if (ret == 0)
  13937. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  13938. if (ret == 0)
  13939. ret = wc_Md5Final(md5, md5_result);
  13940. /* make md5 outer */
  13941. if (ret == 0) {
  13942. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  13943. if (ret == 0) {
  13944. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  13945. if (ret == 0)
  13946. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  13947. if (ret == 0)
  13948. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  13949. if (ret == 0)
  13950. ret = wc_Md5Final(md5, digest);
  13951. wc_Md5Free(md5);
  13952. }
  13953. }
  13954. #ifdef WOLFSSL_SMALL_STACK
  13955. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  13956. #endif
  13957. return ret;
  13958. }
  13959. #endif /* !NO_MD5 && !NO_OLD_TLS */
  13960. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  13961. defined(WOLFSSL_ALLOW_TLS_SHA1))
  13962. static int BuildSHA_CertVerify(WOLFSSL* ssl, byte* digest)
  13963. {
  13964. int ret;
  13965. byte sha_result[WC_SHA_DIGEST_SIZE];
  13966. #ifdef WOLFSSL_SMALL_STACK
  13967. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  13968. #else
  13969. wc_Sha sha[1];
  13970. #endif
  13971. /* make sha inner */
  13972. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  13973. if (ret == 0)
  13974. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  13975. if (ret == 0)
  13976. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  13977. if (ret == 0)
  13978. ret = wc_ShaFinal(sha, sha_result);
  13979. /* make sha outer */
  13980. if (ret == 0) {
  13981. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  13982. if (ret == 0) {
  13983. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  13984. if (ret == 0)
  13985. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  13986. if (ret == 0)
  13987. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  13988. if (ret == 0)
  13989. ret = wc_ShaFinal(sha, digest);
  13990. wc_ShaFree(sha);
  13991. }
  13992. }
  13993. #ifdef WOLFSSL_SMALL_STACK
  13994. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  13995. #endif
  13996. return ret;
  13997. }
  13998. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  13999. int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes)
  14000. {
  14001. int ret = 0;
  14002. (void)hashes;
  14003. if (ssl->options.tls) {
  14004. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  14005. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  14006. if (ret != 0)
  14007. return ret;
  14008. #endif
  14009. #if !defined(NO_SHA)
  14010. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  14011. if (ret != 0)
  14012. return ret;
  14013. #endif
  14014. if (IsAtLeastTLSv1_2(ssl)) {
  14015. #ifndef NO_SHA256
  14016. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  14017. hashes->sha256);
  14018. if (ret != 0)
  14019. return ret;
  14020. #endif
  14021. #ifdef WOLFSSL_SHA384
  14022. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  14023. hashes->sha384);
  14024. if (ret != 0)
  14025. return ret;
  14026. #endif
  14027. #ifdef WOLFSSL_SHA512
  14028. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  14029. hashes->sha512);
  14030. if (ret != 0)
  14031. return ret;
  14032. #endif
  14033. }
  14034. }
  14035. else {
  14036. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  14037. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  14038. if (ret != 0)
  14039. return ret;
  14040. #endif
  14041. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  14042. defined(WOLFSSL_ALLOW_TLS_SHA1))
  14043. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  14044. if (ret != 0)
  14045. return ret;
  14046. #endif
  14047. }
  14048. return ret;
  14049. }
  14050. #ifndef WOLFSSL_NO_TLS12
  14051. void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
  14052. {
  14053. if (args) {
  14054. if (ssl && args->iv)
  14055. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  14056. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  14057. }
  14058. }
  14059. #endif
  14060. /* Build SSL Message, encrypted */
  14061. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  14062. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
  14063. int epochOrder)
  14064. {
  14065. #ifndef WOLFSSL_NO_TLS12
  14066. int ret = 0;
  14067. BuildMsgArgs* args;
  14068. BuildMsgArgs lcl_args;
  14069. #ifdef WOLFSSL_ASYNC_CRYPT
  14070. args = &ssl->async.buildArgs;
  14071. #endif
  14072. #endif
  14073. WOLFSSL_ENTER("BuildMessage");
  14074. if (ssl == NULL) {
  14075. return BAD_FUNC_ARG;
  14076. }
  14077. (void)epochOrder;
  14078. #ifdef WOLFSSL_NO_TLS12
  14079. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  14080. hashOutput, sizeOnly, asyncOkay);
  14081. #else
  14082. #ifdef WOLFSSL_TLS13
  14083. if (ssl->options.tls1_3) {
  14084. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  14085. hashOutput, sizeOnly, asyncOkay);
  14086. }
  14087. #endif
  14088. ret = WC_NOT_PENDING_E;
  14089. #ifdef WOLFSSL_ASYNC_CRYPT
  14090. if (asyncOkay) {
  14091. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  14092. if (ret != WC_NOT_PENDING_E) {
  14093. /* Check for error */
  14094. if (ret < 0)
  14095. goto exit_buildmsg;
  14096. }
  14097. }
  14098. else
  14099. #endif
  14100. {
  14101. args = &lcl_args;
  14102. }
  14103. /* Reset state */
  14104. if (ret == WC_NOT_PENDING_E) {
  14105. ret = 0;
  14106. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  14107. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  14108. args->sz = RECORD_HEADER_SZ + inSz;
  14109. args->idx = RECORD_HEADER_SZ;
  14110. args->headerSz = RECORD_HEADER_SZ;
  14111. }
  14112. switch (ssl->options.buildMsgState) {
  14113. case BUILD_MSG_BEGIN:
  14114. {
  14115. /* catch mistaken sizeOnly parameter */
  14116. if (!sizeOnly && (output == NULL || input == NULL) ) {
  14117. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  14118. }
  14119. if (sizeOnly && (output || input) ) {
  14120. WOLFSSL_MSG("BuildMessage w/sizeOnly doesn't need input/output");
  14121. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  14122. }
  14123. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  14124. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  14125. /* For epochs >1 the current cipher parameters are located in
  14126. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  14127. * parameters and for epoch 1 use ssl->keys */
  14128. switch (epochOrder) {
  14129. case PREV_ORDER:
  14130. if (ssl->encrypt.src != KEYS) {
  14131. ssl->secure_renegotiation->cache_status =
  14132. SCR_CACHE_NULL;
  14133. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  14134. ERROR_OUT(ret, exit_buildmsg);
  14135. }
  14136. break;
  14137. case CUR_ORDER:
  14138. if (ssl->keys.dtls_epoch ==
  14139. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  14140. if (ssl->encrypt.src != SCR) {
  14141. ssl->secure_renegotiation->cache_status =
  14142. SCR_CACHE_NEEDED;
  14143. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  14144. != 0)
  14145. ERROR_OUT(ret, exit_buildmsg);
  14146. }
  14147. }
  14148. else {
  14149. if (ssl->encrypt.src != KEYS) {
  14150. ssl->secure_renegotiation->cache_status =
  14151. SCR_CACHE_NULL;
  14152. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  14153. != 0)
  14154. ERROR_OUT(ret, exit_buildmsg);
  14155. }
  14156. }
  14157. break;
  14158. default:
  14159. WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
  14160. "CUR_ORDER");
  14161. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  14162. }
  14163. }
  14164. #endif
  14165. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  14166. }
  14167. FALL_THROUGH;
  14168. case BUILD_MSG_SIZE:
  14169. {
  14170. args->digestSz = ssl->specs.hash_size;
  14171. #ifdef HAVE_TRUNCATED_HMAC
  14172. if (ssl->truncated_hmac)
  14173. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  14174. #endif
  14175. args->sz += args->digestSz;
  14176. #ifdef WOLFSSL_DTLS
  14177. if (ssl->options.dtls) {
  14178. args->sz += DTLS_RECORD_EXTRA;
  14179. args->idx += DTLS_RECORD_EXTRA;
  14180. args->headerSz += DTLS_RECORD_EXTRA;
  14181. }
  14182. #endif
  14183. #ifndef WOLFSSL_AEAD_ONLY
  14184. if (ssl->specs.cipher_type == block) {
  14185. word32 blockSz = ssl->specs.block_size;
  14186. if (ssl->options.tls1_1) {
  14187. args->ivSz = blockSz;
  14188. args->sz += args->ivSz;
  14189. if (args->ivSz > MAX_IV_SZ)
  14190. ERROR_OUT(BUFFER_E, exit_buildmsg);
  14191. }
  14192. args->sz += 1; /* pad byte */
  14193. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14194. if (ssl->options.startedETMWrite) {
  14195. args->pad = (args->sz - args->headerSz -
  14196. args->digestSz) % blockSz;
  14197. }
  14198. else
  14199. #endif
  14200. args->pad = (args->sz - args->headerSz) % blockSz;
  14201. #ifdef OPENSSL_EXTRA
  14202. if(args->pad != 0)
  14203. #endif
  14204. args->pad = blockSz - args->pad;
  14205. args->sz += args->pad;
  14206. }
  14207. #endif /* WOLFSSL_AEAD_ONLY */
  14208. #ifdef HAVE_AEAD
  14209. if (ssl->specs.cipher_type == aead) {
  14210. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  14211. args->ivSz = AESGCM_EXP_IV_SZ;
  14212. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  14213. }
  14214. #endif
  14215. /* done with size calculations */
  14216. if (sizeOnly)
  14217. goto exit_buildmsg;
  14218. if (args->sz > (word32)outSz) {
  14219. WOLFSSL_MSG("Oops, want to write past output buffer size");
  14220. ERROR_OUT(BUFFER_E, exit_buildmsg);
  14221. }
  14222. if (args->ivSz > 0) {
  14223. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap, DYNAMIC_TYPE_SALT);
  14224. if (args->iv == NULL)
  14225. ERROR_OUT(MEMORY_E, exit_buildmsg);
  14226. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  14227. if (ret != 0)
  14228. goto exit_buildmsg;
  14229. }
  14230. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  14231. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  14232. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  14233. defined(HAVE_AEAD))
  14234. if (ssl->specs.cipher_type == aead) {
  14235. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  14236. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  14237. }
  14238. #endif
  14239. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  14240. AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
  14241. /* write to output */
  14242. if (args->ivSz > 0) {
  14243. XMEMCPY(output + args->idx, args->iv,
  14244. min(args->ivSz, MAX_IV_SZ));
  14245. args->idx += args->ivSz;
  14246. }
  14247. XMEMCPY(output + args->idx, input, inSz);
  14248. args->idx += inSz;
  14249. ssl->options.buildMsgState = BUILD_MSG_HASH;
  14250. }
  14251. FALL_THROUGH;
  14252. case BUILD_MSG_HASH:
  14253. {
  14254. if (type == handshake && hashOutput) {
  14255. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  14256. if (ret != 0)
  14257. goto exit_buildmsg;
  14258. }
  14259. #ifndef WOLFSSL_AEAD_ONLY
  14260. if (ssl->specs.cipher_type == block) {
  14261. word32 tmpIdx;
  14262. word32 i;
  14263. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14264. if (ssl->options.startedETMWrite)
  14265. tmpIdx = args->idx;
  14266. else
  14267. #endif
  14268. tmpIdx = args->idx + args->digestSz;
  14269. for (i = 0; i <= args->pad; i++)
  14270. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  14271. }
  14272. #endif
  14273. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  14274. }
  14275. FALL_THROUGH;
  14276. case BUILD_MSG_VERIFY_MAC:
  14277. {
  14278. /* User Record Layer Callback handling */
  14279. #ifdef ATOMIC_USER
  14280. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14281. if (ssl->options.startedETMWrite) {
  14282. if (ssl->ctx->EncryptMacCb) {
  14283. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  14284. args->pad + 1, type, 0,
  14285. output + args->headerSz,
  14286. output + args->headerSz,
  14287. args->size - args->digestSz,
  14288. ssl->MacEncryptCtx);
  14289. goto exit_buildmsg;
  14290. }
  14291. }
  14292. else
  14293. #endif
  14294. {
  14295. if (ssl->ctx->MacEncryptCb) {
  14296. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  14297. output + args->headerSz + args->ivSz, inSz,
  14298. type, 0, output + args->headerSz,
  14299. output + args->headerSz, args->size,
  14300. ssl->MacEncryptCtx);
  14301. goto exit_buildmsg;
  14302. }
  14303. }
  14304. #endif
  14305. #ifndef WOLFSSL_AEAD_ONLY
  14306. if (ssl->specs.cipher_type != aead
  14307. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14308. && !ssl->options.startedETMWrite
  14309. #endif
  14310. ) {
  14311. #ifdef HAVE_TRUNCATED_HMAC
  14312. if (ssl->truncated_hmac &&
  14313. ssl->specs.hash_size > args->digestSz) {
  14314. #ifdef WOLFSSL_SMALL_STACK
  14315. byte* hmac;
  14316. #else
  14317. byte hmac[WC_MAX_DIGEST_SIZE];
  14318. #endif
  14319. #ifdef WOLFSSL_SMALL_STACK
  14320. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  14321. DYNAMIC_TYPE_DIGEST);
  14322. if (hmac == NULL)
  14323. ERROR_OUT(MEMORY_E, exit_buildmsg);
  14324. #endif
  14325. ret = ssl->hmac(ssl, hmac,
  14326. output + args->headerSz + args->ivSz, inSz,
  14327. -1, type, 0, epochOrder);
  14328. XMEMCPY(output + args->idx, hmac, args->digestSz);
  14329. #ifdef WOLFSSL_SMALL_STACK
  14330. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  14331. #endif
  14332. }
  14333. else
  14334. #endif
  14335. {
  14336. ret = ssl->hmac(ssl, output + args->idx, output +
  14337. args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
  14338. }
  14339. }
  14340. #endif /* WOLFSSL_AEAD_ONLY */
  14341. if (ret != 0)
  14342. goto exit_buildmsg;
  14343. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  14344. }
  14345. FALL_THROUGH;
  14346. case BUILD_MSG_ENCRYPT:
  14347. {
  14348. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  14349. /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
  14350. * for all encryption algos that use it for encryption parameters */
  14351. word16 dtls_epoch = 0;
  14352. word16 dtls_sequence_number_hi = 0;
  14353. word32 dtls_sequence_number_lo = 0;
  14354. int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
  14355. DtlsUseSCRKeys(ssl);
  14356. if (swap_seq) {
  14357. dtls_epoch = ssl->keys.dtls_epoch;
  14358. dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
  14359. dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
  14360. ssl->keys.dtls_epoch--;
  14361. ssl->keys.dtls_sequence_number_hi =
  14362. ssl->keys.dtls_prev_sequence_number_hi;
  14363. ssl->keys.dtls_sequence_number_lo =
  14364. ssl->keys.dtls_prev_sequence_number_lo;
  14365. }
  14366. #endif
  14367. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14368. if (ssl->options.startedETMWrite) {
  14369. ret = Encrypt(ssl, output + args->headerSz,
  14370. output + args->headerSz,
  14371. args->size - args->digestSz, asyncOkay);
  14372. }
  14373. else
  14374. #endif
  14375. {
  14376. ret = Encrypt(ssl, output + args->headerSz,
  14377. output + args->headerSz, args->size, asyncOkay);
  14378. }
  14379. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  14380. /* Restore sequence numbers */
  14381. if (swap_seq) {
  14382. ssl->keys.dtls_epoch = dtls_epoch;
  14383. ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
  14384. ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
  14385. }
  14386. #endif
  14387. if (ret != 0)
  14388. goto exit_buildmsg;
  14389. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  14390. }
  14391. FALL_THROUGH;
  14392. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  14393. {
  14394. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14395. if (ssl->options.startedETMWrite) {
  14396. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  14397. #ifdef HAVE_TRUNCATED_HMAC
  14398. if (ssl->truncated_hmac &&
  14399. ssl->specs.hash_size > args->digestSz) {
  14400. #ifdef WOLFSSL_SMALL_STACK
  14401. byte* hmac = NULL;
  14402. #else
  14403. byte hmac[WC_MAX_DIGEST_SIZE];
  14404. #endif
  14405. #ifdef WOLFSSL_SMALL_STACK
  14406. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  14407. DYNAMIC_TYPE_DIGEST);
  14408. if (hmac == NULL)
  14409. ERROR_OUT(MEMORY_E, exit_buildmsg);
  14410. #endif
  14411. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  14412. args->ivSz + inSz + args->pad + 1, -1, type,
  14413. 0, epochOrder);
  14414. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  14415. args->digestSz);
  14416. #ifdef WOLFSSL_SMALL_STACK
  14417. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  14418. #endif
  14419. }
  14420. else
  14421. #endif
  14422. {
  14423. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  14424. output + args->headerSz,
  14425. args->ivSz + inSz + args->pad + 1, -1, type,
  14426. 0, epochOrder);
  14427. }
  14428. }
  14429. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  14430. }
  14431. }
  14432. exit_buildmsg:
  14433. WOLFSSL_LEAVE("BuildMessage", ret);
  14434. #ifdef WOLFSSL_ASYNC_CRYPT
  14435. if (ret == WC_PENDING_E) {
  14436. return ret;
  14437. }
  14438. #endif
  14439. /* make sure build message state is reset */
  14440. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  14441. #ifdef WOLFSSL_DTLS
  14442. if (ret == 0 && ssl->options.dtls)
  14443. DtlsSEQIncrement(ssl, epochOrder);
  14444. #endif
  14445. /* return sz on success */
  14446. if (ret == 0)
  14447. ret = args->sz;
  14448. /* Final cleanup */
  14449. FreeBuildMsgArgs(ssl, args);
  14450. return ret;
  14451. #endif /* !WOLFSSL_NO_TLS12 */
  14452. }
  14453. #ifndef WOLFSSL_NO_TLS12
  14454. int SendFinished(WOLFSSL* ssl)
  14455. {
  14456. int sendSz,
  14457. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  14458. FINISHED_SZ;
  14459. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  14460. byte *output;
  14461. Hashes* hashes;
  14462. int ret;
  14463. int headerSz = HANDSHAKE_HEADER_SZ;
  14464. int outputSz;
  14465. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  14466. WOLFSSL_ENTER("SendFinished");
  14467. /* setup encrypt keys */
  14468. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  14469. return ret;
  14470. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14471. ssl->options.startedETMWrite = ssl->options.encThenMac;
  14472. #endif
  14473. /* check for available size */
  14474. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  14475. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  14476. return ret;
  14477. #ifdef WOLFSSL_DTLS
  14478. if (ssl->options.dtls) {
  14479. headerSz += DTLS_HANDSHAKE_EXTRA;
  14480. ssl->keys.dtls_epoch++;
  14481. ssl->keys.dtls_prev_sequence_number_hi =
  14482. ssl->keys.dtls_sequence_number_hi;
  14483. ssl->keys.dtls_prev_sequence_number_lo =
  14484. ssl->keys.dtls_sequence_number_lo;
  14485. ssl->keys.dtls_sequence_number_hi = 0;
  14486. ssl->keys.dtls_sequence_number_lo = 0;
  14487. }
  14488. #endif
  14489. /* get output buffer */
  14490. output = ssl->buffers.outputBuffer.buffer +
  14491. ssl->buffers.outputBuffer.length;
  14492. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  14493. /* make finished hashes */
  14494. hashes = (Hashes*)&input[headerSz];
  14495. ret = BuildFinished(ssl, hashes,
  14496. ssl->options.side == WOLFSSL_CLIENT_END ? client : server);
  14497. if (ret != 0) return ret;
  14498. #ifdef HAVE_SECURE_RENEGOTIATION
  14499. if (ssl->secure_renegotiation) {
  14500. if (ssl->options.side == WOLFSSL_CLIENT_END)
  14501. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  14502. TLS_FINISHED_SZ);
  14503. else
  14504. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  14505. TLS_FINISHED_SZ);
  14506. }
  14507. #endif
  14508. #ifdef WOLFSSL_DTLS
  14509. if (IsDtlsNotSctpMode(ssl)) {
  14510. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz, finished)) != 0)
  14511. return ret;
  14512. }
  14513. #endif
  14514. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  14515. handshake, 1, 0, 0, CUR_ORDER);
  14516. if (sendSz < 0)
  14517. return BUILD_MSG_ERROR;
  14518. if (!ssl->options.resuming) {
  14519. #ifndef NO_SESSION_CACHE
  14520. AddSession(ssl); /* just try */
  14521. #endif
  14522. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14523. #ifdef OPENSSL_EXTRA
  14524. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  14525. ssl->cbmode = SSL_CB_MODE_WRITE;
  14526. if (ssl->CBIS != NULL)
  14527. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  14528. #endif
  14529. ssl->options.handShakeState = HANDSHAKE_DONE;
  14530. ssl->options.handShakeDone = 1;
  14531. }
  14532. }
  14533. else {
  14534. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14535. #ifdef OPENSSL_EXTRA
  14536. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  14537. ssl->cbmode = SSL_CB_MODE_WRITE;
  14538. if (ssl->CBIS != NULL)
  14539. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  14540. #endif
  14541. ssl->options.handShakeState = HANDSHAKE_DONE;
  14542. ssl->options.handShakeDone = 1;
  14543. }
  14544. }
  14545. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14546. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  14547. if (ssl->toInfoOn)
  14548. AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  14549. WRITE_PROTO, ssl->heap);
  14550. #endif
  14551. ssl->buffers.outputBuffer.length += sendSz;
  14552. ret = SendBuffered(ssl);
  14553. #ifdef WOLFSSL_DTLS
  14554. if ((!ssl->options.resuming &&
  14555. ssl->options.side == WOLFSSL_SERVER_END) ||
  14556. (ssl->options.resuming &&
  14557. ssl->options.side == WOLFSSL_CLIENT_END)) {
  14558. ssl->keys.dtls_handshake_number = 0;
  14559. ssl->keys.dtls_expected_peer_handshake_number = 0;
  14560. }
  14561. #endif
  14562. WOLFSSL_LEAVE("SendFinished", ret);
  14563. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  14564. return ret;
  14565. }
  14566. #endif /* WOLFSSL_NO_TLS12 */
  14567. #ifndef NO_WOLFSSL_SERVER
  14568. #if (!defined(WOLFSSL_NO_TLS12) && \
  14569. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  14570. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  14571. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  14572. /* Parses and decodes the certificate then initializes "request". In the case
  14573. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  14574. *
  14575. * Returns 0 on success
  14576. */
  14577. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  14578. DecodedCert* cert, byte* certData, word32 length)
  14579. {
  14580. int ret;
  14581. if (request != NULL)
  14582. XMEMSET(request, 0, sizeof(OcspRequest));
  14583. InitDecodedCert(cert, certData, length, ssl->heap);
  14584. /* TODO: Setup async support here */
  14585. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, ssl->ctx->cm);
  14586. if (ret != 0) {
  14587. WOLFSSL_MSG("ParseCert failed");
  14588. }
  14589. if (ret == 0)
  14590. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  14591. if (ret == 0) {
  14592. /* make sure ctx OCSP request is updated */
  14593. if (!ssl->buffers.weOwnCert) {
  14594. wolfSSL_Mutex* ocspLock = &ssl->ctx->cm->ocsp_stapling->ocspLock;
  14595. if (wc_LockMutex(ocspLock) == 0) {
  14596. if (ssl->ctx->certOcspRequest == NULL)
  14597. ssl->ctx->certOcspRequest = request;
  14598. wc_UnLockMutex(ocspLock);
  14599. }
  14600. }
  14601. }
  14602. FreeDecodedCert(cert);
  14603. return ret;
  14604. }
  14605. /* Creates OCSP response and places it in variable "response". Memory
  14606. * management for "buffer* response" is up to the caller.
  14607. *
  14608. * Also creates an OcspRequest in the case that ocspRequest is null or that
  14609. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  14610. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  14611. * be set to point to "ocspRequest" and it then should not be free'd since
  14612. * wolfSSL_CTX_free will take care of it.
  14613. *
  14614. * Returns 0 on success
  14615. */
  14616. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  14617. buffer* response)
  14618. {
  14619. int ret = 0;
  14620. OcspRequest* request = NULL;
  14621. byte createdRequest = 0;
  14622. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  14623. return BAD_FUNC_ARG;
  14624. XMEMSET(response, 0, sizeof(*response));
  14625. request = *ocspRequest;
  14626. /* unable to fetch status. skip. */
  14627. if (ssl->ctx->cm == NULL || ssl->ctx->cm->ocspStaplingEnabled == 0)
  14628. return 0;
  14629. if (request == NULL || ssl->buffers.weOwnCert) {
  14630. DerBuffer* der = ssl->buffers.certificate;
  14631. #ifdef WOLFSSL_SMALL_STACK
  14632. DecodedCert* cert = NULL;
  14633. #else
  14634. DecodedCert cert[1];
  14635. #endif
  14636. /* unable to fetch status. skip. */
  14637. if (der->buffer == NULL || der->length == 0)
  14638. return 0;
  14639. #ifdef WOLFSSL_SMALL_STACK
  14640. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  14641. DYNAMIC_TYPE_DCERT);
  14642. if (cert == NULL)
  14643. return MEMORY_E;
  14644. #endif
  14645. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  14646. DYNAMIC_TYPE_OCSP_REQUEST);
  14647. if (request == NULL)
  14648. ret = MEMORY_E;
  14649. createdRequest = 1;
  14650. if (ret == 0) {
  14651. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  14652. der->length);
  14653. }
  14654. if (ret != 0) {
  14655. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  14656. request = NULL;
  14657. }
  14658. #ifdef WOLFSSL_SMALL_STACK
  14659. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  14660. #endif
  14661. }
  14662. if (ret == 0) {
  14663. request->ssl = ssl;
  14664. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling, request, response);
  14665. /* Suppressing, not critical */
  14666. if (ret == OCSP_CERT_REVOKED ||
  14667. ret == OCSP_CERT_UNKNOWN ||
  14668. ret == OCSP_LOOKUP_FAIL) {
  14669. ret = 0;
  14670. }
  14671. }
  14672. /* free request up if error case found otherwise return it */
  14673. if (ret != 0 && createdRequest) {
  14674. FreeOcspRequest(request);
  14675. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  14676. }
  14677. if (ret == 0)
  14678. *ocspRequest = request;
  14679. return ret;
  14680. }
  14681. #endif
  14682. #endif /* !NO_WOLFSSL_SERVER */
  14683. #ifndef WOLFSSL_NO_TLS12
  14684. #if !defined(NO_CERTS) || defined(HAVE_SESSION_TICKET)
  14685. static int cipherExtraData(WOLFSSL* ssl)
  14686. {
  14687. /* Cipher data that may be added by BuildMessage */
  14688. return ssl->specs.hash_size + ssl->specs.block_size +
  14689. ssl->specs.aead_mac_size + ssl->specs.iv_size +
  14690. ssl->specs.pad_size;
  14691. }
  14692. #endif
  14693. #ifndef NO_CERTS
  14694. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  14695. /* handle generation of certificate (11) */
  14696. int SendCertificate(WOLFSSL* ssl)
  14697. {
  14698. int ret = 0;
  14699. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  14700. word32 length, maxFragment;
  14701. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  14702. WOLFSSL_ENTER("SendCertificate");
  14703. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  14704. return 0; /* not needed */
  14705. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  14706. #ifdef OPENSSL_EXTRA
  14707. if (ssl->version.major == SSLv3_MAJOR
  14708. && ssl->version.minor == SSLv3_MINOR){
  14709. SendAlert(ssl, alert_warning, no_certificate);
  14710. return 0;
  14711. } else {
  14712. #endif
  14713. certSz = 0;
  14714. certChainSz = 0;
  14715. headerSz = CERT_HEADER_SZ;
  14716. length = CERT_HEADER_SZ;
  14717. listSz = 0;
  14718. #ifdef OPENSSL_EXTRA
  14719. }
  14720. #endif
  14721. }
  14722. else {
  14723. if (!ssl->buffers.certificate) {
  14724. WOLFSSL_MSG("Send Cert missing certificate buffer");
  14725. return BUFFER_ERROR;
  14726. }
  14727. certSz = ssl->buffers.certificate->length;
  14728. headerSz = 2 * CERT_HEADER_SZ;
  14729. /* list + cert size */
  14730. length = certSz + headerSz;
  14731. listSz = certSz + CERT_HEADER_SZ;
  14732. /* may need to send rest of chain, already has leading size(s) */
  14733. if (certSz && ssl->buffers.certChain) {
  14734. certChainSz = ssl->buffers.certChain->length;
  14735. length += certChainSz;
  14736. listSz += certChainSz;
  14737. }
  14738. else
  14739. certChainSz = 0;
  14740. }
  14741. payloadSz = length;
  14742. if (ssl->fragOffset != 0)
  14743. length -= (ssl->fragOffset + headerSz);
  14744. maxFragment = MAX_RECORD_SIZE;
  14745. if (ssl->options.dtls) {
  14746. #ifdef WOLFSSL_DTLS
  14747. /* The 100 bytes is used to account for the UDP and IP headers.
  14748. It can also include the record padding and MAC if the
  14749. SendCertificate is called for a secure renegotiation. */
  14750. maxFragment = MAX_MTU - DTLS_RECORD_HEADER_SZ
  14751. - DTLS_HANDSHAKE_HEADER_SZ - 100;
  14752. #endif /* WOLFSSL_DTLS */
  14753. }
  14754. maxFragment = wolfSSL_GetMaxRecordSize(ssl, maxFragment);
  14755. while (length > 0 && ret == 0) {
  14756. byte* output = NULL;
  14757. word32 fragSz = 0;
  14758. word32 i = RECORD_HEADER_SZ;
  14759. int sendSz = RECORD_HEADER_SZ;
  14760. if (!ssl->options.dtls) {
  14761. if (ssl->fragOffset == 0) {
  14762. if (headerSz + certSz + certChainSz <=
  14763. maxFragment - HANDSHAKE_HEADER_SZ) {
  14764. fragSz = headerSz + certSz + certChainSz;
  14765. }
  14766. else {
  14767. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  14768. }
  14769. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  14770. i += HANDSHAKE_HEADER_SZ;
  14771. }
  14772. else {
  14773. fragSz = min(length, maxFragment);
  14774. sendSz += fragSz;
  14775. }
  14776. if (IsEncryptionOn(ssl, 1))
  14777. sendSz += MAX_MSG_EXTRA;
  14778. }
  14779. else {
  14780. #ifdef WOLFSSL_DTLS
  14781. fragSz = min(length, maxFragment);
  14782. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA
  14783. + HANDSHAKE_HEADER_SZ;
  14784. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA
  14785. + HANDSHAKE_HEADER_SZ;
  14786. #endif
  14787. }
  14788. if (IsEncryptionOn(ssl, 1))
  14789. sendSz += cipherExtraData(ssl);
  14790. /* check for available size */
  14791. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  14792. return ret;
  14793. /* get output buffer */
  14794. output = ssl->buffers.outputBuffer.buffer +
  14795. ssl->buffers.outputBuffer.length;
  14796. if (ssl->fragOffset == 0) {
  14797. if (!ssl->options.dtls) {
  14798. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  14799. if (!IsEncryptionOn(ssl, 1))
  14800. HashRaw(ssl, output + RECORD_HEADER_SZ,
  14801. HANDSHAKE_HEADER_SZ);
  14802. }
  14803. else {
  14804. #ifdef WOLFSSL_DTLS
  14805. AddHeaders(output, payloadSz, certificate, ssl);
  14806. HashRaw(ssl,
  14807. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  14808. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  14809. /* Adding the headers increments these, decrement them for
  14810. * actual message header. */
  14811. ssl->keys.dtls_handshake_number--;
  14812. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  14813. ssl->keys.dtls_handshake_number--;
  14814. #endif /* WOLFSSL_DTLS */
  14815. }
  14816. /* list total */
  14817. c32to24(listSz, output + i);
  14818. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  14819. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  14820. i += CERT_HEADER_SZ;
  14821. length -= CERT_HEADER_SZ;
  14822. fragSz -= CERT_HEADER_SZ;
  14823. if (certSz) {
  14824. c32to24(certSz, output + i);
  14825. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  14826. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  14827. i += CERT_HEADER_SZ;
  14828. length -= CERT_HEADER_SZ;
  14829. fragSz -= CERT_HEADER_SZ;
  14830. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
  14831. HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  14832. if (certChainSz)
  14833. HashRaw(ssl, ssl->buffers.certChain->buffer,
  14834. certChainSz);
  14835. }
  14836. }
  14837. }
  14838. else {
  14839. if (!ssl->options.dtls) {
  14840. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  14841. }
  14842. else {
  14843. #ifdef WOLFSSL_DTLS
  14844. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  14845. payloadSz, certificate, ssl);
  14846. ssl->keys.dtls_handshake_number--;
  14847. #endif /* WOLFSSL_DTLS */
  14848. }
  14849. }
  14850. /* member */
  14851. if (certSz && ssl->fragOffset < certSz) {
  14852. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  14853. XMEMCPY(output + i,
  14854. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  14855. i += copySz;
  14856. ssl->fragOffset += copySz;
  14857. length -= copySz;
  14858. fragSz -= copySz;
  14859. }
  14860. if (certChainSz && fragSz) {
  14861. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  14862. XMEMCPY(output + i,
  14863. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  14864. copySz);
  14865. i += copySz;
  14866. ssl->fragOffset += copySz;
  14867. length -= copySz;
  14868. }
  14869. if (IsEncryptionOn(ssl, 1)) {
  14870. byte* input = NULL;
  14871. int inputSz = i; /* build msg adds rec hdr */
  14872. int recordHeaderSz = RECORD_HEADER_SZ;
  14873. if (ssl->options.dtls)
  14874. recordHeaderSz += DTLS_RECORD_EXTRA;
  14875. inputSz -= recordHeaderSz;
  14876. if (inputSz < 0) {
  14877. WOLFSSL_MSG("Send Cert bad inputSz");
  14878. return BUFFER_E;
  14879. }
  14880. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  14881. input = (byte*)XMALLOC(inputSz, ssl->heap,
  14882. DYNAMIC_TYPE_IN_BUFFER);
  14883. if (input == NULL)
  14884. return MEMORY_E;
  14885. XMEMCPY(input, output + recordHeaderSz, inputSz);
  14886. }
  14887. #ifndef WOLFSSL_DTLS
  14888. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  14889. handshake, 1, 0, 0, CUR_ORDER);
  14890. #else
  14891. if (!ssl->options.dtls)
  14892. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  14893. handshake, 1, 0, 0, CUR_ORDER);
  14894. else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
  14895. * calculate the hash ourselves above */ {
  14896. if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
  14897. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  14898. return ret;
  14899. }
  14900. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  14901. handshake, 0, 0, 0, CUR_ORDER);
  14902. }
  14903. #endif
  14904. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  14905. if (sendSz < 0)
  14906. return sendSz;
  14907. }
  14908. else {
  14909. sendSz = i;
  14910. #ifdef WOLFSSL_DTLS
  14911. if (IsDtlsNotSctpMode(ssl)) {
  14912. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
  14913. return ret;
  14914. }
  14915. if (ssl->options.dtls)
  14916. DtlsSEQIncrement(ssl, CUR_ORDER);
  14917. #endif
  14918. }
  14919. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14920. if (ssl->hsInfoOn)
  14921. AddPacketName(ssl, "Certificate");
  14922. if (ssl->toInfoOn)
  14923. AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  14924. WRITE_PROTO, ssl->heap);
  14925. #endif
  14926. ssl->buffers.outputBuffer.length += sendSz;
  14927. if (!ssl->options.groupMessages)
  14928. ret = SendBuffered(ssl);
  14929. }
  14930. if (ret != WANT_WRITE) {
  14931. /* Clean up the fragment offset. */
  14932. ssl->fragOffset = 0;
  14933. #ifdef WOLFSSL_DTLS
  14934. if (ssl->options.dtls)
  14935. ssl->keys.dtls_handshake_number++;
  14936. #endif
  14937. if (ssl->options.side == WOLFSSL_SERVER_END){
  14938. ssl->options.serverState = SERVER_CERT_COMPLETE;
  14939. }
  14940. }
  14941. WOLFSSL_LEAVE("SendCertificate", ret);
  14942. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  14943. return ret;
  14944. }
  14945. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  14946. /* handle generation of certificate_request (13) */
  14947. int SendCertificateRequest(WOLFSSL* ssl)
  14948. {
  14949. byte *output;
  14950. int ret;
  14951. int sendSz;
  14952. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  14953. word32 dnLen = 0;
  14954. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  14955. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  14956. #endif
  14957. int typeTotal = 1; /* only 1 for now */
  14958. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  14959. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  14960. WOLFSSL_ENTER("SendCertificateRequest");
  14961. if (IsAtLeastTLSv1_2(ssl))
  14962. reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz;
  14963. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  14964. /* Certificate Authorities */
  14965. names = ssl->ctx->ca_names;
  14966. while (names != NULL) {
  14967. byte seq[MAX_SEQ_SZ];
  14968. /* 16-bit length | SEQ | Len | DER of name */
  14969. dnLen += OPAQUE16_LEN + SetSequence(names->data.name->rawLen, seq) +
  14970. names->data.name->rawLen;
  14971. names = names->next;
  14972. }
  14973. reqSz += dnLen;
  14974. #endif
  14975. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  14976. return 0; /* not needed */
  14977. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  14978. if (!ssl->options.dtls) {
  14979. if (IsEncryptionOn(ssl, 1))
  14980. sendSz += MAX_MSG_EXTRA;
  14981. }
  14982. else {
  14983. #ifdef WOLFSSL_DTLS
  14984. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  14985. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  14986. #endif
  14987. }
  14988. if (IsEncryptionOn(ssl, 1))
  14989. sendSz += cipherExtraData(ssl);
  14990. /* check for available size */
  14991. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  14992. return ret;
  14993. /* get output buffer */
  14994. output = ssl->buffers.outputBuffer.buffer +
  14995. ssl->buffers.outputBuffer.length;
  14996. AddHeaders(output, reqSz, certificate_request, ssl);
  14997. /* write to output */
  14998. output[i++] = (byte)typeTotal; /* # of types */
  14999. #ifdef HAVE_ECC
  15000. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  15001. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  15002. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  15003. output[i++] = ecdsa_sign;
  15004. } else
  15005. #endif /* HAVE_ECC */
  15006. {
  15007. output[i++] = rsa_sign;
  15008. }
  15009. /* supported hash/sig */
  15010. if (IsAtLeastTLSv1_2(ssl)) {
  15011. c16toa(ssl->suites->hashSigAlgoSz, &output[i]);
  15012. i += OPAQUE16_LEN;
  15013. XMEMCPY(&output[i],
  15014. ssl->suites->hashSigAlgo, ssl->suites->hashSigAlgoSz);
  15015. i += ssl->suites->hashSigAlgoSz;
  15016. }
  15017. /* Certificate Authorities */
  15018. c16toa((word16)dnLen, &output[i]); /* auth's */
  15019. i += REQ_HEADER_SZ;
  15020. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
  15021. names = ssl->ctx->ca_names;
  15022. while (names != NULL) {
  15023. byte seq[MAX_SEQ_SZ];
  15024. c16toa((word16)names->data.name->rawLen +
  15025. SetSequence(names->data.name->rawLen, seq), &output[i]);
  15026. i += OPAQUE16_LEN;
  15027. i += SetSequence(names->data.name->rawLen, output + i);
  15028. XMEMCPY(output + i, names->data.name->raw, names->data.name->rawLen);
  15029. i += names->data.name->rawLen;
  15030. names = names->next;
  15031. }
  15032. #endif
  15033. (void)i;
  15034. if (IsEncryptionOn(ssl, 1)) {
  15035. byte* input;
  15036. int inputSz = i; /* build msg adds rec hdr */
  15037. int recordHeaderSz = RECORD_HEADER_SZ;
  15038. if (ssl->options.dtls)
  15039. recordHeaderSz += DTLS_RECORD_EXTRA;
  15040. inputSz -= recordHeaderSz;
  15041. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15042. if (input == NULL)
  15043. return MEMORY_E;
  15044. XMEMCPY(input, output + recordHeaderSz, inputSz);
  15045. #ifdef WOLFSSL_DTLS
  15046. if (IsDtlsNotSctpMode(ssl) &&
  15047. (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
  15048. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15049. return ret;
  15050. }
  15051. #endif
  15052. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15053. handshake, 1, 0, 0, CUR_ORDER);
  15054. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15055. if (sendSz < 0)
  15056. return sendSz;
  15057. } else {
  15058. sendSz = i;
  15059. #ifdef WOLFSSL_DTLS
  15060. if (IsDtlsNotSctpMode(ssl)) {
  15061. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
  15062. return ret;
  15063. }
  15064. if (ssl->options.dtls)
  15065. DtlsSEQIncrement(ssl, CUR_ORDER);
  15066. #endif
  15067. ret = HashOutput(ssl, output, sendSz, 0);
  15068. if (ret != 0)
  15069. return ret;
  15070. }
  15071. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15072. if (ssl->hsInfoOn)
  15073. AddPacketName(ssl, "CertificateRequest");
  15074. if (ssl->toInfoOn)
  15075. AddPacketInfo(ssl, "CertificateRequest", handshake, output, sendSz,
  15076. WRITE_PROTO, ssl->heap);
  15077. #endif
  15078. ssl->buffers.outputBuffer.length += sendSz;
  15079. if (ssl->options.groupMessages)
  15080. ret = 0;
  15081. else
  15082. ret = SendBuffered(ssl);
  15083. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  15084. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  15085. return ret;
  15086. }
  15087. #ifndef NO_WOLFSSL_SERVER
  15088. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  15089. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  15090. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  15091. byte count)
  15092. {
  15093. byte* output = NULL;
  15094. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  15095. word32 length = ENUM_LEN;
  15096. int sendSz = 0;
  15097. int ret = 0;
  15098. int i = 0;
  15099. WOLFSSL_ENTER("BuildCertificateStatus");
  15100. switch (type) {
  15101. case WOLFSSL_CSR2_OCSP_MULTI:
  15102. length += OPAQUE24_LEN;
  15103. FALL_THROUGH; /* followed by */
  15104. case WOLFSSL_CSR2_OCSP:
  15105. for (i = 0; i < count; i++)
  15106. length += OPAQUE24_LEN + status[i].length;
  15107. break;
  15108. default:
  15109. return 0;
  15110. }
  15111. sendSz = idx + length;
  15112. if (ssl->keys.encryptionOn)
  15113. sendSz += MAX_MSG_EXTRA;
  15114. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  15115. output = ssl->buffers.outputBuffer.buffer +
  15116. ssl->buffers.outputBuffer.length;
  15117. AddHeaders(output, length, certificate_status, ssl);
  15118. output[idx++] = type;
  15119. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  15120. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  15121. idx += OPAQUE24_LEN;
  15122. }
  15123. for (i = 0; i < count; i++) {
  15124. c32to24(status[i].length, output + idx);
  15125. idx += OPAQUE24_LEN;
  15126. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  15127. idx += status[i].length;
  15128. }
  15129. if (IsEncryptionOn(ssl, 1)) {
  15130. byte* input;
  15131. int inputSz = idx; /* build msg adds rec hdr */
  15132. int recordHeaderSz = RECORD_HEADER_SZ;
  15133. if (ssl->options.dtls)
  15134. recordHeaderSz += DTLS_RECORD_EXTRA;
  15135. inputSz -= recordHeaderSz;
  15136. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15137. if (input == NULL)
  15138. return MEMORY_E;
  15139. XMEMCPY(input, output + recordHeaderSz, inputSz);
  15140. #ifdef WOLFSSL_DTLS
  15141. ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
  15142. #endif
  15143. if (ret == 0)
  15144. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  15145. handshake, 1, 0, 0, CUR_ORDER);
  15146. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  15147. if (sendSz < 0)
  15148. ret = sendSz;
  15149. }
  15150. else {
  15151. #ifdef WOLFSSL_DTLS
  15152. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  15153. ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
  15154. if (ret == 0 && ssl->options.dtls)
  15155. DtlsSEQIncrement(ssl, CUR_ORDER);
  15156. #endif
  15157. ret = HashOutput(ssl, output, sendSz, 0);
  15158. }
  15159. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15160. if (ret == 0 && ssl->hsInfoOn)
  15161. AddPacketName(ssl, "CertificateStatus");
  15162. if (ret == 0 && ssl->toInfoOn)
  15163. AddPacketInfo(ssl, "CertificateStatus", handshake, output, sendSz,
  15164. WRITE_PROTO, ssl->heap);
  15165. #endif
  15166. if (ret == 0) {
  15167. ssl->buffers.outputBuffer.length += sendSz;
  15168. if (!ssl->options.groupMessages)
  15169. ret = SendBuffered(ssl);
  15170. }
  15171. }
  15172. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  15173. return ret;
  15174. }
  15175. #endif
  15176. #endif /* NO_WOLFSSL_SERVER */
  15177. /* handle generation of certificate_status (22) */
  15178. int SendCertificateStatus(WOLFSSL* ssl)
  15179. {
  15180. int ret = 0;
  15181. byte status_type = 0;
  15182. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  15183. WOLFSSL_ENTER("SendCertificateStatus");
  15184. (void) ssl;
  15185. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  15186. status_type = ssl->status_request;
  15187. #endif
  15188. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  15189. status_type = status_type ? status_type : ssl->status_request_v2;
  15190. #endif
  15191. switch (status_type) {
  15192. #ifndef NO_WOLFSSL_SERVER
  15193. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  15194. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  15195. /* case WOLFSSL_CSR_OCSP: */
  15196. case WOLFSSL_CSR2_OCSP:
  15197. {
  15198. OcspRequest* request = ssl->ctx->certOcspRequest;
  15199. buffer response;
  15200. ret = CreateOcspResponse(ssl, &request, &response);
  15201. /* if a request was successfully created and not stored in
  15202. * ssl->ctx then free it */
  15203. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  15204. FreeOcspRequest(request);
  15205. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15206. request = NULL;
  15207. }
  15208. if (ret == 0 && response.buffer) {
  15209. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  15210. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15211. response.buffer = NULL;
  15212. }
  15213. break;
  15214. }
  15215. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  15216. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  15217. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  15218. case WOLFSSL_CSR2_OCSP_MULTI:
  15219. {
  15220. OcspRequest* request = ssl->ctx->certOcspRequest;
  15221. buffer responses[1 + MAX_CHAIN_DEPTH];
  15222. int i = 0;
  15223. XMEMSET(responses, 0, sizeof(responses));
  15224. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  15225. /* if a request was successfully created and not stored in
  15226. * ssl->ctx then free it */
  15227. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  15228. FreeOcspRequest(request);
  15229. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15230. request = NULL;
  15231. }
  15232. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  15233. || ssl->buffers.weOwnCertChain)) {
  15234. buffer der;
  15235. word32 idx = 0;
  15236. #ifdef WOLFSSL_SMALL_STACK
  15237. DecodedCert* cert;
  15238. #else
  15239. DecodedCert cert[1];
  15240. #endif
  15241. #ifdef WOLFSSL_SMALL_STACK
  15242. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  15243. DYNAMIC_TYPE_DCERT);
  15244. if (cert == NULL)
  15245. return MEMORY_E;
  15246. #endif
  15247. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  15248. DYNAMIC_TYPE_OCSP_REQUEST);
  15249. if (request == NULL) {
  15250. #ifdef WOLFSSL_SMALL_STACK
  15251. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  15252. #endif
  15253. return MEMORY_E;
  15254. }
  15255. while (idx + OPAQUE24_LEN < ssl->buffers.certChain->length) {
  15256. c24to32(ssl->buffers.certChain->buffer + idx, &der.length);
  15257. idx += OPAQUE24_LEN;
  15258. der.buffer = ssl->buffers.certChain->buffer + idx;
  15259. idx += der.length;
  15260. if (idx > ssl->buffers.certChain->length)
  15261. break;
  15262. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  15263. der.length);
  15264. if (ret == 0) {
  15265. request->ssl = ssl;
  15266. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling,
  15267. request, &responses[i + 1]);
  15268. /* Suppressing, not critical */
  15269. if (ret == OCSP_CERT_REVOKED ||
  15270. ret == OCSP_CERT_UNKNOWN ||
  15271. ret == OCSP_LOOKUP_FAIL) {
  15272. ret = 0;
  15273. }
  15274. i++;
  15275. FreeOcspRequest(request);
  15276. }
  15277. }
  15278. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  15279. #ifdef WOLFSSL_SMALL_STACK
  15280. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  15281. #endif
  15282. }
  15283. else {
  15284. while (ret == 0 &&
  15285. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  15286. request->ssl = ssl;
  15287. ret = CheckOcspRequest(ssl->ctx->cm->ocsp_stapling,
  15288. request, &responses[++i]);
  15289. /* Suppressing, not critical */
  15290. if (ret == OCSP_CERT_REVOKED ||
  15291. ret == OCSP_CERT_UNKNOWN ||
  15292. ret == OCSP_LOOKUP_FAIL) {
  15293. ret = 0;
  15294. }
  15295. }
  15296. }
  15297. if (responses[0].buffer) {
  15298. if (ret == 0) {
  15299. ret = BuildCertificateStatus(ssl, status_type, responses,
  15300. (byte)i + 1);
  15301. }
  15302. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  15303. if (responses[i].buffer) {
  15304. XFREE(responses[i].buffer, ssl->heap,
  15305. DYNAMIC_TYPE_OCSP_REQUEST);
  15306. }
  15307. }
  15308. }
  15309. break;
  15310. }
  15311. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  15312. #endif /* NO_WOLFSSL_SERVER */
  15313. default:
  15314. break;
  15315. }
  15316. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  15317. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  15318. return ret;
  15319. }
  15320. #endif /* !NO_CERTS */
  15321. #endif /* WOLFSSL_NO_TLS12 */
  15322. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  15323. /**
  15324. * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
  15325. */
  15326. int DtlsSCRKeysSet(WOLFSSL* ssl)
  15327. {
  15328. return ssl->secure_renegotiation &&
  15329. ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
  15330. }
  15331. /**
  15332. * ssl->keys contains the current cipher parameters only for epoch 1. For
  15333. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  15334. * cipher parameters. This function checks if the message currently being
  15335. * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  15336. */
  15337. int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
  15338. {
  15339. return DtlsSCRKeysSet(ssl) &&
  15340. ssl->keys.curEpoch ==
  15341. ssl->secure_renegotiation->tmp_keys.dtls_epoch;
  15342. }
  15343. /**
  15344. * ssl->keys contains the current cipher parameters only for epoch 1. For
  15345. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  15346. * cipher parameters. This function checks if the message currently being
  15347. * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  15348. */
  15349. int DtlsUseSCRKeys(WOLFSSL* ssl)
  15350. {
  15351. return DtlsSCRKeysSet(ssl) &&
  15352. ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
  15353. ssl->keys.dtls_epoch;
  15354. }
  15355. /**
  15356. * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
  15357. * then PREV_ORDER refers to the current epoch.
  15358. * */
  15359. int DtlsCheckOrder(WOLFSSL* ssl, int order)
  15360. {
  15361. if (order == PREV_ORDER && ssl->secure_renegotiation &&
  15362. ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
  15363. return CUR_ORDER;
  15364. }
  15365. else {
  15366. return order;
  15367. }
  15368. }
  15369. #endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
  15370. /* If secure renegotiation is disabled, this will always return false.
  15371. * Otherwise it checks to see if we are currently renegotiating. */
  15372. static WC_INLINE int IsSCR(WOLFSSL* ssl)
  15373. {
  15374. #ifndef HAVE_SECURE_RENEGOTIATION
  15375. (void)ssl;
  15376. #else /* HAVE_SECURE_RENEGOTIATION */
  15377. if (ssl->secure_renegotiation &&
  15378. ssl->secure_renegotiation->enabled &&
  15379. ssl->options.handShakeState != HANDSHAKE_DONE)
  15380. return 1;
  15381. #endif /* HAVE_SECURE_RENEGOTIATION */
  15382. return 0;
  15383. }
  15384. int SendData(WOLFSSL* ssl, const void* data, int sz)
  15385. {
  15386. int sent = 0, /* plainText size */
  15387. sendSz,
  15388. ret,
  15389. dtlsExtra = 0;
  15390. int groupMsgs = 0;
  15391. if (ssl->error == WANT_WRITE
  15392. #ifdef WOLFSSL_ASYNC_CRYPT
  15393. || ssl->error == WC_PENDING_E
  15394. #endif
  15395. ) {
  15396. ssl->error = 0;
  15397. }
  15398. /* don't allow write after decrypt or mac error */
  15399. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  15400. /* For DTLS allow these possible errors and allow the session
  15401. to continue despite them */
  15402. if (ssl->options.dtls) {
  15403. ssl->error = 0;
  15404. }
  15405. else {
  15406. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  15407. return WOLFSSL_FATAL_ERROR;
  15408. }
  15409. }
  15410. #ifdef WOLFSSL_EARLY_DATA
  15411. if (ssl->earlyData != no_early_data) {
  15412. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  15413. WOLFSSL_MSG("handshake complete, trying to send early data");
  15414. return BUILD_MSG_ERROR;
  15415. }
  15416. #ifdef WOLFSSL_EARLY_DATA_GROUP
  15417. groupMsgs = 1;
  15418. #endif
  15419. }
  15420. else
  15421. #endif
  15422. if (ssl->options.handShakeState != HANDSHAKE_DONE && !IsSCR(ssl)) {
  15423. int err;
  15424. WOLFSSL_MSG("handshake not complete, trying to finish");
  15425. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  15426. #ifdef WOLFSSL_ASYNC_CRYPT
  15427. /* if async would block return WANT_WRITE */
  15428. if (ssl->error == WC_PENDING_E) {
  15429. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  15430. }
  15431. #endif
  15432. return err;
  15433. }
  15434. }
  15435. /* last time system socket output buffer was full, try again to send */
  15436. if (!groupMsgs && ssl->buffers.outputBuffer.length > 0) {
  15437. WOLFSSL_MSG("output buffer was full, trying to send again");
  15438. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  15439. WOLFSSL_ERROR(ssl->error);
  15440. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  15441. ssl->options.isClosed)) {
  15442. ssl->error = SOCKET_PEER_CLOSED_E;
  15443. WOLFSSL_ERROR(ssl->error);
  15444. return 0; /* peer reset or closed */
  15445. }
  15446. return ssl->error;
  15447. }
  15448. else {
  15449. /* advance sent to previous sent + plain size just sent */
  15450. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  15451. WOLFSSL_MSG("sent write buffered data");
  15452. if (sent > sz) {
  15453. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  15454. return ssl->error = BAD_FUNC_ARG;
  15455. }
  15456. }
  15457. }
  15458. #ifdef WOLFSSL_DTLS
  15459. if (ssl->options.dtls) {
  15460. dtlsExtra = DTLS_RECORD_EXTRA;
  15461. }
  15462. #endif
  15463. for (;;) {
  15464. int len;
  15465. byte* out;
  15466. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  15467. int buffSz; /* may switch on comp */
  15468. int outputSz;
  15469. #ifdef HAVE_LIBZ
  15470. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  15471. #endif
  15472. if (sent == sz) break;
  15473. len = wolfSSL_GetMaxRecordSize(ssl, sz - sent);
  15474. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
  15475. if (ssl->options.dtls && (len < sz - sent)) {
  15476. ssl->error = DTLS_SIZE_ERROR;
  15477. WOLFSSL_ERROR(ssl->error);
  15478. return ssl->error;
  15479. }
  15480. #endif
  15481. buffSz = len;
  15482. /* check for available size */
  15483. outputSz = len + COMP_EXTRA + dtlsExtra + MAX_MSG_EXTRA;
  15484. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  15485. return ssl->error = ret;
  15486. /* get output buffer */
  15487. out = ssl->buffers.outputBuffer.buffer +
  15488. ssl->buffers.outputBuffer.length;
  15489. #ifdef HAVE_LIBZ
  15490. if (ssl->options.usingCompression) {
  15491. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  15492. if (buffSz < 0) {
  15493. return buffSz;
  15494. }
  15495. sendBuffer = comp;
  15496. }
  15497. #endif
  15498. if (!ssl->options.tls1_3) {
  15499. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  15500. application_data, 0, 0, 1, CUR_ORDER);
  15501. }
  15502. else {
  15503. #ifdef WOLFSSL_TLS13
  15504. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  15505. application_data, 0, 0, 1);
  15506. #else
  15507. sendSz = BUFFER_ERROR;
  15508. #endif
  15509. }
  15510. if (sendSz < 0) {
  15511. #ifdef WOLFSSL_ASYNC_CRYPT
  15512. if (sendSz == WC_PENDING_E)
  15513. ssl->error = sendSz;
  15514. #endif
  15515. return BUILD_MSG_ERROR;
  15516. }
  15517. ssl->buffers.outputBuffer.length += sendSz;
  15518. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  15519. WOLFSSL_ERROR(ssl->error);
  15520. /* store for next call if WANT_WRITE or user embedSend() that
  15521. doesn't present like WANT_WRITE */
  15522. ssl->buffers.plainSz = len;
  15523. ssl->buffers.prevSent = sent;
  15524. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  15525. ssl->options.isClosed)) {
  15526. ssl->error = SOCKET_PEER_CLOSED_E;
  15527. WOLFSSL_ERROR(ssl->error);
  15528. return 0; /* peer reset or closed */
  15529. }
  15530. return ssl->error;
  15531. }
  15532. sent += len;
  15533. /* only one message per attempt */
  15534. if (ssl->options.partialWrite == 1) {
  15535. WOLFSSL_MSG("Partial Write on, only sending one record");
  15536. break;
  15537. }
  15538. }
  15539. return sent;
  15540. }
  15541. /* process input data */
  15542. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  15543. {
  15544. int size;
  15545. WOLFSSL_ENTER("ReceiveData()");
  15546. /* reset error state */
  15547. if (ssl->error == WANT_READ) {
  15548. ssl->error = 0;
  15549. }
  15550. #ifdef WOLFSSL_DTLS
  15551. if (ssl->options.dtls) {
  15552. /* In DTLS mode, we forgive some errors and allow the session
  15553. * to continue despite them. */
  15554. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR)
  15555. ssl->error = 0;
  15556. }
  15557. #endif /* WOLFSSL_DTLS */
  15558. if (ssl->error != 0 && ssl->error != WANT_WRITE
  15559. #ifdef WOLFSSL_ASYNC_CRYPT
  15560. && ssl->error != WC_PENDING_E
  15561. #endif
  15562. ) {
  15563. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  15564. return ssl->error;
  15565. }
  15566. #ifdef WOLFSSL_EARLY_DATA
  15567. if (ssl->earlyData != no_early_data) {
  15568. }
  15569. else
  15570. #endif
  15571. if (ssl->options.handShakeState != HANDSHAKE_DONE) {
  15572. int err;
  15573. WOLFSSL_MSG("Handshake not complete, trying to finish");
  15574. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  15575. #ifdef WOLFSSL_ASYNC_CRYPT
  15576. /* if async would block return WANT_WRITE */
  15577. if (ssl->error == WC_PENDING_E) {
  15578. return WOLFSSL_CBIO_ERR_WANT_READ;
  15579. }
  15580. #endif
  15581. return err;
  15582. }
  15583. }
  15584. #ifdef HAVE_SECURE_RENEGOTIATION
  15585. startScr:
  15586. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  15587. int err;
  15588. WOLFSSL_MSG("Need to start scr, server requested");
  15589. if ( (err = wolfSSL_Rehandshake(ssl)) != WOLFSSL_SUCCESS)
  15590. return err;
  15591. ssl->secure_renegotiation->startScr = 0; /* only start once */
  15592. }
  15593. #endif
  15594. while (ssl->buffers.clearOutputBuffer.length == 0) {
  15595. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  15596. WOLFSSL_ERROR(ssl->error);
  15597. if (ssl->error == ZERO_RETURN) {
  15598. WOLFSSL_MSG("Zero return, no more data coming");
  15599. return 0; /* no more data coming */
  15600. }
  15601. if (ssl->error == SOCKET_ERROR_E) {
  15602. if (ssl->options.connReset || ssl->options.isClosed) {
  15603. WOLFSSL_MSG("Peer reset or closed, connection done");
  15604. ssl->error = SOCKET_PEER_CLOSED_E;
  15605. WOLFSSL_ERROR(ssl->error);
  15606. return 0; /* peer reset or closed */
  15607. }
  15608. }
  15609. return ssl->error;
  15610. }
  15611. #ifdef HAVE_SECURE_RENEGOTIATION
  15612. if (ssl->secure_renegotiation &&
  15613. ssl->secure_renegotiation->startScr) {
  15614. goto startScr;
  15615. }
  15616. #endif
  15617. }
  15618. if (sz < (int)ssl->buffers.clearOutputBuffer.length)
  15619. size = sz;
  15620. else
  15621. size = ssl->buffers.clearOutputBuffer.length;
  15622. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  15623. if (peek == 0) {
  15624. ssl->buffers.clearOutputBuffer.length -= size;
  15625. ssl->buffers.clearOutputBuffer.buffer += size;
  15626. }
  15627. if (ssl->buffers.clearOutputBuffer.length == 0 &&
  15628. ssl->buffers.inputBuffer.dynamicFlag)
  15629. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  15630. WOLFSSL_LEAVE("ReceiveData()", size);
  15631. return size;
  15632. }
  15633. /* send alert message */
  15634. int SendAlert(WOLFSSL* ssl, int severity, int type)
  15635. {
  15636. byte input[ALERT_SIZE];
  15637. byte *output;
  15638. int sendSz;
  15639. int ret;
  15640. int outputSz;
  15641. int dtlsExtra = 0;
  15642. WOLFSSL_ENTER("SendAlert");
  15643. #ifdef HAVE_WRITE_DUP
  15644. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  15645. int notifyErr = 0;
  15646. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  15647. if (type == close_notify) {
  15648. notifyErr = ZERO_RETURN;
  15649. } else if (severity == alert_fatal) {
  15650. notifyErr = FATAL_ERROR;
  15651. }
  15652. if (notifyErr != 0) {
  15653. return NotifyWriteSide(ssl, notifyErr);
  15654. }
  15655. return 0;
  15656. }
  15657. #endif
  15658. /* if sendalert is called again for nonblocking */
  15659. if (ssl->options.sendAlertState != 0) {
  15660. ret = SendBuffered(ssl);
  15661. if (ret == 0)
  15662. ssl->options.sendAlertState = 0;
  15663. return ret;
  15664. }
  15665. #ifdef OPENSSL_EXTRA
  15666. if (ssl->CBIS != NULL) {
  15667. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  15668. }
  15669. #endif
  15670. #ifdef WOLFSSL_DTLS
  15671. if (ssl->options.dtls)
  15672. dtlsExtra = DTLS_RECORD_EXTRA;
  15673. #endif
  15674. /* check for available size */
  15675. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  15676. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  15677. return ret;
  15678. /* Check output buffer */
  15679. if (ssl->buffers.outputBuffer.buffer == NULL)
  15680. return BUFFER_E;
  15681. /* get output buffer */
  15682. output = ssl->buffers.outputBuffer.buffer +
  15683. ssl->buffers.outputBuffer.length;
  15684. input[0] = (byte)severity;
  15685. input[1] = (byte)type;
  15686. ssl->alert_history.last_tx.code = type;
  15687. ssl->alert_history.last_tx.level = severity;
  15688. if (severity == alert_fatal) {
  15689. ssl->options.isClosed = 1; /* Don't send close_notify */
  15690. }
  15691. /* send encrypted alert if encryption is on - can be a rehandshake over
  15692. * an existing encrypted channel.
  15693. * TLS 1.3 encrypts handshake packets after the ServerHello
  15694. */
  15695. if (IsEncryptionOn(ssl, 1)) {
  15696. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  15697. 0, 0, 0, CUR_ORDER);
  15698. }
  15699. else {
  15700. AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
  15701. output += RECORD_HEADER_SZ;
  15702. #ifdef WOLFSSL_DTLS
  15703. if (ssl->options.dtls)
  15704. output += DTLS_RECORD_EXTRA;
  15705. #endif
  15706. XMEMCPY(output, input, ALERT_SIZE);
  15707. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  15708. #ifdef WOLFSSL_DTLS
  15709. if (ssl->options.dtls)
  15710. sendSz += DTLS_RECORD_EXTRA;
  15711. #endif
  15712. }
  15713. if (sendSz < 0)
  15714. return BUILD_MSG_ERROR;
  15715. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15716. if (ssl->hsInfoOn)
  15717. AddPacketName(ssl, "Alert");
  15718. if (ssl->toInfoOn)
  15719. AddPacketInfo(ssl, "Alert", alert, output, sendSz, WRITE_PROTO,
  15720. ssl->heap);
  15721. #endif
  15722. ssl->buffers.outputBuffer.length += sendSz;
  15723. ssl->options.sendAlertState = 1;
  15724. ret = SendBuffered(ssl);
  15725. WOLFSSL_LEAVE("SendAlert", ret);
  15726. return ret;
  15727. }
  15728. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  15729. {
  15730. #ifdef NO_ERROR_STRINGS
  15731. (void)e;
  15732. return "no support for error strings built in";
  15733. #else
  15734. int error = (int)e;
  15735. /* pass to wolfCrypt */
  15736. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  15737. return wc_GetErrorString(error);
  15738. }
  15739. switch (error) {
  15740. #ifdef WOLFSSL_WPAS
  15741. case 0 :
  15742. return "ok";
  15743. #endif
  15744. case UNSUPPORTED_SUITE :
  15745. return "unsupported cipher suite";
  15746. case INPUT_CASE_ERROR :
  15747. return "input state error";
  15748. case PREFIX_ERROR :
  15749. return "bad index to key rounds";
  15750. case MEMORY_ERROR :
  15751. return "out of memory";
  15752. case VERIFY_FINISHED_ERROR :
  15753. return "verify problem on finished";
  15754. case VERIFY_MAC_ERROR :
  15755. return "verify mac problem";
  15756. case PARSE_ERROR :
  15757. return "parse error on header";
  15758. case SIDE_ERROR :
  15759. return "wrong client/server type";
  15760. case NO_PEER_CERT :
  15761. return "peer didn't send cert";
  15762. case UNKNOWN_HANDSHAKE_TYPE :
  15763. return "weird handshake type";
  15764. case SOCKET_ERROR_E :
  15765. return "error state on socket";
  15766. case SOCKET_NODATA :
  15767. return "expected data, not there";
  15768. case INCOMPLETE_DATA :
  15769. return "don't have enough data to complete task";
  15770. case UNKNOWN_RECORD_TYPE :
  15771. return "unknown type in record hdr";
  15772. case DECRYPT_ERROR :
  15773. return "error during decryption";
  15774. case FATAL_ERROR :
  15775. return "received alert fatal error";
  15776. case ENCRYPT_ERROR :
  15777. return "error during encryption";
  15778. case FREAD_ERROR :
  15779. return "fread problem";
  15780. case NO_PEER_KEY :
  15781. return "need peer's key";
  15782. case NO_PRIVATE_KEY :
  15783. return "need the private key";
  15784. case NO_DH_PARAMS :
  15785. return "server missing DH params";
  15786. case RSA_PRIVATE_ERROR :
  15787. return "error during rsa priv op";
  15788. case MATCH_SUITE_ERROR :
  15789. return "can't match cipher suite";
  15790. case COMPRESSION_ERROR :
  15791. return "compression mismatch error";
  15792. case BUILD_MSG_ERROR :
  15793. return "build message failure";
  15794. case BAD_HELLO :
  15795. return "client hello malformed";
  15796. case DOMAIN_NAME_MISMATCH :
  15797. return "peer subject name mismatch";
  15798. case IPADDR_MISMATCH :
  15799. return "peer ip address mismatch";
  15800. case WANT_READ :
  15801. case WOLFSSL_ERROR_WANT_READ :
  15802. return "non-blocking socket wants data to be read";
  15803. case NOT_READY_ERROR :
  15804. return "handshake layer not ready yet, complete first";
  15805. case VERSION_ERROR :
  15806. return "record layer version error";
  15807. case WANT_WRITE :
  15808. case WOLFSSL_ERROR_WANT_WRITE :
  15809. return "non-blocking socket write buffer full";
  15810. case BUFFER_ERROR :
  15811. return "malformed buffer input error";
  15812. case VERIFY_CERT_ERROR :
  15813. return "verify problem on certificate";
  15814. case VERIFY_SIGN_ERROR :
  15815. return "verify problem based on signature";
  15816. case CLIENT_ID_ERROR :
  15817. return "psk client identity error";
  15818. case SERVER_HINT_ERROR:
  15819. return "psk server hint error";
  15820. case PSK_KEY_ERROR:
  15821. return "psk key callback error";
  15822. case NTRU_KEY_ERROR:
  15823. return "NTRU key error";
  15824. case NTRU_DRBG_ERROR:
  15825. return "NTRU drbg error";
  15826. case NTRU_ENCRYPT_ERROR:
  15827. return "NTRU encrypt error";
  15828. case NTRU_DECRYPT_ERROR:
  15829. return "NTRU decrypt error";
  15830. case GETTIME_ERROR:
  15831. return "gettimeofday() error";
  15832. case GETITIMER_ERROR:
  15833. return "getitimer() error";
  15834. case SIGACT_ERROR:
  15835. return "sigaction() error";
  15836. case SETITIMER_ERROR:
  15837. return "setitimer() error";
  15838. case LENGTH_ERROR:
  15839. return "record layer length error";
  15840. case PEER_KEY_ERROR:
  15841. return "cant decode peer key";
  15842. case ZERO_RETURN:
  15843. case WOLFSSL_ERROR_ZERO_RETURN:
  15844. return "peer sent close notify alert";
  15845. case ECC_CURVETYPE_ERROR:
  15846. return "Bad ECC Curve Type or unsupported";
  15847. case ECC_CURVE_ERROR:
  15848. return "Bad ECC Curve or unsupported";
  15849. case ECC_PEERKEY_ERROR:
  15850. return "Bad ECC Peer Key";
  15851. case ECC_MAKEKEY_ERROR:
  15852. return "ECC Make Key failure";
  15853. case ECC_EXPORT_ERROR:
  15854. return "ECC Export Key failure";
  15855. case ECC_SHARED_ERROR:
  15856. return "ECC DHE shared failure";
  15857. case NOT_CA_ERROR:
  15858. return "Not a CA by basic constraint error";
  15859. case HTTP_TIMEOUT:
  15860. return "HTTP timeout for OCSP or CRL req";
  15861. case BAD_CERT_MANAGER_ERROR:
  15862. return "Bad Cert Manager error";
  15863. case OCSP_CERT_REVOKED:
  15864. return "OCSP Cert revoked";
  15865. case CRL_CERT_REVOKED:
  15866. return "CRL Cert revoked";
  15867. case CRL_MISSING:
  15868. return "CRL missing, not loaded";
  15869. case MONITOR_SETUP_E:
  15870. return "CRL monitor setup error";
  15871. case THREAD_CREATE_E:
  15872. return "Thread creation problem";
  15873. case OCSP_NEED_URL:
  15874. return "OCSP need URL";
  15875. case OCSP_CERT_UNKNOWN:
  15876. return "OCSP Cert unknown";
  15877. case OCSP_LOOKUP_FAIL:
  15878. return "OCSP Responder lookup fail";
  15879. case MAX_CHAIN_ERROR:
  15880. return "Maximum Chain Depth Exceeded";
  15881. case COOKIE_ERROR:
  15882. return "DTLS Cookie Error";
  15883. case SEQUENCE_ERROR:
  15884. return "DTLS Sequence Error";
  15885. case SUITES_ERROR:
  15886. return "Suites Pointer Error";
  15887. case OUT_OF_ORDER_E:
  15888. return "Out of order message, fatal";
  15889. case BAD_KEA_TYPE_E:
  15890. return "Bad KEA type found";
  15891. case SANITY_CIPHER_E:
  15892. return "Sanity check on ciphertext failed";
  15893. case RECV_OVERFLOW_E:
  15894. return "Receive callback returned more than requested";
  15895. case GEN_COOKIE_E:
  15896. return "Generate Cookie Error";
  15897. case NO_PEER_VERIFY:
  15898. return "Need peer certificate verify Error";
  15899. case FWRITE_ERROR:
  15900. return "fwrite Error";
  15901. case CACHE_MATCH_ERROR:
  15902. return "Cache restore header match Error";
  15903. case UNKNOWN_SNI_HOST_NAME_E:
  15904. return "Unrecognized host name Error";
  15905. case UNKNOWN_MAX_FRAG_LEN_E:
  15906. return "Unrecognized max frag len Error";
  15907. case KEYUSE_SIGNATURE_E:
  15908. return "Key Use digitalSignature not set Error";
  15909. case KEYUSE_ENCIPHER_E:
  15910. return "Key Use keyEncipherment not set Error";
  15911. case EXTKEYUSE_AUTH_E:
  15912. return "Ext Key Use server/client auth not set Error";
  15913. case SEND_OOB_READ_E:
  15914. return "Send Callback Out of Bounds Read Error";
  15915. case SECURE_RENEGOTIATION_E:
  15916. return "Invalid Renegotiation Error";
  15917. case SESSION_TICKET_LEN_E:
  15918. return "Session Ticket Too Long Error";
  15919. case SESSION_TICKET_EXPECT_E:
  15920. return "Session Ticket Error";
  15921. case SESSION_SECRET_CB_E:
  15922. return "Session Secret Callback Error";
  15923. case NO_CHANGE_CIPHER_E:
  15924. return "Finished received from peer before Change Cipher Error";
  15925. case SANITY_MSG_E:
  15926. return "Sanity Check on message order Error";
  15927. case DUPLICATE_MSG_E:
  15928. return "Duplicate HandShake message Error";
  15929. case SNI_UNSUPPORTED:
  15930. return "Protocol version does not support SNI Error";
  15931. case SOCKET_PEER_CLOSED_E:
  15932. return "Peer closed underlying transport Error";
  15933. case BAD_TICKET_KEY_CB_SZ:
  15934. return "Bad user session ticket key callback Size Error";
  15935. case BAD_TICKET_MSG_SZ:
  15936. return "Bad session ticket message Size Error";
  15937. case BAD_TICKET_ENCRYPT:
  15938. return "Bad user ticket callback encrypt Error";
  15939. case DH_KEY_SIZE_E:
  15940. return "DH key too small Error";
  15941. case SNI_ABSENT_ERROR:
  15942. return "No Server Name Indication extension Error";
  15943. case RSA_SIGN_FAULT:
  15944. return "RSA Signature Fault Error";
  15945. case HANDSHAKE_SIZE_ERROR:
  15946. return "Handshake message too large Error";
  15947. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  15948. return "Unrecognized protocol name Error";
  15949. case BAD_CERTIFICATE_STATUS_ERROR:
  15950. return "Bad Certificate Status Message Error";
  15951. case OCSP_INVALID_STATUS:
  15952. return "Invalid OCSP Status Error";
  15953. case OCSP_WANT_READ:
  15954. return "OCSP nonblock wants read";
  15955. case RSA_KEY_SIZE_E:
  15956. return "RSA key too small";
  15957. case ECC_KEY_SIZE_E:
  15958. return "ECC key too small";
  15959. case DTLS_EXPORT_VER_E:
  15960. return "Version needs updated after code change or version mismatch";
  15961. case INPUT_SIZE_E:
  15962. return "Input size too large Error";
  15963. case CTX_INIT_MUTEX_E:
  15964. return "Initialize ctx mutex error";
  15965. case EXT_MASTER_SECRET_NEEDED_E:
  15966. return "Extended Master Secret must be enabled to resume EMS session";
  15967. case DTLS_POOL_SZ_E:
  15968. return "Maximum DTLS pool size exceeded";
  15969. case DECODE_E:
  15970. return "Decode handshake message error";
  15971. case WRITE_DUP_READ_E:
  15972. return "Write dup write side can't read error";
  15973. case WRITE_DUP_WRITE_E:
  15974. return "Write dup read side can't write error";
  15975. case INVALID_CERT_CTX_E:
  15976. return "Certificate context does not match request or not empty";
  15977. case BAD_KEY_SHARE_DATA:
  15978. return "The Key Share data contains group that wasn't in Client Hello";
  15979. case MISSING_HANDSHAKE_DATA:
  15980. return "The handshake message is missing required data";
  15981. case BAD_BINDER:
  15982. return "Binder value does not match value server calculated";
  15983. case EXT_NOT_ALLOWED:
  15984. return "Extension type not allowed in handshake message type";
  15985. case INVALID_PARAMETER:
  15986. return "The security parameter is invalid";
  15987. case UNSUPPORTED_EXTENSION:
  15988. return "TLS Extension not requested by the client";
  15989. case PRF_MISSING:
  15990. return "Pseudo-random function is not enabled";
  15991. case KEY_SHARE_ERROR:
  15992. return "Key share extension did not contain a valid named group";
  15993. case POST_HAND_AUTH_ERROR:
  15994. return "Client will not do post handshake authentication";
  15995. case HRR_COOKIE_ERROR:
  15996. return "Cookie does not match one sent in HelloRetryRequest";
  15997. case MCAST_HIGHWATER_CB_E:
  15998. return "Multicast highwater callback returned error";
  15999. case ALERT_COUNT_E:
  16000. return "Alert Count exceeded error";
  16001. case EXT_MISSING:
  16002. return "Required TLS extension missing";
  16003. case DTLS_RETX_OVER_TX:
  16004. return "DTLS interrupting flight transmit with retransmit";
  16005. case DH_PARAMS_NOT_FFDHE_E:
  16006. return "Server DH parameters were not from the FFDHE set as required";
  16007. case TCA_INVALID_ID_TYPE:
  16008. return "TLS Extension Trusted CA ID type invalid";
  16009. case TCA_ABSENT_ERROR:
  16010. return "TLS Extension Trusted CA ID response absent";
  16011. case TSIP_MAC_DIGSZ_E:
  16012. return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
  16013. case CLIENT_CERT_CB_ERROR:
  16014. return "Error importing client cert or key from callback";
  16015. case SSL_SHUTDOWN_ALREADY_DONE_E:
  16016. return "Shutdown has already occurred";
  16017. case TLS13_SECRET_CB_E:
  16018. return "TLS1.3 Secret Callback Error";
  16019. case DTLS_SIZE_ERROR:
  16020. return "DTLS trying to send too much in single datagram error";
  16021. case NO_CERT_ERROR:
  16022. return "TLS1.3 No Certificate Set Error";
  16023. default :
  16024. return "unknown error number";
  16025. }
  16026. #endif /* NO_ERROR_STRINGS */
  16027. }
  16028. void SetErrorString(int error, char* str)
  16029. {
  16030. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  16031. str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
  16032. }
  16033. #ifndef NO_ERROR_STRINGS
  16034. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16035. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u)}
  16036. #else
  16037. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w)}
  16038. #endif
  16039. #else
  16040. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  16041. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u)}
  16042. #else
  16043. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w)}
  16044. #endif
  16045. #endif
  16046. static const CipherSuiteInfo cipher_names[] =
  16047. {
  16048. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  16049. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  16050. #endif
  16051. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  16052. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
  16053. #endif
  16054. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  16055. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  16056. #endif
  16057. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  16058. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  16059. #endif
  16060. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  16061. SUITE_INFO("TLS13-AES128-CCM-8-SHA256","TLS_AES_128_CCM_8_SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  16062. #endif
  16063. #ifdef BUILD_TLS_SHA256_SHA256
  16064. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  16065. #endif
  16066. #ifdef BUILD_TLS_SHA384_SHA384
  16067. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
  16068. #endif
  16069. #ifndef WOLFSSL_NO_TLS12
  16070. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  16071. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16072. #endif
  16073. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  16074. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  16075. #endif
  16076. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  16077. SUITE_INFO("DES-CBC3-SHA","SSL_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16078. #endif
  16079. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  16080. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16081. #endif
  16082. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  16083. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16084. #endif
  16085. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  16086. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  16087. #endif
  16088. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  16089. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16090. #endif
  16091. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  16092. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  16093. #endif
  16094. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  16095. SUITE_INFO("DHE-RSA-AES128-SHA","TLS_DHE_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16096. #endif
  16097. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  16098. SUITE_INFO("DHE-RSA-AES256-SHA","TLS_DHE_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16099. #endif
  16100. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  16101. SUITE_INFO("DHE-PSK-AES256-GCM-SHA384","TLS_DHE_PSK_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_256_GCM_SHA384,TLSv1_2_MINOR,SSLv3_MAJOR),
  16102. #endif
  16103. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  16104. SUITE_INFO("DHE-PSK-AES128-GCM-SHA256","TLS_DHE_PSK_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  16105. #endif
  16106. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  16107. SUITE_INFO("PSK-AES256-GCM-SHA384","TLS_PSK_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_PSK_WITH_AES_256_GCM_SHA384,TLSv1_2_MINOR,SSLv3_MAJOR),
  16108. #endif
  16109. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  16110. SUITE_INFO("PSK-AES128-GCM-SHA256","TLS_PSK_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_PSK_WITH_AES_128_GCM_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  16111. #endif
  16112. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  16113. SUITE_INFO("DHE-PSK-AES256-CBC-SHA384","TLS_DHE_PSK_WITH_AES_256_CBC_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_256_CBC_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  16114. #endif
  16115. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  16116. SUITE_INFO("DHE-PSK-AES128-CBC-SHA256","TLS_DHE_PSK_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16117. #endif
  16118. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  16119. SUITE_INFO("PSK-AES256-CBC-SHA384","TLS_PSK_WITH_AES_256_CBC_SHA384",CIPHER_BYTE,TLS_PSK_WITH_AES_256_CBC_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  16120. #endif
  16121. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  16122. SUITE_INFO("PSK-AES128-CBC-SHA256","TLS_PSK_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_PSK_WITH_AES_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16123. #endif
  16124. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  16125. SUITE_INFO("PSK-AES128-CBC-SHA","TLS_PSK_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_PSK_WITH_AES_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16126. #endif
  16127. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  16128. SUITE_INFO("PSK-AES256-CBC-SHA","TLS_PSK_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_PSK_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16129. #endif
  16130. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  16131. SUITE_INFO("DHE-PSK-AES128-CCM","TLS_DHE_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_DHE_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  16132. #endif
  16133. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  16134. SUITE_INFO("DHE-PSK-AES256-CCM","TLS_DHE_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_DHE_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  16135. #endif
  16136. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  16137. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  16138. #endif
  16139. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  16140. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  16141. #endif
  16142. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  16143. SUITE_INFO("PSK-AES128-CCM-8","TLS_PSK_WITH_AES_128_CCM_8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR),
  16144. #endif
  16145. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  16146. SUITE_INFO("PSK-AES256-CCM-8","TLS_PSK_WITH_AES_256_CCM_8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR),
  16147. #endif
  16148. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  16149. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  16150. #endif
  16151. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  16152. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16153. #endif
  16154. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  16155. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  16156. #endif
  16157. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  16158. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16159. #endif
  16160. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  16161. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16162. #endif
  16163. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  16164. SUITE_INFO("HC128-MD5","TLS_RSA_WITH_HC_128_MD5",CIPHER_BYTE,TLS_RSA_WITH_HC_128_MD5,TLSv1_MINOR,SSLv3_MAJOR),
  16165. #endif
  16166. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  16167. SUITE_INFO("HC128-SHA","TLS_RSA_WITH_HC_128_SHA",CIPHER_BYTE,TLS_RSA_WITH_HC_128_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16168. #endif
  16169. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  16170. SUITE_INFO("RABBIT-SHA","TLS_RSA_WITH_RABBIT_SHA",CIPHER_BYTE,TLS_RSA_WITH_RABBIT_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16171. #endif
  16172. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  16173. SUITE_INFO("NTRU-RC4-SHA","TLS_NTRU_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16174. #endif
  16175. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  16176. SUITE_INFO("NTRU-DES-CBC3-SHA","TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16177. #endif
  16178. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  16179. SUITE_INFO("NTRU-AES128-SHA","TLS_NTRU_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16180. #endif
  16181. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  16182. SUITE_INFO("NTRU-AES256-SHA","TLS_NTRU_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_NTRU_RSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16183. #endif
  16184. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  16185. SUITE_INFO("AES128-CCM-8","TLS_RSA_WITH_AES_128_CCM_8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
  16186. #endif
  16187. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  16188. SUITE_INFO("AES256-CCM-8","TLS_RSA_WITH_AES_256_CCM_8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
  16189. #endif
  16190. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  16191. SUITE_INFO("ECDHE-ECDSA-AES128-CCM","TLS_ECDHE_ECDSA_WITH_AES_128_CCM",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM, TLSv1_2_MINOR, SSLv3_MAJOR),
  16192. #endif
  16193. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  16194. SUITE_INFO("ECDHE-ECDSA-AES128-CCM-8","TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
  16195. #endif
  16196. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  16197. SUITE_INFO("ECDHE-ECDSA-AES256-CCM-8","TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
  16198. #endif
  16199. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  16200. SUITE_INFO("ECDHE-RSA-AES128-SHA","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16201. #endif
  16202. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  16203. SUITE_INFO("ECDHE-RSA-AES256-SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16204. #endif
  16205. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  16206. SUITE_INFO("ECDHE-ECDSA-AES128-SHA","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16207. #endif
  16208. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  16209. SUITE_INFO("ECDHE-ECDSA-AES256-SHA","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16210. #endif
  16211. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  16212. SUITE_INFO("ECDHE-RSA-RC4-SHA","TLS_ECDHE_RSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16213. #endif
  16214. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  16215. SUITE_INFO("ECDHE-RSA-DES-CBC3-SHA","TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16216. #endif
  16217. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  16218. SUITE_INFO("ECDHE-ECDSA-RC4-SHA","TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16219. #endif
  16220. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  16221. SUITE_INFO("ECDHE-ECDSA-DES-CBC3-SHA","TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16222. #endif
  16223. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  16224. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
  16225. #endif
  16226. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  16227. SUITE_INFO("AES256-SHA256","TLS_RSA_WITH_AES_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16228. #endif
  16229. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  16230. SUITE_INFO("DHE-RSA-AES128-SHA256","TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16231. #endif
  16232. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  16233. SUITE_INFO("DHE-RSA-AES256-SHA256","TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16234. #endif
  16235. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  16236. SUITE_INFO("ECDH-RSA-AES128-SHA","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16237. #endif
  16238. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  16239. SUITE_INFO("ECDH-RSA-AES256-SHA","TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16240. #endif
  16241. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  16242. SUITE_INFO("ECDH-ECDSA-AES128-SHA","TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16243. #endif
  16244. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  16245. SUITE_INFO("ECDH-ECDSA-AES256-SHA","TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16246. #endif
  16247. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  16248. SUITE_INFO("ECDH-RSA-RC4-SHA","TLS_ECDH_RSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16249. #endif
  16250. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  16251. SUITE_INFO("ECDH-RSA-DES-CBC3-SHA","TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16252. #endif
  16253. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  16254. SUITE_INFO("ECDH-ECDSA-RC4-SHA","TLS_ECDH_ECDSA_WITH_RC4_128_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_RC4_128_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16255. #endif
  16256. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  16257. SUITE_INFO("ECDH-ECDSA-DES-CBC3-SHA","TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",ECC_BYTE,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16258. #endif
  16259. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  16260. SUITE_INFO("AES128-GCM-SHA256","TLS_RSA_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16261. #endif
  16262. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  16263. SUITE_INFO("AES256-GCM-SHA384","TLS_RSA_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16264. #endif
  16265. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  16266. SUITE_INFO("DHE-RSA-AES128-GCM-SHA256","TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16267. #endif
  16268. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  16269. SUITE_INFO("DHE-RSA-AES256-GCM-SHA384","TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16270. #endif
  16271. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  16272. SUITE_INFO("ECDHE-RSA-AES128-GCM-SHA256","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16273. #endif
  16274. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  16275. SUITE_INFO("ECDHE-RSA-AES256-GCM-SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16276. #endif
  16277. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  16278. SUITE_INFO("ECDHE-ECDSA-AES128-GCM-SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16279. #endif
  16280. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  16281. SUITE_INFO("ECDHE-ECDSA-AES256-GCM-SHA384","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16282. #endif
  16283. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  16284. SUITE_INFO("ECDH-RSA-AES128-GCM-SHA256","TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16285. #endif
  16286. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  16287. SUITE_INFO("ECDH-RSA-AES256-GCM-SHA384","TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16288. #endif
  16289. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  16290. SUITE_INFO("ECDH-ECDSA-AES128-GCM-SHA256","TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16291. #endif
  16292. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  16293. SUITE_INFO("ECDH-ECDSA-AES256-GCM-SHA384","TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16294. #endif
  16295. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  16296. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16297. #endif
  16298. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  16299. SUITE_INFO("DHE-RSA-CAMELLIA128-SHA","TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16300. #endif
  16301. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  16302. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16303. #endif
  16304. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  16305. SUITE_INFO("DHE-RSA-CAMELLIA256-SHA","TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  16306. #endif
  16307. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  16308. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16309. #endif
  16310. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  16311. SUITE_INFO("DHE-RSA-CAMELLIA128-SHA256","TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16312. #endif
  16313. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  16314. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16315. #endif
  16316. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  16317. SUITE_INFO("DHE-RSA-CAMELLIA256-SHA256","TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16318. #endif
  16319. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  16320. SUITE_INFO("ECDHE-RSA-AES128-SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16321. #endif
  16322. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  16323. SUITE_INFO("ECDHE-ECDSA-AES128-SHA256","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16324. #endif
  16325. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  16326. SUITE_INFO("ECDH-RSA-AES128-SHA256","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16327. #endif
  16328. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  16329. SUITE_INFO("ECDH-ECDSA-AES128-SHA256","TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16330. #endif
  16331. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  16332. SUITE_INFO("ECDHE-RSA-AES256-SHA384","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16333. #endif
  16334. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  16335. SUITE_INFO("ECDHE-ECDSA-AES256-SHA384","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16336. #endif
  16337. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  16338. SUITE_INFO("ECDH-RSA-AES256-SHA384","TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16339. #endif
  16340. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  16341. SUITE_INFO("ECDH-ECDSA-AES256-SHA384","TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",ECC_BYTE,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16342. #endif
  16343. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  16344. SUITE_INFO("ECDHE-RSA-CHACHA20-POLY1305","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16345. #endif
  16346. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  16347. SUITE_INFO("ECDHE-ECDSA-CHACHA20-POLY1305","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16348. #endif
  16349. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  16350. SUITE_INFO("DHE-RSA-CHACHA20-POLY1305","TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16351. #endif
  16352. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  16353. SUITE_INFO("ECDHE-RSA-CHACHA20-POLY1305-OLD","TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16354. #endif
  16355. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  16356. SUITE_INFO("ECDHE-ECDSA-CHACHA20-POLY1305-OLD","TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16357. #endif
  16358. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  16359. SUITE_INFO("DHE-RSA-CHACHA20-POLY1305-OLD","TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  16360. #endif
  16361. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  16362. SUITE_INFO("ADH-AES128-SHA","TLS_DH_anon_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_DH_anon_WITH_AES_128_CBC_SHA, TLSv1_2_MINOR, SSLv3_MAJOR),
  16363. #endif
  16364. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  16365. SUITE_INFO("ADH-AES256-GCM-SHA384","TLS_DH_anon_WITH_AES_256_GCM_SHA384",CIPHER_BYTE,TLS_DH_anon_WITH_AES_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  16366. #endif
  16367. #ifdef BUILD_TLS_QSH
  16368. SUITE_INFO("QSH","TLS_QSH",QSH_BYTE,TLS_QSH, TLSv1_MINOR, SSLv3_MAJOR),
  16369. #endif
  16370. #ifdef HAVE_RENEGOTIATION_INDICATION
  16371. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
  16372. #endif
  16373. #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA
  16374. SUITE_INFO("IDEA-CBC-SHA","SSL_RSA_WITH_IDEA_CBC_SHA",CIPHER_BYTE,SSL_RSA_WITH_IDEA_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  16375. #endif
  16376. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  16377. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16378. #endif
  16379. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  16380. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16381. #endif
  16382. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  16383. SUITE_INFO("ECDHE-PSK-AES128-CBC-SHA256","TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  16384. #endif
  16385. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  16386. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  16387. #endif
  16388. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  16389. SUITE_INFO("ECDHE-PSK-CHACHA20-POLY1305","TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  16390. #endif
  16391. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  16392. SUITE_INFO("DHE-PSK-CHACHA20-POLY1305","TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  16393. #endif
  16394. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  16395. SUITE_INFO("EDH-RSA-DES-CBC3-SHA","TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  16396. #endif
  16397. #ifdef BUILD_WDM_WITH_NULL_SHA256
  16398. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
  16399. #endif
  16400. #endif /* WOLFSSL_NO_TLS12 */
  16401. };
  16402. /* returns the cipher_names array */
  16403. const CipherSuiteInfo* GetCipherNames(void)
  16404. {
  16405. return cipher_names;
  16406. }
  16407. /* returns the number of elements in the cipher_names array */
  16408. int GetCipherNamesSize(void)
  16409. {
  16410. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  16411. }
  16412. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  16413. {
  16414. int i;
  16415. const char* nameInternal = "None";
  16416. for (i = 0; i < GetCipherNamesSize(); i++) {
  16417. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  16418. (cipher_names[i].cipherSuite == cipherSuite)) {
  16419. nameInternal = cipher_names[i].name;
  16420. break;
  16421. }
  16422. }
  16423. return nameInternal;
  16424. }
  16425. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  16426. const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
  16427. const char* keaStr = NULL;
  16428. const char *n0,*n1,*n2,*n3,*n4;
  16429. n0 = n[0];
  16430. n1 = n[1];
  16431. n2 = n[2];
  16432. n3 = n[3];
  16433. n4 = n[4];
  16434. if (XSTRNCMP(n0,"ECDHE",5) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  16435. keaStr = "ECDHEPSK";
  16436. else if (XSTRNCMP(n0,"ECDH",4) == 0)
  16437. keaStr = "ECDH";
  16438. else if (XSTRNCMP(n0,"DHE",3) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  16439. keaStr = "DHEPSK";
  16440. else if (XSTRNCMP(n0,"DHE",3) == 0)
  16441. keaStr = "DH";
  16442. else if (XSTRNCMP(n0,"RSA",3) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
  16443. keaStr = "RSAPSK";
  16444. else if (XSTRNCMP(n0,"SRP",3) == 0)
  16445. keaStr = "SRP";
  16446. else if (XSTRNCMP(n0,"PSK",3) == 0)
  16447. keaStr = "PSK";
  16448. else if (XSTRNCMP(n0,"EDH",3) == 0)
  16449. keaStr = "EDH";
  16450. else if ((XSTRNCMP(n1,"SHA",3) == 0) || (XSTRNCMP(n2,"SHA",3) == 0) ||
  16451. (XSTRNCMP(n3,"SHA",3) == 0) || (XSTRNCMP(n4,"SHA",3) == 0) ||
  16452. (XSTRNCMP(n2,"RSA",3) == 0) || (XSTRNCMP(n0,"AES128",6) == 0) ||
  16453. (XSTRNCMP(n0,"AES256",6) == 0) || (XSTRNCMP(n1,"MD5",3) == 0))
  16454. keaStr = "RSA";
  16455. else
  16456. keaStr = "unknown";
  16457. return keaStr;
  16458. }
  16459. const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
  16460. const char* authStr = NULL;
  16461. const char *n0,*n1,*n2;
  16462. n0 = n[0];
  16463. n1 = n[1];
  16464. n2 = n[2];
  16465. if ((XSTRNCMP(n0,"AES128",6) == 0) || (XSTRNCMP(n0,"AES256",6) == 0) ||
  16466. ((XSTRNCMP(n0,"TLS13",5) == 0) && ((XSTRNCMP(n1,"AES128",6) == 0) ||
  16467. (XSTRNCMP(n1,"AES256",6) == 0) || (XSTRNCMP(n1,"CHACHA20",8) == 0))) ||
  16468. (XSTRNCMP(n0,"RSA",3) == 0) || (XSTRNCMP(n1,"RSA",3) == 0) ||
  16469. (XSTRNCMP(n1,"SHA",3) == 0) || (XSTRNCMP(n2,"SHA",3) == 0) ||
  16470. (XSTRNCMP(n1,"MD5",3) == 0))
  16471. authStr = "RSA";
  16472. else if (XSTRNCMP(n0,"PSK",3) == 0 || XSTRNCMP(n1,"PSK",3) == 0)
  16473. authStr = "PSK";
  16474. else if (XSTRNCMP(n0,"SRP",3) == 0 && XSTRNCMP(n1,"AES",3) == 0)
  16475. authStr = "SRP";
  16476. else if (XSTRNCMP(n1,"ECDSA",5) == 0)
  16477. authStr = "ECDSA";
  16478. else if (XSTRNCMP(n0,"ADH",3) == 0)
  16479. authStr = "None";
  16480. else
  16481. authStr = "unknown";
  16482. return authStr;
  16483. }
  16484. const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
  16485. const char* encStr = NULL;
  16486. const char *n0,*n1,*n2,*n3;
  16487. n0 = n[0];
  16488. n1 = n[1];
  16489. n2 = n[2];
  16490. n3 = n[3];
  16491. if ((XSTRNCMP(n0,"AES256",6) == 0 && XSTRNCMP(n1,"GCM",3) == 0) ||
  16492. (XSTRNCMP(n1,"AES256",6) == 0 && XSTRNCMP(n2,"GCM",3) == 0) ||
  16493. (XSTRNCMP(n2,"AES256",6) == 0 && XSTRNCMP(n3,"GCM",3) == 0))
  16494. encStr = "AESGCM(256)";
  16495. else if ((XSTRNCMP(n0,"AES128",6) == 0 && XSTRNCMP(n1,"GCM",3) == 0) ||
  16496. (XSTRNCMP(n1,"AES128",6) == 0 && XSTRNCMP(n2,"GCM",3) == 0) ||
  16497. (XSTRNCMP(n2,"AES128",6) == 0 && XSTRNCMP(n3,"GCM",3) == 0))
  16498. encStr = "AESGCM(128)";
  16499. else if ((XSTRNCMP(n0,"AES128",6) == 0 && XSTRNCMP(n1,"CCM",3) == 0) ||
  16500. (XSTRNCMP(n1,"AES128",6) == 0 && XSTRNCMP(n2,"CCM",3) == 0) ||
  16501. (XSTRNCMP(n2,"AES128",6) == 0 && XSTRNCMP(n3,"CCM",3) == 0))
  16502. encStr = "AESCCM(128)";
  16503. else if ((XSTRNCMP(n0,"AES128",6) == 0) ||
  16504. (XSTRNCMP(n1,"AES128",6) == 0) ||
  16505. (XSTRNCMP(n2,"AES128",6) == 0) ||
  16506. (XSTRNCMP(n1,"AES",3) == 0 && XSTRNCMP(n2,"128",3) == 0) ||
  16507. (XSTRNCMP(n2,"AES",3) == 0 && XSTRNCMP(n3,"128",3) == 0))
  16508. encStr = "AES(128)";
  16509. else if ((XSTRNCMP(n0,"AES256",6) == 0) ||
  16510. (XSTRNCMP(n1,"AES256",6) == 0) ||
  16511. (XSTRNCMP(n2,"AES256",6) == 0) ||
  16512. (XSTRNCMP(n1,"AES",3) == 0 && XSTRNCMP(n2,"256",3) == 0) ||
  16513. (XSTRNCMP(n2,"AES",3) == 0 && XSTRNCMP(n3,"256",3) == 0))
  16514. encStr = "AES(256)";
  16515. else if ((XSTRNCMP(n0,"CAMELLIA256",11) == 0) ||
  16516. (XSTRNCMP(n2,"CAMELLIA256",11) == 0))
  16517. encStr = "CAMELLIA(256)";
  16518. else if ((XSTRNCMP(n0,"CAMELLIA128",11) == 0) ||
  16519. (XSTRNCMP(n2,"CAMELLIA128",11) == 0))
  16520. encStr = "CAMELLIA(128)";
  16521. else if ((XSTRNCMP(n0,"RC4",3) == 0) || (XSTRNCMP(n2,"RC4",3) == 0))
  16522. encStr = "RC4";
  16523. else if (((XSTRNCMP(n0,"DES",3) == 0) || (XSTRNCMP(n2,"DES",3) == 0)) &&
  16524. ((XSTRNCMP(n1,"CBC3",4) == 0) || (XSTRNCMP(n3,"CBC3",4) == 0)))
  16525. encStr = "3DES";
  16526. else if ((XSTRNCMP(n1,"CHACHA20",8) == 0 && XSTRNCMP(n2,"POLY1305",8) == 0) ||
  16527. (XSTRNCMP(n2,"CHACHA20",8) == 0 && XSTRNCMP(n3,"POLY1305",8) == 0))
  16528. encStr = "CHACHA20/POLY1305(256)";
  16529. else if ((XSTRNCMP(n0,"NULL",4) == 0) || (XSTRNCMP(n1,"NULL",4) == 0) ||
  16530. (XSTRNCMP(n2,"NULL",4) == 0) ||
  16531. ((XSTRNCMP(n0,"TLS13",5) == 0) && (XSTRNCMP(n3,"",0) == 0)))
  16532. encStr = "None";
  16533. else if ((XSTRNCMP(n0,"IDEA",4) == 0))
  16534. encStr = "IDEA";
  16535. else if ((XSTRNCMP(n0,"RABBIT",4) == 0))
  16536. encStr = "RABBIT";
  16537. else if ((XSTRNCMP(n0,"HC128",5) == 0))
  16538. encStr = "HC128";
  16539. else
  16540. encStr = "unknown";
  16541. return encStr;
  16542. }
  16543. /* Returns the MAC string of a cipher or "unknown" on failure */
  16544. const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
  16545. const char* macStr = NULL;
  16546. const char *n1,*n2,*n3,*n4;
  16547. n1 = n[1];
  16548. n2 = n[2];
  16549. n3 = n[3];
  16550. n4 = n[4];
  16551. if ((XSTRNCMP(n4,"SHA256",6) == 0) || (XSTRNCMP(n3,"SHA256",6) == 0) ||
  16552. (XSTRNCMP(n2,"SHA256",6) == 0) || (XSTRNCMP(n1,"SHA256",6) == 0))
  16553. macStr = "SHA256";
  16554. else if ((XSTRNCMP(n4,"SHA384",6) == 0) ||
  16555. (XSTRNCMP(n3,"SHA384",6) == 0) ||
  16556. (XSTRNCMP(n2,"SHA384",6) == 0) ||
  16557. (XSTRNCMP(n1,"SHA384",6) == 0))
  16558. macStr = "SHA384";
  16559. else if ((XSTRNCMP(n4,"SHA",3) == 0) || (XSTRNCMP(n3,"SHA",3) == 0) ||
  16560. (XSTRNCMP(n2,"SHA",3) == 0) || (XSTRNCMP(n1,"SHA",3) == 0) ||
  16561. (XSTRNCMP(n1,"MD5",3) == 0))
  16562. macStr = "SHA1";
  16563. else if ((XSTRNCMP(n3,"GCM",3) == 0) ||
  16564. (XSTRNCMP(n1,"CCM",3) == 0) ||
  16565. (XSTRNCMP(n2,"CCM",3) == 0) || (XSTRNCMP(n3,"CCM",3) == 0) ||
  16566. (XSTRNCMP(n1,"CHACHA20",8) == 0 && XSTRNCMP(n2,"POLY1305",8) == 0) ||
  16567. (XSTRNCMP(n2,"CHACHA20",8) == 0 && XSTRNCMP(n3,"POLY1305",8) == 0))
  16568. macStr = "AEAD";
  16569. else
  16570. macStr = "unknown";
  16571. return macStr;
  16572. }
  16573. /* Returns the number of bits based on the cipher enc string, or 0 on failure */
  16574. int SetCipherBits(const char* enc) {
  16575. int ret = WOLFSSL_FAILURE;
  16576. if ((XSTRNCMP(enc,"AESGCM(256)",11) == 0) ||
  16577. (XSTRNCMP(enc,"AES(256)",8) == 0) ||
  16578. (XSTRNCMP(enc,"CAMELLIA(256)",13) == 0) ||
  16579. (XSTRNCMP(enc,"CHACHA20/POLY1305(256)",22) == 0))
  16580. ret = 256;
  16581. else if
  16582. ((XSTRNCMP(enc,"3DES",4) == 0))
  16583. ret = 168;
  16584. else if
  16585. ((XSTRNCMP(enc,"AESGCM(128)",11) == 0) ||
  16586. (XSTRNCMP(enc,"AES(128)",8) == 0) ||
  16587. (XSTRNCMP(enc,"CAMELLIA(128)",13) == 0) ||
  16588. (XSTRNCMP(enc,"IDEA",4) == 0) ||
  16589. (XSTRNCMP(enc,"RC4",3) == 0))
  16590. ret = 128;
  16591. else if
  16592. ((XSTRNCMP(enc,"DES",3) == 0))
  16593. ret = 56;
  16594. return ret;
  16595. }
  16596. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  16597. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  16598. {
  16599. #ifndef NO_ERROR_STRINGS
  16600. int i;
  16601. const char* nameIana = "NONE";
  16602. for (i = 0; i < GetCipherNamesSize(); i++) {
  16603. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  16604. (cipher_names[i].cipherSuite == cipherSuite)) {
  16605. nameIana = cipher_names[i].name_iana;
  16606. break;
  16607. }
  16608. }
  16609. return nameIana;
  16610. #else
  16611. (void)cipherSuite0;
  16612. (void)cipherSuite;
  16613. return NULL;
  16614. #endif
  16615. }
  16616. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  16617. {
  16618. if (ssl == NULL) {
  16619. return NULL;
  16620. }
  16621. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  16622. }
  16623. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  16624. {
  16625. if (ssl == NULL) {
  16626. return NULL;
  16627. }
  16628. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  16629. }
  16630. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  16631. byte* cipherSuite)
  16632. {
  16633. int ret = BAD_FUNC_ARG;
  16634. int i;
  16635. unsigned long len;
  16636. const char* nameDelim;
  16637. /* Support trailing : */
  16638. nameDelim = XSTRSTR(name, ":");
  16639. if (nameDelim)
  16640. len = (unsigned long)(nameDelim - name);
  16641. else
  16642. len = (unsigned long)XSTRLEN(name);
  16643. for (i = 0; i < GetCipherNamesSize(); i++) {
  16644. if (XSTRNCMP(name, cipher_names[i].name, len) == 0) {
  16645. *cipherSuite0 = cipher_names[i].cipherSuite0;
  16646. *cipherSuite = cipher_names[i].cipherSuite;
  16647. ret = 0;
  16648. break;
  16649. }
  16650. }
  16651. return ret;
  16652. }
  16653. /**
  16654. Set the enabled cipher suites.
  16655. @param [out] suites Suites structure.
  16656. @param [in] list List of cipher suites, only supports full name from
  16657. cipher_names[] delimited by ':'.
  16658. @return true on success, else false.
  16659. */
  16660. int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list)
  16661. {
  16662. int ret = 0;
  16663. int idx = 0;
  16664. int haveRSAsig = 0;
  16665. int haveECDSAsig = 0;
  16666. int haveAnon = 0;
  16667. const int suiteSz = GetCipherNamesSize();
  16668. char* next = (char*)list;
  16669. if (suites == NULL || list == NULL) {
  16670. WOLFSSL_MSG("SetCipherList parameter error");
  16671. return 0;
  16672. }
  16673. if (next[0] == 0 || XSTRNCMP(next, "ALL", 3) == 0 ||
  16674. XSTRNCMP(next, "DEFAULT", 7) == 0)
  16675. return 1; /* wolfSSL default */
  16676. do {
  16677. char* current = next;
  16678. char name[MAX_SUITE_NAME + 1];
  16679. int i;
  16680. word32 length;
  16681. next = XSTRSTR(next, ":");
  16682. length = min(sizeof(name), !next ? (word32)XSTRLEN(current) /* last */
  16683. : (word32)(next - current));
  16684. XSTRNCPY(name, current, length);
  16685. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  16686. for (i = 0; i < suiteSz; i++) {
  16687. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  16688. #ifndef NO_ERROR_STRINGS
  16689. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  16690. #endif
  16691. ) {
  16692. #ifdef WOLFSSL_DTLS
  16693. /* don't allow stream ciphers with DTLS */
  16694. if (ctx->method->version.major == DTLS_MAJOR) {
  16695. if (XSTRSTR(name, "RC4") ||
  16696. XSTRSTR(name, "HC128") ||
  16697. XSTRSTR(name, "RABBIT"))
  16698. {
  16699. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  16700. continue;
  16701. }
  16702. }
  16703. #endif /* WOLFSSL_DTLS */
  16704. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  16705. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  16706. return 0; /* suites buffer not large enough, error out */
  16707. }
  16708. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  16709. suites->suites[idx++] = cipher_names[i].cipherSuite;
  16710. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  16711. * suites don't necessarily have RSA in the name. */
  16712. #ifdef WOLFSSL_TLS13
  16713. if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
  16714. (cipher_names[i].cipherSuite0 == ECC_BYTE &&
  16715. (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
  16716. cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
  16717. #ifndef NO_RSA
  16718. haveRSAsig = 1;
  16719. #endif
  16720. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  16721. defined(HAVE_ED448)
  16722. haveECDSAsig = 1;
  16723. #endif
  16724. }
  16725. else
  16726. #endif
  16727. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  16728. defined(HAVE_ED448)
  16729. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  16730. haveECDSAsig = 1;
  16731. else
  16732. #endif
  16733. #ifdef HAVE_ANON
  16734. if (XSTRSTR(name, "ADH"))
  16735. haveAnon = 1;
  16736. else
  16737. #endif
  16738. if (haveRSAsig == 0
  16739. #ifndef NO_PSK
  16740. && (XSTRSTR(name, "PSK") == NULL)
  16741. #endif
  16742. ) {
  16743. haveRSAsig = 1;
  16744. }
  16745. ret = 1; /* found at least one */
  16746. break;
  16747. }
  16748. }
  16749. }
  16750. while (next++); /* ++ needed to skip ':' */
  16751. if (ret) {
  16752. int keySz = 0;
  16753. #ifndef NO_CERTS
  16754. keySz = ctx->privateKeySz;
  16755. #endif
  16756. suites->setSuites = 1;
  16757. suites->suiteSz = (word16)idx;
  16758. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig, haveAnon, 1,
  16759. keySz);
  16760. }
  16761. (void)ctx;
  16762. return ret;
  16763. }
  16764. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  16765. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  16766. {
  16767. word32 i;
  16768. int ret = MATCH_SUITE_ERROR;
  16769. ssl->suites->sigAlgo = ssl->specs.sig_algo;
  16770. /* set defaults */
  16771. if (IsAtLeastTLSv1_3(ssl->version)) {
  16772. ssl->suites->hashAlgo = sha256_mac;
  16773. #ifndef NO_CERTS
  16774. ssl->suites->sigAlgo = ssl->buffers.keyType;
  16775. #endif
  16776. }
  16777. #ifndef WOLFSSL_NO_TLS12
  16778. else if (IsAtLeastTLSv1_2(ssl)) {
  16779. #ifdef WOLFSSL_ALLOW_TLS_SHA1
  16780. ssl->suites->hashAlgo = sha_mac;
  16781. #else
  16782. ssl->suites->hashAlgo = sha256_mac;
  16783. #endif
  16784. }
  16785. else {
  16786. ssl->suites->hashAlgo = sha_mac;
  16787. }
  16788. #endif
  16789. if (hashSigAlgoSz == 0)
  16790. return 0;
  16791. /* i+1 since peek a byte ahead for type */
  16792. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  16793. byte hashAlgo = 0, sigAlgo = 0;
  16794. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  16795. #ifdef HAVE_ED25519
  16796. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  16797. if (sigAlgo != ed25519_sa_algo)
  16798. continue;
  16799. if (sigAlgo == ed25519_sa_algo &&
  16800. ssl->suites->sigAlgo == ecc_dsa_sa_algo) {
  16801. ssl->suites->sigAlgo = sigAlgo;
  16802. ssl->suites->hashAlgo = sha512_mac;
  16803. ret = 0;
  16804. break;
  16805. }
  16806. }
  16807. #endif
  16808. #ifdef HAVE_ED448
  16809. if (ssl->pkCurveOID == ECC_ED448_OID) {
  16810. if (sigAlgo != ed448_sa_algo)
  16811. continue;
  16812. if (sigAlgo == ed448_sa_algo &&
  16813. ssl->suites->sigAlgo == ecc_dsa_sa_algo) {
  16814. ssl->suites->sigAlgo = sigAlgo;
  16815. ssl->suites->hashAlgo = sha512_mac;
  16816. ret = 0;
  16817. break;
  16818. }
  16819. }
  16820. #endif
  16821. #if defined(WOLFSSL_TLS13) && defined(HAVE_ECC)
  16822. if (IsAtLeastTLSv1_3(ssl->version) && sigAlgo == ssl->suites->sigAlgo &&
  16823. sigAlgo == ecc_dsa_sa_algo) {
  16824. int digestSz = GetMacDigestSize(hashAlgo);
  16825. if (digestSz <= 0)
  16826. continue;
  16827. /* TLS 1.3 signature algorithms for ECDSA match hash length with
  16828. * key size.
  16829. */
  16830. if (digestSz != ssl->buffers.keySz)
  16831. continue;
  16832. ssl->suites->hashAlgo = hashAlgo;
  16833. ssl->suites->sigAlgo = sigAlgo;
  16834. ret = 0;
  16835. break; /* done selected sig/hash algorithms */
  16836. }
  16837. else
  16838. #endif
  16839. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  16840. * algorithm that matches the ephemeral ECDHE key size or the next highest
  16841. * available. This workaround resolves issue with some peer's that do not
  16842. * properly support scenarios such as a P-256 key hashed with SHA512.
  16843. */
  16844. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  16845. if (sigAlgo == ssl->suites->sigAlgo && sigAlgo == ecc_dsa_sa_algo) {
  16846. int digestSz = GetMacDigestSize(hashAlgo);
  16847. if (digestSz <= 0)
  16848. continue;
  16849. /* For ecc_dsa_sa_algo, pick hash algo that is curve size unless
  16850. algorithm in not compiled in, then choose next highest */
  16851. if (digestSz == ssl->eccTempKeySz) {
  16852. ssl->suites->hashAlgo = hashAlgo;
  16853. ssl->suites->sigAlgo = sigAlgo;
  16854. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  16855. ssl->namedGroup = 0;
  16856. #endif
  16857. ret = 0;
  16858. break; /* done selected sig/hash algorithms */
  16859. }
  16860. /* not strong enough, so keep checking hashSigAlso list */
  16861. if (digestSz < ssl->eccTempKeySz)
  16862. continue;
  16863. /* mark as highest and check remainder of hashSigAlgo list */
  16864. ssl->suites->hashAlgo = hashAlgo;
  16865. ssl->suites->sigAlgo = sigAlgo;
  16866. ret = 0;
  16867. }
  16868. else
  16869. #endif
  16870. #ifdef WC_RSA_PSS
  16871. if (IsAtLeastTLSv1_3(ssl->version) &&
  16872. ssl->suites->sigAlgo == rsa_sa_algo &&
  16873. sigAlgo != rsa_pss_sa_algo) {
  16874. continue;
  16875. }
  16876. else if (sigAlgo == ssl->suites->sigAlgo ||
  16877. (sigAlgo == rsa_pss_sa_algo &&
  16878. (ssl->suites->sigAlgo == rsa_sa_algo)))
  16879. #else
  16880. if (sigAlgo == ssl->suites->sigAlgo)
  16881. #endif
  16882. {
  16883. /* pick highest available between both server and client */
  16884. switch (hashAlgo) {
  16885. case sha_mac:
  16886. #ifdef WOLFSSL_SHA224
  16887. case sha224_mac:
  16888. #endif
  16889. #ifndef NO_SHA256
  16890. case sha256_mac:
  16891. #endif
  16892. #ifdef WOLFSSL_SHA384
  16893. case sha384_mac:
  16894. #endif
  16895. #ifdef WOLFSSL_SHA512
  16896. case sha512_mac:
  16897. #endif
  16898. /* not strong enough, so keep checking hashSigAlso list */
  16899. if (hashAlgo < ssl->suites->hashAlgo) {
  16900. ret = 0;
  16901. continue;
  16902. }
  16903. /* mark as highest and check remainder of hashSigAlgo list */
  16904. ssl->suites->hashAlgo = hashAlgo;
  16905. ssl->suites->sigAlgo = sigAlgo;
  16906. break;
  16907. default:
  16908. continue;
  16909. }
  16910. ret = 0;
  16911. break;
  16912. }
  16913. #if defined(WOLFSSL_TLS13)
  16914. else if (ssl->specs.sig_algo == 0 && IsAtLeastTLSv1_3(ssl->version)) {
  16915. }
  16916. #endif
  16917. else if (ssl->specs.sig_algo == 0)
  16918. {
  16919. ssl->suites->hashAlgo = ssl->specs.mac_algorithm;
  16920. ret = 0;
  16921. }
  16922. }
  16923. return ret;
  16924. }
  16925. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  16926. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16927. /* Initialize HandShakeInfo */
  16928. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  16929. {
  16930. int i;
  16931. info->ssl = ssl;
  16932. info->cipherName[0] = 0;
  16933. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  16934. info->packetNames[i][0] = 0;
  16935. info->numberPackets = 0;
  16936. info->negotiationError = 0;
  16937. }
  16938. /* Set Final HandShakeInfo parameters */
  16939. void FinishHandShakeInfo(HandShakeInfo* info)
  16940. {
  16941. int i;
  16942. int sz = GetCipherNamesSize();
  16943. for (i = 0; i < sz; i++)
  16944. if (info->ssl->options.cipherSuite ==
  16945. (byte)cipher_names[i].cipherSuite) {
  16946. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  16947. continue; /* ECC suites at end */
  16948. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  16949. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  16950. break;
  16951. }
  16952. /* error max and min are negative numbers */
  16953. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  16954. info->negotiationError = info->ssl->error;
  16955. }
  16956. /* Add name to info packet names, increase packet name count */
  16957. void AddPacketName(WOLFSSL* ssl, const char* name)
  16958. {
  16959. #ifdef WOLFSSL_CALLBACKS
  16960. HandShakeInfo* info = &ssl->handShakeInfo;
  16961. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  16962. char* packetName = info->packetNames[info->numberPackets];
  16963. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  16964. packetName[MAX_PACKETNAME_SZ] = '\0';
  16965. info->numberPackets++;
  16966. }
  16967. #endif
  16968. (void)ssl;
  16969. (void)name;
  16970. }
  16971. #ifdef WOLFSSL_CALLBACKS
  16972. /* Initialize TimeoutInfo */
  16973. void InitTimeoutInfo(TimeoutInfo* info)
  16974. {
  16975. int i;
  16976. info->timeoutName[0] = 0;
  16977. info->flags = 0;
  16978. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  16979. info->packets[i].packetName[0] = 0;
  16980. info->packets[i].timestamp.tv_sec = 0;
  16981. info->packets[i].timestamp.tv_usec = 0;
  16982. info->packets[i].bufferValue = 0;
  16983. info->packets[i].valueSz = 0;
  16984. }
  16985. info->numberPackets = 0;
  16986. info->timeoutValue.tv_sec = 0;
  16987. info->timeoutValue.tv_usec = 0;
  16988. }
  16989. /* Free TimeoutInfo */
  16990. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  16991. {
  16992. int i;
  16993. (void)heap;
  16994. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  16995. if (info->packets[i].bufferValue) {
  16996. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  16997. info->packets[i].bufferValue = 0;
  16998. }
  16999. }
  17000. /* Add packet name to previously added packet info */
  17001. void AddLateName(const char* name, TimeoutInfo* info)
  17002. {
  17003. /* make sure we have a valid previous one */
  17004. if (info->numberPackets > 0 && info->numberPackets <
  17005. MAX_PACKETS_HANDSHAKE) {
  17006. char* packetName = info->packets[info->numberPackets-1].packetName;
  17007. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  17008. packetName[MAX_PACKETNAME_SZ] = '\0';
  17009. }
  17010. }
  17011. /* Add record header to previously added packet info */
  17012. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  17013. {
  17014. /* make sure we have a valid previous one */
  17015. if (info->numberPackets > 0 && info->numberPackets <
  17016. MAX_PACKETS_HANDSHAKE) {
  17017. if (info->packets[info->numberPackets - 1].bufferValue)
  17018. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  17019. RECORD_HEADER_SZ);
  17020. else
  17021. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  17022. RECORD_HEADER_SZ);
  17023. }
  17024. }
  17025. #endif /* WOLFSSL_CALLBACKS */
  17026. /* Add PacketInfo to TimeoutInfo
  17027. *
  17028. * ssl WOLFSSL structure sending or receiving packet
  17029. * name name of packet being sent
  17030. * type type of packet being sent
  17031. * data data bing sent with packet
  17032. * sz size of data buffer
  17033. * written 1 if this packet is being written to wire, 0 if being read
  17034. * heap custom heap to use for mallocs/frees
  17035. */
  17036. void AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  17037. const byte* data, int sz, int written, void* heap)
  17038. {
  17039. #ifdef WOLFSSL_CALLBACKS
  17040. TimeoutInfo* info = &ssl->timeoutInfo;
  17041. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  17042. WOLFSSL_TIMEVAL currTime;
  17043. /* may add name after */
  17044. if (name) {
  17045. char* packetName = info->packets[info->numberPackets].packetName;
  17046. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  17047. packetName[MAX_PACKETNAME_SZ] = '\0';
  17048. }
  17049. /* add data, put in buffer if bigger than static buffer */
  17050. info->packets[info->numberPackets].valueSz = sz;
  17051. if (sz < MAX_VALUE_SZ)
  17052. XMEMCPY(info->packets[info->numberPackets].value, data, sz);
  17053. else {
  17054. info->packets[info->numberPackets].bufferValue =
  17055. (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_INFO);
  17056. if (!info->packets[info->numberPackets].bufferValue)
  17057. /* let next alloc catch, just don't fill, not fatal here */
  17058. info->packets[info->numberPackets].valueSz = 0;
  17059. else
  17060. XMEMCPY(info->packets[info->numberPackets].bufferValue,
  17061. data, sz);
  17062. }
  17063. gettimeofday(&currTime, 0);
  17064. info->packets[info->numberPackets].timestamp.tv_sec =
  17065. currTime.tv_sec;
  17066. info->packets[info->numberPackets].timestamp.tv_usec =
  17067. currTime.tv_usec;
  17068. info->numberPackets++;
  17069. }
  17070. #endif /* WOLFSSL_CALLBACKS */
  17071. #ifdef OPENSSL_EXTRA
  17072. if (ssl->protoMsgCb != NULL && sz > RECORD_HEADER_SZ) {
  17073. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  17074. 4096 from 16^3 */
  17075. int version = (ssl->version.minor & 0X0F) +
  17076. (ssl->version.minor & 0xF0) * 16 +
  17077. (ssl->version.major & 0X0F) * 256 +
  17078. (ssl->version.major & 0xF0) * 4096;
  17079. ssl->protoMsgCb(written, version, type,
  17080. (const void *)(data + RECORD_HEADER_SZ),
  17081. (size_t)(sz - RECORD_HEADER_SZ),
  17082. ssl, ssl->protoMsgCtx);
  17083. }
  17084. #endif /* OPENSSL_EXTRA */
  17085. (void)written;
  17086. (void)name;
  17087. (void)heap;
  17088. (void)type;
  17089. (void)ssl;
  17090. }
  17091. #endif /* WOLFSSL_CALLBACKS */
  17092. #if !defined(NO_CERTS)
  17093. /* Decode the private key - RSA/ECC/Ed25519/Ed448 - and creates a key object.
  17094. * The signature type is set as well.
  17095. * The maximum length of a signature is returned.
  17096. *
  17097. * ssl The SSL/TLS object.
  17098. * length The length of a signature.
  17099. * returns 0 on success, otherwise failure.
  17100. */
  17101. int DecodePrivateKey(WOLFSSL *ssl, word16* length)
  17102. {
  17103. int ret = BAD_FUNC_ARG;
  17104. int keySz;
  17105. word32 idx;
  17106. #ifdef HAVE_PK_CALLBACKS
  17107. /* allow no private key if using PK callbacks and CB is set */
  17108. if (wolfSSL_IsPrivatePkSet(ssl)) {
  17109. *length = GetPrivateKeySigSize(ssl);
  17110. return 0;
  17111. }
  17112. else
  17113. #endif
  17114. /* make sure private key exists */
  17115. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  17116. WOLFSSL_MSG("Private key missing!");
  17117. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  17118. }
  17119. #ifdef HAVE_PKCS11
  17120. if (ssl->buffers.keyDevId != INVALID_DEVID && ssl->buffers.keyId) {
  17121. if (ssl->buffers.keyType == rsa_sa_algo)
  17122. ssl->hsType = DYNAMIC_TYPE_RSA;
  17123. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  17124. ssl->hsType = DYNAMIC_TYPE_ECC;
  17125. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17126. if (ret != 0) {
  17127. goto exit_dpk;
  17128. }
  17129. if (ssl->buffers.keyType == rsa_sa_algo) {
  17130. #ifndef NO_RSA
  17131. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  17132. ssl->buffers.key->buffer, ssl->buffers.key->length,
  17133. ssl->heap, ssl->buffers.keyDevId);
  17134. if (ret == 0) {
  17135. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  17136. WOLFSSL_MSG("RSA key size too small");
  17137. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  17138. }
  17139. /* Return the maximum signature length. */
  17140. *length = (word16)ssl->buffers.keySz;
  17141. }
  17142. #else
  17143. ret = NOT_COMPILED_IN;
  17144. #endif
  17145. }
  17146. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  17147. #ifdef HAVE_ECC
  17148. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey, ssl->buffers.key->buffer,
  17149. ssl->buffers.key->length, ssl->heap,
  17150. ssl->buffers.keyDevId);
  17151. if (ret == 0) {
  17152. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  17153. WOLFSSL_MSG("ECC key size too small");
  17154. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  17155. }
  17156. /* Return the maximum signature length. */
  17157. *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz);
  17158. }
  17159. #else
  17160. ret = NOT_COMPILED_IN;
  17161. #endif
  17162. }
  17163. goto exit_dpk;
  17164. }
  17165. #endif
  17166. #ifndef NO_RSA
  17167. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  17168. ssl->hsType = DYNAMIC_TYPE_RSA;
  17169. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17170. if (ret != 0) {
  17171. goto exit_dpk;
  17172. }
  17173. WOLFSSL_MSG("Trying RSA private key");
  17174. /* Set start of data to beginning of buffer. */
  17175. idx = 0;
  17176. /* Decode the key assuming it is an RSA private key. */
  17177. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  17178. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  17179. if (ret == 0) {
  17180. WOLFSSL_MSG("Using RSA private key");
  17181. /* It worked so check it meets minimum key size requirements. */
  17182. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  17183. if (keySz < 0) { /* check if keySz has error case */
  17184. ERROR_OUT(keySz, exit_dpk);
  17185. }
  17186. if (keySz < ssl->options.minRsaKeySz) {
  17187. WOLFSSL_MSG("RSA key size too small");
  17188. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  17189. }
  17190. /* Return the maximum signature length. */
  17191. *length = (word16)keySz;
  17192. goto exit_dpk;
  17193. }
  17194. }
  17195. #endif /* !NO_RSA */
  17196. #ifdef HAVE_ECC
  17197. #ifndef NO_RSA
  17198. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  17199. #endif /* !NO_RSA */
  17200. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0) {
  17201. ssl->hsType = DYNAMIC_TYPE_ECC;
  17202. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17203. if (ret != 0) {
  17204. goto exit_dpk;
  17205. }
  17206. #ifndef NO_RSA
  17207. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  17208. #else
  17209. WOLFSSL_MSG("Trying ECC private key");
  17210. #endif
  17211. /* Set start of data to beginning of buffer. */
  17212. idx = 0;
  17213. /* Decode the key assuming it is an ECC private key. */
  17214. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  17215. (ecc_key*)ssl->hsKey,
  17216. ssl->buffers.key->length);
  17217. if (ret == 0) {
  17218. WOLFSSL_MSG("Using ECC private key");
  17219. /* Check it meets the minimum ECC key size requirements. */
  17220. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  17221. if (keySz < ssl->options.minEccKeySz) {
  17222. WOLFSSL_MSG("ECC key size too small");
  17223. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  17224. }
  17225. /* Return the maximum signature length. */
  17226. *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  17227. goto exit_dpk;
  17228. }
  17229. }
  17230. #endif
  17231. #ifdef HAVE_ED25519
  17232. #if !defined(NO_RSA) || defined(HAVE_ECC)
  17233. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  17234. #endif
  17235. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  17236. ssl->hsType = DYNAMIC_TYPE_ED25519;
  17237. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17238. if (ret != 0) {
  17239. goto exit_dpk;
  17240. }
  17241. #ifdef HAVE_ECC
  17242. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  17243. #elif !defined(NO_RSA)
  17244. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  17245. #else
  17246. WOLFSSL_MSG("Trying ED25519 private key");
  17247. #endif
  17248. /* Set start of data to beginning of buffer. */
  17249. idx = 0;
  17250. /* Decode the key assuming it is an ED25519 private key. */
  17251. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  17252. (ed25519_key*)ssl->hsKey,
  17253. ssl->buffers.key->length);
  17254. if (ret == 0) {
  17255. WOLFSSL_MSG("Using ED25519 private key");
  17256. /* Check it meets the minimum ECC key size requirements. */
  17257. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  17258. WOLFSSL_MSG("ED25519 key size too small");
  17259. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  17260. }
  17261. /* Return the maximum signature length. */
  17262. *length = ED25519_SIG_SIZE;
  17263. goto exit_dpk;
  17264. }
  17265. }
  17266. #endif /* HAVE_ED25519 */
  17267. #ifdef HAVE_ED448
  17268. #if !defined(NO_RSA) || defined(HAVE_ECC)
  17269. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  17270. #endif
  17271. if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
  17272. ssl->hsType = DYNAMIC_TYPE_ED448;
  17273. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  17274. if (ret != 0) {
  17275. goto exit_dpk;
  17276. }
  17277. #ifdef HAVE_ED25519
  17278. WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
  17279. #elif defined(HAVE_ECC)
  17280. WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
  17281. #elif !defined(NO_RSA)
  17282. WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
  17283. #else
  17284. WOLFSSL_MSG("Trying ED447 private key");
  17285. #endif
  17286. /* Set start of data to beginning of buffer. */
  17287. idx = 0;
  17288. /* Decode the key assuming it is an ED448 private key. */
  17289. ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  17290. (ed448_key*)ssl->hsKey,
  17291. ssl->buffers.key->length);
  17292. if (ret == 0) {
  17293. WOLFSSL_MSG("Using ED448 private key");
  17294. /* Check it meets the minimum ECC key size requirements. */
  17295. if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  17296. WOLFSSL_MSG("ED448 key size too small");
  17297. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  17298. }
  17299. /* Return the maximum signature length. */
  17300. *length = ED448_SIG_SIZE;
  17301. goto exit_dpk;
  17302. }
  17303. }
  17304. #endif /* HAVE_ED448 */
  17305. (void)idx;
  17306. (void)keySz;
  17307. (void)length;
  17308. exit_dpk:
  17309. return ret;
  17310. }
  17311. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  17312. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  17313. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  17314. static int TLSv1_3_Capable(WOLFSSL* ssl)
  17315. {
  17316. #ifndef WOLFSSL_TLS13
  17317. return 0;
  17318. #else
  17319. int ret = 0;
  17320. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  17321. ret = 1;
  17322. }
  17323. #ifdef OPENSSL_EXTRA
  17324. if ((wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_3)) {
  17325. /* option set at run time to disable TLS 1.3 */
  17326. ret = 0;
  17327. }
  17328. #endif
  17329. return ret;
  17330. #endif
  17331. }
  17332. #endif /* WOLFSSL_TLS13 */
  17333. /* client only parts */
  17334. #ifndef NO_WOLFSSL_CLIENT
  17335. #ifndef WOLFSSL_NO_TLS12
  17336. /* handle generation of client_hello (1) */
  17337. int SendClientHello(WOLFSSL* ssl)
  17338. {
  17339. byte *output;
  17340. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  17341. int sendSz;
  17342. int idSz = ssl->options.resuming
  17343. ? ssl->session.sessionIDSz
  17344. : 0;
  17345. int ret;
  17346. word16 extSz = 0;
  17347. #ifdef WOLFSSL_TLS13
  17348. if (IsAtLeastTLSv1_3(ssl->version))
  17349. return SendTls13ClientHello(ssl);
  17350. #endif
  17351. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  17352. WOLFSSL_ENTER("SendClientHello");
  17353. if (ssl->suites == NULL) {
  17354. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  17355. return SUITES_ERROR;
  17356. }
  17357. #ifdef HAVE_SESSION_TICKET
  17358. if (ssl->options.resuming && ssl->session.ticketLen > 0) {
  17359. SessionTicket* ticket;
  17360. ticket = TLSX_SessionTicket_Create(0, ssl->session.ticket,
  17361. ssl->session.ticketLen, ssl->heap);
  17362. if (ticket == NULL) return MEMORY_E;
  17363. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  17364. if (ret != WOLFSSL_SUCCESS) {
  17365. TLSX_SessionTicket_Free(ticket, ssl->heap);
  17366. return ret;
  17367. }
  17368. idSz = 0;
  17369. }
  17370. #endif
  17371. length = VERSION_SZ + RAN_LEN
  17372. + idSz + ENUM_LEN
  17373. + ssl->suites->suiteSz + SUITE_LEN
  17374. + COMP_LEN + ENUM_LEN;
  17375. #ifdef HAVE_TLS_EXTENSIONS
  17376. /* auto populate extensions supported unless user defined */
  17377. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  17378. return ret;
  17379. #ifdef HAVE_QSH
  17380. if (QSH_Init(ssl) != 0)
  17381. return MEMORY_E;
  17382. #endif
  17383. extSz = 0;
  17384. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  17385. if (ret != 0)
  17386. return ret;
  17387. length += extSz;
  17388. #else
  17389. if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
  17390. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  17391. + ssl->suites->hashSigAlgoSz;
  17392. #ifdef HAVE_EXTENDED_MASTER
  17393. if (ssl->options.haveEMS)
  17394. extSz += HELLO_EXT_SZ;
  17395. #endif
  17396. if (extSz != 0)
  17397. length += extSz + HELLO_EXT_SZ_SZ;
  17398. #endif
  17399. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  17400. #ifdef WOLFSSL_DTLS
  17401. if (ssl->options.dtls) {
  17402. length += ENUM_LEN; /* cookie */
  17403. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  17404. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  17405. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  17406. }
  17407. #endif
  17408. if (IsEncryptionOn(ssl, 1))
  17409. sendSz += MAX_MSG_EXTRA;
  17410. /* check for available size */
  17411. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  17412. return ret;
  17413. /* get output buffer */
  17414. output = ssl->buffers.outputBuffer.buffer +
  17415. ssl->buffers.outputBuffer.length;
  17416. AddHeaders(output, length, client_hello, ssl);
  17417. /* client hello, first version */
  17418. output[idx++] = ssl->version.major;
  17419. output[idx++] = ssl->version.minor;
  17420. ssl->chVersion = ssl->version; /* store in case changed */
  17421. /* then random */
  17422. if (ssl->options.connectState == CONNECT_BEGIN) {
  17423. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  17424. if (ret != 0)
  17425. return ret;
  17426. /* store random */
  17427. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  17428. } else {
  17429. #ifdef WOLFSSL_DTLS
  17430. /* send same random on hello again */
  17431. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  17432. #endif
  17433. }
  17434. idx += RAN_LEN;
  17435. /* then session id */
  17436. output[idx++] = (byte)idSz;
  17437. if (idSz) {
  17438. XMEMCPY(output + idx, ssl->session.sessionID,
  17439. ssl->session.sessionIDSz);
  17440. idx += ssl->session.sessionIDSz;
  17441. }
  17442. /* then DTLS cookie */
  17443. #ifdef WOLFSSL_DTLS
  17444. if (ssl->options.dtls) {
  17445. byte cookieSz = ssl->arrays->cookieSz;
  17446. output[idx++] = cookieSz;
  17447. if (cookieSz) {
  17448. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  17449. idx += cookieSz;
  17450. }
  17451. }
  17452. #endif
  17453. /* then cipher suites */
  17454. c16toa(ssl->suites->suiteSz, output + idx);
  17455. idx += OPAQUE16_LEN;
  17456. XMEMCPY(output + idx, &ssl->suites->suites, ssl->suites->suiteSz);
  17457. idx += ssl->suites->suiteSz;
  17458. /* last, compression */
  17459. output[idx++] = COMP_LEN;
  17460. if (ssl->options.usingCompression)
  17461. output[idx++] = ZLIB_COMPRESSION;
  17462. else
  17463. output[idx++] = NO_COMPRESSION;
  17464. #ifdef HAVE_TLS_EXTENSIONS
  17465. extSz = 0;
  17466. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  17467. if (ret != 0)
  17468. return ret;
  17469. idx += extSz;
  17470. (void)idx; /* suppress analyzer warning, keep idx current */
  17471. #else
  17472. if (extSz != 0) {
  17473. c16toa(extSz, output + idx);
  17474. idx += HELLO_EXT_SZ_SZ;
  17475. if (IsAtLeastTLSv1_2(ssl)) {
  17476. if (ssl->suites->hashSigAlgoSz) {
  17477. word16 i;
  17478. /* extension type */
  17479. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  17480. idx += HELLO_EXT_TYPE_SZ;
  17481. /* extension data length */
  17482. c16toa(HELLO_EXT_SIGALGO_SZ + ssl->suites->hashSigAlgoSz,
  17483. output + idx);
  17484. idx += HELLO_EXT_SZ_SZ;
  17485. /* sig algos length */
  17486. c16toa(ssl->suites->hashSigAlgoSz, output + idx);
  17487. idx += HELLO_EXT_SIGALGO_SZ;
  17488. for (i=0; i < ssl->suites->hashSigAlgoSz; i++, idx++) {
  17489. output[idx] = ssl->suites->hashSigAlgo[i];
  17490. }
  17491. }
  17492. }
  17493. #ifdef HAVE_EXTENDED_MASTER
  17494. if (ssl->options.haveEMS) {
  17495. c16toa(HELLO_EXT_EXTMS, output + idx);
  17496. idx += HELLO_EXT_TYPE_SZ;
  17497. c16toa(0, output + idx);
  17498. idx += HELLO_EXT_SZ_SZ;
  17499. }
  17500. #endif
  17501. }
  17502. #endif
  17503. if (IsEncryptionOn(ssl, 1)) {
  17504. byte* input;
  17505. int inputSz = idx; /* build msg adds rec hdr */
  17506. int recordHeaderSz = RECORD_HEADER_SZ;
  17507. if (ssl->options.dtls)
  17508. recordHeaderSz += DTLS_RECORD_EXTRA;
  17509. inputSz -= recordHeaderSz;
  17510. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17511. if (input == NULL)
  17512. return MEMORY_E;
  17513. XMEMCPY(input, output + recordHeaderSz, inputSz);
  17514. #ifdef WOLFSSL_DTLS
  17515. if (IsDtlsNotSctpMode(ssl) &&
  17516. (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
  17517. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17518. return ret;
  17519. }
  17520. #endif
  17521. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  17522. handshake, 1, 0, 0, CUR_ORDER);
  17523. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17524. if (sendSz < 0)
  17525. return sendSz;
  17526. } else {
  17527. #ifdef WOLFSSL_DTLS
  17528. if (IsDtlsNotSctpMode(ssl)) {
  17529. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
  17530. return ret;
  17531. }
  17532. if (ssl->options.dtls)
  17533. DtlsSEQIncrement(ssl, CUR_ORDER);
  17534. #endif
  17535. ret = HashOutput(ssl, output, sendSz, 0);
  17536. if (ret != 0)
  17537. return ret;
  17538. }
  17539. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  17540. #ifdef OPENSSL_EXTRA
  17541. ssl->cbmode = SSL_CB_MODE_WRITE;
  17542. if (ssl->CBIS != NULL)
  17543. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  17544. #endif
  17545. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17546. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  17547. if (ssl->toInfoOn)
  17548. AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  17549. WRITE_PROTO, ssl->heap);
  17550. #endif
  17551. ssl->buffers.outputBuffer.length += sendSz;
  17552. ret = SendBuffered(ssl);
  17553. WOLFSSL_LEAVE("SendClientHello", ret);
  17554. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  17555. return ret;
  17556. }
  17557. /* handle processing of DTLS hello_verify_request (3) */
  17558. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input,
  17559. word32* inOutIdx, word32 size)
  17560. {
  17561. ProtocolVersion pv;
  17562. byte cookieSz;
  17563. word32 begin = *inOutIdx;
  17564. #ifdef WOLFSSL_CALLBACKS
  17565. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  17566. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  17567. #endif
  17568. #ifdef WOLFSSL_DTLS
  17569. if (ssl->options.dtls) {
  17570. DtlsMsgPoolReset(ssl);
  17571. }
  17572. #endif
  17573. if (OPAQUE16_LEN + OPAQUE8_LEN > size)
  17574. return BUFFER_ERROR;
  17575. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  17576. *inOutIdx += OPAQUE16_LEN;
  17577. if (pv.major != DTLS_MAJOR ||
  17578. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  17579. return VERSION_ERROR;
  17580. cookieSz = input[(*inOutIdx)++];
  17581. if (cookieSz) {
  17582. if ((*inOutIdx - begin) + cookieSz > size)
  17583. return BUFFER_ERROR;
  17584. #ifdef WOLFSSL_DTLS
  17585. if (cookieSz <= MAX_COOKIE_LEN) {
  17586. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  17587. ssl->arrays->cookieSz = cookieSz;
  17588. }
  17589. #endif
  17590. *inOutIdx += cookieSz;
  17591. }
  17592. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  17593. return 0;
  17594. }
  17595. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  17596. {
  17597. int ret = 0;
  17598. #ifdef HAVE_SECRET_CALLBACK
  17599. /* If a session secret callback exists, we are using that
  17600. * key instead of the saved session key. */
  17601. ret = ret || (ssl->sessionSecretCb != NULL);
  17602. #endif
  17603. #ifdef HAVE_SESSION_TICKET
  17604. /* server may send blank ticket which may not be expected to indicate
  17605. * existing one ok but will also be sending a new one */
  17606. ret = ret || (ssl->session.ticketLen > 0);
  17607. #endif
  17608. ret = ret ||
  17609. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  17610. ssl->session.sessionID, ID_LEN) == 0);
  17611. return ret;
  17612. }
  17613. /* Check the version in the received message is valid and set protocol
  17614. * version to use.
  17615. *
  17616. * ssl The SSL/TLS object.
  17617. * pv The protocol version from the packet.
  17618. * returns 0 on success, otherwise failure.
  17619. */
  17620. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  17621. {
  17622. #ifdef WOLFSSL_TLS13_DRAFT
  17623. if (pv.major == TLS_DRAFT_MAJOR) {
  17624. pv.major = SSLv3_MAJOR;
  17625. pv.minor = TLSv1_3_MINOR;
  17626. }
  17627. #endif
  17628. #ifdef OPENSSL_EXTRA
  17629. if (ssl->CBIS != NULL) {
  17630. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, SSL_SUCCESS);
  17631. }
  17632. #endif
  17633. if (pv.minor > ssl->version.minor) {
  17634. WOLFSSL_MSG("Server using higher version, fatal error");
  17635. return VERSION_ERROR;
  17636. }
  17637. if (pv.minor < ssl->version.minor) {
  17638. WOLFSSL_MSG("server using lower version");
  17639. /* Check for downgrade attack. */
  17640. if (!ssl->options.downgrade) {
  17641. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  17642. return VERSION_ERROR;
  17643. }
  17644. if (pv.minor < ssl->options.minDowngrade) {
  17645. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  17646. return VERSION_ERROR;
  17647. }
  17648. #ifdef HAVE_SECURE_RENEGOTIATION
  17649. if (ssl->secure_renegotiation &&
  17650. ssl->secure_renegotiation->enabled &&
  17651. ssl->options.handShakeDone) {
  17652. WOLFSSL_MSG("Server changed version during scr");
  17653. return VERSION_ERROR;
  17654. }
  17655. #endif
  17656. /* Checks made - OK to downgrade. */
  17657. if (pv.minor == SSLv3_MINOR) {
  17658. /* turn off tls */
  17659. WOLFSSL_MSG("\tdowngrading to SSLv3");
  17660. ssl->options.tls = 0;
  17661. ssl->options.tls1_1 = 0;
  17662. ssl->version.minor = SSLv3_MINOR;
  17663. }
  17664. else if (pv.minor == TLSv1_MINOR) {
  17665. /* turn off tls 1.1+ */
  17666. WOLFSSL_MSG("\tdowngrading to TLSv1");
  17667. ssl->options.tls1_1 = 0;
  17668. ssl->version.minor = TLSv1_MINOR;
  17669. }
  17670. else if (pv.minor == TLSv1_1_MINOR) {
  17671. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  17672. ssl->version.minor = TLSv1_1_MINOR;
  17673. }
  17674. else if (pv.minor == TLSv1_2_MINOR) {
  17675. WOLFSSL_MSG(" downgrading to TLSv1.2");
  17676. ssl->version.minor = TLSv1_2_MINOR;
  17677. }
  17678. }
  17679. #ifdef OPENSSL_EXTRA
  17680. /* check if option is set to not allow the current version
  17681. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  17682. if (!ssl->options.dtls && ssl->options.downgrade &&
  17683. ssl->options.mask > 0) {
  17684. if (ssl->version.minor == TLSv1_2_MINOR &&
  17685. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  17686. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  17687. ssl->version.minor = TLSv1_1_MINOR;
  17688. }
  17689. if (ssl->version.minor == TLSv1_1_MINOR &&
  17690. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  17691. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  17692. ssl->options.tls1_1 = 0;
  17693. ssl->version.minor = TLSv1_MINOR;
  17694. }
  17695. if (ssl->version.minor == TLSv1_MINOR &&
  17696. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  17697. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  17698. ssl->options.tls = 0;
  17699. ssl->options.tls1_1 = 0;
  17700. ssl->version.minor = SSLv3_MINOR;
  17701. }
  17702. if (ssl->version.minor == SSLv3_MINOR &&
  17703. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  17704. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  17705. return VERSION_ERROR;
  17706. }
  17707. if (ssl->version.minor < ssl->options.minDowngrade) {
  17708. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  17709. return VERSION_ERROR;
  17710. }
  17711. }
  17712. #endif
  17713. return 0;
  17714. }
  17715. /* handle processing of server_hello (2) */
  17716. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  17717. word32 helloSz)
  17718. {
  17719. byte cs0; /* cipher suite bytes 0, 1 */
  17720. byte cs1;
  17721. ProtocolVersion pv;
  17722. byte compression;
  17723. word32 i = *inOutIdx;
  17724. word32 begin = i;
  17725. int ret;
  17726. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  17727. WOLFSSL_ENTER("DoServerHello");
  17728. #ifdef WOLFSSL_CALLBACKS
  17729. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  17730. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  17731. #endif
  17732. /* protocol version, random and session id length check */
  17733. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  17734. return BUFFER_ERROR;
  17735. /* protocol version */
  17736. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  17737. i += OPAQUE16_LEN;
  17738. ret = CheckVersion(ssl, pv);
  17739. if (ret != 0)
  17740. return ret;
  17741. #ifdef WOLFSSL_TLS13
  17742. if (IsAtLeastTLSv1_3(pv)) {
  17743. byte type = server_hello;
  17744. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  17745. }
  17746. #endif
  17747. /* random */
  17748. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  17749. i += RAN_LEN;
  17750. /* session id */
  17751. ssl->arrays->sessionIDSz = input[i++];
  17752. if (ssl->arrays->sessionIDSz > ID_LEN) {
  17753. WOLFSSL_MSG("Invalid session ID size");
  17754. ssl->arrays->sessionIDSz = 0;
  17755. return BUFFER_ERROR;
  17756. }
  17757. else if (ssl->arrays->sessionIDSz) {
  17758. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  17759. return BUFFER_ERROR;
  17760. XMEMCPY(ssl->arrays->sessionID, input + i,
  17761. ssl->arrays->sessionIDSz);
  17762. i += ssl->arrays->sessionIDSz;
  17763. ssl->options.haveSessionId = 1;
  17764. }
  17765. /* suite and compression */
  17766. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  17767. return BUFFER_ERROR;
  17768. cs0 = input[i++];
  17769. cs1 = input[i++];
  17770. #ifdef HAVE_SECURE_RENEGOTIATION
  17771. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  17772. ssl->options.handShakeDone) {
  17773. if (ssl->options.cipherSuite0 != cs0 ||
  17774. ssl->options.cipherSuite != cs1) {
  17775. WOLFSSL_MSG("Server changed cipher suite during scr");
  17776. return MATCH_SUITE_ERROR;
  17777. }
  17778. }
  17779. #endif
  17780. ssl->options.cipherSuite0 = cs0;
  17781. ssl->options.cipherSuite = cs1;
  17782. compression = input[i++];
  17783. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  17784. {
  17785. word32 idx, found = 0;
  17786. /* confirm server_hello cipher suite is one sent in client_hello */
  17787. for (idx = 0; idx < ssl->suites->suiteSz; idx += 2) {
  17788. if (ssl->suites->suites[idx] == cs0 &&
  17789. ssl->suites->suites[idx+1] == cs1) {
  17790. found = 1;
  17791. break;
  17792. }
  17793. }
  17794. if (!found) {
  17795. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  17796. return MATCH_SUITE_ERROR;
  17797. }
  17798. }
  17799. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  17800. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  17801. WOLFSSL_MSG("Server forcing compression w/o support");
  17802. return COMPRESSION_ERROR;
  17803. }
  17804. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  17805. WOLFSSL_MSG("Server refused compression, turning off");
  17806. ssl->options.usingCompression = 0; /* turn off if server refused */
  17807. }
  17808. *inOutIdx = i;
  17809. #ifdef HAVE_TLS_EXTENSIONS
  17810. if ( (i - begin) < helloSz) {
  17811. if (TLSX_SupportExtensions(ssl)) {
  17812. word16 totalExtSz;
  17813. if ((i - begin) + OPAQUE16_LEN > helloSz)
  17814. return BUFFER_ERROR;
  17815. ato16(&input[i], &totalExtSz);
  17816. i += OPAQUE16_LEN;
  17817. if ((i - begin) + totalExtSz > helloSz)
  17818. return BUFFER_ERROR;
  17819. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  17820. server_hello, NULL)))
  17821. return ret;
  17822. i += totalExtSz;
  17823. *inOutIdx = i;
  17824. }
  17825. else
  17826. *inOutIdx = begin + helloSz; /* skip extensions */
  17827. }
  17828. else
  17829. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  17830. #else
  17831. {
  17832. int allowExt = 0;
  17833. byte pendingEMS = 0;
  17834. if ( (i - begin) < helloSz) {
  17835. if (ssl->version.major == SSLv3_MAJOR &&
  17836. ssl->version.minor >= TLSv1_MINOR) {
  17837. allowExt = 1;
  17838. }
  17839. #ifdef WOLFSSL_DTLS
  17840. if (ssl->version.major == DTLS_MAJOR)
  17841. allowExt = 1;
  17842. #endif
  17843. if (allowExt) {
  17844. word16 totalExtSz;
  17845. if ((i - begin) + OPAQUE16_LEN > helloSz)
  17846. return BUFFER_ERROR;
  17847. ato16(&input[i], &totalExtSz);
  17848. i += OPAQUE16_LEN;
  17849. if ((i - begin) + totalExtSz > helloSz)
  17850. return BUFFER_ERROR;
  17851. while (totalExtSz) {
  17852. word16 extId, extSz;
  17853. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  17854. return BUFFER_ERROR;
  17855. ato16(&input[i], &extId);
  17856. i += OPAQUE16_LEN;
  17857. ato16(&input[i], &extSz);
  17858. i += OPAQUE16_LEN;
  17859. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  17860. return BUFFER_ERROR;
  17861. if (extId == HELLO_EXT_EXTMS)
  17862. pendingEMS = 1;
  17863. else
  17864. i += extSz;
  17865. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  17866. }
  17867. *inOutIdx = i;
  17868. }
  17869. else
  17870. *inOutIdx = begin + helloSz; /* skip extensions */
  17871. }
  17872. if (!pendingEMS && ssl->options.haveEMS)
  17873. ssl->options.haveEMS = 0;
  17874. }
  17875. #endif
  17876. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  17877. if (IsEncryptionOn(ssl, 0)) {
  17878. *inOutIdx += ssl->keys.padSz;
  17879. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17880. if (ssl->options.startedETMWrite &&
  17881. ssl->specs.cipher_type == block) {
  17882. *inOutIdx += MacSize(ssl);
  17883. }
  17884. #endif
  17885. }
  17886. #ifdef HAVE_SECRET_CALLBACK
  17887. if (ssl->sessionSecretCb != NULL) {
  17888. int secretSz = SECRET_LEN;
  17889. ret = ssl->sessionSecretCb(ssl, ssl->session.masterSecret,
  17890. &secretSz, ssl->sessionSecretCtx);
  17891. if (ret != 0 || secretSz != SECRET_LEN)
  17892. return SESSION_SECRET_CB_E;
  17893. }
  17894. #endif /* HAVE_SECRET_CALLBACK */
  17895. ret = CompleteServerHello(ssl);
  17896. WOLFSSL_LEAVE("DoServerHello", ret);
  17897. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  17898. return ret;
  17899. }
  17900. int CompleteServerHello(WOLFSSL* ssl)
  17901. {
  17902. int ret;
  17903. if (!ssl->options.resuming) {
  17904. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  17905. TLS13_DOWNGRADE_SZ - 1;
  17906. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  17907. #ifdef WOLFSSL_TLS13
  17908. if (TLSv1_3_Capable(ssl)) {
  17909. /* TLS v1.3 capable client not allowed to downgrade when
  17910. * connecting to TLS v1.3 capable server unless cipher suite
  17911. * demands it.
  17912. */
  17913. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  17914. (vers == 0 || vers == 1)) {
  17915. SendAlert(ssl, alert_fatal, illegal_parameter);
  17916. return VERSION_ERROR;
  17917. }
  17918. }
  17919. else
  17920. #endif
  17921. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  17922. ssl->ctx->method->version.minor == TLSv1_2_MINOR
  17923. #ifdef OPENSSL_EXTRA
  17924. && (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0
  17925. #endif
  17926. ) {
  17927. /* TLS v1.2 capable client not allowed to downgrade when
  17928. * connecting to TLS v1.2 capable server.
  17929. */
  17930. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  17931. vers == 0) {
  17932. SendAlert(ssl, alert_fatal, illegal_parameter);
  17933. return VERSION_ERROR;
  17934. }
  17935. }
  17936. }
  17937. else {
  17938. if (DSH_CheckSessionId(ssl)) {
  17939. if (SetCipherSpecs(ssl) == 0) {
  17940. XMEMCPY(ssl->arrays->masterSecret,
  17941. ssl->session.masterSecret, SECRET_LEN);
  17942. #ifdef NO_OLD_TLS
  17943. ret = DeriveTlsKeys(ssl);
  17944. #else
  17945. ret = -1; /* default value */
  17946. #ifndef NO_TLS
  17947. if (ssl->options.tls)
  17948. ret = DeriveTlsKeys(ssl);
  17949. #endif
  17950. if (!ssl->options.tls)
  17951. ret = DeriveKeys(ssl);
  17952. #endif /* NO_OLD_TLS */
  17953. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  17954. return ret;
  17955. }
  17956. else {
  17957. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  17958. return UNSUPPORTED_SUITE;
  17959. }
  17960. }
  17961. else {
  17962. WOLFSSL_MSG("Server denied resumption attempt");
  17963. ssl->options.resuming = 0; /* server denied resumption try */
  17964. }
  17965. }
  17966. return SetCipherSpecs(ssl);
  17967. }
  17968. #endif /* !WOLFSSL_NO_TLS12 */
  17969. /* Make sure client setup is valid for this suite, true on success */
  17970. int VerifyClientSuite(WOLFSSL* ssl)
  17971. {
  17972. int havePSK = 0;
  17973. byte first = ssl->options.cipherSuite0;
  17974. byte second = ssl->options.cipherSuite;
  17975. WOLFSSL_ENTER("VerifyClientSuite");
  17976. #ifndef NO_PSK
  17977. havePSK = ssl->options.havePSK;
  17978. #endif
  17979. if (CipherRequires(first, second, REQUIRES_PSK)) {
  17980. WOLFSSL_MSG("Requires PSK");
  17981. if (havePSK == 0) {
  17982. WOLFSSL_MSG("Don't have PSK");
  17983. return 0;
  17984. }
  17985. }
  17986. return 1; /* success */
  17987. }
  17988. #ifndef WOLFSSL_NO_TLS12
  17989. #ifndef NO_CERTS
  17990. /* handle processing of certificate_request (13) */
  17991. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  17992. inOutIdx, word32 size)
  17993. {
  17994. word16 len;
  17995. word32 begin = *inOutIdx;
  17996. #ifdef OPENSSL_EXTRA
  17997. int ret;
  17998. WOLFSSL_X509* x509 = NULL;
  17999. WOLFSSL_EVP_PKEY* pkey = NULL;
  18000. #endif
  18001. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  18002. WOLFSSL_ENTER("DoCertificateRequest");
  18003. #ifdef WOLFSSL_CALLBACKS
  18004. if (ssl->hsInfoOn)
  18005. AddPacketName(ssl, "CertificateRequest");
  18006. if (ssl->toInfoOn)
  18007. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  18008. #endif
  18009. if (OPAQUE8_LEN > size)
  18010. return BUFFER_ERROR;
  18011. len = input[(*inOutIdx)++];
  18012. if ((*inOutIdx - begin) + len > size)
  18013. return BUFFER_ERROR;
  18014. /* types, read in here */
  18015. *inOutIdx += len;
  18016. /* signature and hash signature algorithm */
  18017. if (IsAtLeastTLSv1_2(ssl)) {
  18018. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  18019. return BUFFER_ERROR;
  18020. ato16(input + *inOutIdx, &len);
  18021. *inOutIdx += OPAQUE16_LEN;
  18022. if ((*inOutIdx - begin) + len > size)
  18023. return BUFFER_ERROR;
  18024. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  18025. ssl->buffers.certificate &&
  18026. ssl->buffers.certificate->buffer) {
  18027. #ifdef HAVE_PK_CALLBACKS
  18028. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  18029. WOLFSSL_MSG("Using PK for client private key");
  18030. return INVALID_PARAMETER;
  18031. }
  18032. #endif
  18033. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  18034. return INVALID_PARAMETER;
  18035. }
  18036. }
  18037. *inOutIdx += len;
  18038. #ifdef WC_RSA_PSS
  18039. ssl->pssAlgo = 0;
  18040. if (ssl->suites->sigAlgo == rsa_pss_sa_algo)
  18041. ssl->pssAlgo |= 1 << ssl->suites->hashAlgo;
  18042. #endif
  18043. }
  18044. /* authorities */
  18045. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  18046. return BUFFER_ERROR;
  18047. ato16(input + *inOutIdx, &len);
  18048. *inOutIdx += OPAQUE16_LEN;
  18049. if ((*inOutIdx - begin) + len > size)
  18050. return BUFFER_ERROR;
  18051. while (len) {
  18052. word16 dnSz;
  18053. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  18054. return BUFFER_ERROR;
  18055. ato16(input + *inOutIdx, &dnSz);
  18056. *inOutIdx += OPAQUE16_LEN;
  18057. if ((*inOutIdx - begin) + dnSz > size)
  18058. return BUFFER_ERROR;
  18059. *inOutIdx += dnSz;
  18060. len -= OPAQUE16_LEN + dnSz;
  18061. }
  18062. #ifdef OPENSSL_EXTRA
  18063. /* call client cert callback if no cert has been loaded */
  18064. if ((ssl->ctx->CBClientCert != NULL) &&
  18065. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  18066. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  18067. if (ret == 1) {
  18068. if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
  18069. (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
  18070. return CLIENT_CERT_CB_ERROR;
  18071. }
  18072. wolfSSL_X509_free(x509);
  18073. wolfSSL_EVP_PKEY_free(pkey);
  18074. } else if (ret < 0) {
  18075. return WOLFSSL_ERROR_WANT_X509_LOOKUP;
  18076. }
  18077. }
  18078. #endif
  18079. /* don't send client cert or cert verify if user hasn't provided
  18080. cert and private key */
  18081. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  18082. #ifdef HAVE_PK_CALLBACKS
  18083. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  18084. WOLFSSL_MSG("Using PK for client private key");
  18085. ssl->options.sendVerify = SEND_CERT;
  18086. }
  18087. #endif
  18088. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  18089. ssl->options.sendVerify = SEND_CERT;
  18090. }
  18091. }
  18092. #ifdef OPENSSL_EXTRA
  18093. else
  18094. #else
  18095. else if (IsTLS(ssl))
  18096. #endif
  18097. {
  18098. ssl->options.sendVerify = SEND_BLANK_CERT;
  18099. }
  18100. if (IsEncryptionOn(ssl, 0)) {
  18101. *inOutIdx += ssl->keys.padSz;
  18102. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18103. if (ssl->options.startedETMRead)
  18104. *inOutIdx += MacSize(ssl);
  18105. #endif
  18106. }
  18107. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  18108. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  18109. return 0;
  18110. }
  18111. #endif /* !NO_CERTS */
  18112. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  18113. static int CheckCurveId(int tlsCurveId)
  18114. {
  18115. int ret = ECC_CURVE_ERROR;
  18116. switch (tlsCurveId) {
  18117. #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
  18118. #ifndef NO_ECC_SECP
  18119. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  18120. #endif /* !NO_ECC_SECP */
  18121. #ifdef HAVE_ECC_SECPR2
  18122. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  18123. #endif /* HAVE_ECC_SECPR2 */
  18124. #ifdef HAVE_ECC_KOBLITZ
  18125. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  18126. #endif /* HAVE_ECC_KOBLITZ */
  18127. #endif
  18128. #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
  18129. #ifndef NO_ECC_SECP
  18130. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  18131. #endif /* !NO_ECC_SECP */
  18132. #ifdef HAVE_ECC_KOBLITZ
  18133. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  18134. #endif /* HAVE_ECC_KOBLITZ */
  18135. #endif
  18136. #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
  18137. #ifndef NO_ECC_SECP
  18138. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  18139. #endif /* !NO_ECC_SECP */
  18140. #ifdef HAVE_ECC_KOBLITZ
  18141. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  18142. #endif /* HAVE_ECC_KOBLITZ */
  18143. #endif
  18144. #ifdef HAVE_CURVE25519
  18145. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  18146. #endif
  18147. #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
  18148. #ifndef NO_ECC_SECP
  18149. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  18150. #endif /* !NO_ECC_SECP */
  18151. #ifdef HAVE_ECC_KOBLITZ
  18152. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  18153. #endif /* HAVE_ECC_KOBLITZ */
  18154. #ifdef HAVE_ECC_BRAINPOOL
  18155. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  18156. #endif /* HAVE_ECC_BRAINPOOL */
  18157. #endif
  18158. #ifdef HAVE_CURVE448
  18159. case WOLFSSL_ECC_X448: return ECC_X448_OID;
  18160. #endif
  18161. #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
  18162. #ifndef NO_ECC_SECP
  18163. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  18164. #endif /* !NO_ECC_SECP */
  18165. #ifdef HAVE_ECC_BRAINPOOL
  18166. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  18167. #endif /* HAVE_ECC_BRAINPOOL */
  18168. #endif
  18169. #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
  18170. #ifdef HAVE_ECC_BRAINPOOL
  18171. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  18172. #endif /* HAVE_ECC_BRAINPOOL */
  18173. #endif
  18174. #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
  18175. #ifndef NO_ECC_SECP
  18176. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  18177. #endif /* !NO_ECC_SECP */
  18178. #endif
  18179. }
  18180. return ret;
  18181. }
  18182. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  18183. /* Persistable DoServerKeyExchange arguments */
  18184. typedef struct DskeArgs {
  18185. byte* output; /* not allocated */
  18186. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  18187. defined(HAVE_ED448)
  18188. byte* verifySig;
  18189. #endif
  18190. word32 idx;
  18191. word32 begin;
  18192. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  18193. defined(HAVE_ED448)
  18194. word16 verifySigSz;
  18195. #endif
  18196. word16 sigSz;
  18197. byte sigAlgo;
  18198. byte hashAlgo;
  18199. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  18200. int bits;
  18201. #endif
  18202. } DskeArgs;
  18203. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  18204. {
  18205. DskeArgs* args = (DskeArgs*)pArgs;
  18206. (void)ssl;
  18207. (void)args;
  18208. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  18209. defined(HAVE_ED448)
  18210. if (args->verifySig) {
  18211. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  18212. args->verifySig = NULL;
  18213. }
  18214. #endif
  18215. }
  18216. #ifndef NO_DH
  18217. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  18218. DskeArgs* args)
  18219. {
  18220. int ret = 0;
  18221. word16 length;
  18222. #ifdef HAVE_FFDHE
  18223. const DhParams* params = NULL;
  18224. int group = 0;
  18225. #endif
  18226. ssl->buffers.weOwnDH = 1;
  18227. ssl->buffers.serverDH_P.buffer = NULL;
  18228. ssl->buffers.serverDH_G.buffer = NULL;
  18229. ssl->buffers.serverDH_Pub.buffer = NULL;
  18230. /* p */
  18231. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  18232. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18233. }
  18234. ato16(input + args->idx, &length);
  18235. args->idx += OPAQUE16_LEN;
  18236. if ((args->idx - args->begin) + length > size) {
  18237. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18238. }
  18239. if (length < ssl->options.minDhKeySz) {
  18240. WOLFSSL_MSG("Server using a DH key that is too small");
  18241. SendAlert(ssl, alert_fatal, handshake_failure);
  18242. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  18243. }
  18244. if (length > ssl->options.maxDhKeySz) {
  18245. WOLFSSL_MSG("Server using a DH key that is too big");
  18246. SendAlert(ssl, alert_fatal, handshake_failure);
  18247. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  18248. }
  18249. ssl->buffers.serverDH_P.buffer =
  18250. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18251. if (ssl->buffers.serverDH_P.buffer) {
  18252. ssl->buffers.serverDH_P.length = length;
  18253. }
  18254. else {
  18255. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  18256. }
  18257. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  18258. length);
  18259. args->idx += length;
  18260. ssl->options.dhKeySz = length;
  18261. /* g */
  18262. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  18263. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18264. }
  18265. ato16(input + args->idx, &length);
  18266. args->idx += OPAQUE16_LEN;
  18267. if ((args->idx - args->begin) + length > size) {
  18268. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18269. }
  18270. ssl->buffers.serverDH_G.buffer =
  18271. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18272. if (ssl->buffers.serverDH_G.buffer) {
  18273. ssl->buffers.serverDH_G.length = length;
  18274. }
  18275. else {
  18276. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  18277. }
  18278. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  18279. length);
  18280. args->idx += length;
  18281. /* pub */
  18282. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  18283. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18284. }
  18285. ato16(input + args->idx, &length);
  18286. args->idx += OPAQUE16_LEN;
  18287. if ((args->idx - args->begin) + length > size) {
  18288. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  18289. }
  18290. ssl->buffers.serverDH_Pub.buffer =
  18291. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  18292. if (ssl->buffers.serverDH_Pub.buffer) {
  18293. ssl->buffers.serverDH_Pub.length = length;
  18294. }
  18295. else {
  18296. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  18297. }
  18298. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  18299. length);
  18300. args->idx += length;
  18301. #ifdef HAVE_FFDHE
  18302. switch (ssl->options.dhKeySz) {
  18303. #ifdef HAVE_FFDHE_2048
  18304. case 2048/8:
  18305. params = wc_Dh_ffdhe2048_Get();
  18306. group = WOLFSSL_FFDHE_2048;
  18307. break;
  18308. #endif
  18309. #ifdef HAVE_FFDHE_3072
  18310. case 3072/8:
  18311. params = wc_Dh_ffdhe3072_Get();
  18312. group = WOLFSSL_FFDHE_3072;
  18313. break;
  18314. #endif
  18315. #ifdef HAVE_FFDHE_4096
  18316. case 4096/8:
  18317. params = wc_Dh_ffdhe4096_Get();
  18318. group = WOLFSSL_FFDHE_4096;
  18319. break;
  18320. #endif
  18321. #ifdef HAVE_FFDHE_6144
  18322. case 6144/8:
  18323. params = wc_Dh_ffdhe6144_Get();
  18324. group = WOLFSSL_FFDHE_6144;
  18325. break;
  18326. #endif
  18327. #ifdef HAVE_FFDHE_8192
  18328. case 8192/8:
  18329. params = wc_Dh_ffdhe8192_Get();
  18330. group = WOLFSSL_FFDHE_8192;
  18331. break;
  18332. #endif
  18333. default:
  18334. break;
  18335. }
  18336. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  18337. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  18338. params->g_len) != 0) ||
  18339. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  18340. params->p_len) != 0)) {
  18341. WOLFSSL_MSG("Server not using FFDHE parameters");
  18342. #ifdef WOLFSSL_REQUIRE_FFDHE
  18343. SendAlert(ssl, alert_fatal, handshake_failure);
  18344. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  18345. #endif
  18346. }
  18347. else {
  18348. ssl->namedGroup = group;
  18349. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  18350. !defined(HAVE_SELFTEST)
  18351. ssl->options.dhDoKeyTest = 0;
  18352. #endif
  18353. }
  18354. #endif /* HAVE_FFDHE */
  18355. exit_gdpk:
  18356. return ret;
  18357. }
  18358. #endif
  18359. /* handle processing of server_key_exchange (12) */
  18360. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  18361. word32* inOutIdx, word32 size)
  18362. {
  18363. int ret = 0;
  18364. #ifdef WOLFSSL_ASYNC_CRYPT
  18365. DskeArgs* args = (DskeArgs*)ssl->async.args;
  18366. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  18367. (void)sizeof(args_test);
  18368. #else
  18369. DskeArgs args[1];
  18370. #endif
  18371. (void)input;
  18372. (void)size;
  18373. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  18374. WOLFSSL_ENTER("DoServerKeyExchange");
  18375. #ifdef WOLFSSL_ASYNC_CRYPT
  18376. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  18377. if (ret != WC_NOT_PENDING_E) {
  18378. /* Check for error */
  18379. if (ret < 0)
  18380. goto exit_dske;
  18381. }
  18382. else
  18383. #endif
  18384. {
  18385. /* Reset state */
  18386. ret = 0;
  18387. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  18388. XMEMSET(args, 0, sizeof(DskeArgs));
  18389. args->idx = *inOutIdx;
  18390. args->begin = *inOutIdx;
  18391. args->sigAlgo = ssl->specs.sig_algo;
  18392. args->hashAlgo = sha_mac;
  18393. #ifdef WOLFSSL_ASYNC_CRYPT
  18394. ssl->async.freeArgs = FreeDskeArgs;
  18395. #endif
  18396. }
  18397. switch(ssl->options.asyncState)
  18398. {
  18399. case TLS_ASYNC_BEGIN:
  18400. {
  18401. #ifdef WOLFSSL_CALLBACKS
  18402. if (ssl->hsInfoOn)
  18403. AddPacketName(ssl, "ServerKeyExchange");
  18404. if (ssl->toInfoOn)
  18405. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  18406. #endif
  18407. switch(ssl->specs.kea)
  18408. {
  18409. #ifndef NO_PSK
  18410. case psk_kea:
  18411. {
  18412. int srvHintLen;
  18413. word16 length;
  18414. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  18415. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18416. }
  18417. ato16(input + args->idx, &length);
  18418. args->idx += OPAQUE16_LEN;
  18419. if ((args->idx - args->begin) + length > size) {
  18420. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18421. }
  18422. /* get PSK server hint from the wire */
  18423. srvHintLen = min(length, MAX_PSK_ID_LEN);
  18424. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  18425. srvHintLen);
  18426. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  18427. args->idx += length;
  18428. break;
  18429. }
  18430. #endif /* !NO_PSK */
  18431. #ifndef NO_DH
  18432. case diffie_hellman_kea:
  18433. {
  18434. ret = GetDhPublicKey(ssl, input, size, args);
  18435. if (ret != 0)
  18436. goto exit_dske;
  18437. break;
  18438. }
  18439. #endif /* !NO_DH */
  18440. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  18441. defined(HAVE_CURVE448)
  18442. case ecc_diffie_hellman_kea:
  18443. {
  18444. byte b;
  18445. #ifdef HAVE_ECC
  18446. int curveId;
  18447. #endif
  18448. int curveOid;
  18449. word16 length;
  18450. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  18451. OPAQUE8_LEN > size) {
  18452. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18453. }
  18454. b = input[args->idx++];
  18455. if (b != named_curve) {
  18456. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  18457. }
  18458. args->idx += 1; /* curve type, eat leading 0 */
  18459. b = input[args->idx++];
  18460. if ((curveOid = CheckCurveId(b)) < 0) {
  18461. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  18462. }
  18463. ssl->ecdhCurveOID = curveOid;
  18464. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  18465. ssl->namedGroup = 0;
  18466. #endif
  18467. length = input[args->idx++];
  18468. if ((args->idx - args->begin) + length > size) {
  18469. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18470. }
  18471. #ifdef HAVE_CURVE25519
  18472. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  18473. if (ssl->peerX25519Key == NULL) {
  18474. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  18475. (void**)&ssl->peerX25519Key);
  18476. if (ret != 0) {
  18477. goto exit_dske;
  18478. }
  18479. } else if (ssl->peerX25519KeyPresent) {
  18480. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  18481. ssl->peerX25519Key);
  18482. ssl->peerX25519KeyPresent = 0;
  18483. if (ret != 0) {
  18484. goto exit_dske;
  18485. }
  18486. }
  18487. if ((ret = wc_curve25519_check_public(
  18488. input + args->idx, length,
  18489. EC25519_LITTLE_ENDIAN)) != 0) {
  18490. #ifdef WOLFSSL_EXTRA_ALERTS
  18491. if (ret == BUFFER_E)
  18492. SendAlert(ssl, alert_fatal, decode_error);
  18493. else if (ret == ECC_OUT_OF_RANGE_E)
  18494. SendAlert(ssl, alert_fatal, bad_record_mac);
  18495. else {
  18496. SendAlert(ssl, alert_fatal, illegal_parameter);
  18497. }
  18498. #endif
  18499. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  18500. }
  18501. if (wc_curve25519_import_public_ex(input + args->idx,
  18502. length, ssl->peerX25519Key,
  18503. EC25519_LITTLE_ENDIAN) != 0) {
  18504. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  18505. }
  18506. args->idx += length;
  18507. ssl->peerX25519KeyPresent = 1;
  18508. break;
  18509. }
  18510. #endif
  18511. #ifdef HAVE_CURVE448
  18512. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  18513. if (ssl->peerX448Key == NULL) {
  18514. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  18515. (void**)&ssl->peerX448Key);
  18516. if (ret != 0) {
  18517. goto exit_dske;
  18518. }
  18519. } else if (ssl->peerX448KeyPresent) {
  18520. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  18521. ssl->peerX448Key);
  18522. ssl->peerX448KeyPresent = 0;
  18523. if (ret != 0) {
  18524. goto exit_dske;
  18525. }
  18526. }
  18527. if ((ret = wc_curve448_check_public(
  18528. input + args->idx, length,
  18529. EC448_LITTLE_ENDIAN)) != 0) {
  18530. #ifdef WOLFSSL_EXTRA_ALERTS
  18531. if (ret == BUFFER_E)
  18532. SendAlert(ssl, alert_fatal, decode_error);
  18533. else if (ret == ECC_OUT_OF_RANGE_E)
  18534. SendAlert(ssl, alert_fatal, bad_record_mac);
  18535. else {
  18536. SendAlert(ssl, alert_fatal, illegal_parameter);
  18537. }
  18538. #endif
  18539. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  18540. }
  18541. if (wc_curve448_import_public_ex(input + args->idx,
  18542. length, ssl->peerX448Key,
  18543. EC448_LITTLE_ENDIAN) != 0) {
  18544. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  18545. }
  18546. args->idx += length;
  18547. ssl->peerX448KeyPresent = 1;
  18548. break;
  18549. }
  18550. #endif
  18551. #ifdef HAVE_ECC
  18552. if (ssl->peerEccKey == NULL) {
  18553. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  18554. (void**)&ssl->peerEccKey);
  18555. if (ret != 0) {
  18556. goto exit_dske;
  18557. }
  18558. } else if (ssl->peerEccKeyPresent) {
  18559. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  18560. ssl->peerEccKeyPresent = 0;
  18561. if (ret != 0) {
  18562. goto exit_dske;
  18563. }
  18564. }
  18565. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  18566. if (wc_ecc_import_x963_ex(input + args->idx, length,
  18567. ssl->peerEccKey, curveId) != 0) {
  18568. #ifdef WOLFSSL_EXTRA_ALERTS
  18569. SendAlert(ssl, alert_fatal, illegal_parameter);
  18570. #endif
  18571. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  18572. }
  18573. args->idx += length;
  18574. ssl->peerEccKeyPresent = 1;
  18575. #endif
  18576. break;
  18577. }
  18578. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  18579. #if !defined(NO_DH) && !defined(NO_PSK)
  18580. case dhe_psk_kea:
  18581. {
  18582. int srvHintLen;
  18583. word16 length;
  18584. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  18585. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18586. }
  18587. ato16(input + args->idx, &length);
  18588. args->idx += OPAQUE16_LEN;
  18589. if ((args->idx - args->begin) + length > size) {
  18590. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18591. }
  18592. /* get PSK server hint from the wire */
  18593. srvHintLen = min(length, MAX_PSK_ID_LEN);
  18594. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  18595. srvHintLen);
  18596. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  18597. args->idx += length;
  18598. ret = GetDhPublicKey(ssl, input, size, args);
  18599. if (ret != 0)
  18600. goto exit_dske;
  18601. break;
  18602. }
  18603. #endif /* !NO_DH && !NO_PSK */
  18604. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  18605. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  18606. case ecdhe_psk_kea:
  18607. {
  18608. byte b;
  18609. int curveOid, curveId;
  18610. int srvHintLen;
  18611. word16 length;
  18612. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  18613. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18614. }
  18615. ato16(input + args->idx, &length);
  18616. args->idx += OPAQUE16_LEN;
  18617. if ((args->idx - args->begin) + length > size) {
  18618. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18619. }
  18620. /* get PSK server hint from the wire */
  18621. srvHintLen = min(length, MAX_PSK_ID_LEN);
  18622. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  18623. srvHintLen);
  18624. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  18625. args->idx += length;
  18626. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  18627. OPAQUE8_LEN > size) {
  18628. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18629. }
  18630. /* Check curve name and ID */
  18631. b = input[args->idx++];
  18632. if (b != named_curve) {
  18633. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  18634. }
  18635. args->idx += 1; /* curve type, eat leading 0 */
  18636. b = input[args->idx++];
  18637. if ((curveOid = CheckCurveId(b)) < 0) {
  18638. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  18639. }
  18640. length = input[args->idx++];
  18641. if ((args->idx - args->begin) + length > size) {
  18642. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18643. }
  18644. #ifdef HAVE_CURVE25519
  18645. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  18646. if (ssl->peerX25519Key == NULL) {
  18647. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  18648. (void**)&ssl->peerX25519Key);
  18649. if (ret != 0) {
  18650. goto exit_dske;
  18651. }
  18652. } else if (ssl->peerEccKeyPresent) {
  18653. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  18654. ssl->peerX25519Key);
  18655. ssl->peerX25519KeyPresent = 0;
  18656. if (ret != 0) {
  18657. goto exit_dske;
  18658. }
  18659. }
  18660. if ((ret = wc_curve25519_check_public(
  18661. input + args->idx, length,
  18662. EC25519_LITTLE_ENDIAN)) != 0) {
  18663. #ifdef WOLFSSL_EXTRA_ALERTS
  18664. if (ret == BUFFER_E)
  18665. SendAlert(ssl, alert_fatal, decode_error);
  18666. else if (ret == ECC_OUT_OF_RANGE_E)
  18667. SendAlert(ssl, alert_fatal, bad_record_mac);
  18668. else {
  18669. SendAlert(ssl, alert_fatal, illegal_parameter);
  18670. }
  18671. #endif
  18672. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  18673. }
  18674. if (wc_curve25519_import_public_ex(input + args->idx,
  18675. length, ssl->peerX25519Key,
  18676. EC25519_LITTLE_ENDIAN) != 0) {
  18677. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  18678. }
  18679. args->idx += length;
  18680. ssl->peerX25519KeyPresent = 1;
  18681. break;
  18682. }
  18683. #endif
  18684. #ifdef HAVE_CURVE448
  18685. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  18686. if (ssl->peerX448Key == NULL) {
  18687. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  18688. (void**)&ssl->peerX448Key);
  18689. if (ret != 0) {
  18690. goto exit_dske;
  18691. }
  18692. } else if (ssl->peerEccKeyPresent) {
  18693. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  18694. ssl->peerX448Key);
  18695. ssl->peerX448KeyPresent = 0;
  18696. if (ret != 0) {
  18697. goto exit_dske;
  18698. }
  18699. }
  18700. if ((ret = wc_curve448_check_public(
  18701. input + args->idx, length,
  18702. EC448_LITTLE_ENDIAN)) != 0) {
  18703. #ifdef WOLFSSL_EXTRA_ALERTS
  18704. if (ret == BUFFER_E)
  18705. SendAlert(ssl, alert_fatal, decode_error);
  18706. else if (ret == ECC_OUT_OF_RANGE_E)
  18707. SendAlert(ssl, alert_fatal, bad_record_mac);
  18708. else {
  18709. SendAlert(ssl, alert_fatal, illegal_parameter);
  18710. }
  18711. #endif
  18712. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  18713. }
  18714. if (wc_curve448_import_public_ex(input + args->idx,
  18715. length, ssl->peerX448Key,
  18716. EC448_LITTLE_ENDIAN) != 0) {
  18717. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  18718. }
  18719. args->idx += length;
  18720. ssl->peerX448KeyPresent = 1;
  18721. break;
  18722. }
  18723. #endif
  18724. if (ssl->peerEccKey == NULL) {
  18725. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  18726. (void**)&ssl->peerEccKey);
  18727. if (ret != 0) {
  18728. goto exit_dske;
  18729. }
  18730. } else if (ssl->peerEccKeyPresent) {
  18731. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  18732. ssl->peerEccKeyPresent = 0;
  18733. if (ret != 0) {
  18734. goto exit_dske;
  18735. }
  18736. }
  18737. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  18738. if (wc_ecc_import_x963_ex(input + args->idx, length,
  18739. ssl->peerEccKey, curveId) != 0) {
  18740. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  18741. }
  18742. args->idx += length;
  18743. ssl->peerEccKeyPresent = 1;
  18744. break;
  18745. }
  18746. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  18747. default:
  18748. ret = BAD_KEA_TYPE_E;
  18749. } /* switch(ssl->specs.kea) */
  18750. /* Check for error */
  18751. if (ret != 0) {
  18752. goto exit_dske;
  18753. }
  18754. /* Advance state and proceed */
  18755. ssl->options.asyncState = TLS_ASYNC_BUILD;
  18756. } /* case TLS_ASYNC_BEGIN */
  18757. FALL_THROUGH;
  18758. case TLS_ASYNC_BUILD:
  18759. {
  18760. switch(ssl->specs.kea)
  18761. {
  18762. case psk_kea:
  18763. case dhe_psk_kea:
  18764. case ecdhe_psk_kea:
  18765. {
  18766. /* Nothing to do in this sub-state */
  18767. break;
  18768. }
  18769. case diffie_hellman_kea:
  18770. case ecc_diffie_hellman_kea:
  18771. {
  18772. #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(HAVE_ED25519) \
  18773. && !defined(HAVE_ED448)
  18774. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  18775. #else
  18776. enum wc_HashType hashType;
  18777. word16 verifySz;
  18778. if (ssl->options.usingAnon_cipher) {
  18779. break;
  18780. }
  18781. verifySz = (word16)(args->idx - args->begin);
  18782. if (verifySz > MAX_DH_SZ) {
  18783. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18784. }
  18785. if (IsAtLeastTLSv1_2(ssl)) {
  18786. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  18787. size) {
  18788. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18789. }
  18790. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  18791. &args->sigAlgo);
  18792. args->idx += 2;
  18793. hashType = HashAlgoToType(args->hashAlgo);
  18794. if (hashType == WC_HASH_TYPE_NONE) {
  18795. ERROR_OUT(ALGO_ID_E, exit_dske);
  18796. }
  18797. } else {
  18798. /* only using sha and md5 for rsa */
  18799. #ifndef NO_OLD_TLS
  18800. hashType = WC_HASH_TYPE_SHA;
  18801. if (args->sigAlgo == rsa_sa_algo) {
  18802. hashType = WC_HASH_TYPE_MD5_SHA;
  18803. }
  18804. #else
  18805. ERROR_OUT(ALGO_ID_E, exit_dske);
  18806. #endif
  18807. }
  18808. /* signature */
  18809. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  18810. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18811. }
  18812. ato16(input + args->idx, &args->verifySigSz);
  18813. args->idx += OPAQUE16_LEN;
  18814. if ((args->idx - args->begin) + args->verifySigSz > size) {
  18815. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18816. }
  18817. /* buffer for signature */
  18818. ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + verifySz,
  18819. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  18820. if (ssl->buffers.sig.buffer == NULL) {
  18821. ERROR_OUT(MEMORY_E, exit_dske);
  18822. }
  18823. ssl->buffers.sig.length = SEED_LEN + verifySz;
  18824. /* build message to hash */
  18825. XMEMCPY(ssl->buffers.sig.buffer,
  18826. ssl->arrays->clientRandom, RAN_LEN);
  18827. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN],
  18828. ssl->arrays->serverRandom, RAN_LEN);
  18829. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2],
  18830. input + args->begin, verifySz); /* message */
  18831. if (args->sigAlgo != ed25519_sa_algo) {
  18832. int digest_sz = wc_HashGetDigestSize(hashType);
  18833. if (digest_sz <= 0) {
  18834. ERROR_OUT(BUFFER_ERROR, exit_dske);
  18835. }
  18836. ssl->buffers.digest.length = (unsigned int)digest_sz;
  18837. /* buffer for hash */
  18838. ssl->buffers.digest.buffer = (byte*)XMALLOC(
  18839. ssl->buffers.digest.length, ssl->heap,
  18840. DYNAMIC_TYPE_DIGEST);
  18841. if (ssl->buffers.digest.buffer == NULL) {
  18842. ERROR_OUT(MEMORY_E, exit_dske);
  18843. }
  18844. /* Perform hash */
  18845. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  18846. ssl->buffers.sig.length,
  18847. ssl->buffers.digest.buffer,
  18848. ssl->buffers.digest.length);
  18849. if (ret != 0) {
  18850. goto exit_dske;
  18851. }
  18852. }
  18853. switch (args->sigAlgo)
  18854. {
  18855. #ifndef NO_RSA
  18856. #ifdef WC_RSA_PSS
  18857. case rsa_pss_sa_algo:
  18858. #endif
  18859. case rsa_sa_algo:
  18860. {
  18861. if (ssl->peerRsaKey == NULL ||
  18862. !ssl->peerRsaKeyPresent) {
  18863. ERROR_OUT(NO_PEER_KEY, exit_dske);
  18864. }
  18865. break;
  18866. }
  18867. #endif /* !NO_RSA */
  18868. #ifdef HAVE_ECC
  18869. case ecc_dsa_sa_algo:
  18870. {
  18871. if (!ssl->peerEccDsaKeyPresent) {
  18872. ERROR_OUT(NO_PEER_KEY, exit_dske);
  18873. }
  18874. break;
  18875. }
  18876. #endif /* HAVE_ECC */
  18877. #if defined(HAVE_ED25519)
  18878. case ed25519_sa_algo:
  18879. {
  18880. if (!ssl->peerEd25519KeyPresent) {
  18881. ERROR_OUT(NO_PEER_KEY, exit_dske);
  18882. }
  18883. break;
  18884. }
  18885. #endif /* HAVE_ED25519 */
  18886. #if defined(HAVE_ED448)
  18887. case ed448_sa_algo:
  18888. {
  18889. if (!ssl->peerEd448KeyPresent) {
  18890. ERROR_OUT(NO_PEER_KEY, exit_dske);
  18891. }
  18892. break;
  18893. }
  18894. #endif /* HAVE_ED448 */
  18895. default:
  18896. ret = ALGO_ID_E;
  18897. } /* switch (args->sigAlgo) */
  18898. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  18899. break;
  18900. }
  18901. default:
  18902. ret = BAD_KEA_TYPE_E;
  18903. } /* switch(ssl->specs.kea) */
  18904. /* Check for error */
  18905. if (ret != 0) {
  18906. goto exit_dske;
  18907. }
  18908. /* Advance state and proceed */
  18909. ssl->options.asyncState = TLS_ASYNC_DO;
  18910. } /* case TLS_ASYNC_BUILD */
  18911. FALL_THROUGH;
  18912. case TLS_ASYNC_DO:
  18913. {
  18914. switch(ssl->specs.kea)
  18915. {
  18916. case psk_kea:
  18917. case dhe_psk_kea:
  18918. case ecdhe_psk_kea:
  18919. {
  18920. /* Nothing to do in this sub-state */
  18921. break;
  18922. }
  18923. case diffie_hellman_kea:
  18924. case ecc_diffie_hellman_kea:
  18925. {
  18926. #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(HAVE_ED25519) \
  18927. && !defined(HAVE_ED448)
  18928. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  18929. #else
  18930. if (ssl->options.usingAnon_cipher) {
  18931. break;
  18932. }
  18933. if (args->verifySig == NULL) {
  18934. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  18935. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  18936. if (args->verifySig == NULL) {
  18937. ERROR_OUT(MEMORY_E, exit_dske);
  18938. }
  18939. XMEMCPY(args->verifySig, input + args->idx,
  18940. args->verifySigSz);
  18941. }
  18942. switch (args->sigAlgo)
  18943. {
  18944. #ifndef NO_RSA
  18945. #ifdef WC_RSA_PSS
  18946. case rsa_pss_sa_algo:
  18947. #endif
  18948. case rsa_sa_algo:
  18949. {
  18950. ret = RsaVerify(ssl,
  18951. args->verifySig, args->verifySigSz,
  18952. &args->output,
  18953. args->sigAlgo, args->hashAlgo,
  18954. ssl->peerRsaKey,
  18955. #ifdef HAVE_PK_CALLBACKS
  18956. &ssl->buffers.peerRsaKey
  18957. #else
  18958. NULL
  18959. #endif
  18960. );
  18961. if (ret >= 0) {
  18962. args->sigSz = (word16)ret;
  18963. #ifdef WC_RSA_PSS
  18964. args->bits = mp_count_bits(&ssl->peerRsaKey->n);
  18965. #endif
  18966. ret = 0;
  18967. }
  18968. #ifdef WOLFSSL_ASYNC_CRYPT
  18969. if (ret != WC_PENDING_E)
  18970. #endif
  18971. {
  18972. /* peerRsaKey */
  18973. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  18974. (void**)&ssl->peerRsaKey);
  18975. ssl->peerRsaKeyPresent = 0;
  18976. }
  18977. break;
  18978. }
  18979. #endif /* !NO_RSA */
  18980. #ifdef HAVE_ECC
  18981. case ecc_dsa_sa_algo:
  18982. {
  18983. ret = EccVerify(ssl,
  18984. args->verifySig, args->verifySigSz,
  18985. ssl->buffers.digest.buffer,
  18986. ssl->buffers.digest.length,
  18987. ssl->peerEccDsaKey,
  18988. #ifdef HAVE_PK_CALLBACKS
  18989. &ssl->buffers.peerEccDsaKey
  18990. #else
  18991. NULL
  18992. #endif
  18993. );
  18994. #ifdef WOLFSSL_ASYNC_CRYPT
  18995. if (ret != WC_PENDING_E)
  18996. #endif
  18997. {
  18998. /* peerEccDsaKey */
  18999. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  19000. (void**)&ssl->peerEccDsaKey);
  19001. ssl->peerEccDsaKeyPresent = 0;
  19002. }
  19003. break;
  19004. }
  19005. #endif /* HAVE_ECC */
  19006. #if defined(HAVE_ED25519)
  19007. case ed25519_sa_algo:
  19008. {
  19009. ret = Ed25519Verify(ssl,
  19010. args->verifySig, args->verifySigSz,
  19011. ssl->buffers.sig.buffer,
  19012. ssl->buffers.sig.length,
  19013. ssl->peerEd25519Key,
  19014. #ifdef HAVE_PK_CALLBACKS
  19015. &ssl->buffers.peerEd25519Key
  19016. #else
  19017. NULL
  19018. #endif
  19019. );
  19020. #ifdef WOLFSSL_ASYNC_CRYPT
  19021. if (ret != WC_PENDING_E)
  19022. #endif
  19023. {
  19024. /* peerEccDsaKey */
  19025. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  19026. (void**)&ssl->peerEd25519Key);
  19027. ssl->peerEd25519KeyPresent = 0;
  19028. }
  19029. break;
  19030. }
  19031. #endif /* HAVE_ED25519 */
  19032. #if defined(HAVE_ED448)
  19033. case ed448_sa_algo:
  19034. {
  19035. ret = Ed448Verify(ssl,
  19036. args->verifySig, args->verifySigSz,
  19037. ssl->buffers.sig.buffer,
  19038. ssl->buffers.sig.length,
  19039. ssl->peerEd448Key,
  19040. #ifdef HAVE_PK_CALLBACKS
  19041. &ssl->buffers.peerEd448Key
  19042. #else
  19043. NULL
  19044. #endif
  19045. );
  19046. #ifdef WOLFSSL_ASYNC_CRYPT
  19047. if (ret != WC_PENDING_E)
  19048. #endif
  19049. {
  19050. /* peerEccDsaKey */
  19051. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  19052. (void**)&ssl->peerEd448Key);
  19053. ssl->peerEd448KeyPresent = 0;
  19054. }
  19055. break;
  19056. }
  19057. #endif /* HAVE_ED448 */
  19058. default:
  19059. ret = ALGO_ID_E;
  19060. } /* switch (sigAlgo) */
  19061. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  19062. break;
  19063. }
  19064. default:
  19065. ret = BAD_KEA_TYPE_E;
  19066. } /* switch(ssl->specs.kea) */
  19067. /* Check for error */
  19068. if (ret != 0) {
  19069. goto exit_dske;
  19070. }
  19071. /* Advance state and proceed */
  19072. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  19073. } /* case TLS_ASYNC_DO */
  19074. FALL_THROUGH;
  19075. case TLS_ASYNC_VERIFY:
  19076. {
  19077. switch(ssl->specs.kea)
  19078. {
  19079. case psk_kea:
  19080. case dhe_psk_kea:
  19081. case ecdhe_psk_kea:
  19082. {
  19083. /* Nothing to do in this sub-state */
  19084. break;
  19085. }
  19086. case diffie_hellman_kea:
  19087. case ecc_diffie_hellman_kea:
  19088. {
  19089. #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(HAVE_ED25519) \
  19090. && !defined(HAVE_ED448)
  19091. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  19092. #else
  19093. if (ssl->options.usingAnon_cipher) {
  19094. break;
  19095. }
  19096. /* increment index after verify is done */
  19097. args->idx += args->verifySigSz;
  19098. switch(args->sigAlgo)
  19099. {
  19100. #ifndef NO_RSA
  19101. #ifdef WC_RSA_PSS
  19102. case rsa_pss_sa_algo:
  19103. #ifdef HAVE_SELFTEST
  19104. ret = wc_RsaPSS_CheckPadding(
  19105. ssl->buffers.digest.buffer,
  19106. ssl->buffers.digest.length,
  19107. args->output, args->sigSz,
  19108. HashAlgoToType(args->hashAlgo));
  19109. #else
  19110. ret = wc_RsaPSS_CheckPadding_ex(
  19111. ssl->buffers.digest.buffer,
  19112. ssl->buffers.digest.length,
  19113. args->output, args->sigSz,
  19114. HashAlgoToType(args->hashAlgo),
  19115. -1, args->bits);
  19116. #endif
  19117. if (ret != 0)
  19118. return ret;
  19119. break;
  19120. #endif
  19121. case rsa_sa_algo:
  19122. {
  19123. if (IsAtLeastTLSv1_2(ssl)) {
  19124. #ifdef WOLFSSL_SMALL_STACK
  19125. byte* encodedSig;
  19126. #else
  19127. byte encodedSig[MAX_ENCODED_SIG_SZ];
  19128. #endif
  19129. word32 encSigSz;
  19130. #ifdef WOLFSSL_SMALL_STACK
  19131. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  19132. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  19133. if (encodedSig == NULL) {
  19134. ERROR_OUT(MEMORY_E, exit_dske);
  19135. }
  19136. #endif
  19137. encSigSz = wc_EncodeSignature(encodedSig,
  19138. ssl->buffers.digest.buffer,
  19139. ssl->buffers.digest.length,
  19140. TypeHash(args->hashAlgo));
  19141. if (encSigSz != args->sigSz || !args->output ||
  19142. XMEMCMP(args->output, encodedSig,
  19143. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  19144. ret = VERIFY_SIGN_ERROR;
  19145. }
  19146. #ifdef WOLFSSL_SMALL_STACK
  19147. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  19148. #endif
  19149. if (ret != 0) {
  19150. goto exit_dske;
  19151. }
  19152. }
  19153. else if (args->sigSz != FINISHED_SZ ||
  19154. !args->output ||
  19155. XMEMCMP(args->output,
  19156. ssl->buffers.digest.buffer,
  19157. FINISHED_SZ) != 0) {
  19158. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  19159. }
  19160. break;
  19161. }
  19162. #endif /* !NO_RSA */
  19163. #ifdef HAVE_ECC
  19164. case ecc_dsa_sa_algo:
  19165. /* Nothing to do in this algo */
  19166. break;
  19167. #endif /* HAVE_ECC */
  19168. #if defined(HAVE_ED25519)
  19169. case ed25519_sa_algo:
  19170. /* Nothing to do in this algo */
  19171. break;
  19172. #endif /* HAVE_ED25519 */
  19173. #if defined(HAVE_ED448)
  19174. case ed448_sa_algo:
  19175. /* Nothing to do in this algo */
  19176. break;
  19177. #endif /* HAVE_ED448 */
  19178. default:
  19179. ret = ALGO_ID_E;
  19180. } /* switch (sigAlgo) */
  19181. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  19182. break;
  19183. }
  19184. default:
  19185. ret = BAD_KEA_TYPE_E;
  19186. } /* switch(ssl->specs.kea) */
  19187. /* Check for error */
  19188. if (ret != 0) {
  19189. goto exit_dske;
  19190. }
  19191. /* Advance state and proceed */
  19192. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  19193. } /* case TLS_ASYNC_VERIFY */
  19194. FALL_THROUGH;
  19195. case TLS_ASYNC_FINALIZE:
  19196. {
  19197. if (IsEncryptionOn(ssl, 0)) {
  19198. args->idx += ssl->keys.padSz;
  19199. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19200. if (ssl->options.startedETMRead)
  19201. args->idx += MacSize(ssl);
  19202. #endif
  19203. }
  19204. /* QSH extensions */
  19205. #ifdef HAVE_QSH
  19206. if (ssl->peerQSHKeyPresent) {
  19207. word16 name;
  19208. int qshSz;
  19209. /* extension name */
  19210. ato16(input + args->idx, &name);
  19211. args->idx += OPAQUE16_LEN;
  19212. if (name == TLSX_QUANTUM_SAFE_HYBRID) {
  19213. /* if qshSz is larger than 0 it is the length of
  19214. buffer used */
  19215. if ((qshSz = TLSX_QSHCipher_Parse(ssl, input + args->idx,
  19216. size, 0)) < 0) {
  19217. ERROR_OUT(qshSz, exit_dske);
  19218. }
  19219. args->idx += qshSz;
  19220. }
  19221. else {
  19222. /* unknown extension sent server ignored handshake */
  19223. ERROR_OUT(BUFFER_ERROR, exit_dske);
  19224. }
  19225. }
  19226. #endif
  19227. /* Advance state and proceed */
  19228. ssl->options.asyncState = TLS_ASYNC_END;
  19229. } /* case TLS_ASYNC_FINALIZE */
  19230. FALL_THROUGH;
  19231. case TLS_ASYNC_END:
  19232. {
  19233. /* return index */
  19234. *inOutIdx = args->idx;
  19235. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  19236. break;
  19237. }
  19238. default:
  19239. ret = INPUT_CASE_ERROR;
  19240. } /* switch(ssl->options.asyncState) */
  19241. exit_dske:
  19242. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  19243. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  19244. #ifdef WOLFSSL_ASYNC_CRYPT
  19245. /* Handle async operation */
  19246. if (ret == WC_PENDING_E) {
  19247. /* Mark message as not received so it can process again */
  19248. ssl->msgsReceived.got_server_key_exchange = 0;
  19249. return ret;
  19250. }
  19251. #endif /* WOLFSSL_ASYNC_CRYPT */
  19252. /* Final cleanup */
  19253. FreeDskeArgs(ssl, args);
  19254. FreeKeyExchange(ssl);
  19255. return ret;
  19256. }
  19257. #ifdef HAVE_QSH
  19258. #ifdef HAVE_NTRU
  19259. /* Encrypt a byte array using ntru
  19260. key a struct containing the public key to use
  19261. bufIn array to be encrypted
  19262. inSz size of bufIn array
  19263. bufOut cipher text out
  19264. outSz will be set to the new size of cipher text
  19265. */
  19266. static int NtruSecretEncrypt(QSHKey* key, byte* bufIn, word32 inSz,
  19267. byte* bufOut, word16* outSz)
  19268. {
  19269. int ret;
  19270. DRBG_HANDLE drbg;
  19271. /* sanity checks on input arguments */
  19272. if (key == NULL || bufIn == NULL || bufOut == NULL || outSz == NULL)
  19273. return BAD_FUNC_ARG;
  19274. if (key->pub.buffer == NULL)
  19275. return BAD_FUNC_ARG;
  19276. switch (key->name) {
  19277. case WOLFSSL_NTRU_EESS439:
  19278. case WOLFSSL_NTRU_EESS593:
  19279. case WOLFSSL_NTRU_EESS743:
  19280. break;
  19281. default:
  19282. WOLFSSL_MSG("Unknown QSH encryption key!");
  19283. return -1;
  19284. }
  19285. /* set up ntru drbg */
  19286. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  19287. if (ret != DRBG_OK)
  19288. return NTRU_DRBG_ERROR;
  19289. /* encrypt the byte array */
  19290. ret = ntru_crypto_ntru_encrypt(drbg, key->pub.length, key->pub.buffer,
  19291. inSz, bufIn, outSz, bufOut);
  19292. ntru_crypto_drbg_uninstantiate(drbg);
  19293. if (ret != NTRU_OK)
  19294. return NTRU_ENCRYPT_ERROR;
  19295. return ret;
  19296. }
  19297. /* Decrypt a byte array using ntru
  19298. key a struct containing the private key to use
  19299. bufIn array to be decrypted
  19300. inSz size of bufIn array
  19301. bufOut plain text out
  19302. outSz will be set to the new size of plain text
  19303. */
  19304. static int NtruSecretDecrypt(QSHKey* key, byte* bufIn, word32 inSz,
  19305. byte* bufOut, word16* outSz)
  19306. {
  19307. int ret;
  19308. DRBG_HANDLE drbg;
  19309. /* sanity checks on input arguments */
  19310. if (key == NULL || bufIn == NULL || bufOut == NULL || outSz == NULL)
  19311. return BAD_FUNC_ARG;
  19312. if (key->pri.buffer == NULL)
  19313. return BAD_FUNC_ARG;
  19314. switch (key->name) {
  19315. case WOLFSSL_NTRU_EESS439:
  19316. case WOLFSSL_NTRU_EESS593:
  19317. case WOLFSSL_NTRU_EESS743:
  19318. break;
  19319. default:
  19320. WOLFSSL_MSG("Unknown QSH decryption key!");
  19321. return -1;
  19322. }
  19323. /* set up drbg */
  19324. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  19325. if (ret != DRBG_OK)
  19326. return NTRU_DRBG_ERROR;
  19327. /* decrypt cipher text */
  19328. ret = ntru_crypto_ntru_decrypt(key->pri.length, key->pri.buffer,
  19329. inSz, bufIn, outSz, bufOut);
  19330. ntru_crypto_drbg_uninstantiate(drbg);
  19331. if (ret != NTRU_OK)
  19332. return NTRU_ENCRYPT_ERROR;
  19333. return ret;
  19334. }
  19335. #endif /* HAVE_NTRU */
  19336. int QSH_Init(WOLFSSL* ssl)
  19337. {
  19338. /* check so not initializing twice when running DTLS */
  19339. if (ssl->QSH_secret != NULL)
  19340. return 0;
  19341. /* malloc memory for holding generated secret information */
  19342. if ((ssl->QSH_secret = (QSHSecret*)XMALLOC(sizeof(QSHSecret), ssl->heap,
  19343. DYNAMIC_TYPE_QSH)) == NULL)
  19344. return MEMORY_E;
  19345. ssl->QSH_secret->CliSi = (buffer*)XMALLOC(sizeof(buffer), ssl->heap,
  19346. DYNAMIC_TYPE_SECRET);
  19347. if (ssl->QSH_secret->CliSi == NULL)
  19348. return MEMORY_E;
  19349. ssl->QSH_secret->SerSi = (buffer*)XMALLOC(sizeof(buffer), ssl->heap,
  19350. DYNAMIC_TYPE_SECRET);
  19351. if (ssl->QSH_secret->SerSi == NULL)
  19352. return MEMORY_E;
  19353. /* initialize variables */
  19354. ssl->QSH_secret->list = NULL;
  19355. ssl->QSH_secret->CliSi->length = 0;
  19356. ssl->QSH_secret->CliSi->buffer = NULL;
  19357. ssl->QSH_secret->SerSi->length = 0;
  19358. ssl->QSH_secret->SerSi->buffer = NULL;
  19359. return 0;
  19360. }
  19361. static int QSH_Encrypt(QSHKey* key, byte* in, word32 szIn,
  19362. byte* out, word32* szOut)
  19363. {
  19364. int ret = 0;
  19365. word16 size = *szOut;
  19366. (void)in;
  19367. (void)szIn;
  19368. (void)out;
  19369. (void)szOut;
  19370. WOLFSSL_MSG("Encrypting QSH key material");
  19371. switch (key->name) {
  19372. #ifdef HAVE_NTRU
  19373. case WOLFSSL_NTRU_EESS439:
  19374. case WOLFSSL_NTRU_EESS593:
  19375. case WOLFSSL_NTRU_EESS743:
  19376. ret = NtruSecretEncrypt(key, in, szIn, out, &size);
  19377. break;
  19378. #endif
  19379. default:
  19380. WOLFSSL_MSG("Unknown QSH encryption key!");
  19381. return -1;
  19382. }
  19383. *szOut = size;
  19384. return ret;
  19385. }
  19386. /* Decrypt using Quantum Safe Handshake algorithms */
  19387. int QSH_Decrypt(QSHKey* key, byte* in, word32 szIn, byte* out, word16* szOut)
  19388. {
  19389. int ret = 0;
  19390. word16 size = *szOut;
  19391. (void)in;
  19392. (void)szIn;
  19393. (void)out;
  19394. (void)szOut;
  19395. WOLFSSL_MSG("Decrypting QSH key material");
  19396. switch (key->name) {
  19397. #ifdef HAVE_NTRU
  19398. case WOLFSSL_NTRU_EESS439:
  19399. case WOLFSSL_NTRU_EESS593:
  19400. case WOLFSSL_NTRU_EESS743:
  19401. ret = NtruSecretDecrypt(key, in, szIn, out, &size);
  19402. break;
  19403. #endif
  19404. default:
  19405. WOLFSSL_MSG("Unknown QSH decryption key!");
  19406. return -1;
  19407. }
  19408. *szOut = size;
  19409. return ret;
  19410. }
  19411. /* Get the max cipher text for corresponding encryption scheme
  19412. (encrypting 48 or max plain text whichever is smaller)
  19413. */
  19414. static word32 QSH_MaxSecret(QSHKey* key)
  19415. {
  19416. int ret = 0;
  19417. #ifdef HAVE_NTRU
  19418. byte isNtru = 0;
  19419. word16 inSz = 48;
  19420. word16 outSz;
  19421. DRBG_HANDLE drbg = 0;
  19422. byte bufIn[48];
  19423. #endif
  19424. if (key == NULL || key->pub.length == 0)
  19425. return 0;
  19426. switch(key->name) {
  19427. #ifdef HAVE_NTRU
  19428. case WOLFSSL_NTRU_EESS439:
  19429. isNtru = 1;
  19430. break;
  19431. case WOLFSSL_NTRU_EESS593:
  19432. isNtru = 1;
  19433. break;
  19434. case WOLFSSL_NTRU_EESS743:
  19435. isNtru = 1;
  19436. break;
  19437. #endif
  19438. default:
  19439. WOLFSSL_MSG("Unknown QSH encryption scheme size!");
  19440. return 0;
  19441. }
  19442. #ifdef HAVE_NTRU
  19443. if (isNtru) {
  19444. ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  19445. if (ret != DRBG_OK)
  19446. return NTRU_DRBG_ERROR;
  19447. ret = ntru_crypto_ntru_encrypt(drbg, key->pub.length,
  19448. key->pub.buffer, inSz, bufIn, &outSz, NULL);
  19449. if (ret != NTRU_OK) {
  19450. return NTRU_ENCRYPT_ERROR;
  19451. }
  19452. ntru_crypto_drbg_uninstantiate(drbg);
  19453. ret = outSz;
  19454. }
  19455. #endif
  19456. return ret;
  19457. }
  19458. /* Generate the secret byte material for pms
  19459. returns length on success and -1 on fail
  19460. */
  19461. static int QSH_GenerateSerCliSecret(WOLFSSL* ssl, byte isServer)
  19462. {
  19463. int sz = 0;
  19464. int plainSz = 48; /* lesser of 48 and max plain text able to encrypt */
  19465. int offset = 0;
  19466. word32 tmpSz = 0;
  19467. buffer* buf;
  19468. QSHKey* current;
  19469. QSHScheme* schmPre = NULL;
  19470. QSHScheme* schm = NULL;
  19471. if (ssl == NULL)
  19472. return -1;
  19473. WOLFSSL_MSG("Generating QSH secret key material");
  19474. current = ssl->peerQSHKey;
  19475. /* get size of buffer needed */
  19476. while (current) {
  19477. if (current->pub.length != 0) {
  19478. sz += plainSz;
  19479. }
  19480. current = (QSHKey*)current->next;
  19481. }
  19482. /* allocate memory for buffer */
  19483. if (isServer) {
  19484. buf = ssl->QSH_secret->SerSi;
  19485. }
  19486. else {
  19487. buf = ssl->QSH_secret->CliSi;
  19488. }
  19489. buf->length = sz;
  19490. buf->buffer = (byte*)XMALLOC(sz, ssl->heap, DYNAMIC_TYPE_SECRET);
  19491. if (buf->buffer == NULL) {
  19492. WOLFSSL_ERROR(MEMORY_E);
  19493. }
  19494. /* create secret information */
  19495. sz = 0;
  19496. current = ssl->peerQSHKey;
  19497. while (current) {
  19498. schm = (QSHScheme*)XMALLOC(sizeof(QSHScheme), ssl->heap,
  19499. DYNAMIC_TYPE_QSH);
  19500. if (schm == NULL)
  19501. return MEMORY_E;
  19502. /* initialize variables */
  19503. schm->name = 0;
  19504. schm->PK = NULL;
  19505. schm->PKLen = 0;
  19506. schm->next = NULL;
  19507. if (ssl->QSH_secret->list == NULL) {
  19508. ssl->QSH_secret->list = schm;
  19509. }
  19510. else {
  19511. if (schmPre)
  19512. schmPre->next = schm;
  19513. }
  19514. tmpSz = QSH_MaxSecret(current);
  19515. if ((schm->PK = (byte*)XMALLOC(tmpSz, ssl->heap,
  19516. DYNAMIC_TYPE_SECRET)) == NULL)
  19517. return -1;
  19518. /* store info for writing extension */
  19519. schm->name = current->name;
  19520. /* no key to use for encryption */
  19521. if (tmpSz == 0) {
  19522. current = (QSHKey*)current->next;
  19523. continue;
  19524. }
  19525. if (wc_RNG_GenerateBlock(ssl->rng, buf->buffer + offset, plainSz)
  19526. != 0) {
  19527. return -1;
  19528. }
  19529. if (QSH_Encrypt(current, buf->buffer + offset, plainSz, schm->PK,
  19530. &tmpSz) != 0) {
  19531. return -1;
  19532. }
  19533. schm->PKLen = tmpSz;
  19534. sz += tmpSz;
  19535. offset += plainSz;
  19536. schmPre = schm;
  19537. current = (QSHKey*)current->next;
  19538. }
  19539. return sz;
  19540. }
  19541. static word32 QSH_KeyGetSize(WOLFSSL* ssl)
  19542. {
  19543. word32 sz = 0;
  19544. QSHKey* current;
  19545. if (ssl == NULL)
  19546. return -1;
  19547. current = ssl->peerQSHKey;
  19548. sz += OPAQUE16_LEN; /* type of extension ie 0x00 0x18 */
  19549. sz += OPAQUE24_LEN;
  19550. /* get size of buffer needed */
  19551. while (current) {
  19552. sz += OPAQUE16_LEN; /* scheme id */
  19553. sz += OPAQUE16_LEN; /* encrypted key len*/
  19554. sz += QSH_MaxSecret(current);
  19555. current = (QSHKey*)current->next;
  19556. }
  19557. return sz;
  19558. }
  19559. /* handle QSH key Exchange
  19560. return 0 on success
  19561. */
  19562. static word32 QSH_KeyExchangeWrite(WOLFSSL* ssl, byte isServer)
  19563. {
  19564. int ret = 0;
  19565. WOLFSSL_ENTER("QSH KeyExchange");
  19566. ret = QSH_GenerateSerCliSecret(ssl, isServer);
  19567. if (ret < 0)
  19568. return MEMORY_E;
  19569. return 0;
  19570. }
  19571. #endif /* HAVE_QSH */
  19572. typedef struct SckeArgs {
  19573. byte* output; /* not allocated */
  19574. byte* encSecret;
  19575. byte* input;
  19576. word32 encSz;
  19577. word32 length;
  19578. int sendSz;
  19579. int inputSz;
  19580. } SckeArgs;
  19581. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  19582. {
  19583. SckeArgs* args = (SckeArgs*)pArgs;
  19584. (void)ssl;
  19585. if (args->encSecret) {
  19586. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  19587. args->encSecret = NULL;
  19588. }
  19589. if (args->input) {
  19590. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19591. args->input = NULL;
  19592. }
  19593. }
  19594. /* handle generation client_key_exchange (16) */
  19595. int SendClientKeyExchange(WOLFSSL* ssl)
  19596. {
  19597. int ret = 0;
  19598. #ifdef WOLFSSL_ASYNC_CRYPT
  19599. SckeArgs* args = (SckeArgs*)ssl->async.args;
  19600. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  19601. (void)sizeof(args_test);
  19602. #else
  19603. SckeArgs args[1];
  19604. #endif
  19605. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  19606. WOLFSSL_ENTER("SendClientKeyExchange");
  19607. #ifdef OPENSSL_EXTRA
  19608. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  19609. ssl->cbmode = SSL_CB_MODE_WRITE;
  19610. if (ssl->CBIS != NULL)
  19611. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  19612. #endif
  19613. #ifdef WOLFSSL_ASYNC_CRYPT
  19614. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  19615. if (ret != WC_NOT_PENDING_E) {
  19616. /* Check for error */
  19617. if (ret < 0)
  19618. goto exit_scke;
  19619. }
  19620. else
  19621. #endif
  19622. {
  19623. /* Reset state */
  19624. ret = 0;
  19625. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  19626. XMEMSET(args, 0, sizeof(SckeArgs));
  19627. #ifdef WOLFSSL_ASYNC_CRYPT
  19628. ssl->async.freeArgs = FreeSckeArgs;
  19629. #endif
  19630. }
  19631. switch(ssl->options.asyncState)
  19632. {
  19633. case TLS_ASYNC_BEGIN:
  19634. {
  19635. switch (ssl->specs.kea) {
  19636. #ifndef NO_RSA
  19637. case rsa_kea:
  19638. if (ssl->peerRsaKey == NULL ||
  19639. ssl->peerRsaKeyPresent == 0) {
  19640. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19641. }
  19642. break;
  19643. #endif
  19644. #ifndef NO_DH
  19645. case diffie_hellman_kea:
  19646. if (ssl->buffers.serverDH_P.buffer == NULL ||
  19647. ssl->buffers.serverDH_G.buffer == NULL ||
  19648. ssl->buffers.serverDH_Pub.buffer == NULL) {
  19649. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19650. }
  19651. break;
  19652. #endif /* NO_DH */
  19653. #ifndef NO_PSK
  19654. case psk_kea:
  19655. /* sanity check that PSK client callback has been set */
  19656. if (ssl->options.client_psk_cb == NULL) {
  19657. WOLFSSL_MSG("No client PSK callback set");
  19658. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  19659. }
  19660. break;
  19661. #endif /* NO_PSK */
  19662. #if !defined(NO_DH) && !defined(NO_PSK)
  19663. case dhe_psk_kea:
  19664. if (ssl->buffers.serverDH_P.buffer == NULL ||
  19665. ssl->buffers.serverDH_G.buffer == NULL ||
  19666. ssl->buffers.serverDH_Pub.buffer == NULL) {
  19667. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19668. }
  19669. /* sanity check that PSK client callback has been set */
  19670. if (ssl->options.client_psk_cb == NULL) {
  19671. WOLFSSL_MSG("No client PSK callback set");
  19672. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  19673. }
  19674. break;
  19675. #endif /* !NO_DH && !NO_PSK */
  19676. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  19677. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  19678. case ecdhe_psk_kea:
  19679. /* sanity check that PSK client callback has been set */
  19680. if (ssl->options.client_psk_cb == NULL) {
  19681. WOLFSSL_MSG("No client PSK callback set");
  19682. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  19683. }
  19684. #ifdef HAVE_CURVE25519
  19685. if (ssl->peerX25519KeyPresent) {
  19686. /* Check client ECC public key */
  19687. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  19688. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19689. }
  19690. #ifdef HAVE_PK_CALLBACKS
  19691. /* if callback then use it for shared secret */
  19692. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  19693. break;
  19694. }
  19695. #endif
  19696. /* create private key */
  19697. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  19698. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19699. if (ret != 0) {
  19700. goto exit_scke;
  19701. }
  19702. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  19703. ssl->peerX25519Key);
  19704. break;
  19705. }
  19706. #endif
  19707. #ifdef HAVE_CURVE448
  19708. if (ssl->peerX448KeyPresent) {
  19709. /* Check client ECC public key */
  19710. if (!ssl->peerX448Key) {
  19711. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19712. }
  19713. #ifdef HAVE_PK_CALLBACKS
  19714. /* if callback then use it for shared secret */
  19715. if (ssl->ctx->X448SharedSecretCb != NULL) {
  19716. break;
  19717. }
  19718. #endif
  19719. /* create private key */
  19720. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  19721. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19722. if (ret != 0) {
  19723. goto exit_scke;
  19724. }
  19725. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  19726. ssl->peerX448Key);
  19727. break;
  19728. }
  19729. #endif
  19730. /* Check client ECC public key */
  19731. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  19732. !ssl->peerEccKey->dp) {
  19733. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19734. }
  19735. #ifdef HAVE_PK_CALLBACKS
  19736. /* if callback then use it for shared secret */
  19737. if (ssl->ctx->EccSharedSecretCb != NULL) {
  19738. break;
  19739. }
  19740. #endif
  19741. /* create ephemeral private key */
  19742. ssl->hsType = DYNAMIC_TYPE_ECC;
  19743. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19744. if (ret != 0) {
  19745. goto exit_scke;
  19746. }
  19747. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  19748. break;
  19749. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  19750. #ifdef HAVE_NTRU
  19751. case ntru_kea:
  19752. if (ssl->peerNtruKeyPresent == 0) {
  19753. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19754. }
  19755. break;
  19756. #endif /* HAVE_NTRU */
  19757. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  19758. defined(HAVE_CURVE448)
  19759. case ecc_diffie_hellman_kea:
  19760. {
  19761. #ifdef HAVE_ECC
  19762. ecc_key* peerKey;
  19763. #endif
  19764. #ifdef HAVE_PK_CALLBACKS
  19765. /* if callback then use it for shared secret */
  19766. #ifdef HAVE_CURVE25519
  19767. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  19768. if (ssl->ctx->X25519SharedSecretCb != NULL)
  19769. break;
  19770. }
  19771. else
  19772. #endif
  19773. #ifdef HAVE_CURVE448
  19774. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  19775. if (ssl->ctx->X448SharedSecretCb != NULL)
  19776. break;
  19777. }
  19778. else
  19779. #endif
  19780. if (ssl->ctx->EccSharedSecretCb != NULL) {
  19781. break;
  19782. }
  19783. #endif /* HAVE_PK_CALLBACKS */
  19784. #ifdef HAVE_CURVE25519
  19785. if (ssl->peerX25519KeyPresent) {
  19786. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  19787. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19788. }
  19789. /* create private key */
  19790. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  19791. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19792. if (ret != 0) {
  19793. goto exit_scke;
  19794. }
  19795. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  19796. ssl->peerX25519Key);
  19797. break;
  19798. }
  19799. #endif
  19800. #ifdef HAVE_CURVE448
  19801. if (ssl->peerX448KeyPresent) {
  19802. if (!ssl->peerX448Key) {
  19803. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19804. }
  19805. /* create private key */
  19806. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  19807. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19808. if (ret != 0) {
  19809. goto exit_scke;
  19810. }
  19811. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  19812. ssl->peerX448Key);
  19813. break;
  19814. }
  19815. #endif
  19816. #ifdef HAVE_ECC
  19817. if (ssl->specs.static_ecdh) {
  19818. /* Note: EccDsa is really fixed Ecc key here */
  19819. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
  19820. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19821. }
  19822. peerKey = ssl->peerEccDsaKey;
  19823. }
  19824. else {
  19825. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
  19826. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19827. }
  19828. peerKey = ssl->peerEccKey;
  19829. }
  19830. if (peerKey == NULL) {
  19831. ERROR_OUT(NO_PEER_KEY, exit_scke);
  19832. }
  19833. /* create ephemeral private key */
  19834. ssl->hsType = DYNAMIC_TYPE_ECC;
  19835. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19836. if (ret != 0) {
  19837. goto exit_scke;
  19838. }
  19839. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  19840. #endif
  19841. break;
  19842. }
  19843. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  19844. default:
  19845. ret = BAD_KEA_TYPE_E;
  19846. } /* switch(ssl->specs.kea) */
  19847. /* Check for error */
  19848. if (ret != 0) {
  19849. goto exit_scke;
  19850. }
  19851. /* Advance state and proceed */
  19852. ssl->options.asyncState = TLS_ASYNC_BUILD;
  19853. } /* case TLS_ASYNC_BEGIN */
  19854. FALL_THROUGH;
  19855. case TLS_ASYNC_BUILD:
  19856. {
  19857. args->encSz = MAX_ENCRYPT_SZ;
  19858. args->encSecret = (byte*)XMALLOC(args->encSz, ssl->heap,
  19859. DYNAMIC_TYPE_SECRET);
  19860. if (args->encSecret == NULL) {
  19861. ERROR_OUT(MEMORY_E, exit_scke);
  19862. }
  19863. if (ssl->arrays->preMasterSecret == NULL) {
  19864. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  19865. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  19866. ssl->heap, DYNAMIC_TYPE_SECRET);
  19867. if (ssl->arrays->preMasterSecret == NULL) {
  19868. ERROR_OUT(MEMORY_E, exit_scke);
  19869. }
  19870. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  19871. }
  19872. switch(ssl->specs.kea)
  19873. {
  19874. #ifndef NO_RSA
  19875. case rsa_kea:
  19876. {
  19877. /* build PreMasterSecret with RNG data */
  19878. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  19879. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  19880. if (tsip_useable(ssl)) {
  19881. ret = tsip_generatePremasterSecret(
  19882. &ssl->arrays->preMasterSecret[VERSION_SZ],
  19883. ENCRYPT_LEN - VERSION_SZ);
  19884. } else {
  19885. #endif
  19886. ret = wc_RNG_GenerateBlock(ssl->rng,
  19887. &ssl->arrays->preMasterSecret[VERSION_SZ],
  19888. SECRET_LEN - VERSION_SZ);
  19889. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  19890. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  19891. }
  19892. #endif
  19893. if (ret != 0) {
  19894. goto exit_scke;
  19895. }
  19896. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  19897. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  19898. ssl->arrays->preMasterSz = SECRET_LEN;
  19899. break;
  19900. }
  19901. #endif /* !NO_RSA */
  19902. #ifndef NO_DH
  19903. case diffie_hellman_kea:
  19904. {
  19905. ssl->buffers.sig.length = ENCRYPT_LEN;
  19906. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  19907. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  19908. if (ssl->buffers.sig.buffer == NULL) {
  19909. ERROR_OUT(MEMORY_E, exit_scke);
  19910. }
  19911. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  19912. (void**)&ssl->buffers.serverDH_Key);
  19913. if (ret != 0) {
  19914. goto exit_scke;
  19915. }
  19916. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  19917. !defined(WOLFSSL_OLD_PRIME_CHECK)
  19918. if (ssl->options.dhDoKeyTest &&
  19919. !ssl->options.dhKeyTested)
  19920. {
  19921. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  19922. ssl->buffers.serverDH_P.buffer,
  19923. ssl->buffers.serverDH_P.length,
  19924. ssl->buffers.serverDH_G.buffer,
  19925. ssl->buffers.serverDH_G.length,
  19926. NULL, 0, 0, ssl->rng);
  19927. if (ret != 0) {
  19928. goto exit_scke;
  19929. }
  19930. ssl->options.dhKeyTested = 1;
  19931. }
  19932. else
  19933. #endif
  19934. {
  19935. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  19936. ssl->buffers.serverDH_P.buffer,
  19937. ssl->buffers.serverDH_P.length,
  19938. ssl->buffers.serverDH_G.buffer,
  19939. ssl->buffers.serverDH_G.length);
  19940. if (ret != 0) {
  19941. goto exit_scke;
  19942. }
  19943. }
  19944. /* for DH, encSecret is Yc, agree is pre-master */
  19945. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  19946. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  19947. args->encSecret, &args->encSz);
  19948. /* set the max agree result size */
  19949. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  19950. break;
  19951. }
  19952. #endif /* !NO_DH */
  19953. #ifndef NO_PSK
  19954. case psk_kea:
  19955. {
  19956. byte* pms = ssl->arrays->preMasterSecret;
  19957. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  19958. ssl->arrays->server_hint, ssl->arrays->client_identity,
  19959. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  19960. if (ssl->arrays->psk_keySz == 0 ||
  19961. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  19962. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  19963. }
  19964. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  19965. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  19966. if (args->encSz > MAX_PSK_ID_LEN) {
  19967. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  19968. }
  19969. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  19970. args->encSz);
  19971. /* make psk pre master secret */
  19972. /* length of key + length 0s + length of key + key */
  19973. c16toa((word16)ssl->arrays->psk_keySz, pms);
  19974. pms += OPAQUE16_LEN;
  19975. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  19976. pms += ssl->arrays->psk_keySz;
  19977. c16toa((word16)ssl->arrays->psk_keySz, pms);
  19978. pms += OPAQUE16_LEN;
  19979. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  19980. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
  19981. (2 * OPAQUE16_LEN);
  19982. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  19983. ssl->arrays->psk_keySz = 0; /* No further need */
  19984. break;
  19985. }
  19986. #endif /* !NO_PSK */
  19987. #if !defined(NO_DH) && !defined(NO_PSK)
  19988. case dhe_psk_kea:
  19989. {
  19990. word32 esSz = 0;
  19991. args->output = args->encSecret;
  19992. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  19993. ssl->arrays->server_hint, ssl->arrays->client_identity,
  19994. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  19995. if (ssl->arrays->psk_keySz == 0 ||
  19996. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  19997. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  19998. }
  19999. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  20000. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  20001. if (esSz > MAX_PSK_ID_LEN) {
  20002. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  20003. }
  20004. ssl->buffers.sig.length = ENCRYPT_LEN;
  20005. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  20006. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20007. if (ssl->buffers.sig.buffer == NULL) {
  20008. ERROR_OUT(MEMORY_E, exit_scke);
  20009. }
  20010. c16toa((word16)esSz, args->output);
  20011. args->output += OPAQUE16_LEN;
  20012. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  20013. args->output += esSz;
  20014. args->encSz = esSz + OPAQUE16_LEN;
  20015. args->length = 0;
  20016. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  20017. (void**)&ssl->buffers.serverDH_Key);
  20018. if (ret != 0) {
  20019. goto exit_scke;
  20020. }
  20021. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  20022. !defined(WOLFSSL_OLD_PRIME_CHECK)
  20023. if (ssl->options.dhDoKeyTest &&
  20024. !ssl->options.dhKeyTested)
  20025. {
  20026. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  20027. ssl->buffers.serverDH_P.buffer,
  20028. ssl->buffers.serverDH_P.length,
  20029. ssl->buffers.serverDH_G.buffer,
  20030. ssl->buffers.serverDH_G.length,
  20031. NULL, 0, 0, ssl->rng);
  20032. if (ret != 0) {
  20033. goto exit_scke;
  20034. }
  20035. ssl->options.dhKeyTested = 1;
  20036. }
  20037. else
  20038. #endif
  20039. {
  20040. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  20041. ssl->buffers.serverDH_P.buffer,
  20042. ssl->buffers.serverDH_P.length,
  20043. ssl->buffers.serverDH_G.buffer,
  20044. ssl->buffers.serverDH_G.length);
  20045. if (ret != 0) {
  20046. goto exit_scke;
  20047. }
  20048. }
  20049. /* for DH, encSecret is Yc, agree is pre-master */
  20050. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  20051. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  20052. args->output + OPAQUE16_LEN, &args->length);
  20053. break;
  20054. }
  20055. #endif /* !NO_DH && !NO_PSK */
  20056. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20057. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  20058. case ecdhe_psk_kea:
  20059. {
  20060. word32 esSz = 0;
  20061. args->output = args->encSecret;
  20062. /* Send PSK client identity */
  20063. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  20064. ssl->arrays->server_hint, ssl->arrays->client_identity,
  20065. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  20066. if (ssl->arrays->psk_keySz == 0 ||
  20067. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  20068. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  20069. }
  20070. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  20071. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  20072. if (esSz > MAX_PSK_ID_LEN) {
  20073. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  20074. }
  20075. /* place size and identity in output buffer sz:identity */
  20076. c16toa((word16)esSz, args->output);
  20077. args->output += OPAQUE16_LEN;
  20078. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  20079. args->output += esSz;
  20080. args->encSz = esSz + OPAQUE16_LEN;
  20081. /* length is used for public key size */
  20082. args->length = MAX_ENCRYPT_SZ;
  20083. /* Create shared ECC key leaving room at the beginning
  20084. of buffer for size of shared key. */
  20085. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  20086. #ifdef HAVE_CURVE25519
  20087. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  20088. #ifdef HAVE_PK_CALLBACKS
  20089. /* if callback then use it for shared secret */
  20090. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  20091. break;
  20092. }
  20093. #endif
  20094. ret = wc_curve25519_export_public_ex(
  20095. (curve25519_key*)ssl->hsKey,
  20096. args->output + OPAQUE8_LEN, &args->length,
  20097. EC25519_LITTLE_ENDIAN);
  20098. if (ret != 0) {
  20099. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20100. }
  20101. break;
  20102. }
  20103. #endif
  20104. #ifdef HAVE_CURVE448
  20105. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  20106. #ifdef HAVE_PK_CALLBACKS
  20107. /* if callback then use it for shared secret */
  20108. if (ssl->ctx->X448SharedSecretCb != NULL) {
  20109. break;
  20110. }
  20111. #endif
  20112. ret = wc_curve448_export_public_ex(
  20113. (curve448_key*)ssl->hsKey,
  20114. args->output + OPAQUE8_LEN, &args->length,
  20115. EC448_LITTLE_ENDIAN);
  20116. if (ret != 0) {
  20117. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20118. }
  20119. break;
  20120. }
  20121. #endif
  20122. #ifdef HAVE_PK_CALLBACKS
  20123. /* if callback then use it for shared secret */
  20124. if (ssl->ctx->EccSharedSecretCb != NULL) {
  20125. break;
  20126. }
  20127. #endif
  20128. /* Place ECC key in output buffer, leaving room for size */
  20129. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  20130. args->output + OPAQUE8_LEN, &args->length);
  20131. if (ret != 0) {
  20132. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20133. }
  20134. break;
  20135. }
  20136. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  20137. #ifdef HAVE_NTRU
  20138. case ntru_kea:
  20139. {
  20140. ret = wc_RNG_GenerateBlock(ssl->rng,
  20141. ssl->arrays->preMasterSecret, SECRET_LEN);
  20142. if (ret != 0) {
  20143. goto exit_scke;
  20144. }
  20145. ssl->arrays->preMasterSz = SECRET_LEN;
  20146. args->encSz = MAX_ENCRYPT_SZ;
  20147. break;
  20148. }
  20149. #endif /* HAVE_NTRU */
  20150. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20151. defined(HAVE_CURVE448)
  20152. case ecc_diffie_hellman_kea:
  20153. {
  20154. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  20155. #ifdef HAVE_CURVE25519
  20156. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  20157. #ifdef HAVE_PK_CALLBACKS
  20158. /* if callback then use it for shared secret */
  20159. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  20160. break;
  20161. }
  20162. #endif
  20163. ret = wc_curve25519_export_public_ex(
  20164. (curve25519_key*)ssl->hsKey,
  20165. args->encSecret + OPAQUE8_LEN, &args->encSz,
  20166. EC25519_LITTLE_ENDIAN);
  20167. if (ret != 0) {
  20168. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20169. }
  20170. break;
  20171. }
  20172. #endif
  20173. #ifdef HAVE_CURVE448
  20174. if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
  20175. #ifdef HAVE_PK_CALLBACKS
  20176. /* if callback then use it for shared secret */
  20177. if (ssl->ctx->X448SharedSecretCb != NULL) {
  20178. break;
  20179. }
  20180. #endif
  20181. ret = wc_curve448_export_public_ex(
  20182. (curve448_key*)ssl->hsKey,
  20183. args->encSecret + OPAQUE8_LEN, &args->encSz,
  20184. EC448_LITTLE_ENDIAN);
  20185. if (ret != 0) {
  20186. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20187. }
  20188. break;
  20189. }
  20190. #endif
  20191. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  20192. #ifdef HAVE_PK_CALLBACKS
  20193. /* if callback then use it for shared secret */
  20194. if (ssl->ctx->EccSharedSecretCb != NULL) {
  20195. break;
  20196. }
  20197. #endif
  20198. /* Place ECC key in buffer, leaving room for size */
  20199. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  20200. args->encSecret + OPAQUE8_LEN, &args->encSz);
  20201. if (ret != 0) {
  20202. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  20203. }
  20204. #endif /* HAVE_ECC */
  20205. break;
  20206. }
  20207. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  20208. default:
  20209. ret = BAD_KEA_TYPE_E;
  20210. } /* switch(ssl->specs.kea) */
  20211. /* Check for error */
  20212. if (ret != 0) {
  20213. goto exit_scke;
  20214. }
  20215. /* Advance state and proceed */
  20216. ssl->options.asyncState = TLS_ASYNC_DO;
  20217. } /* case TLS_ASYNC_BUILD */
  20218. FALL_THROUGH;
  20219. case TLS_ASYNC_DO:
  20220. {
  20221. switch(ssl->specs.kea)
  20222. {
  20223. #ifndef NO_RSA
  20224. case rsa_kea:
  20225. {
  20226. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  20227. !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
  20228. if (tsip_useable(ssl) &&
  20229. wc_RsaEncryptSize(ssl->peerRsaKey) == 256) {
  20230. ret = tsip_generateEncryptPreMasterSecret(ssl,
  20231. args->encSecret,
  20232. &args->encSz);
  20233. } else
  20234. #endif
  20235. ret = RsaEnc(ssl,
  20236. ssl->arrays->preMasterSecret, SECRET_LEN,
  20237. args->encSecret, &args->encSz,
  20238. ssl->peerRsaKey,
  20239. #if defined(HAVE_PK_CALLBACKS)
  20240. &ssl->buffers.peerRsaKey
  20241. #else
  20242. NULL
  20243. #endif
  20244. );
  20245. break;
  20246. }
  20247. #endif /* !NO_RSA */
  20248. #ifndef NO_DH
  20249. case diffie_hellman_kea:
  20250. {
  20251. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  20252. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  20253. ssl->buffers.serverDH_Pub.buffer,
  20254. ssl->buffers.serverDH_Pub.length,
  20255. ssl->arrays->preMasterSecret,
  20256. &ssl->arrays->preMasterSz);
  20257. break;
  20258. }
  20259. #endif /* !NO_DH */
  20260. #ifndef NO_PSK
  20261. case psk_kea:
  20262. {
  20263. break;
  20264. }
  20265. #endif /* !NO_PSK */
  20266. #if !defined(NO_DH) && !defined(NO_PSK)
  20267. case dhe_psk_kea:
  20268. {
  20269. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  20270. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  20271. ssl->buffers.serverDH_Pub.buffer,
  20272. ssl->buffers.serverDH_Pub.length,
  20273. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  20274. &ssl->arrays->preMasterSz);
  20275. break;
  20276. }
  20277. #endif /* !NO_DH && !NO_PSK */
  20278. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20279. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  20280. case ecdhe_psk_kea:
  20281. {
  20282. #ifdef HAVE_CURVE25519
  20283. if (ssl->peerX25519KeyPresent) {
  20284. ret = X25519SharedSecret(ssl,
  20285. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  20286. args->output + OPAQUE8_LEN, &args->length,
  20287. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  20288. &ssl->arrays->preMasterSz,
  20289. WOLFSSL_CLIENT_END
  20290. );
  20291. if (!ssl->specs.static_ecdh
  20292. #ifdef WOLFSSL_ASYNC_CRYPT
  20293. && ret != WC_PENDING_E
  20294. #endif
  20295. ) {
  20296. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  20297. (void**)&ssl->peerX25519Key);
  20298. ssl->peerX25519KeyPresent = 0;
  20299. }
  20300. break;
  20301. }
  20302. #endif
  20303. #ifdef HAVE_CURVE448
  20304. if (ssl->peerX448KeyPresent) {
  20305. ret = X448SharedSecret(ssl,
  20306. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  20307. args->output + OPAQUE8_LEN, &args->length,
  20308. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  20309. &ssl->arrays->preMasterSz,
  20310. WOLFSSL_CLIENT_END
  20311. );
  20312. if (!ssl->specs.static_ecdh
  20313. #ifdef WOLFSSL_ASYNC_CRYPT
  20314. && ret != WC_PENDING_E
  20315. #endif
  20316. ) {
  20317. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  20318. (void**)&ssl->peerX448Key);
  20319. ssl->peerX448KeyPresent = 0;
  20320. }
  20321. break;
  20322. }
  20323. #endif
  20324. ret = EccSharedSecret(ssl,
  20325. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  20326. args->output + OPAQUE8_LEN, &args->length,
  20327. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  20328. &ssl->arrays->preMasterSz,
  20329. WOLFSSL_CLIENT_END
  20330. );
  20331. #ifdef WOLFSSL_ASYNC_CRYPT
  20332. if (ret != WC_PENDING_E)
  20333. #endif
  20334. {
  20335. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  20336. (void**)&ssl->peerEccKey);
  20337. ssl->peerEccKeyPresent = 0;
  20338. }
  20339. break;
  20340. }
  20341. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  20342. #ifdef HAVE_NTRU
  20343. case ntru_kea:
  20344. {
  20345. word32 rc;
  20346. word16 tmpEncSz = (word16)args->encSz;
  20347. DRBG_HANDLE drbg;
  20348. rc = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
  20349. if (rc != DRBG_OK) {
  20350. ERROR_OUT(NTRU_DRBG_ERROR, exit_scke);
  20351. }
  20352. rc = ntru_crypto_ntru_encrypt(drbg, ssl->peerNtruKeyLen,
  20353. ssl->peerNtruKey,
  20354. ssl->arrays->preMasterSz,
  20355. ssl->arrays->preMasterSecret,
  20356. &tmpEncSz,
  20357. args->encSecret);
  20358. args->encSz = tmpEncSz;
  20359. ntru_crypto_drbg_uninstantiate(drbg);
  20360. if (rc != NTRU_OK) {
  20361. ERROR_OUT(NTRU_ENCRYPT_ERROR, exit_scke);
  20362. }
  20363. ret = 0;
  20364. break;
  20365. }
  20366. #endif /* HAVE_NTRU */
  20367. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20368. defined(HAVE_CURVE448)
  20369. case ecc_diffie_hellman_kea:
  20370. {
  20371. #ifdef HAVE_ECC
  20372. ecc_key* peerKey;
  20373. #endif
  20374. #ifdef HAVE_CURVE25519
  20375. if (ssl->peerX25519KeyPresent) {
  20376. ret = X25519SharedSecret(ssl,
  20377. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  20378. args->encSecret + OPAQUE8_LEN, &args->encSz,
  20379. ssl->arrays->preMasterSecret,
  20380. &ssl->arrays->preMasterSz,
  20381. WOLFSSL_CLIENT_END
  20382. );
  20383. if (!ssl->specs.static_ecdh
  20384. #ifdef WOLFSSL_ASYNC_CRYPT
  20385. && ret != WC_PENDING_E
  20386. #endif
  20387. ) {
  20388. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  20389. (void**)&ssl->peerX25519Key);
  20390. ssl->peerX25519KeyPresent = 0;
  20391. }
  20392. break;
  20393. }
  20394. #endif
  20395. #ifdef HAVE_CURVE448
  20396. if (ssl->peerX448KeyPresent) {
  20397. ret = X448SharedSecret(ssl,
  20398. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  20399. args->encSecret + OPAQUE8_LEN, &args->encSz,
  20400. ssl->arrays->preMasterSecret,
  20401. &ssl->arrays->preMasterSz,
  20402. WOLFSSL_CLIENT_END
  20403. );
  20404. if (!ssl->specs.static_ecdh
  20405. #ifdef WOLFSSL_ASYNC_CRYPT
  20406. && ret != WC_PENDING_E
  20407. #endif
  20408. ) {
  20409. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  20410. (void**)&ssl->peerX448Key);
  20411. ssl->peerX448KeyPresent = 0;
  20412. }
  20413. break;
  20414. }
  20415. #endif
  20416. #ifdef HAVE_ECC
  20417. peerKey = (ssl->specs.static_ecdh) ?
  20418. ssl->peerEccDsaKey : ssl->peerEccKey;
  20419. ret = EccSharedSecret(ssl,
  20420. (ecc_key*)ssl->hsKey, peerKey,
  20421. args->encSecret + OPAQUE8_LEN, &args->encSz,
  20422. ssl->arrays->preMasterSecret,
  20423. &ssl->arrays->preMasterSz,
  20424. WOLFSSL_CLIENT_END
  20425. );
  20426. if (!ssl->specs.static_ecdh
  20427. #ifdef WOLFSSL_ASYNC_CRYPT
  20428. && ret != WC_PENDING_E
  20429. #endif
  20430. && !ssl->options.keepResources) {
  20431. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  20432. (void**)&ssl->peerEccKey);
  20433. ssl->peerEccKeyPresent = 0;
  20434. }
  20435. #endif
  20436. break;
  20437. }
  20438. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  20439. default:
  20440. ret = BAD_KEA_TYPE_E;
  20441. } /* switch(ssl->specs.kea) */
  20442. /* Check for error */
  20443. if (ret != 0) {
  20444. goto exit_scke;
  20445. }
  20446. /* Advance state and proceed */
  20447. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  20448. } /* case TLS_ASYNC_DO */
  20449. FALL_THROUGH;
  20450. case TLS_ASYNC_VERIFY:
  20451. {
  20452. switch(ssl->specs.kea)
  20453. {
  20454. #ifndef NO_RSA
  20455. case rsa_kea:
  20456. {
  20457. break;
  20458. }
  20459. #endif /* !NO_RSA */
  20460. #ifndef NO_DH
  20461. case diffie_hellman_kea:
  20462. {
  20463. break;
  20464. }
  20465. #endif /* !NO_DH */
  20466. #ifndef NO_PSK
  20467. case psk_kea:
  20468. {
  20469. break;
  20470. }
  20471. #endif /* !NO_PSK */
  20472. #if !defined(NO_DH) && !defined(NO_PSK)
  20473. case dhe_psk_kea:
  20474. {
  20475. byte* pms = ssl->arrays->preMasterSecret;
  20476. /* validate args */
  20477. if (args->output == NULL || args->length == 0) {
  20478. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  20479. }
  20480. c16toa((word16)args->length, args->output);
  20481. args->encSz += args->length + OPAQUE16_LEN;
  20482. c16toa((word16)ssl->arrays->preMasterSz, pms);
  20483. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  20484. pms += ssl->arrays->preMasterSz;
  20485. /* make psk pre master secret */
  20486. /* length of key + length 0s + length of key + key */
  20487. c16toa((word16)ssl->arrays->psk_keySz, pms);
  20488. pms += OPAQUE16_LEN;
  20489. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  20490. ssl->arrays->preMasterSz +=
  20491. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  20492. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  20493. ssl->arrays->psk_keySz = 0; /* No further need */
  20494. break;
  20495. }
  20496. #endif /* !NO_DH && !NO_PSK */
  20497. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20498. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  20499. case ecdhe_psk_kea:
  20500. {
  20501. byte* pms = ssl->arrays->preMasterSecret;
  20502. /* validate args */
  20503. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  20504. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  20505. }
  20506. /* place size of public key in output buffer */
  20507. *args->output = (byte)args->length;
  20508. args->encSz += args->length + OPAQUE8_LEN;
  20509. /* Create pre master secret is the concatenation of
  20510. eccSize + eccSharedKey + pskSize + pskKey */
  20511. c16toa((word16)ssl->arrays->preMasterSz, pms);
  20512. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  20513. pms += ssl->arrays->preMasterSz;
  20514. c16toa((word16)ssl->arrays->psk_keySz, pms);
  20515. pms += OPAQUE16_LEN;
  20516. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  20517. ssl->arrays->preMasterSz +=
  20518. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  20519. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  20520. ssl->arrays->psk_keySz = 0; /* No further need */
  20521. break;
  20522. }
  20523. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  20524. #ifdef HAVE_NTRU
  20525. case ntru_kea:
  20526. {
  20527. break;
  20528. }
  20529. #endif /* HAVE_NTRU */
  20530. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  20531. defined(HAVE_CURVE448)
  20532. case ecc_diffie_hellman_kea:
  20533. {
  20534. /* place size of public key in buffer */
  20535. *args->encSecret = (byte)args->encSz;
  20536. args->encSz += OPAQUE8_LEN;
  20537. break;
  20538. }
  20539. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  20540. default:
  20541. ret = BAD_KEA_TYPE_E;
  20542. } /* switch(ssl->specs.kea) */
  20543. /* Check for error */
  20544. if (ret != 0) {
  20545. goto exit_scke;
  20546. }
  20547. /* Advance state and proceed */
  20548. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  20549. } /* case TLS_ASYNC_VERIFY */
  20550. FALL_THROUGH;
  20551. case TLS_ASYNC_FINALIZE:
  20552. {
  20553. word32 tlsSz = 0;
  20554. word32 idx = 0;
  20555. #ifdef HAVE_QSH
  20556. word32 qshSz = 0;
  20557. if (ssl->peerQSHKeyPresent) {
  20558. qshSz = QSH_KeyGetSize(ssl);
  20559. }
  20560. #endif
  20561. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  20562. tlsSz = 2;
  20563. }
  20564. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  20565. ssl->specs.kea == dhe_psk_kea ||
  20566. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  20567. tlsSz = 0;
  20568. }
  20569. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  20570. args->sendSz = args->encSz + tlsSz + idx;
  20571. #ifdef WOLFSSL_DTLS
  20572. if (ssl->options.dtls) {
  20573. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  20574. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  20575. }
  20576. #endif
  20577. if (IsEncryptionOn(ssl, 1)) {
  20578. args->sendSz += MAX_MSG_EXTRA;
  20579. }
  20580. #ifdef HAVE_QSH
  20581. args->encSz += qshSz;
  20582. args->sendSz += qshSz;
  20583. #endif
  20584. /* check for available size */
  20585. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  20586. goto exit_scke;
  20587. }
  20588. /* get output buffer */
  20589. args->output = ssl->buffers.outputBuffer.buffer +
  20590. ssl->buffers.outputBuffer.length;
  20591. #ifdef HAVE_QSH
  20592. if (ssl->peerQSHKeyPresent) {
  20593. byte idxSave = idx;
  20594. idx = args->sendSz - qshSz;
  20595. if (QSH_KeyExchangeWrite(ssl, 0) != 0) {
  20596. ERROR_OUT(MEMORY_E, exit_scke);
  20597. }
  20598. /* extension type */
  20599. c16toa(TLSX_QUANTUM_SAFE_HYBRID, args->output + idx);
  20600. idx += OPAQUE16_LEN;
  20601. /* write to output and check amount written */
  20602. if (TLSX_QSHPK_Write(ssl->QSH_secret->list,
  20603. args->output + idx) > qshSz - OPAQUE16_LEN) {
  20604. ERROR_OUT(MEMORY_E, exit_scke);
  20605. }
  20606. idx = idxSave;
  20607. }
  20608. #endif
  20609. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  20610. #ifdef HAVE_QSH
  20611. if (ssl->peerQSHKeyPresent) {
  20612. args->encSz -= qshSz;
  20613. }
  20614. #endif
  20615. if (tlsSz) {
  20616. c16toa((word16)args->encSz, &args->output[idx]);
  20617. idx += OPAQUE16_LEN;
  20618. }
  20619. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  20620. idx += args->encSz;
  20621. if (IsEncryptionOn(ssl, 1)) {
  20622. int recordHeaderSz = RECORD_HEADER_SZ;
  20623. if (ssl->options.dtls)
  20624. recordHeaderSz += DTLS_RECORD_EXTRA;
  20625. args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
  20626. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  20627. DYNAMIC_TYPE_IN_BUFFER);
  20628. if (args->input == NULL) {
  20629. ERROR_OUT(MEMORY_E, exit_scke);
  20630. }
  20631. XMEMCPY(args->input, args->output + recordHeaderSz,
  20632. args->inputSz);
  20633. }
  20634. /* Advance state and proceed */
  20635. ssl->options.asyncState = TLS_ASYNC_END;
  20636. } /* case TLS_ASYNC_FINALIZE */
  20637. FALL_THROUGH;
  20638. case TLS_ASYNC_END:
  20639. {
  20640. if (IsEncryptionOn(ssl, 1)) {
  20641. #ifdef WOLFSSL_DTLS
  20642. if (IsDtlsNotSctpMode(ssl) &&
  20643. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
  20644. goto exit_scke;
  20645. }
  20646. #endif
  20647. ret = BuildMessage(ssl, args->output, args->sendSz,
  20648. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  20649. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20650. args->input = NULL; /* make sure its not double free'd on cleanup */
  20651. if (ret >= 0) {
  20652. args->sendSz = ret;
  20653. ret = 0;
  20654. }
  20655. }
  20656. else {
  20657. #ifdef WOLFSSL_DTLS
  20658. if (IsDtlsNotSctpMode(ssl)) {
  20659. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
  20660. goto exit_scke;
  20661. }
  20662. }
  20663. if (ssl->options.dtls)
  20664. DtlsSEQIncrement(ssl, CUR_ORDER);
  20665. #endif
  20666. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  20667. }
  20668. if (ret != 0) {
  20669. goto exit_scke;
  20670. }
  20671. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20672. if (ssl->hsInfoOn)
  20673. AddPacketName(ssl, "ClientKeyExchange");
  20674. if (ssl->toInfoOn)
  20675. AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  20676. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  20677. #endif
  20678. ssl->buffers.outputBuffer.length += args->sendSz;
  20679. if (!ssl->options.groupMessages) {
  20680. ret = SendBuffered(ssl);
  20681. }
  20682. if (ret == 0 || ret == WANT_WRITE) {
  20683. int tmpRet = MakeMasterSecret(ssl);
  20684. if (tmpRet != 0) {
  20685. ret = tmpRet; /* save WANT_WRITE unless more serious */
  20686. }
  20687. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  20688. }
  20689. break;
  20690. }
  20691. default:
  20692. ret = INPUT_CASE_ERROR;
  20693. } /* switch(ssl->options.asyncState) */
  20694. exit_scke:
  20695. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  20696. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  20697. #ifdef WOLFSSL_ASYNC_CRYPT
  20698. /* Handle async operation */
  20699. if (ret == WC_PENDING_E)
  20700. return ret;
  20701. #endif
  20702. /* No further need for PMS */
  20703. if (ssl->arrays->preMasterSecret != NULL) {
  20704. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  20705. }
  20706. ssl->arrays->preMasterSz = 0;
  20707. /* Final cleanup */
  20708. FreeSckeArgs(ssl, args);
  20709. FreeKeyExchange(ssl);
  20710. return ret;
  20711. }
  20712. #endif /* !WOLFSSL_NO_TLS12 */
  20713. #ifndef NO_CERTS
  20714. #ifndef WOLFSSL_NO_TLS12
  20715. #ifndef WOLFSSL_NO_CLIENT_AUTH
  20716. typedef struct ScvArgs {
  20717. byte* output; /* not allocated */
  20718. #ifndef NO_RSA
  20719. byte* verifySig;
  20720. #endif
  20721. byte* verify; /* not allocated */
  20722. byte* input;
  20723. word32 idx;
  20724. word32 extraSz;
  20725. word32 sigSz;
  20726. int sendSz;
  20727. int inputSz;
  20728. word16 length;
  20729. byte sigAlgo;
  20730. } ScvArgs;
  20731. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  20732. {
  20733. ScvArgs* args = (ScvArgs*)pArgs;
  20734. (void)ssl;
  20735. #ifndef NO_RSA
  20736. if (args->verifySig) {
  20737. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20738. args->verifySig = NULL;
  20739. }
  20740. #endif
  20741. if (args->input) {
  20742. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20743. args->input = NULL;
  20744. }
  20745. }
  20746. /* handle generation of certificate_verify (15) */
  20747. int SendCertificateVerify(WOLFSSL* ssl)
  20748. {
  20749. int ret = 0;
  20750. #ifdef WOLFSSL_ASYNC_CRYPT
  20751. ScvArgs* args = (ScvArgs*)ssl->async.args;
  20752. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  20753. (void)sizeof(args_test);
  20754. #else
  20755. ScvArgs args[1];
  20756. #endif
  20757. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  20758. WOLFSSL_ENTER("SendCertificateVerify");
  20759. #ifdef WOLFSSL_ASYNC_CRYPT
  20760. /* BuildMessage does its own Pop */
  20761. if (ssl->error != WC_PENDING_E ||
  20762. ssl->options.asyncState != TLS_ASYNC_END)
  20763. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  20764. if (ret != WC_NOT_PENDING_E) {
  20765. /* Check for error */
  20766. if (ret < 0)
  20767. goto exit_scv;
  20768. }
  20769. else
  20770. #endif
  20771. {
  20772. /* Reset state */
  20773. ret = 0;
  20774. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  20775. XMEMSET(args, 0, sizeof(ScvArgs));
  20776. #ifdef WOLFSSL_ASYNC_CRYPT
  20777. ssl->async.freeArgs = FreeScvArgs;
  20778. #endif
  20779. }
  20780. switch(ssl->options.asyncState)
  20781. {
  20782. case TLS_ASYNC_BEGIN:
  20783. {
  20784. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  20785. return 0; /* sent blank cert, can't verify */
  20786. }
  20787. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  20788. if (IsEncryptionOn(ssl, 1)) {
  20789. args->sendSz += MAX_MSG_EXTRA;
  20790. }
  20791. /* check for available size */
  20792. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  20793. goto exit_scv;
  20794. }
  20795. /* get output buffer */
  20796. args->output = ssl->buffers.outputBuffer.buffer +
  20797. ssl->buffers.outputBuffer.length;
  20798. /* Advance state and proceed */
  20799. ssl->options.asyncState = TLS_ASYNC_BUILD;
  20800. } /* case TLS_ASYNC_BEGIN */
  20801. FALL_THROUGH;
  20802. case TLS_ASYNC_BUILD:
  20803. {
  20804. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  20805. if (ret != 0) {
  20806. goto exit_scv;
  20807. }
  20808. if (ssl->buffers.key == NULL) {
  20809. #ifdef HAVE_PK_CALLBACKS
  20810. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  20811. args->length = GetPrivateKeySigSize(ssl);
  20812. else
  20813. #endif
  20814. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  20815. }
  20816. else {
  20817. /* Decode private key. */
  20818. ret = DecodePrivateKey(ssl, &args->length);
  20819. if (ret != 0) {
  20820. goto exit_scv;
  20821. }
  20822. }
  20823. if (args->length == 0) {
  20824. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  20825. }
  20826. /* idx is used to track verify pointer offset to output */
  20827. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  20828. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  20829. args->extraSz = 0; /* tls 1.2 hash/sig */
  20830. /* build encoded signature buffer */
  20831. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  20832. ssl->buffers.sig.buffer = (byte*)XMALLOC(ssl->buffers.sig.length,
  20833. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  20834. if (ssl->buffers.sig.buffer == NULL) {
  20835. ERROR_OUT(MEMORY_E, exit_scv);
  20836. }
  20837. #ifdef WOLFSSL_DTLS
  20838. if (ssl->options.dtls) {
  20839. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  20840. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  20841. }
  20842. #endif
  20843. #ifndef NO_OLD_TLS
  20844. #ifndef NO_SHA
  20845. /* old tls default */
  20846. SetDigest(ssl, sha_mac);
  20847. #endif
  20848. #else
  20849. #ifndef NO_SHA256
  20850. /* new tls default */
  20851. SetDigest(ssl, sha256_mac);
  20852. #endif
  20853. #endif /* !NO_OLD_TLS */
  20854. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  20855. #ifdef WC_RSA_PSS
  20856. if (IsAtLeastTLSv1_2(ssl) &&
  20857. (ssl->pssAlgo & (1 << ssl->suites->hashAlgo))) {
  20858. args->sigAlgo = rsa_pss_sa_algo;
  20859. }
  20860. else
  20861. #endif
  20862. args->sigAlgo = rsa_sa_algo;
  20863. }
  20864. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  20865. args->sigAlgo = ecc_dsa_sa_algo;
  20866. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  20867. args->sigAlgo = ed25519_sa_algo;
  20868. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  20869. args->sigAlgo = ed448_sa_algo;
  20870. if (IsAtLeastTLSv1_2(ssl)) {
  20871. EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo,
  20872. args->verify);
  20873. args->extraSz = HASH_SIG_SIZE;
  20874. SetDigest(ssl, ssl->suites->hashAlgo);
  20875. }
  20876. #ifndef NO_OLD_TLS
  20877. else {
  20878. /* if old TLS load MD5 and SHA hash as value to sign */
  20879. XMEMCPY(ssl->buffers.sig.buffer,
  20880. (byte*)ssl->hsHashes->certHashes.md5, FINISHED_SZ);
  20881. }
  20882. #endif
  20883. #ifndef NO_RSA
  20884. if (args->sigAlgo == rsa_sa_algo) {
  20885. ssl->buffers.sig.length = FINISHED_SZ;
  20886. args->sigSz = ENCRYPT_LEN;
  20887. if (IsAtLeastTLSv1_2(ssl)) {
  20888. ssl->buffers.sig.length = wc_EncodeSignature(
  20889. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  20890. ssl->buffers.digest.length,
  20891. TypeHash(ssl->suites->hashAlgo));
  20892. }
  20893. /* prepend hdr */
  20894. c16toa(args->length, args->verify + args->extraSz);
  20895. }
  20896. #ifdef WC_RSA_PSS
  20897. else if (args->sigAlgo == rsa_pss_sa_algo) {
  20898. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  20899. ssl->buffers.digest.length);
  20900. ssl->buffers.sig.length = ssl->buffers.digest.length;
  20901. args->sigSz = ENCRYPT_LEN;
  20902. /* prepend hdr */
  20903. c16toa(args->length, args->verify + args->extraSz);
  20904. }
  20905. #endif
  20906. #endif /* !NO_RSA */
  20907. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  20908. if (args->sigAlgo == ed25519_sa_algo) {
  20909. ret = Ed25519CheckPubKey(ssl);
  20910. if (ret != 0)
  20911. goto exit_scv;
  20912. }
  20913. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  20914. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  20915. if (args->sigAlgo == ed448_sa_algo) {
  20916. ret = Ed448CheckPubKey(ssl);
  20917. if (ret != 0)
  20918. goto exit_scv;
  20919. }
  20920. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  20921. /* Advance state and proceed */
  20922. ssl->options.asyncState = TLS_ASYNC_DO;
  20923. } /* case TLS_ASYNC_BUILD */
  20924. FALL_THROUGH;
  20925. case TLS_ASYNC_DO:
  20926. {
  20927. #ifdef HAVE_ECC
  20928. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  20929. ecc_key* key = (ecc_key*)ssl->hsKey;
  20930. ret = EccSign(ssl,
  20931. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  20932. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  20933. key,
  20934. #ifdef HAVE_PK_CALLBACKS
  20935. ssl->buffers.key
  20936. #else
  20937. NULL
  20938. #endif
  20939. );
  20940. }
  20941. #endif /* HAVE_ECC */
  20942. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  20943. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  20944. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  20945. ret = Ed25519Sign(ssl,
  20946. ssl->hsHashes->messages, ssl->hsHashes->length,
  20947. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  20948. key,
  20949. #ifdef HAVE_PK_CALLBACKS
  20950. ssl->buffers.key
  20951. #else
  20952. NULL
  20953. #endif
  20954. );
  20955. }
  20956. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  20957. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  20958. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  20959. ed448_key* key = (ed448_key*)ssl->hsKey;
  20960. ret = Ed448Sign(ssl,
  20961. ssl->hsHashes->messages, ssl->hsHashes->length,
  20962. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  20963. key,
  20964. #ifdef HAVE_PK_CALLBACKS
  20965. ssl->buffers.key
  20966. #else
  20967. NULL
  20968. #endif
  20969. );
  20970. }
  20971. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  20972. #ifndef NO_RSA
  20973. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  20974. RsaKey* key = (RsaKey*)ssl->hsKey;
  20975. /* restore verify pointer */
  20976. args->verify = &args->output[args->idx];
  20977. ret = RsaSign(ssl,
  20978. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  20979. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  20980. args->sigAlgo, ssl->suites->hashAlgo, key,
  20981. ssl->buffers.key
  20982. );
  20983. }
  20984. #endif /* !NO_RSA */
  20985. /* Check for error */
  20986. if (ret != 0) {
  20987. goto exit_scv;
  20988. }
  20989. /* Advance state and proceed */
  20990. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  20991. } /* case TLS_ASYNC_DO */
  20992. FALL_THROUGH;
  20993. case TLS_ASYNC_VERIFY:
  20994. {
  20995. /* restore verify pointer */
  20996. args->verify = &args->output[args->idx];
  20997. switch (ssl->hsType) {
  20998. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  20999. #ifdef HAVE_ECC
  21000. case DYNAMIC_TYPE_ECC:
  21001. #endif
  21002. #ifdef HAVE_ED25519
  21003. case DYNAMIC_TYPE_ED25519:
  21004. #endif
  21005. #ifdef HAVE_ED448
  21006. case DYNAMIC_TYPE_ED448:
  21007. #endif
  21008. args->length = (word16)ssl->buffers.sig.length;
  21009. /* prepend hdr */
  21010. c16toa(args->length, args->verify + args->extraSz);
  21011. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  21012. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  21013. break;
  21014. #endif
  21015. #ifndef NO_RSA
  21016. case DYNAMIC_TYPE_RSA:
  21017. {
  21018. RsaKey* key = (RsaKey*)ssl->hsKey;
  21019. if (args->verifySig == NULL) {
  21020. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  21021. DYNAMIC_TYPE_SIGNATURE);
  21022. if (args->verifySig == NULL) {
  21023. ERROR_OUT(MEMORY_E, exit_scv);
  21024. }
  21025. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  21026. VERIFY_HEADER, args->sigSz);
  21027. }
  21028. /* check for signature faults */
  21029. ret = VerifyRsaSign(ssl,
  21030. args->verifySig, args->sigSz,
  21031. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  21032. args->sigAlgo, ssl->suites->hashAlgo, key,
  21033. ssl->buffers.key
  21034. );
  21035. break;
  21036. }
  21037. #endif /* !NO_RSA */
  21038. default:
  21039. break;
  21040. }
  21041. /* Check for error */
  21042. if (ret != 0) {
  21043. goto exit_scv;
  21044. }
  21045. /* Advance state and proceed */
  21046. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  21047. } /* case TLS_ASYNC_VERIFY */
  21048. FALL_THROUGH;
  21049. case TLS_ASYNC_FINALIZE:
  21050. {
  21051. if (args->output == NULL) {
  21052. ERROR_OUT(BUFFER_ERROR, exit_scv);
  21053. }
  21054. AddHeaders(args->output, (word32)args->length + args->extraSz +
  21055. VERIFY_HEADER, certificate_verify, ssl);
  21056. args->sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ +
  21057. (word32)args->length + args->extraSz + VERIFY_HEADER;
  21058. #ifdef WOLFSSL_DTLS
  21059. if (ssl->options.dtls) {
  21060. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21061. }
  21062. #endif
  21063. if (IsEncryptionOn(ssl, 1)) {
  21064. int recordHeaderSz = RECORD_HEADER_SZ;
  21065. if (ssl->options.dtls)
  21066. recordHeaderSz += DTLS_RECORD_EXTRA;
  21067. args->inputSz = args->sendSz - recordHeaderSz;
  21068. /* build msg adds rec hdr */
  21069. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  21070. DYNAMIC_TYPE_IN_BUFFER);
  21071. if (args->input == NULL) {
  21072. ERROR_OUT(MEMORY_E, exit_scv);
  21073. }
  21074. XMEMCPY(args->input, args->output + recordHeaderSz,
  21075. args->inputSz);
  21076. }
  21077. /* Advance state and proceed */
  21078. ssl->options.asyncState = TLS_ASYNC_END;
  21079. } /* case TLS_ASYNC_FINALIZE */
  21080. FALL_THROUGH;
  21081. case TLS_ASYNC_END:
  21082. {
  21083. if (IsEncryptionOn(ssl, 1)) {
  21084. #ifdef WOLFSSL_DTLS
  21085. if (IsDtlsNotSctpMode(ssl) &&
  21086. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, certificate_verify)) != 0) {
  21087. goto exit_scv;
  21088. }
  21089. #endif
  21090. ret = BuildMessage(ssl, args->output,
  21091. MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA,
  21092. args->input, args->inputSz, handshake,
  21093. 1, 0, 1, CUR_ORDER);
  21094. #ifdef WOLFSSL_ASYNC_CRYPT
  21095. if (ret == WC_PENDING_E)
  21096. goto exit_scv;
  21097. #endif
  21098. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21099. args->input = NULL; /* make sure its not double free'd on cleanup */
  21100. if (ret >= 0) {
  21101. args->sendSz = ret;
  21102. ret = 0;
  21103. }
  21104. }
  21105. else {
  21106. #ifdef WOLFSSL_DTLS
  21107. if (IsDtlsNotSctpMode(ssl)) {
  21108. ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, certificate_verify);
  21109. }
  21110. if (ret == 0 && ssl->options.dtls)
  21111. DtlsSEQIncrement(ssl, CUR_ORDER);
  21112. #endif
  21113. if (ret == 0)
  21114. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  21115. }
  21116. if (ret != 0) {
  21117. goto exit_scv;
  21118. }
  21119. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  21120. if (ssl->hsInfoOn)
  21121. AddPacketName(ssl, "CertificateVerify");
  21122. if (ssl->toInfoOn)
  21123. AddPacketInfo(ssl, "CertificateVerify", handshake,
  21124. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  21125. #endif
  21126. ssl->buffers.outputBuffer.length += args->sendSz;
  21127. if (!ssl->options.groupMessages) {
  21128. ret = SendBuffered(ssl);
  21129. }
  21130. break;
  21131. }
  21132. default:
  21133. ret = INPUT_CASE_ERROR;
  21134. } /* switch(ssl->options.asyncState) */
  21135. exit_scv:
  21136. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  21137. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  21138. #ifdef WOLFSSL_ASYNC_CRYPT
  21139. /* Handle async operation */
  21140. if (ret == WC_PENDING_E) {
  21141. return ret;
  21142. }
  21143. #endif /* WOLFSSL_ASYNC_CRYPT */
  21144. /* Digest is not allocated, so do this to prevent free */
  21145. ssl->buffers.digest.buffer = NULL;
  21146. ssl->buffers.digest.length = 0;
  21147. /* Final cleanup */
  21148. FreeScvArgs(ssl, args);
  21149. FreeKeyExchange(ssl);
  21150. return ret;
  21151. }
  21152. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  21153. #endif /* WOLFSSL_NO_TLS12 */
  21154. #endif /* NO_CERTS */
  21155. #ifdef HAVE_SESSION_TICKET
  21156. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  21157. {
  21158. /* Free old dynamic ticket if we already had one */
  21159. if (ssl->session.isDynamic) {
  21160. XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  21161. ssl->session.ticket = ssl->session.staticTicket;
  21162. ssl->session.isDynamic = 0;
  21163. }
  21164. if (length > sizeof(ssl->session.staticTicket)) {
  21165. byte* sessionTicket =
  21166. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  21167. if (sessionTicket == NULL)
  21168. return MEMORY_E;
  21169. ssl->session.ticket = sessionTicket;
  21170. ssl->session.isDynamic = 1;
  21171. }
  21172. ssl->session.ticketLen = (word16)length;
  21173. if (length > 0) {
  21174. XMEMCPY(ssl->session.ticket, ticket, length);
  21175. if (ssl->session_ticket_cb != NULL) {
  21176. ssl->session_ticket_cb(ssl,
  21177. ssl->session.ticket, ssl->session.ticketLen,
  21178. ssl->session_ticket_ctx);
  21179. }
  21180. /* Create a fake sessionID based on the ticket, this will
  21181. * supersede the existing session cache info. */
  21182. ssl->options.haveSessionId = 1;
  21183. #ifdef WOLFSSL_TLS13
  21184. if (ssl->options.tls1_3) {
  21185. XMEMCPY(ssl->session.sessionID,
  21186. ssl->session.ticket + length - ID_LEN, ID_LEN);
  21187. }
  21188. else
  21189. #endif
  21190. XMEMCPY(ssl->arrays->sessionID,
  21191. ssl->session.ticket + length - ID_LEN, ID_LEN);
  21192. }
  21193. return 0;
  21194. }
  21195. #ifndef WOLFSSL_NO_TLS12
  21196. /* handle processing of session_ticket (4) */
  21197. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  21198. word32 size)
  21199. {
  21200. word32 begin = *inOutIdx;
  21201. word32 lifetime;
  21202. word16 length;
  21203. int ret;
  21204. if (ssl->expect_session_ticket == 0) {
  21205. WOLFSSL_MSG("Unexpected session ticket");
  21206. return SESSION_TICKET_EXPECT_E;
  21207. }
  21208. if (OPAQUE32_LEN > size)
  21209. return BUFFER_ERROR;
  21210. ato32(input + *inOutIdx, &lifetime);
  21211. *inOutIdx += OPAQUE32_LEN;
  21212. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  21213. return BUFFER_ERROR;
  21214. ato16(input + *inOutIdx, &length);
  21215. *inOutIdx += OPAQUE16_LEN;
  21216. if ((*inOutIdx - begin) + length > size)
  21217. return BUFFER_ERROR;
  21218. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  21219. return ret;
  21220. *inOutIdx += length;
  21221. if (length > 0) {
  21222. ssl->timeout = lifetime;
  21223. #ifndef NO_SESSION_CACHE
  21224. AddSession(ssl);
  21225. #endif
  21226. }
  21227. if (IsEncryptionOn(ssl, 0)) {
  21228. *inOutIdx += ssl->keys.padSz;
  21229. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  21230. if (ssl->options.startedETMRead)
  21231. *inOutIdx += MacSize(ssl);
  21232. #endif
  21233. }
  21234. ssl->expect_session_ticket = 0;
  21235. return 0;
  21236. }
  21237. #endif /* !WOLFSSL_NO_TLS12 */
  21238. #endif /* HAVE_SESSION_TICKET */
  21239. #endif /* NO_WOLFSSL_CLIENT */
  21240. #ifndef NO_CERTS
  21241. #ifdef HAVE_PK_CALLBACKS
  21242. int GetPrivateKeySigSize(WOLFSSL* ssl)
  21243. {
  21244. int sigSz = 0;
  21245. if (ssl == NULL)
  21246. return 0;
  21247. switch (ssl->buffers.keyType) {
  21248. #ifndef NO_RSA
  21249. #ifdef WC_RSA_PSS
  21250. case rsa_pss_sa_algo:
  21251. #endif
  21252. case rsa_sa_algo:
  21253. sigSz = ssl->buffers.keySz;
  21254. ssl->hsType = DYNAMIC_TYPE_RSA;
  21255. break;
  21256. #endif
  21257. #ifdef HAVE_ECC
  21258. case ecc_dsa_sa_algo:
  21259. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  21260. ssl->hsType = DYNAMIC_TYPE_ECC;
  21261. break;
  21262. #endif
  21263. #ifdef HAVE_ED25519
  21264. case ed25519_sa_algo:
  21265. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  21266. ssl->hsType = DYNAMIC_TYPE_ED25519;
  21267. break;
  21268. #endif
  21269. #ifdef HAVE_ED448
  21270. case ed448_sa_algo:
  21271. sigSz = ED448_SIG_SIZE; /* fixed known value */
  21272. ssl->hsType = DYNAMIC_TYPE_ED448;
  21273. break;
  21274. #endif
  21275. default:
  21276. break;
  21277. }
  21278. return sigSz;
  21279. }
  21280. #endif /* HAVE_PK_CALLBACKS */
  21281. #endif /* NO_CERTS */
  21282. #ifdef HAVE_ECC
  21283. /* returns the WOLFSSL_* version of the curve from the OID sum */
  21284. word16 GetCurveByOID(int oidSum) {
  21285. switch(oidSum) {
  21286. #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
  21287. #ifndef NO_ECC_SECP
  21288. case ECC_SECP160R1_OID:
  21289. return WOLFSSL_ECC_SECP160R1;
  21290. #endif /* !NO_ECC_SECP */
  21291. #ifdef HAVE_ECC_SECPR2
  21292. case ECC_SECP160R2_OID:
  21293. return WOLFSSL_ECC_SECP160R2;
  21294. #endif /* HAVE_ECC_SECPR2 */
  21295. #ifdef HAVE_ECC_KOBLITZ
  21296. case ECC_SECP160K1_OID:
  21297. return WOLFSSL_ECC_SECP160K1;
  21298. #endif /* HAVE_ECC_KOBLITZ */
  21299. #endif
  21300. #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
  21301. #ifndef NO_ECC_SECP
  21302. case ECC_SECP192R1_OID:
  21303. return WOLFSSL_ECC_SECP192R1;
  21304. #endif /* !NO_ECC_SECP */
  21305. #ifdef HAVE_ECC_KOBLITZ
  21306. case ECC_SECP192K1_OID:
  21307. return WOLFSSL_ECC_SECP192K1;
  21308. #endif /* HAVE_ECC_KOBLITZ */
  21309. #endif
  21310. #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
  21311. #ifndef NO_ECC_SECP
  21312. case ECC_SECP224R1_OID:
  21313. return WOLFSSL_ECC_SECP224R1;
  21314. #endif /* !NO_ECC_SECP */
  21315. #ifdef HAVE_ECC_KOBLITZ
  21316. case ECC_SECP224K1_OID:
  21317. return WOLFSSL_ECC_SECP224K1;
  21318. #endif /* HAVE_ECC_KOBLITZ */
  21319. #endif
  21320. #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
  21321. #ifndef NO_ECC_SECP
  21322. case ECC_SECP256R1_OID:
  21323. return WOLFSSL_ECC_SECP256R1;
  21324. #endif /* !NO_ECC_SECP */
  21325. #ifdef HAVE_ECC_KOBLITZ
  21326. case ECC_SECP256K1_OID:
  21327. return WOLFSSL_ECC_SECP256K1;
  21328. #endif /* HAVE_ECC_KOBLITZ */
  21329. #ifdef HAVE_ECC_BRAINPOOL
  21330. case ECC_BRAINPOOLP256R1_OID:
  21331. return WOLFSSL_ECC_BRAINPOOLP256R1;
  21332. #endif /* HAVE_ECC_BRAINPOOL */
  21333. #endif
  21334. #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
  21335. #ifndef NO_ECC_SECP
  21336. case ECC_SECP384R1_OID:
  21337. return WOLFSSL_ECC_SECP384R1;
  21338. #endif /* !NO_ECC_SECP */
  21339. #ifdef HAVE_ECC_BRAINPOOL
  21340. case ECC_BRAINPOOLP384R1_OID:
  21341. return WOLFSSL_ECC_BRAINPOOLP384R1;
  21342. #endif /* HAVE_ECC_BRAINPOOL */
  21343. #endif
  21344. #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
  21345. #ifdef HAVE_ECC_BRAINPOOL
  21346. case ECC_BRAINPOOLP512R1_OID:
  21347. return WOLFSSL_ECC_BRAINPOOLP512R1;
  21348. #endif /* HAVE_ECC_BRAINPOOL */
  21349. #endif
  21350. #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
  21351. #ifndef NO_ECC_SECP
  21352. case ECC_SECP521R1_OID:
  21353. return WOLFSSL_ECC_SECP521R1;
  21354. #endif /* !NO_ECC_SECP */
  21355. #endif
  21356. default:
  21357. WOLFSSL_MSG("Curve OID not compiled in or implemented");
  21358. return 0;
  21359. }
  21360. }
  21361. #endif /* HAVE_ECC */
  21362. #ifndef NO_WOLFSSL_SERVER
  21363. #ifndef WOLFSSL_NO_TLS12
  21364. /* handle generation of server_hello (2) */
  21365. int SendServerHello(WOLFSSL* ssl)
  21366. {
  21367. int ret;
  21368. byte *output;
  21369. word16 length;
  21370. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  21371. int sendSz;
  21372. byte sessIdSz = ID_LEN;
  21373. byte echoId = 0; /* ticket echo id flag */
  21374. byte cacheOff = 0; /* session cache off flag */
  21375. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  21376. WOLFSSL_ENTER("SendServerHello");
  21377. length = VERSION_SZ + RAN_LEN
  21378. + ID_LEN + ENUM_LEN
  21379. + SUITE_LEN
  21380. + ENUM_LEN;
  21381. #ifdef HAVE_TLS_EXTENSIONS
  21382. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  21383. if (ret != 0)
  21384. return ret;
  21385. #ifdef HAVE_SESSION_TICKET
  21386. if (ssl->options.useTicket) {
  21387. /* echo session id sz can be 0,32 or bogus len in between */
  21388. sessIdSz = ssl->arrays->sessionIDSz;
  21389. if (sessIdSz > ID_LEN) {
  21390. WOLFSSL_MSG("Bad bogus session id len");
  21391. return BUFFER_ERROR;
  21392. }
  21393. if (!IsAtLeastTLSv1_3(ssl->version))
  21394. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  21395. echoId = 1;
  21396. }
  21397. #endif /* HAVE_SESSION_TICKET */
  21398. #else
  21399. if (ssl->options.haveEMS) {
  21400. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  21401. }
  21402. #endif
  21403. /* is the session cache off at build or runtime */
  21404. #ifdef NO_SESSION_CACHE
  21405. cacheOff = 1;
  21406. #else
  21407. if (ssl->options.sessionCacheOff == 1) {
  21408. cacheOff = 1;
  21409. }
  21410. #endif
  21411. /* if no session cache don't send a session ID unless we're echoing
  21412. * an ID as part of session tickets */
  21413. if (echoId == 0 && cacheOff == 1) {
  21414. length -= ID_LEN; /* adjust ID_LEN assumption */
  21415. sessIdSz = 0;
  21416. }
  21417. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  21418. #ifdef WOLFSSL_DTLS
  21419. if (ssl->options.dtls) {
  21420. /* Server Hello should use the same sequence number as the
  21421. * Client Hello. */
  21422. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  21423. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  21424. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21425. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21426. }
  21427. #endif /* WOLFSSL_DTLS */
  21428. if (IsEncryptionOn(ssl, 1))
  21429. sendSz += MAX_MSG_EXTRA;
  21430. /* check for available size */
  21431. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  21432. return ret;
  21433. /* get output buffer */
  21434. output = ssl->buffers.outputBuffer.buffer +
  21435. ssl->buffers.outputBuffer.length;
  21436. AddHeaders(output, length, server_hello, ssl);
  21437. /* now write to output */
  21438. /* first version */
  21439. output[idx++] = (byte)ssl->version.major;
  21440. output[idx++] = (byte)ssl->version.minor;
  21441. /* then random and session id */
  21442. if (!ssl->options.resuming) {
  21443. /* generate random part and session id */
  21444. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  21445. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  21446. if (ret != 0)
  21447. return ret;
  21448. #ifdef WOLFSSL_TLS13
  21449. if (TLSv1_3_Capable(ssl)) {
  21450. /* TLS v1.3 capable server downgraded. */
  21451. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  21452. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  21453. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  21454. }
  21455. else
  21456. #endif
  21457. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  21458. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  21459. #ifdef OPENSSL_EXTRA
  21460. (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0 &&
  21461. #endif
  21462. !IsAtLeastTLSv1_2(ssl)) {
  21463. /* TLS v1.2 capable server downgraded. */
  21464. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  21465. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  21466. output[idx + RAN_LEN - 1] = 0;
  21467. }
  21468. /* store info in SSL for later */
  21469. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  21470. idx += RAN_LEN;
  21471. output[idx++] = sessIdSz;
  21472. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  21473. ssl->arrays->sessionIDSz = sessIdSz;
  21474. }
  21475. else {
  21476. /* If resuming, use info from SSL */
  21477. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  21478. idx += RAN_LEN;
  21479. output[idx++] = sessIdSz;
  21480. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  21481. }
  21482. idx += sessIdSz;
  21483. #ifdef SHOW_SECRETS
  21484. {
  21485. int j;
  21486. printf("server random: ");
  21487. for (j = 0; j < RAN_LEN; j++)
  21488. printf("%02x", ssl->arrays->serverRandom[j]);
  21489. printf("\n");
  21490. }
  21491. #endif
  21492. /* then cipher suite */
  21493. output[idx++] = ssl->options.cipherSuite0;
  21494. output[idx++] = ssl->options.cipherSuite;
  21495. /* then compression */
  21496. if (ssl->options.usingCompression)
  21497. output[idx++] = ZLIB_COMPRESSION;
  21498. else
  21499. output[idx++] = NO_COMPRESSION;
  21500. /* last, extensions */
  21501. #ifdef HAVE_TLS_EXTENSIONS
  21502. {
  21503. word16 offset = 0;
  21504. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  21505. if (ret != 0)
  21506. return ret;
  21507. idx += offset;
  21508. }
  21509. #else
  21510. #ifdef HAVE_EXTENDED_MASTER
  21511. if (ssl->options.haveEMS) {
  21512. c16toa(HELLO_EXT_SZ, output + idx);
  21513. idx += HELLO_EXT_SZ_SZ;
  21514. c16toa(HELLO_EXT_EXTMS, output + idx);
  21515. idx += HELLO_EXT_TYPE_SZ;
  21516. c16toa(0, output + idx);
  21517. /*idx += HELLO_EXT_SZ_SZ;*/
  21518. /* idx is not used after this point. uncomment the line above
  21519. * if adding any more extensions in the future. */
  21520. }
  21521. #endif
  21522. #endif
  21523. if (IsEncryptionOn(ssl, 1)) {
  21524. byte* input;
  21525. int inputSz = idx; /* build msg adds rec hdr */
  21526. int recordHeaderSz = RECORD_HEADER_SZ;
  21527. if (ssl->options.dtls)
  21528. recordHeaderSz += DTLS_RECORD_EXTRA;
  21529. inputSz -= recordHeaderSz;
  21530. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21531. if (input == NULL)
  21532. return MEMORY_E;
  21533. XMEMCPY(input, output + recordHeaderSz, inputSz);
  21534. #ifdef WOLFSSL_DTLS
  21535. if (IsDtlsNotSctpMode(ssl) &&
  21536. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
  21537. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21538. return ret;
  21539. }
  21540. #endif
  21541. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  21542. handshake, 1, 0, 0, CUR_ORDER);
  21543. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21544. if (sendSz < 0)
  21545. return sendSz;
  21546. } else {
  21547. #ifdef WOLFSSL_DTLS
  21548. if (IsDtlsNotSctpMode(ssl)) {
  21549. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
  21550. return ret;
  21551. }
  21552. if (ssl->options.dtls)
  21553. DtlsSEQIncrement(ssl, CUR_ORDER);
  21554. #endif
  21555. ret = HashOutput(ssl, output, sendSz, 0);
  21556. if (ret != 0)
  21557. return ret;
  21558. }
  21559. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  21560. if (ssl->hsInfoOn)
  21561. AddPacketName(ssl, "ServerHello");
  21562. if (ssl->toInfoOn)
  21563. AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  21564. WRITE_PROTO, ssl->heap);
  21565. #endif
  21566. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  21567. ssl->buffers.outputBuffer.length += sendSz;
  21568. if (ssl->options.groupMessages)
  21569. ret = 0;
  21570. else
  21571. ret = SendBuffered(ssl);
  21572. WOLFSSL_LEAVE("SendServerHello", ret);
  21573. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  21574. return ret;
  21575. }
  21576. #if defined(HAVE_ECC)
  21577. static byte SetCurveId(ecc_key* key)
  21578. {
  21579. if (key == NULL || key->dp == NULL) {
  21580. WOLFSSL_MSG("SetCurveId: Invalid key!");
  21581. return 0;
  21582. }
  21583. return (byte)GetCurveByOID(key->dp->oidSum);
  21584. }
  21585. #endif /* HAVE_ECC */
  21586. typedef struct SskeArgs {
  21587. byte* output; /* not allocated */
  21588. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  21589. (!defined(NO_DH) && !defined(NO_RSA))
  21590. byte* sigDataBuf;
  21591. #endif
  21592. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  21593. byte* exportBuf;
  21594. #endif
  21595. #ifndef NO_RSA
  21596. byte* verifySig;
  21597. #endif
  21598. byte* input;
  21599. word32 idx;
  21600. word32 tmpSigSz;
  21601. word32 length;
  21602. word32 sigSz;
  21603. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  21604. (!defined(NO_DH) && !defined(NO_RSA))
  21605. word32 sigDataSz;
  21606. #endif
  21607. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  21608. word32 exportSz;
  21609. #endif
  21610. #ifdef HAVE_QSH
  21611. word32 qshSz;
  21612. #endif
  21613. int sendSz;
  21614. int inputSz;
  21615. } SskeArgs;
  21616. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  21617. {
  21618. SskeArgs* args = (SskeArgs*)pArgs;
  21619. (void)ssl;
  21620. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  21621. if (args->exportBuf) {
  21622. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  21623. args->exportBuf = NULL;
  21624. }
  21625. #endif
  21626. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  21627. (!defined(NO_DH) && !defined(NO_RSA))
  21628. if (args->sigDataBuf) {
  21629. XFREE(args->sigDataBuf, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21630. args->sigDataBuf = NULL;
  21631. }
  21632. #endif
  21633. #ifndef NO_RSA
  21634. if (args->verifySig) {
  21635. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21636. args->verifySig = NULL;
  21637. }
  21638. #endif
  21639. (void)args;
  21640. }
  21641. /* handle generation of server_key_exchange (12) */
  21642. int SendServerKeyExchange(WOLFSSL* ssl)
  21643. {
  21644. int ret;
  21645. #ifdef WOLFSSL_ASYNC_CRYPT
  21646. SskeArgs* args = (SskeArgs*)ssl->async.args;
  21647. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  21648. (void)sizeof(args_test);
  21649. #else
  21650. SskeArgs args[1];
  21651. #endif
  21652. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  21653. WOLFSSL_ENTER("SendServerKeyExchange");
  21654. #ifdef WOLFSSL_ASYNC_CRYPT
  21655. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  21656. if (ret != WC_NOT_PENDING_E) {
  21657. /* Check for error */
  21658. if (ret < 0)
  21659. goto exit_sske;
  21660. }
  21661. else
  21662. #endif
  21663. {
  21664. /* Reset state */
  21665. ret = 0;
  21666. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  21667. XMEMSET(args, 0, sizeof(SskeArgs));
  21668. #ifdef WOLFSSL_ASYNC_CRYPT
  21669. ssl->async.freeArgs = FreeSskeArgs;
  21670. #endif
  21671. }
  21672. switch(ssl->options.asyncState)
  21673. {
  21674. case TLS_ASYNC_BEGIN:
  21675. {
  21676. #ifdef HAVE_QSH
  21677. if (ssl->peerQSHKeyPresent && ssl->options.haveQSH) {
  21678. args->qshSz = QSH_KeyGetSize(ssl);
  21679. }
  21680. #endif
  21681. /* Do some checks / debug msgs */
  21682. switch(ssl->specs.kea)
  21683. {
  21684. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21685. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  21686. case ecdhe_psk_kea:
  21687. {
  21688. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  21689. break;
  21690. }
  21691. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  21692. #if defined(HAVE_ECC)
  21693. case ecc_diffie_hellman_kea:
  21694. {
  21695. if (ssl->specs.static_ecdh) {
  21696. WOLFSSL_MSG("Using Static ECDH, not sending "
  21697. "ServerKeyExchange");
  21698. ERROR_OUT(0, exit_sske);
  21699. }
  21700. WOLFSSL_MSG("Using ephemeral ECDH");
  21701. break;
  21702. }
  21703. #endif /* HAVE_ECC */
  21704. }
  21705. /* Preparing keys */
  21706. switch(ssl->specs.kea)
  21707. {
  21708. #ifndef NO_PSK
  21709. case psk_kea:
  21710. {
  21711. /* Nothing to do in this sub-state */
  21712. break;
  21713. }
  21714. #endif /* !NO_PSK */
  21715. #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA))
  21716. #if !defined(NO_PSK)
  21717. case dhe_psk_kea:
  21718. #endif
  21719. #if !defined(NO_RSA)
  21720. case diffie_hellman_kea:
  21721. #endif
  21722. {
  21723. /* Allocate DH key buffers and generate key */
  21724. if (ssl->buffers.serverDH_P.buffer == NULL ||
  21725. ssl->buffers.serverDH_G.buffer == NULL) {
  21726. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  21727. }
  21728. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  21729. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  21730. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  21731. ssl->buffers.serverDH_P.length + OPAQUE16_LEN,
  21732. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21733. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  21734. ERROR_OUT(MEMORY_E, exit_sske);
  21735. }
  21736. }
  21737. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  21738. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  21739. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  21740. ssl->buffers.serverDH_P.length + OPAQUE16_LEN,
  21741. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  21742. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  21743. ERROR_OUT(MEMORY_E, exit_sske);
  21744. }
  21745. }
  21746. ssl->options.dhKeySz =
  21747. (word16)ssl->buffers.serverDH_P.length;
  21748. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  21749. (void**)&ssl->buffers.serverDH_Key);
  21750. if (ret != 0) {
  21751. goto exit_sske;
  21752. }
  21753. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  21754. !defined(HAVE_FIPS) && \
  21755. !defined(HAVE_SELFTEST)
  21756. if (ssl->options.dhDoKeyTest &&
  21757. !ssl->options.dhKeyTested)
  21758. {
  21759. ret = wc_DhSetCheckKey(
  21760. ssl->buffers.serverDH_Key,
  21761. ssl->buffers.serverDH_P.buffer,
  21762. ssl->buffers.serverDH_P.length,
  21763. ssl->buffers.serverDH_G.buffer,
  21764. ssl->buffers.serverDH_G.length,
  21765. NULL, 0, 0, ssl->rng);
  21766. if (ret != 0) {
  21767. goto exit_sske;
  21768. }
  21769. ssl->options.dhKeyTested = 1;
  21770. }
  21771. else
  21772. #endif
  21773. {
  21774. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  21775. ssl->buffers.serverDH_P.buffer,
  21776. ssl->buffers.serverDH_P.length,
  21777. ssl->buffers.serverDH_G.buffer,
  21778. ssl->buffers.serverDH_G.length);
  21779. if (ret != 0) {
  21780. goto exit_sske;
  21781. }
  21782. }
  21783. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  21784. ssl->buffers.serverDH_Priv.buffer,
  21785. (word32*)&ssl->buffers.serverDH_Priv.length,
  21786. ssl->buffers.serverDH_Pub.buffer,
  21787. (word32*)&ssl->buffers.serverDH_Pub.length);
  21788. break;
  21789. }
  21790. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  21791. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21792. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  21793. case ecdhe_psk_kea:
  21794. /* Fall through to create temp ECC key */
  21795. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  21796. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21797. defined(HAVE_CURVE448)
  21798. case ecc_diffie_hellman_kea:
  21799. {
  21800. #ifdef HAVE_CURVE25519
  21801. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  21802. /* need ephemeral key now, create it if missing */
  21803. if (ssl->eccTempKey == NULL) {
  21804. /* alloc/init on demand */
  21805. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  21806. (void**)&ssl->eccTempKey);
  21807. if (ret != 0) {
  21808. goto exit_sske;
  21809. }
  21810. }
  21811. if (ssl->eccTempKeyPresent == 0) {
  21812. ret = X25519MakeKey(ssl,
  21813. (curve25519_key*)ssl->eccTempKey, NULL);
  21814. if (ret == 0 || ret == WC_PENDING_E) {
  21815. ssl->eccTempKeyPresent =
  21816. DYNAMIC_TYPE_CURVE25519;
  21817. }
  21818. }
  21819. break;
  21820. }
  21821. #endif
  21822. #ifdef HAVE_CURVE448
  21823. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  21824. /* need ephemeral key now, create it if missing */
  21825. if (ssl->eccTempKey == NULL) {
  21826. /* alloc/init on demand */
  21827. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  21828. (void**)&ssl->eccTempKey);
  21829. if (ret != 0) {
  21830. goto exit_sske;
  21831. }
  21832. }
  21833. if (ssl->eccTempKeyPresent == 0) {
  21834. ret = X448MakeKey(ssl,
  21835. (curve448_key*)ssl->eccTempKey, NULL);
  21836. if (ret == 0 || ret == WC_PENDING_E) {
  21837. ssl->eccTempKeyPresent =
  21838. DYNAMIC_TYPE_CURVE448;
  21839. }
  21840. }
  21841. break;
  21842. }
  21843. #endif
  21844. #ifdef HAVE_ECC
  21845. /* need ephemeral key now, create it if missing */
  21846. if (ssl->eccTempKey == NULL) {
  21847. /* alloc/init on demand */
  21848. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  21849. (void**)&ssl->eccTempKey);
  21850. if (ret != 0) {
  21851. goto exit_sske;
  21852. }
  21853. }
  21854. if (ssl->eccTempKeyPresent == 0) {
  21855. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  21856. if (ret == 0 || ret == WC_PENDING_E) {
  21857. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  21858. }
  21859. }
  21860. #endif
  21861. break;
  21862. }
  21863. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  21864. default:
  21865. /* Skip ServerKeyExchange */
  21866. goto exit_sske;
  21867. } /* switch(ssl->specs.kea) */
  21868. /* Check for error */
  21869. if (ret != 0) {
  21870. goto exit_sske;
  21871. }
  21872. /* Advance state and proceed */
  21873. ssl->options.asyncState = TLS_ASYNC_BUILD;
  21874. } /* case TLS_ASYNC_BEGIN */
  21875. FALL_THROUGH;
  21876. case TLS_ASYNC_BUILD:
  21877. {
  21878. #if (!defined(NO_DH) && !defined(NO_RSA)) || (defined(HAVE_ECC) || \
  21879. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))
  21880. word32 preSigSz, preSigIdx;
  21881. #endif
  21882. switch(ssl->specs.kea)
  21883. {
  21884. #ifndef NO_PSK
  21885. case psk_kea:
  21886. {
  21887. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  21888. if (ssl->arrays->server_hint[0] == 0) {
  21889. ERROR_OUT(0, exit_sske); /* don't send */
  21890. }
  21891. /* include size part */
  21892. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  21893. if (args->length > MAX_PSK_ID_LEN) {
  21894. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  21895. }
  21896. args->length += HINT_LEN_SZ;
  21897. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  21898. RECORD_HEADER_SZ;
  21899. #ifdef HAVE_QSH
  21900. args->length += args->qshSz;
  21901. args->sendSz += args->qshSz;
  21902. #endif
  21903. #ifdef WOLFSSL_DTLS
  21904. if (ssl->options.dtls) {
  21905. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21906. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21907. }
  21908. #endif
  21909. if (IsEncryptionOn(ssl, 1)) {
  21910. args->sendSz += MAX_MSG_EXTRA;
  21911. }
  21912. /* check for available size */
  21913. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  21914. goto exit_sske;
  21915. }
  21916. /* get output buffer */
  21917. args->output = ssl->buffers.outputBuffer.buffer +
  21918. ssl->buffers.outputBuffer.length;
  21919. AddHeaders(args->output, args->length,
  21920. server_key_exchange, ssl);
  21921. /* key data */
  21922. #ifdef HAVE_QSH
  21923. c16toa((word16)(args->length - args->qshSz -
  21924. HINT_LEN_SZ), args->output + args->idx);
  21925. #else
  21926. c16toa((word16)(args->length - HINT_LEN_SZ),
  21927. args->output + args->idx);
  21928. #endif
  21929. args->idx += HINT_LEN_SZ;
  21930. XMEMCPY(args->output + args->idx,
  21931. ssl->arrays->server_hint,
  21932. args->length - HINT_LEN_SZ);
  21933. break;
  21934. }
  21935. #endif /* !NO_PSK */
  21936. #if !defined(NO_DH) && !defined(NO_PSK)
  21937. case dhe_psk_kea:
  21938. {
  21939. word32 hintLen;
  21940. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  21941. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  21942. ssl->buffers.serverDH_P.length +
  21943. ssl->buffers.serverDH_G.length +
  21944. ssl->buffers.serverDH_Pub.length;
  21945. /* include size part */
  21946. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  21947. if (hintLen > MAX_PSK_ID_LEN) {
  21948. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  21949. }
  21950. args->length += hintLen + HINT_LEN_SZ;
  21951. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  21952. RECORD_HEADER_SZ;
  21953. #ifdef HAVE_QSH
  21954. args->length += args->qshSz;
  21955. args->sendSz += args->qshSz;
  21956. #endif
  21957. #ifdef WOLFSSL_DTLS
  21958. if (ssl->options.dtls) {
  21959. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21960. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  21961. }
  21962. #endif
  21963. if (IsEncryptionOn(ssl, 1)) {
  21964. args->sendSz += MAX_MSG_EXTRA;
  21965. }
  21966. /* check for available size */
  21967. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  21968. goto exit_sske;
  21969. }
  21970. /* get output buffer */
  21971. args->output = ssl->buffers.outputBuffer.buffer +
  21972. ssl->buffers.outputBuffer.length;
  21973. AddHeaders(args->output, args->length,
  21974. server_key_exchange, ssl);
  21975. /* key data */
  21976. c16toa((word16)hintLen, args->output + args->idx);
  21977. args->idx += HINT_LEN_SZ;
  21978. XMEMCPY(args->output + args->idx,
  21979. ssl->arrays->server_hint, hintLen);
  21980. args->idx += hintLen;
  21981. /* add p, g, pub */
  21982. c16toa((word16)ssl->buffers.serverDH_P.length,
  21983. args->output + args->idx);
  21984. args->idx += LENGTH_SZ;
  21985. XMEMCPY(args->output + args->idx,
  21986. ssl->buffers.serverDH_P.buffer,
  21987. ssl->buffers.serverDH_P.length);
  21988. args->idx += ssl->buffers.serverDH_P.length;
  21989. /* g */
  21990. c16toa((word16)ssl->buffers.serverDH_G.length,
  21991. args->output + args->idx);
  21992. args->idx += LENGTH_SZ;
  21993. XMEMCPY(args->output + args->idx,
  21994. ssl->buffers.serverDH_G.buffer,
  21995. ssl->buffers.serverDH_G.length);
  21996. args->idx += ssl->buffers.serverDH_G.length;
  21997. /* pub */
  21998. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  21999. args->output + args->idx);
  22000. args->idx += LENGTH_SZ;
  22001. XMEMCPY(args->output + args->idx,
  22002. ssl->buffers.serverDH_Pub.buffer,
  22003. ssl->buffers.serverDH_Pub.length);
  22004. /* No need to update idx, since sizes are already set */
  22005. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  22006. break;
  22007. }
  22008. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  22009. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22010. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22011. case ecdhe_psk_kea:
  22012. {
  22013. word32 hintLen;
  22014. /* curve type, named curve, length(1) */
  22015. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22016. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  22017. args->exportSz = MAX_EXPORT_ECC_SZ;
  22018. args->exportBuf = (byte*)XMALLOC(args->exportSz,
  22019. ssl->heap, DYNAMIC_TYPE_DER);
  22020. if (args->exportBuf == NULL) {
  22021. ERROR_OUT(MEMORY_E, exit_sske);
  22022. }
  22023. #ifdef HAVE_CURVE25519
  22024. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22025. if (wc_curve25519_export_public_ex(
  22026. (curve25519_key*)ssl->eccTempKey,
  22027. args->exportBuf, &args->exportSz,
  22028. EC25519_LITTLE_ENDIAN) != 0) {
  22029. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22030. }
  22031. }
  22032. else
  22033. #endif
  22034. #ifdef HAVE_CURVE448
  22035. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  22036. if (wc_curve448_export_public_ex(
  22037. (curve448_key*)ssl->eccTempKey,
  22038. args->exportBuf, &args->exportSz,
  22039. EC448_LITTLE_ENDIAN) != 0) {
  22040. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22041. }
  22042. }
  22043. else
  22044. #endif
  22045. {
  22046. if (wc_ecc_export_x963(ssl->eccTempKey,
  22047. args->exportBuf, &args->exportSz) != 0) {
  22048. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22049. }
  22050. }
  22051. args->length += args->exportSz;
  22052. /* include size part */
  22053. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  22054. if (hintLen > MAX_PSK_ID_LEN) {
  22055. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  22056. }
  22057. args->length += hintLen + HINT_LEN_SZ;
  22058. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  22059. #ifdef HAVE_QSH
  22060. args->length += args->qshSz;
  22061. args->sendSz += args->qshSz;
  22062. #endif
  22063. #ifdef WOLFSSL_DTLS
  22064. if (ssl->options.dtls) {
  22065. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22066. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22067. }
  22068. #endif
  22069. if (IsEncryptionOn(ssl, 1)) {
  22070. args->sendSz += MAX_MSG_EXTRA;
  22071. }
  22072. /* check for available size */
  22073. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  22074. goto exit_sske;
  22075. }
  22076. /* get output buffer */
  22077. args->output = ssl->buffers.outputBuffer.buffer +
  22078. ssl->buffers.outputBuffer.length;
  22079. /* key data */
  22080. c16toa((word16)hintLen, args->output + args->idx);
  22081. args->idx += HINT_LEN_SZ;
  22082. XMEMCPY(args->output + args->idx,
  22083. ssl->arrays->server_hint, hintLen);
  22084. args->idx += hintLen;
  22085. /* ECC key exchange data */
  22086. args->output[args->idx++] = named_curve;
  22087. args->output[args->idx++] = 0x00; /* leading zero */
  22088. #ifdef HAVE_CURVE25519
  22089. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  22090. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  22091. else
  22092. #endif
  22093. #ifdef HAVE_CURVE448
  22094. if (ssl->ecdhCurveOID == ECC_X448_OID)
  22095. args->output[args->idx++] = WOLFSSL_ECC_X448;
  22096. else
  22097. #endif
  22098. {
  22099. #ifdef HAVE_ECC
  22100. args->output[args->idx++] =
  22101. SetCurveId(ssl->eccTempKey);
  22102. #endif
  22103. }
  22104. args->output[args->idx++] = (byte)args->exportSz;
  22105. XMEMCPY(args->output + args->idx, args->exportBuf,
  22106. args->exportSz);
  22107. break;
  22108. }
  22109. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  22110. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22111. defined(HAVE_CURVE448)
  22112. case ecc_diffie_hellman_kea:
  22113. {
  22114. enum wc_HashType hashType;
  22115. /* curve type, named curve, length(1) */
  22116. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22117. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  22118. /* Export temp ECC key and add to length */
  22119. args->exportSz = MAX_EXPORT_ECC_SZ;
  22120. args->exportBuf = (byte*)XMALLOC(args->exportSz,
  22121. ssl->heap, DYNAMIC_TYPE_DER);
  22122. if (args->exportBuf == NULL) {
  22123. ERROR_OUT(MEMORY_E, exit_sske);
  22124. }
  22125. #ifdef HAVE_CURVE25519
  22126. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22127. if (wc_curve25519_export_public_ex(
  22128. (curve25519_key*)ssl->eccTempKey,
  22129. args->exportBuf, &args->exportSz,
  22130. EC25519_LITTLE_ENDIAN) != 0) {
  22131. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22132. }
  22133. }
  22134. else
  22135. #endif
  22136. #ifdef HAVE_CURVE448
  22137. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  22138. if (wc_curve448_export_public_ex(
  22139. (curve448_key*)ssl->eccTempKey,
  22140. args->exportBuf, &args->exportSz,
  22141. EC448_LITTLE_ENDIAN) != 0) {
  22142. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22143. }
  22144. }
  22145. else
  22146. #endif
  22147. {
  22148. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  22149. if (wc_ecc_export_x963(ssl->eccTempKey,
  22150. args->exportBuf, &args->exportSz) != 0) {
  22151. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  22152. }
  22153. #endif
  22154. }
  22155. args->length += args->exportSz;
  22156. preSigSz = args->length;
  22157. preSigIdx = args->idx;
  22158. if (ssl->buffers.key == NULL) {
  22159. #ifdef HAVE_PK_CALLBACKS
  22160. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  22161. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  22162. if (args->tmpSigSz == 0) {
  22163. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  22164. }
  22165. }
  22166. else
  22167. #endif
  22168. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  22169. }
  22170. else {
  22171. switch(ssl->suites->sigAlgo) {
  22172. #ifndef NO_RSA
  22173. #ifdef WC_RSA_PSS
  22174. case rsa_pss_sa_algo:
  22175. #endif
  22176. case rsa_sa_algo:
  22177. {
  22178. word16 keySz;
  22179. ssl->buffers.keyType = rsa_sa_algo;
  22180. ret = DecodePrivateKey(ssl, &keySz);
  22181. if (ret != 0) {
  22182. goto exit_sske;
  22183. }
  22184. args->tmpSigSz = (word32)keySz;
  22185. break;
  22186. }
  22187. #endif /* !NO_RSA */
  22188. #ifdef HAVE_ECC
  22189. case ecc_dsa_sa_algo:
  22190. {
  22191. word16 keySz;
  22192. ssl->buffers.keyType = ecc_dsa_sa_algo;
  22193. ret = DecodePrivateKey(ssl, &keySz);
  22194. if (ret != 0) {
  22195. goto exit_sske;
  22196. }
  22197. /* worst case estimate */
  22198. args->tmpSigSz = keySz;
  22199. break;
  22200. }
  22201. #endif
  22202. #ifdef HAVE_ED25519
  22203. case ed25519_sa_algo:
  22204. {
  22205. word16 keySz;
  22206. ssl->buffers.keyType = ed25519_sa_algo;
  22207. ret = DecodePrivateKey(ssl, &keySz);
  22208. if (ret != 0) {
  22209. goto exit_sske;
  22210. }
  22211. /* worst case estimate */
  22212. args->tmpSigSz = ED25519_SIG_SIZE;
  22213. break;
  22214. }
  22215. #endif /* HAVE_ED25519 */
  22216. #ifdef HAVE_ED448
  22217. case ed448_sa_algo:
  22218. {
  22219. word16 keySz;
  22220. ssl->buffers.keyType = ed448_sa_algo;
  22221. ret = DecodePrivateKey(ssl, &keySz);
  22222. if (ret != 0) {
  22223. goto exit_sske;
  22224. }
  22225. /* worst case estimate */
  22226. args->tmpSigSz = ED448_SIG_SIZE;
  22227. break;
  22228. }
  22229. #endif /* HAVE_ED448 */
  22230. default:
  22231. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  22232. } /* switch(ssl->specs.sig_algo) */
  22233. }
  22234. /* sig length */
  22235. args->length += LENGTH_SZ;
  22236. args->length += args->tmpSigSz;
  22237. if (IsAtLeastTLSv1_2(ssl)) {
  22238. args->length += HASH_SIG_SIZE;
  22239. }
  22240. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  22241. #ifdef HAVE_QSH
  22242. args->length += args->qshSz;
  22243. args->sendSz += args->qshSz;
  22244. #endif
  22245. #ifdef WOLFSSL_DTLS
  22246. if (ssl->options.dtls) {
  22247. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22248. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22249. preSigIdx = args->idx;
  22250. }
  22251. #endif
  22252. if (IsEncryptionOn(ssl, 1)) {
  22253. args->sendSz += MAX_MSG_EXTRA;
  22254. }
  22255. /* check for available size */
  22256. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  22257. goto exit_sske;
  22258. }
  22259. /* get output buffer */
  22260. args->output = ssl->buffers.outputBuffer.buffer +
  22261. ssl->buffers.outputBuffer.length;
  22262. /* record and message headers will be added below, when we're sure
  22263. of the sig length */
  22264. /* key exchange data */
  22265. args->output[args->idx++] = named_curve;
  22266. args->output[args->idx++] = 0x00; /* leading zero */
  22267. #ifdef HAVE_CURVE25519
  22268. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  22269. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  22270. else
  22271. #endif
  22272. #ifdef HAVE_CURVE448
  22273. if (ssl->ecdhCurveOID == ECC_X448_OID)
  22274. args->output[args->idx++] = WOLFSSL_ECC_X448;
  22275. else
  22276. #endif
  22277. {
  22278. #ifdef HAVE_ECC
  22279. args->output[args->idx++] =
  22280. SetCurveId(ssl->eccTempKey);
  22281. #endif
  22282. }
  22283. args->output[args->idx++] = (byte)args->exportSz;
  22284. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  22285. args->idx += args->exportSz;
  22286. /* Determine hash type */
  22287. if (IsAtLeastTLSv1_2(ssl)) {
  22288. EncodeSigAlg(ssl->suites->hashAlgo,
  22289. ssl->suites->sigAlgo,
  22290. &args->output[args->idx]);
  22291. args->idx += 2;
  22292. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  22293. if (hashType == WC_HASH_TYPE_NONE) {
  22294. ERROR_OUT(ALGO_ID_E, exit_sske);
  22295. }
  22296. } else {
  22297. /* only using sha and md5 for rsa */
  22298. #ifndef NO_OLD_TLS
  22299. hashType = WC_HASH_TYPE_SHA;
  22300. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  22301. hashType = WC_HASH_TYPE_MD5_SHA;
  22302. }
  22303. #else
  22304. ERROR_OUT(ALGO_ID_E, exit_sske);
  22305. #endif
  22306. }
  22307. /* Signature length will be written later, when we're sure what it is */
  22308. #ifdef HAVE_FUZZER
  22309. if (ssl->fuzzerCb) {
  22310. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  22311. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  22312. }
  22313. #endif
  22314. /* Assemble buffer to hash for signature */
  22315. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  22316. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  22317. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22318. if (args->sigDataBuf == NULL) {
  22319. ERROR_OUT(MEMORY_E, exit_sske);
  22320. }
  22321. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  22322. RAN_LEN);
  22323. XMEMCPY(args->sigDataBuf+RAN_LEN,
  22324. ssl->arrays->serverRandom, RAN_LEN);
  22325. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  22326. args->output + preSigIdx, preSigSz);
  22327. if (ssl->suites->sigAlgo != ed25519_sa_algo &&
  22328. ssl->suites->sigAlgo != ed448_sa_algo) {
  22329. ssl->buffers.sig.length =
  22330. wc_HashGetDigestSize(hashType);
  22331. if ((int)ssl->buffers.sig.length < 0) {
  22332. ERROR_OUT(HASH_TYPE_E, exit_sske);
  22333. }
  22334. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  22335. ssl->buffers.sig.length,
  22336. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22337. if (ssl->buffers.sig.buffer == NULL) {
  22338. ERROR_OUT(MEMORY_E, exit_sske);
  22339. }
  22340. /* Perform hash */
  22341. ret = wc_Hash(hashType, args->sigDataBuf,
  22342. args->sigDataSz,
  22343. ssl->buffers.sig.buffer,
  22344. ssl->buffers.sig.length);
  22345. if (ret != 0) {
  22346. goto exit_sske;
  22347. }
  22348. }
  22349. args->sigSz = args->tmpSigSz;
  22350. /* Sign hash to create signature */
  22351. switch (ssl->suites->sigAlgo)
  22352. {
  22353. #ifndef NO_RSA
  22354. case rsa_sa_algo:
  22355. {
  22356. /* For TLS 1.2 re-encode signature */
  22357. if (IsAtLeastTLSv1_2(ssl)) {
  22358. byte* encodedSig = (byte*)XMALLOC(
  22359. MAX_ENCODED_SIG_SZ, ssl->heap,
  22360. DYNAMIC_TYPE_SIGNATURE);
  22361. if (encodedSig == NULL) {
  22362. ERROR_OUT(MEMORY_E, exit_sske);
  22363. }
  22364. ssl->buffers.sig.length =
  22365. wc_EncodeSignature(encodedSig,
  22366. ssl->buffers.sig.buffer,
  22367. ssl->buffers.sig.length,
  22368. TypeHash(ssl->suites->hashAlgo));
  22369. /* Replace sig buffer with new one */
  22370. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  22371. DYNAMIC_TYPE_SIGNATURE);
  22372. ssl->buffers.sig.buffer = encodedSig;
  22373. }
  22374. /* write sig size here */
  22375. c16toa((word16)args->sigSz,
  22376. args->output + args->idx);
  22377. args->idx += LENGTH_SZ;
  22378. break;
  22379. }
  22380. #ifdef WC_RSA_PSS
  22381. case rsa_pss_sa_algo:
  22382. /* write sig size here */
  22383. c16toa((word16)args->sigSz,
  22384. args->output + args->idx);
  22385. args->idx += LENGTH_SZ;
  22386. break;
  22387. #endif
  22388. #endif /* !NO_RSA */
  22389. case ecc_dsa_sa_algo:
  22390. {
  22391. break;
  22392. }
  22393. #ifdef HAVE_ED25519
  22394. case ed25519_sa_algo:
  22395. ret = Ed25519CheckPubKey(ssl);
  22396. if (ret != 0)
  22397. goto exit_sske;
  22398. break;
  22399. #endif /* HAVE_ED25519 */
  22400. #ifdef HAVE_ED448
  22401. case ed448_sa_algo:
  22402. ret = Ed448CheckPubKey(ssl);
  22403. if (ret != 0)
  22404. goto exit_sske;
  22405. break;
  22406. #endif /* HAVE_ED448 */
  22407. } /* switch(ssl->specs.sig_algo) */
  22408. break;
  22409. }
  22410. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  22411. #if !defined(NO_DH) && !defined(NO_RSA)
  22412. case diffie_hellman_kea:
  22413. {
  22414. enum wc_HashType hashType;
  22415. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22416. args->length = LENGTH_SZ * 3; /* p, g, pub */
  22417. args->length += ssl->buffers.serverDH_P.length +
  22418. ssl->buffers.serverDH_G.length +
  22419. ssl->buffers.serverDH_Pub.length;
  22420. preSigIdx = args->idx;
  22421. preSigSz = args->length;
  22422. if (!ssl->options.usingAnon_cipher) {
  22423. word16 keySz;
  22424. /* sig length */
  22425. args->length += LENGTH_SZ;
  22426. if (ssl->buffers.key == NULL) {
  22427. #ifdef HAVE_PK_CALLBACKS
  22428. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  22429. keySz = (word32)GetPrivateKeySigSize(ssl);
  22430. else
  22431. #endif
  22432. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  22433. }
  22434. else
  22435. {
  22436. if (ssl->buffers.keyType == 0)
  22437. ssl->buffers.keyType = rsa_sa_algo;
  22438. ret = DecodePrivateKey(ssl, &keySz);
  22439. if (ret != 0) {
  22440. goto exit_sske;
  22441. }
  22442. }
  22443. if (keySz == 0) { /* test if keySz has error */
  22444. ERROR_OUT(keySz, exit_sske);
  22445. }
  22446. args->tmpSigSz = (word32)keySz;
  22447. args->length += args->tmpSigSz;
  22448. if (IsAtLeastTLSv1_2(ssl)) {
  22449. args->length += HASH_SIG_SIZE;
  22450. }
  22451. }
  22452. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  22453. RECORD_HEADER_SZ;
  22454. #ifdef HAVE_QSH
  22455. args->length += args->qshSz;
  22456. args->sendSz += args->qshSz;
  22457. #endif
  22458. #ifdef WOLFSSL_DTLS
  22459. if (ssl->options.dtls) {
  22460. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22461. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  22462. preSigIdx = args->idx;
  22463. }
  22464. #endif
  22465. if (IsEncryptionOn(ssl, 1)) {
  22466. args->sendSz += MAX_MSG_EXTRA;
  22467. }
  22468. /* check for available size */
  22469. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
  22470. goto exit_sske;
  22471. }
  22472. /* get output buffer */
  22473. args->output = ssl->buffers.outputBuffer.buffer +
  22474. ssl->buffers.outputBuffer.length;
  22475. AddHeaders(args->output, args->length,
  22476. server_key_exchange, ssl);
  22477. /* add p, g, pub */
  22478. c16toa((word16)ssl->buffers.serverDH_P.length,
  22479. args->output + args->idx);
  22480. args->idx += LENGTH_SZ;
  22481. XMEMCPY(args->output + args->idx,
  22482. ssl->buffers.serverDH_P.buffer,
  22483. ssl->buffers.serverDH_P.length);
  22484. args->idx += ssl->buffers.serverDH_P.length;
  22485. /* g */
  22486. c16toa((word16)ssl->buffers.serverDH_G.length,
  22487. args->output + args->idx);
  22488. args->idx += LENGTH_SZ;
  22489. XMEMCPY(args->output + args->idx,
  22490. ssl->buffers.serverDH_G.buffer,
  22491. ssl->buffers.serverDH_G.length);
  22492. args->idx += ssl->buffers.serverDH_G.length;
  22493. /* pub */
  22494. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  22495. args->output + args->idx);
  22496. args->idx += LENGTH_SZ;
  22497. XMEMCPY(args->output + args->idx,
  22498. ssl->buffers.serverDH_Pub.buffer,
  22499. ssl->buffers.serverDH_Pub.length);
  22500. args->idx += ssl->buffers.serverDH_Pub.length;
  22501. #ifdef HAVE_FUZZER
  22502. if (ssl->fuzzerCb) {
  22503. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  22504. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  22505. }
  22506. #endif
  22507. if (ssl->options.usingAnon_cipher) {
  22508. break;
  22509. }
  22510. /* Determine hash type */
  22511. if (IsAtLeastTLSv1_2(ssl)) {
  22512. EncodeSigAlg(ssl->suites->hashAlgo,
  22513. ssl->suites->sigAlgo,
  22514. &args->output[args->idx]);
  22515. args->idx += 2;
  22516. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  22517. if (hashType == WC_HASH_TYPE_NONE) {
  22518. ERROR_OUT(ALGO_ID_E, exit_sske);
  22519. }
  22520. } else {
  22521. /* only using sha and md5 for rsa */
  22522. #ifndef NO_OLD_TLS
  22523. hashType = WC_HASH_TYPE_SHA;
  22524. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  22525. hashType = WC_HASH_TYPE_MD5_SHA;
  22526. }
  22527. #else
  22528. ERROR_OUT(ALGO_ID_E, exit_sske);
  22529. #endif
  22530. }
  22531. /* signature size */
  22532. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  22533. args->idx += LENGTH_SZ;
  22534. /* Assemble buffer to hash for signature */
  22535. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  22536. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  22537. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22538. if (args->sigDataBuf == NULL) {
  22539. ERROR_OUT(MEMORY_E, exit_sske);
  22540. }
  22541. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  22542. RAN_LEN);
  22543. XMEMCPY(args->sigDataBuf+RAN_LEN,
  22544. ssl->arrays->serverRandom, RAN_LEN);
  22545. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  22546. args->output + preSigIdx, preSigSz);
  22547. if (ssl->suites->sigAlgo != ed25519_sa_algo &&
  22548. ssl->suites->sigAlgo != ed448_sa_algo) {
  22549. ssl->buffers.sig.length =
  22550. wc_HashGetDigestSize(hashType);
  22551. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  22552. ssl->buffers.sig.length, ssl->heap,
  22553. DYNAMIC_TYPE_SIGNATURE);
  22554. if (ssl->buffers.sig.buffer == NULL) {
  22555. ERROR_OUT(MEMORY_E, exit_sske);
  22556. }
  22557. /* Perform hash */
  22558. ret = wc_Hash(hashType, args->sigDataBuf,
  22559. args->sigDataSz,
  22560. ssl->buffers.sig.buffer,
  22561. ssl->buffers.sig.length);
  22562. if (ret != 0) {
  22563. goto exit_sske;
  22564. }
  22565. }
  22566. args->sigSz = args->tmpSigSz;
  22567. /* Sign hash to create signature */
  22568. switch (ssl->suites->sigAlgo)
  22569. {
  22570. #ifndef NO_RSA
  22571. case rsa_sa_algo:
  22572. {
  22573. /* For TLS 1.2 re-encode signature */
  22574. if (IsAtLeastTLSv1_2(ssl)) {
  22575. byte* encodedSig = (byte*)XMALLOC(
  22576. MAX_ENCODED_SIG_SZ, ssl->heap,
  22577. DYNAMIC_TYPE_SIGNATURE);
  22578. if (encodedSig == NULL) {
  22579. ERROR_OUT(MEMORY_E, exit_sske);
  22580. }
  22581. ssl->buffers.sig.length =
  22582. wc_EncodeSignature(encodedSig,
  22583. ssl->buffers.sig.buffer,
  22584. ssl->buffers.sig.length,
  22585. TypeHash(ssl->suites->hashAlgo));
  22586. /* Replace sig buffer with new one */
  22587. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  22588. DYNAMIC_TYPE_SIGNATURE);
  22589. ssl->buffers.sig.buffer = encodedSig;
  22590. }
  22591. break;
  22592. }
  22593. #endif /* NO_RSA */
  22594. } /* switch (ssl->suites->sigAlgo) */
  22595. break;
  22596. }
  22597. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  22598. } /* switch(ssl->specs.kea) */
  22599. /* Check for error */
  22600. if (ret != 0) {
  22601. goto exit_sske;
  22602. }
  22603. /* Advance state and proceed */
  22604. ssl->options.asyncState = TLS_ASYNC_DO;
  22605. } /* case TLS_ASYNC_BUILD */
  22606. FALL_THROUGH;
  22607. case TLS_ASYNC_DO:
  22608. {
  22609. switch(ssl->specs.kea)
  22610. {
  22611. #ifndef NO_PSK
  22612. case psk_kea:
  22613. {
  22614. break;
  22615. }
  22616. #endif /* !NO_PSK */
  22617. #if !defined(NO_DH) && !defined(NO_PSK)
  22618. case dhe_psk_kea:
  22619. {
  22620. break;
  22621. }
  22622. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  22623. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22624. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22625. case ecdhe_psk_kea:
  22626. {
  22627. break;
  22628. }
  22629. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  22630. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  22631. defined(HAVE_ED448)
  22632. case ecc_diffie_hellman_kea:
  22633. {
  22634. /* Sign hash to create signature */
  22635. switch (ssl->suites->sigAlgo)
  22636. {
  22637. #ifndef NO_RSA
  22638. #ifdef WC_RSA_PSS
  22639. case rsa_pss_sa_algo:
  22640. #endif
  22641. case rsa_sa_algo:
  22642. {
  22643. RsaKey* key = (RsaKey*)ssl->hsKey;
  22644. ret = RsaSign(ssl,
  22645. ssl->buffers.sig.buffer,
  22646. ssl->buffers.sig.length,
  22647. args->output + args->idx,
  22648. &args->sigSz,
  22649. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  22650. key,
  22651. ssl->buffers.key
  22652. );
  22653. break;
  22654. }
  22655. #endif /* !NO_RSA */
  22656. #ifdef HAVE_ECC
  22657. case ecc_dsa_sa_algo:
  22658. {
  22659. ecc_key* key = (ecc_key*)ssl->hsKey;
  22660. ret = EccSign(ssl,
  22661. ssl->buffers.sig.buffer,
  22662. ssl->buffers.sig.length,
  22663. args->output + LENGTH_SZ + args->idx,
  22664. &args->sigSz,
  22665. key,
  22666. #ifdef HAVE_PK_CALLBACKS
  22667. ssl->buffers.key
  22668. #else
  22669. NULL
  22670. #endif
  22671. );
  22672. break;
  22673. }
  22674. #endif /* HAVE_ECC */
  22675. #ifdef HAVE_ED25519
  22676. case ed25519_sa_algo:
  22677. {
  22678. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  22679. ret = Ed25519Sign(ssl,
  22680. args->sigDataBuf, args->sigDataSz,
  22681. args->output + LENGTH_SZ + args->idx,
  22682. &args->sigSz,
  22683. key,
  22684. #ifdef HAVE_PK_CALLBACKS
  22685. ssl->buffers.key
  22686. #else
  22687. NULL
  22688. #endif
  22689. );
  22690. break;
  22691. }
  22692. #endif
  22693. #ifdef HAVE_ED448
  22694. case ed448_sa_algo:
  22695. {
  22696. ed448_key* key = (ed448_key*)ssl->hsKey;
  22697. ret = Ed448Sign(ssl,
  22698. args->sigDataBuf, args->sigDataSz,
  22699. args->output + LENGTH_SZ + args->idx,
  22700. &args->sigSz,
  22701. key,
  22702. #ifdef HAVE_PK_CALLBACKS
  22703. ssl->buffers.key
  22704. #else
  22705. NULL
  22706. #endif
  22707. );
  22708. break;
  22709. }
  22710. #endif
  22711. } /* switch(ssl->specs.sig_algo) */
  22712. break;
  22713. }
  22714. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  22715. #if !defined(NO_DH) && !defined(NO_RSA)
  22716. case diffie_hellman_kea:
  22717. {
  22718. /* Sign hash to create signature */
  22719. switch (ssl->suites->sigAlgo)
  22720. {
  22721. #ifndef NO_RSA
  22722. #ifdef WC_RSA_PSS
  22723. case rsa_pss_sa_algo:
  22724. #endif
  22725. case rsa_sa_algo:
  22726. {
  22727. RsaKey* key = (RsaKey*)ssl->hsKey;
  22728. if (ssl->options.usingAnon_cipher) {
  22729. break;
  22730. }
  22731. ret = RsaSign(ssl,
  22732. ssl->buffers.sig.buffer,
  22733. ssl->buffers.sig.length,
  22734. args->output + args->idx,
  22735. &args->sigSz,
  22736. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  22737. key,
  22738. ssl->buffers.key
  22739. );
  22740. break;
  22741. }
  22742. #endif /* NO_RSA */
  22743. } /* switch (ssl->suites->sigAlgo) */
  22744. break;
  22745. }
  22746. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  22747. } /* switch(ssl->specs.kea) */
  22748. /* Check for error */
  22749. if (ret != 0) {
  22750. goto exit_sske;
  22751. }
  22752. /* Advance state and proceed */
  22753. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  22754. } /* case TLS_ASYNC_DO */
  22755. FALL_THROUGH;
  22756. case TLS_ASYNC_VERIFY:
  22757. {
  22758. switch(ssl->specs.kea)
  22759. {
  22760. #ifndef NO_PSK
  22761. case psk_kea:
  22762. {
  22763. /* Nothing to do in this sub-state */
  22764. break;
  22765. }
  22766. #endif /* !NO_PSK */
  22767. #if !defined(NO_DH) && !defined(NO_PSK)
  22768. case dhe_psk_kea:
  22769. {
  22770. /* Nothing to do in this sub-state */
  22771. break;
  22772. }
  22773. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  22774. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22775. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22776. case ecdhe_psk_kea:
  22777. {
  22778. /* Nothing to do in this sub-state */
  22779. break;
  22780. }
  22781. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  22782. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22783. defined(HAVE_CURVE448)
  22784. case ecc_diffie_hellman_kea:
  22785. {
  22786. switch(ssl->suites->sigAlgo)
  22787. {
  22788. #ifndef NO_RSA
  22789. #ifdef WC_RSA_PSS
  22790. case rsa_pss_sa_algo:
  22791. #endif
  22792. case rsa_sa_algo:
  22793. {
  22794. RsaKey* key = (RsaKey*)ssl->hsKey;
  22795. if (args->verifySig == NULL) {
  22796. if (args->sigSz == 0) {
  22797. ERROR_OUT(BAD_COND_E, exit_sske);
  22798. }
  22799. args->verifySig = (byte*)XMALLOC(
  22800. args->sigSz, ssl->heap,
  22801. DYNAMIC_TYPE_SIGNATURE);
  22802. if (!args->verifySig) {
  22803. ERROR_OUT(MEMORY_E, exit_sske);
  22804. }
  22805. XMEMCPY(args->verifySig,
  22806. args->output + args->idx, args->sigSz);
  22807. }
  22808. /* check for signature faults */
  22809. ret = VerifyRsaSign(ssl,
  22810. args->verifySig, args->sigSz,
  22811. ssl->buffers.sig.buffer,
  22812. ssl->buffers.sig.length,
  22813. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  22814. key, ssl->buffers.key
  22815. );
  22816. break;
  22817. }
  22818. #endif
  22819. case ecc_dsa_sa_algo:
  22820. #ifdef HAVE_ED25519
  22821. case ed25519_sa_algo:
  22822. #endif
  22823. #ifdef HAVE_ED448
  22824. case ed448_sa_algo:
  22825. #endif
  22826. {
  22827. /* Now that we know the real sig size, write it. */
  22828. c16toa((word16)args->sigSz,
  22829. args->output + args->idx);
  22830. /* And adjust length and sendSz from estimates */
  22831. args->length += args->sigSz - args->tmpSigSz;
  22832. args->sendSz += args->sigSz - args->tmpSigSz;
  22833. break;
  22834. }
  22835. default:
  22836. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  22837. } /* switch(ssl->specs.sig_algo) */
  22838. break;
  22839. }
  22840. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  22841. #if !defined(NO_DH) && !defined(NO_RSA)
  22842. case diffie_hellman_kea:
  22843. {
  22844. switch (ssl->suites->sigAlgo)
  22845. {
  22846. #ifndef NO_RSA
  22847. #ifndef WC_RSA_PSS
  22848. case rsa_pss_sa_algo:
  22849. #endif
  22850. case rsa_sa_algo:
  22851. {
  22852. RsaKey* key = (RsaKey*)ssl->hsKey;
  22853. if (ssl->options.usingAnon_cipher) {
  22854. break;
  22855. }
  22856. if (args->verifySig == NULL) {
  22857. if (args->sigSz == 0) {
  22858. ERROR_OUT(BAD_COND_E, exit_sske);
  22859. }
  22860. args->verifySig = (byte*)XMALLOC(
  22861. args->sigSz, ssl->heap,
  22862. DYNAMIC_TYPE_SIGNATURE);
  22863. if (!args->verifySig) {
  22864. ERROR_OUT(MEMORY_E, exit_sske);
  22865. }
  22866. XMEMCPY(args->verifySig,
  22867. args->output + args->idx, args->sigSz);
  22868. }
  22869. /* check for signature faults */
  22870. ret = VerifyRsaSign(ssl,
  22871. args->verifySig, args->sigSz,
  22872. ssl->buffers.sig.buffer,
  22873. ssl->buffers.sig.length,
  22874. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  22875. key, ssl->buffers.key
  22876. );
  22877. break;
  22878. }
  22879. #endif
  22880. } /* switch (ssl->suites->sigAlgo) */
  22881. break;
  22882. }
  22883. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  22884. } /* switch(ssl->specs.kea) */
  22885. /* Check for error */
  22886. if (ret != 0) {
  22887. goto exit_sske;
  22888. }
  22889. /* Advance state and proceed */
  22890. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  22891. } /* case TLS_ASYNC_VERIFY */
  22892. FALL_THROUGH;
  22893. case TLS_ASYNC_FINALIZE:
  22894. {
  22895. #ifdef HAVE_QSH
  22896. if (ssl->peerQSHKeyPresent) {
  22897. if (args->qshSz > 0) {
  22898. args->idx = args->sendSz - args->qshSz;
  22899. if (QSH_KeyExchangeWrite(ssl, 1) != 0) {
  22900. ERROR_OUT(MEMORY_E, exit_sske);
  22901. }
  22902. /* extension type */
  22903. c16toa(TLSX_QUANTUM_SAFE_HYBRID,
  22904. args->output + args->idx);
  22905. args->idx += OPAQUE16_LEN;
  22906. /* write to output and check amount written */
  22907. if (TLSX_QSHPK_Write(ssl->QSH_secret->list,
  22908. args->output + args->idx) >
  22909. args->qshSz - OPAQUE16_LEN) {
  22910. ERROR_OUT(MEMORY_E, exit_sske);
  22911. }
  22912. }
  22913. }
  22914. #endif
  22915. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22916. defined(HAVE_CURVE448)
  22917. if (ssl->specs.kea == ecdhe_psk_kea ||
  22918. ssl->specs.kea == ecc_diffie_hellman_kea) {
  22919. /* Check output to make sure it was set */
  22920. if (args->output) {
  22921. AddHeaders(args->output, args->length,
  22922. server_key_exchange, ssl);
  22923. }
  22924. else {
  22925. ERROR_OUT(BUFFER_ERROR, exit_sske);
  22926. }
  22927. }
  22928. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  22929. if (IsEncryptionOn(ssl, 1)) {
  22930. args->inputSz = args->length + HANDSHAKE_HEADER_SZ;
  22931. if (ssl->options.dtls)
  22932. args->inputSz += DTLS_HANDSHAKE_EXTRA;
  22933. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  22934. DYNAMIC_TYPE_IN_BUFFER);
  22935. if (args->input == NULL) {
  22936. ERROR_OUT(MEMORY_E, exit_sske);
  22937. }
  22938. if (args->output == NULL) {
  22939. ERROR_OUT(BUFFER_ERROR, exit_sske);
  22940. }
  22941. if (!ssl->options.dtls)
  22942. XMEMCPY(args->input, args->output + RECORD_HEADER_SZ,
  22943. args->inputSz);
  22944. else
  22945. XMEMCPY(args->input, args->output + DTLS_RECORD_HEADER_SZ,
  22946. args->inputSz);
  22947. #ifdef WOLFSSL_DTLS
  22948. if (IsDtlsNotSctpMode(ssl) &&
  22949. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, server_key_exchange))
  22950. != 0) {
  22951. goto exit_sske;
  22952. }
  22953. #endif
  22954. ret = BuildMessage(ssl, args->output, args->sendSz,
  22955. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  22956. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22957. args->input = NULL;
  22958. /* make sure its not double free'd on cleanup */
  22959. if (ret >= 0) {
  22960. args->sendSz = ret;
  22961. ret = 0;
  22962. }
  22963. }
  22964. else {
  22965. #ifdef WOLFSSL_DTLS
  22966. if (IsDtlsNotSctpMode(ssl)) {
  22967. if ((ret = DtlsMsgPoolSave(ssl,
  22968. args->output, args->sendSz, server_key_exchange)) != 0) {
  22969. goto exit_sske;
  22970. }
  22971. }
  22972. if (ssl->options.dtls)
  22973. DtlsSEQIncrement(ssl, CUR_ORDER);
  22974. #endif
  22975. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  22976. if (ret != 0) {
  22977. goto exit_sske;
  22978. }
  22979. }
  22980. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  22981. if (ssl->hsInfoOn) {
  22982. AddPacketName(ssl, "ServerKeyExchange");
  22983. }
  22984. if (ssl->toInfoOn) {
  22985. AddPacketInfo(ssl, "ServerKeyExchange", handshake,
  22986. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  22987. }
  22988. #endif
  22989. /* Advance state and proceed */
  22990. ssl->options.asyncState = TLS_ASYNC_END;
  22991. } /* case TLS_ASYNC_FINALIZE */
  22992. FALL_THROUGH;
  22993. case TLS_ASYNC_END:
  22994. {
  22995. ssl->buffers.outputBuffer.length += args->sendSz;
  22996. if (!ssl->options.groupMessages) {
  22997. ret = SendBuffered(ssl);
  22998. }
  22999. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  23000. break;
  23001. }
  23002. default:
  23003. ret = INPUT_CASE_ERROR;
  23004. } /* switch(ssl->options.asyncState) */
  23005. exit_sske:
  23006. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  23007. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  23008. #ifdef WOLFSSL_ASYNC_CRYPT
  23009. /* Handle async operation */
  23010. if (ret == WC_PENDING_E)
  23011. return ret;
  23012. #endif /* WOLFSSL_ASYNC_CRYPT */
  23013. /* Final cleanup */
  23014. FreeSskeArgs(ssl, args);
  23015. FreeKeyExchange(ssl);
  23016. return ret;
  23017. }
  23018. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  23019. defined(OPENSSL_ALL)
  23020. /* search suites for specific one, idx on success, negative on error */
  23021. #ifndef WOLFSSL_TLS13
  23022. static
  23023. #endif
  23024. int FindSuite(Suites* suites, byte first, byte second)
  23025. {
  23026. int i;
  23027. if (suites == NULL || suites->suiteSz == 0) {
  23028. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  23029. return SUITES_ERROR;
  23030. }
  23031. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  23032. if (suites->suites[i] == first &&
  23033. suites->suites[i+1] == second )
  23034. return i;
  23035. }
  23036. return MATCH_SUITE_ERROR;
  23037. }
  23038. #endif
  23039. #endif /* !WOLFSSL_NO_TLS12 */
  23040. /* Make sure server cert/key are valid for this suite, true on success */
  23041. static int VerifyServerSuite(WOLFSSL* ssl, word16 idx)
  23042. {
  23043. int haveRSA = !ssl->options.haveStaticECC;
  23044. int havePSK = 0;
  23045. byte first;
  23046. byte second;
  23047. WOLFSSL_ENTER("VerifyServerSuite");
  23048. if (ssl->suites == NULL) {
  23049. WOLFSSL_MSG("Suites pointer error");
  23050. return 0;
  23051. }
  23052. first = ssl->suites->suites[idx];
  23053. second = ssl->suites->suites[idx+1];
  23054. #ifndef NO_PSK
  23055. havePSK = ssl->options.havePSK;
  23056. #endif
  23057. if (ssl->options.haveNTRU)
  23058. haveRSA = 0;
  23059. if (CipherRequires(first, second, REQUIRES_RSA)) {
  23060. WOLFSSL_MSG("Requires RSA");
  23061. if (haveRSA == 0) {
  23062. WOLFSSL_MSG("Don't have RSA");
  23063. return 0;
  23064. }
  23065. }
  23066. if (CipherRequires(first, second, REQUIRES_DHE)) {
  23067. WOLFSSL_MSG("Requires DHE");
  23068. if (ssl->options.haveDH == 0) {
  23069. WOLFSSL_MSG("Don't have DHE");
  23070. return 0;
  23071. }
  23072. }
  23073. if (CipherRequires(first, second, REQUIRES_ECC)) {
  23074. WOLFSSL_MSG("Requires ECC");
  23075. if (ssl->options.haveECC == 0) {
  23076. WOLFSSL_MSG("Don't have ECC");
  23077. return 0;
  23078. }
  23079. }
  23080. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  23081. WOLFSSL_MSG("Requires static ECC");
  23082. if (ssl->options.haveStaticECC == 0) {
  23083. WOLFSSL_MSG("Don't have static ECC");
  23084. return 0;
  23085. }
  23086. }
  23087. if (CipherRequires(first, second, REQUIRES_PSK)) {
  23088. WOLFSSL_MSG("Requires PSK");
  23089. if (havePSK == 0) {
  23090. WOLFSSL_MSG("Don't have PSK");
  23091. return 0;
  23092. }
  23093. }
  23094. if (CipherRequires(first, second, REQUIRES_NTRU)) {
  23095. WOLFSSL_MSG("Requires NTRU");
  23096. if (ssl->options.haveNTRU == 0) {
  23097. WOLFSSL_MSG("Don't have NTRU");
  23098. return 0;
  23099. }
  23100. }
  23101. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  23102. WOLFSSL_MSG("Requires RSA Signature");
  23103. if (ssl->options.side == WOLFSSL_SERVER_END &&
  23104. ssl->options.haveECDSAsig == 1) {
  23105. WOLFSSL_MSG("Don't have RSA Signature");
  23106. return 0;
  23107. }
  23108. }
  23109. #if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
  23110. if (CipherRequires(first, second, REQUIRES_AEAD)) {
  23111. WOLFSSL_MSG("Requires AEAD");
  23112. if (ssl->version.major == SSLv3_MAJOR &&
  23113. ssl->version.minor < TLSv1_2_MINOR) {
  23114. WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
  23115. return 0;
  23116. }
  23117. }
  23118. #endif
  23119. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23120. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  23121. if (!TLSX_ValidateSupportedCurves(ssl, first, second)) {
  23122. WOLFSSL_MSG("Don't have matching curves");
  23123. return 0;
  23124. }
  23125. #endif
  23126. /* ECCDHE is always supported if ECC on */
  23127. #ifdef HAVE_QSH
  23128. /* need to negotiate a classic suite in addition to TLS_QSH */
  23129. if (first == QSH_BYTE && second == TLS_QSH) {
  23130. if (TLSX_SupportExtensions(ssl)) {
  23131. ssl->options.haveQSH = 1; /* matched TLS_QSH */
  23132. }
  23133. else {
  23134. WOLFSSL_MSG("Version of SSL connection does not support "
  23135. "TLS_QSH");
  23136. }
  23137. return 0;
  23138. }
  23139. #endif
  23140. #ifdef WOLFSSL_TLS13
  23141. if (IsAtLeastTLSv1_3(ssl->version) &&
  23142. ssl->options.side == WOLFSSL_SERVER_END) {
  23143. /* Try to establish a key share. */
  23144. int ret = TLSX_KeyShare_Establish(ssl);
  23145. if (ret == KEY_SHARE_ERROR)
  23146. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  23147. else if (ret != 0)
  23148. return 0;
  23149. }
  23150. else if (first == TLS13_BYTE || (first == ECC_BYTE &&
  23151. (second == TLS_SHA256_SHA256 || second == TLS_SHA384_SHA384))) {
  23152. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  23153. * version. */
  23154. return 0;
  23155. }
  23156. #endif
  23157. return 1;
  23158. }
  23159. #ifndef NO_WOLFSSL_SERVER
  23160. static int CompareSuites(WOLFSSL* ssl, Suites* peerSuites, word16 i,
  23161. word16 j)
  23162. {
  23163. if (ssl->suites->suites[i] == peerSuites->suites[j] &&
  23164. ssl->suites->suites[i+1] == peerSuites->suites[j+1] ) {
  23165. if (VerifyServerSuite(ssl, i)) {
  23166. int result;
  23167. WOLFSSL_MSG("Verified suite validity");
  23168. ssl->options.cipherSuite0 = ssl->suites->suites[i];
  23169. ssl->options.cipherSuite = ssl->suites->suites[i+1];
  23170. result = SetCipherSpecs(ssl);
  23171. if (result == 0) {
  23172. result = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  23173. peerSuites->hashSigAlgoSz);
  23174. }
  23175. return result;
  23176. }
  23177. else {
  23178. WOLFSSL_MSG("Could not verify suite validity, continue");
  23179. }
  23180. }
  23181. return MATCH_SUITE_ERROR;
  23182. }
  23183. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  23184. {
  23185. int ret;
  23186. word16 i, j;
  23187. WOLFSSL_ENTER("MatchSuite");
  23188. /* & 0x1 equivalent % 2 */
  23189. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  23190. return BUFFER_ERROR;
  23191. if (ssl->suites == NULL)
  23192. return SUITES_ERROR;
  23193. if (!ssl->options.useClientOrder) {
  23194. /* Server order */
  23195. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  23196. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  23197. ret = CompareSuites(ssl, peerSuites, i, j);
  23198. if (ret != MATCH_SUITE_ERROR)
  23199. return ret;
  23200. }
  23201. }
  23202. }
  23203. else {
  23204. /* Client order */
  23205. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  23206. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  23207. ret = CompareSuites(ssl, peerSuites, i, j);
  23208. if (ret != MATCH_SUITE_ERROR)
  23209. return ret;
  23210. }
  23211. }
  23212. }
  23213. return MATCH_SUITE_ERROR;
  23214. }
  23215. #endif
  23216. #ifdef OLD_HELLO_ALLOWED
  23217. /* process old style client hello, deprecate? */
  23218. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  23219. word32 inSz, word16 sz)
  23220. {
  23221. word32 idx = *inOutIdx;
  23222. word16 sessionSz;
  23223. word16 randomSz;
  23224. word16 i, j;
  23225. ProtocolVersion pv;
  23226. Suites clSuites;
  23227. int ret = -1;
  23228. (void)inSz;
  23229. WOLFSSL_MSG("Got old format client hello");
  23230. #ifdef WOLFSSL_CALLBACKS
  23231. if (ssl->hsInfoOn)
  23232. AddPacketName(ssl, "ClientHello");
  23233. if (ssl->toInfoOn)
  23234. AddLateName("ClientHello", &ssl->timeoutInfo);
  23235. #endif
  23236. /* manually hash input since different format */
  23237. #ifndef NO_OLD_TLS
  23238. #ifndef NO_MD5
  23239. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  23240. #endif
  23241. #ifndef NO_SHA
  23242. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  23243. #endif
  23244. #endif
  23245. #ifndef NO_SHA256
  23246. if (IsAtLeastTLSv1_2(ssl)) {
  23247. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  23248. input + idx, sz);
  23249. if (shaRet != 0)
  23250. return shaRet;
  23251. }
  23252. #endif
  23253. /* does this value mean client_hello? */
  23254. idx++;
  23255. /* version */
  23256. pv.major = input[idx++];
  23257. pv.minor = input[idx++];
  23258. ssl->chVersion = pv; /* store */
  23259. if (ssl->version.minor > pv.minor) {
  23260. byte haveRSA = 0;
  23261. byte havePSK = 0;
  23262. int keySz = 0;
  23263. if (!ssl->options.downgrade) {
  23264. WOLFSSL_MSG("Client trying to connect with lesser version");
  23265. return VERSION_ERROR;
  23266. }
  23267. if (pv.minor < ssl->options.minDowngrade) {
  23268. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  23269. return VERSION_ERROR;
  23270. }
  23271. if (pv.minor == SSLv3_MINOR) {
  23272. /* turn off tls */
  23273. WOLFSSL_MSG("\tdowngrading to SSLv3");
  23274. ssl->options.tls = 0;
  23275. ssl->options.tls1_1 = 0;
  23276. ssl->version.minor = SSLv3_MINOR;
  23277. }
  23278. else if (pv.minor == TLSv1_MINOR) {
  23279. WOLFSSL_MSG("\tdowngrading to TLSv1");
  23280. /* turn off tls 1.1+ */
  23281. ssl->options.tls1_1 = 0;
  23282. ssl->version.minor = TLSv1_MINOR;
  23283. }
  23284. else if (pv.minor == TLSv1_1_MINOR) {
  23285. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  23286. ssl->version.minor = TLSv1_1_MINOR;
  23287. }
  23288. else if (pv.minor == TLSv1_2_MINOR) {
  23289. WOLFSSL_MSG(" downgrading to TLSv1.2");
  23290. ssl->version.minor = TLSv1_2_MINOR;
  23291. }
  23292. #ifndef NO_RSA
  23293. haveRSA = 1;
  23294. #endif
  23295. #ifndef NO_PSK
  23296. havePSK = ssl->options.havePSK;
  23297. #endif
  23298. #ifndef NO_CERTS
  23299. keySz = ssl->buffers.keySz;
  23300. #endif
  23301. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  23302. ssl->options.haveDH, ssl->options.haveNTRU,
  23303. ssl->options.haveECDSAsig, ssl->options.haveECC,
  23304. ssl->options.haveStaticECC, ssl->options.side);
  23305. }
  23306. /* suite size */
  23307. ato16(&input[idx], &clSuites.suiteSz);
  23308. idx += OPAQUE16_LEN;
  23309. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  23310. return BUFFER_ERROR;
  23311. /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
  23312. if (clSuites.suiteSz % 3 != 0)
  23313. return BUFFER_ERROR;
  23314. clSuites.hashSigAlgoSz = 0;
  23315. /* session size */
  23316. ato16(&input[idx], &sessionSz);
  23317. idx += OPAQUE16_LEN;
  23318. if (sessionSz > ID_LEN)
  23319. return BUFFER_ERROR;
  23320. /* random size */
  23321. ato16(&input[idx], &randomSz);
  23322. idx += OPAQUE16_LEN;
  23323. if (randomSz > RAN_LEN)
  23324. return BUFFER_ERROR;
  23325. /* suites */
  23326. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  23327. byte first = input[idx++];
  23328. if (!first) { /* implicit: skip sslv2 type */
  23329. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  23330. j += SUITE_LEN;
  23331. }
  23332. idx += SUITE_LEN;
  23333. }
  23334. clSuites.suiteSz = j;
  23335. /* session id */
  23336. if (sessionSz) {
  23337. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  23338. ssl->arrays->sessionIDSz = (byte)sessionSz;
  23339. idx += sessionSz;
  23340. ssl->options.resuming = 1;
  23341. }
  23342. /* random */
  23343. if (randomSz < RAN_LEN)
  23344. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  23345. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  23346. randomSz);
  23347. idx += randomSz;
  23348. if (ssl->options.usingCompression)
  23349. ssl->options.usingCompression = 0; /* turn off */
  23350. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  23351. ssl->cbmode = SSL_CB_MODE_WRITE;
  23352. *inOutIdx = idx;
  23353. ssl->options.haveSessionId = 1;
  23354. /* DoClientHello uses same resume code */
  23355. if (ssl->options.resuming) { /* let's try */
  23356. WOLFSSL_SESSION* session = GetSession(ssl,
  23357. ssl->arrays->masterSecret, 1);
  23358. #ifdef HAVE_SESSION_TICKET
  23359. if (ssl->options.useTicket == 1) {
  23360. session = &ssl->session;
  23361. }
  23362. #endif
  23363. if (!session) {
  23364. WOLFSSL_MSG("Session lookup for resume failed");
  23365. ssl->options.resuming = 0;
  23366. } else {
  23367. #ifdef HAVE_EXT_CACHE
  23368. wolfSSL_SESSION_free(session);
  23369. #endif
  23370. if (MatchSuite(ssl, &clSuites) < 0) {
  23371. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  23372. return UNSUPPORTED_SUITE;
  23373. }
  23374. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  23375. RAN_LEN);
  23376. if (ret != 0)
  23377. return ret;
  23378. #ifdef NO_OLD_TLS
  23379. ret = DeriveTlsKeys(ssl);
  23380. #else
  23381. #ifndef NO_TLS
  23382. if (ssl->options.tls)
  23383. ret = DeriveTlsKeys(ssl);
  23384. #endif
  23385. if (!ssl->options.tls)
  23386. ret = DeriveKeys(ssl);
  23387. #endif
  23388. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  23389. return ret;
  23390. }
  23391. }
  23392. ret = MatchSuite(ssl, &clSuites);
  23393. if (ret != 0)return ret;
  23394. return SanityCheckMsgReceived(ssl, client_hello);
  23395. }
  23396. #endif /* OLD_HELLO_ALLOWED */
  23397. #ifndef WOLFSSL_NO_TLS12
  23398. int HandleTlsResumption(WOLFSSL* ssl, int bogusID, Suites* clSuites)
  23399. {
  23400. int ret = 0;
  23401. WOLFSSL_SESSION* session;
  23402. (void)bogusID;
  23403. session = GetSession(ssl, ssl->arrays->masterSecret, 1);
  23404. #ifdef HAVE_SESSION_TICKET
  23405. if (ssl->options.useTicket == 1) {
  23406. session = &ssl->session;
  23407. } else if (bogusID == 1 && ssl->options.rejectTicket == 0) {
  23408. WOLFSSL_MSG("Bogus session ID without session ticket");
  23409. return BUFFER_ERROR;
  23410. }
  23411. #endif
  23412. if (!session) {
  23413. WOLFSSL_MSG("Session lookup for resume failed");
  23414. ssl->options.resuming = 0;
  23415. }
  23416. else if (session->haveEMS != ssl->options.haveEMS) {
  23417. /* RFC 7627, 5.3, server-side */
  23418. /* if old sess didn't have EMS, but new does, full handshake */
  23419. if (!session->haveEMS && ssl->options.haveEMS) {
  23420. WOLFSSL_MSG("Attempting to resume a session that didn't "
  23421. "use EMS with a new session with EMS. Do full "
  23422. "handshake.");
  23423. ssl->options.resuming = 0;
  23424. }
  23425. /* if old sess used EMS, but new doesn't, MUST abort */
  23426. else if (session->haveEMS && !ssl->options.haveEMS) {
  23427. WOLFSSL_MSG("Trying to resume a session with EMS without "
  23428. "using EMS");
  23429. #ifdef WOLFSSL_EXTRA_ALERTS
  23430. SendAlert(ssl, alert_fatal, handshake_failure);
  23431. #endif
  23432. #ifdef HAVE_EXT_CACHE
  23433. wolfSSL_SESSION_free(session);
  23434. #endif
  23435. return EXT_MASTER_SECRET_NEEDED_E;
  23436. }
  23437. #ifdef HAVE_EXT_CACHE
  23438. wolfSSL_SESSION_free(session);
  23439. #endif
  23440. }
  23441. else {
  23442. #ifndef NO_RESUME_SUITE_CHECK
  23443. int j;
  23444. /* Check client suites include the one in session */
  23445. for (j = 0; j < clSuites->suiteSz; j += 2) {
  23446. if (clSuites->suites[j] == session->cipherSuite0 &&
  23447. clSuites->suites[j+1] == session->cipherSuite) {
  23448. break;
  23449. }
  23450. }
  23451. if (j == clSuites->suiteSz) {
  23452. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  23453. #ifdef WOLFSSL_EXTRA_ALERTS
  23454. SendAlert(ssl, alert_fatal, illegal_parameter);
  23455. #endif
  23456. return UNSUPPORTED_SUITE;
  23457. }
  23458. #endif
  23459. #ifdef HAVE_EXT_CACHE
  23460. wolfSSL_SESSION_free(session);
  23461. #endif
  23462. if (MatchSuite(ssl, clSuites) < 0) {
  23463. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  23464. return UNSUPPORTED_SUITE;
  23465. }
  23466. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  23467. RAN_LEN);
  23468. if (ret != 0)
  23469. return ret;
  23470. #ifdef NO_OLD_TLS
  23471. ret = DeriveTlsKeys(ssl);
  23472. #else
  23473. #ifndef NO_TLS
  23474. if (ssl->options.tls)
  23475. ret = DeriveTlsKeys(ssl);
  23476. #endif
  23477. if (!ssl->options.tls)
  23478. ret = DeriveKeys(ssl);
  23479. #endif
  23480. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  23481. }
  23482. return ret;
  23483. }
  23484. /* handle processing of client_hello (1) */
  23485. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  23486. word32 helloSz)
  23487. {
  23488. byte b;
  23489. byte bogusID = 0; /* flag for a bogus session id */
  23490. ProtocolVersion pv;
  23491. Suites clSuites;
  23492. word32 i = *inOutIdx;
  23493. word32 begin = i;
  23494. int ret = 0;
  23495. #ifdef WOLFSSL_DTLS
  23496. Hmac cookieHmac;
  23497. byte peerCookie[MAX_COOKIE_LEN];
  23498. byte peerCookieSz = 0;
  23499. byte cookieType;
  23500. byte cookieSz = 0;
  23501. XMEMSET(&cookieHmac, 0, sizeof(Hmac));
  23502. #endif /* WOLFSSL_DTLS */
  23503. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  23504. WOLFSSL_ENTER("DoClientHello");
  23505. #ifdef WOLFSSL_CALLBACKS
  23506. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  23507. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  23508. #endif
  23509. /* protocol version, random and session id length check */
  23510. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  23511. return BUFFER_ERROR;
  23512. /* protocol version */
  23513. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  23514. ssl->chVersion = pv; /* store */
  23515. #ifdef WOLFSSL_DTLS
  23516. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  23517. #if defined(NO_SHA) && defined(NO_SHA256)
  23518. #error "DTLS needs either SHA or SHA-256"
  23519. #endif /* NO_SHA && NO_SHA256 */
  23520. #if !defined(NO_SHA) && defined(NO_SHA256)
  23521. cookieType = WC_SHA;
  23522. cookieSz = WC_SHA_DIGEST_SIZE;
  23523. #endif /* NO_SHA */
  23524. #ifndef NO_SHA256
  23525. cookieType = WC_SHA256;
  23526. cookieSz = WC_SHA256_DIGEST_SIZE;
  23527. #endif /* NO_SHA256 */
  23528. ret = wc_HmacSetKey(&cookieHmac, cookieType,
  23529. ssl->buffers.dtlsCookieSecret.buffer,
  23530. ssl->buffers.dtlsCookieSecret.length);
  23531. if (ret != 0) return ret;
  23532. ret = wc_HmacUpdate(&cookieHmac,
  23533. (const byte*)ssl->buffers.dtlsCtx.peer.sa,
  23534. ssl->buffers.dtlsCtx.peer.sz);
  23535. if (ret != 0) return ret;
  23536. ret = wc_HmacUpdate(&cookieHmac, input + i, OPAQUE16_LEN);
  23537. if (ret != 0) return ret;
  23538. }
  23539. #endif /* WOLFSSL_DTLS */
  23540. i += OPAQUE16_LEN;
  23541. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  23542. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  23543. pv.minor = TLSv1_2_MINOR;
  23544. if ((!ssl->options.dtls && ssl->version.minor > pv.minor) ||
  23545. (ssl->options.dtls && ssl->version.minor != DTLS_MINOR
  23546. && ssl->version.minor != DTLSv1_2_MINOR && pv.minor != DTLS_MINOR
  23547. && pv.minor != DTLSv1_2_MINOR)) {
  23548. word16 haveRSA = 0;
  23549. word16 havePSK = 0;
  23550. int keySz = 0;
  23551. if (!ssl->options.downgrade) {
  23552. WOLFSSL_MSG("Client trying to connect with lesser version");
  23553. return VERSION_ERROR;
  23554. }
  23555. if (pv.minor < ssl->options.minDowngrade) {
  23556. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  23557. return VERSION_ERROR;
  23558. }
  23559. if (pv.minor == SSLv3_MINOR) {
  23560. /* turn off tls */
  23561. WOLFSSL_MSG("\tdowngrading to SSLv3");
  23562. ssl->options.tls = 0;
  23563. ssl->options.tls1_1 = 0;
  23564. ssl->version.minor = SSLv3_MINOR;
  23565. }
  23566. else if (pv.minor == TLSv1_MINOR) {
  23567. /* turn off tls 1.1+ */
  23568. WOLFSSL_MSG("\tdowngrading to TLSv1");
  23569. ssl->options.tls1_1 = 0;
  23570. ssl->version.minor = TLSv1_MINOR;
  23571. }
  23572. else if (pv.minor == TLSv1_1_MINOR) {
  23573. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  23574. ssl->version.minor = TLSv1_1_MINOR;
  23575. }
  23576. else if (pv.minor == TLSv1_2_MINOR) {
  23577. WOLFSSL_MSG(" downgrading to TLSv1.2");
  23578. ssl->version.minor = TLSv1_2_MINOR;
  23579. }
  23580. #ifndef NO_RSA
  23581. haveRSA = 1;
  23582. #endif
  23583. #ifndef NO_PSK
  23584. havePSK = ssl->options.havePSK;
  23585. #endif
  23586. #ifndef NO_CERTS
  23587. keySz = ssl->buffers.keySz;
  23588. #endif
  23589. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  23590. ssl->options.haveDH, ssl->options.haveNTRU,
  23591. ssl->options.haveECDSAsig, ssl->options.haveECC,
  23592. ssl->options.haveStaticECC, ssl->options.side);
  23593. }
  23594. #ifdef OPENSSL_EXTRA
  23595. /* check if option is set to not allow the current version
  23596. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  23597. if (!ssl->options.dtls && ssl->options.downgrade &&
  23598. ssl->options.mask > 0) {
  23599. int reset = 0;
  23600. if (ssl->version.minor == TLSv1_2_MINOR &&
  23601. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  23602. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  23603. ssl->version.minor = TLSv1_1_MINOR;
  23604. reset = 1;
  23605. }
  23606. if (ssl->version.minor == TLSv1_1_MINOR &&
  23607. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  23608. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  23609. ssl->options.tls1_1 = 0;
  23610. ssl->version.minor = TLSv1_MINOR;
  23611. reset = 1;
  23612. }
  23613. if (ssl->version.minor == TLSv1_MINOR &&
  23614. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  23615. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  23616. ssl->options.tls = 0;
  23617. ssl->options.tls1_1 = 0;
  23618. ssl->version.minor = SSLv3_MINOR;
  23619. reset = 1;
  23620. }
  23621. if (ssl->version.minor == SSLv3_MINOR &&
  23622. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  23623. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  23624. return VERSION_ERROR;
  23625. }
  23626. if (ssl->version.minor < ssl->options.minDowngrade) {
  23627. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  23628. return VERSION_ERROR;
  23629. }
  23630. if (reset) {
  23631. word16 haveRSA = 0;
  23632. word16 havePSK = 0;
  23633. int keySz = 0;
  23634. #ifndef NO_RSA
  23635. haveRSA = 1;
  23636. #endif
  23637. #ifndef NO_PSK
  23638. havePSK = ssl->options.havePSK;
  23639. #endif
  23640. #ifndef NO_CERTS
  23641. keySz = ssl->buffers.keySz;
  23642. #endif
  23643. /* reset cipher suites to account for TLS version change */
  23644. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  23645. ssl->options.haveDH, ssl->options.haveNTRU,
  23646. ssl->options.haveECDSAsig, ssl->options.haveECC,
  23647. ssl->options.haveStaticECC, ssl->options.side);
  23648. }
  23649. }
  23650. #endif
  23651. /* random */
  23652. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  23653. #ifdef WOLFSSL_DTLS
  23654. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  23655. ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN);
  23656. if (ret != 0) return ret;
  23657. }
  23658. #endif /* WOLFSSL_DTLS */
  23659. i += RAN_LEN;
  23660. #ifdef SHOW_SECRETS
  23661. {
  23662. int j;
  23663. printf("client random: ");
  23664. for (j = 0; j < RAN_LEN; j++)
  23665. printf("%02x", ssl->arrays->clientRandom[j]);
  23666. printf("\n");
  23667. }
  23668. #endif
  23669. /* session id */
  23670. b = input[i++];
  23671. #ifdef HAVE_SESSION_TICKET
  23672. if (b > 0 && b < ID_LEN) {
  23673. bogusID = 1;
  23674. WOLFSSL_MSG("Client sent bogus session id, let's allow for echo");
  23675. }
  23676. #endif
  23677. if (b == ID_LEN || bogusID) {
  23678. if ((i - begin) + b > helloSz)
  23679. return BUFFER_ERROR;
  23680. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  23681. #ifdef WOLFSSL_DTLS
  23682. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) &&
  23683. !ssl->options.resuming) {
  23684. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  23685. if (ret != 0) return ret;
  23686. }
  23687. #endif /* WOLFSSL_DTLS */
  23688. ssl->arrays->sessionIDSz = b;
  23689. i += b;
  23690. ssl->options.resuming = 1; /* client wants to resume */
  23691. WOLFSSL_MSG("Client wants to resume session");
  23692. }
  23693. else if (b) {
  23694. WOLFSSL_MSG("Invalid session ID size");
  23695. return BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
  23696. }
  23697. #ifdef WOLFSSL_DTLS
  23698. /* cookie */
  23699. if (ssl->options.dtls) {
  23700. if ((i - begin) + OPAQUE8_LEN > helloSz)
  23701. return BUFFER_ERROR;
  23702. peerCookieSz = input[i++];
  23703. if (peerCookieSz) {
  23704. if (peerCookieSz > MAX_COOKIE_LEN)
  23705. return BUFFER_ERROR;
  23706. if ((i - begin) + peerCookieSz > helloSz)
  23707. return BUFFER_ERROR;
  23708. XMEMCPY(peerCookie, input + i, peerCookieSz);
  23709. i += peerCookieSz;
  23710. }
  23711. }
  23712. #endif
  23713. /* suites */
  23714. if ((i - begin) + OPAQUE16_LEN > helloSz)
  23715. return BUFFER_ERROR;
  23716. ato16(&input[i], &clSuites.suiteSz);
  23717. i += OPAQUE16_LEN;
  23718. /* Cipher suite lists are always multiples of two in length. */
  23719. if (clSuites.suiteSz % 2 != 0)
  23720. return BUFFER_ERROR;
  23721. /* suites and compression length check */
  23722. if ((i - begin) + clSuites.suiteSz + OPAQUE8_LEN > helloSz)
  23723. return BUFFER_ERROR;
  23724. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  23725. return BUFFER_ERROR;
  23726. XMEMCPY(clSuites.suites, input + i, clSuites.suiteSz);
  23727. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  23728. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  23729. if (FindSuite(&clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  23730. TLSX* extension;
  23731. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  23732. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  23733. if (ret != WOLFSSL_SUCCESS)
  23734. return ret;
  23735. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  23736. if (extension) {
  23737. ssl->secure_renegotiation =
  23738. (SecureRenegotiation*)extension->data;
  23739. ssl->secure_renegotiation->enabled = 1;
  23740. }
  23741. }
  23742. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  23743. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  23744. /* check for TLS_FALLBACK_SCSV suite */
  23745. if (FindSuite(&clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  23746. WOLFSSL_MSG("Found Fallback SCSV");
  23747. if (ssl->ctx->method->version.minor > pv.minor) {
  23748. WOLFSSL_MSG("Client trying to connect with lesser version");
  23749. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  23750. return VERSION_ERROR;
  23751. }
  23752. }
  23753. #endif
  23754. #ifdef WOLFSSL_DTLS
  23755. if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
  23756. ret = wc_HmacUpdate(&cookieHmac,
  23757. input + i - OPAQUE16_LEN,
  23758. clSuites.suiteSz + OPAQUE16_LEN);
  23759. if (ret != 0) return ret;
  23760. }
  23761. #endif /* WOLFSSL_DTLS */
  23762. i += clSuites.suiteSz;
  23763. clSuites.hashSigAlgoSz = 0;
  23764. /* compression length */
  23765. b = input[i++];
  23766. if ((i - begin) + b > helloSz)
  23767. return BUFFER_ERROR;
  23768. if (b == 0) {
  23769. WOLFSSL_MSG("No compression types in list");
  23770. #ifdef WOLFSSL_EXTRA_ALERTS
  23771. SendAlert(ssl, alert_fatal, decode_error);
  23772. #endif
  23773. return COMPRESSION_ERROR;
  23774. }
  23775. #ifdef WOLFSSL_DTLS
  23776. if (IsDtlsNotSctpMode(ssl)) {
  23777. if (!IsSCR(ssl) && !ssl->options.resuming) {
  23778. byte newCookie[MAX_COOKIE_LEN];
  23779. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  23780. if (ret != 0) return ret;
  23781. ret = wc_HmacFinal(&cookieHmac, newCookie);
  23782. if (ret != 0) return ret;
  23783. /* If a cookie callback is set, call it to overwrite the cookie.
  23784. * This should be deprecated. The code now calculates the cookie
  23785. * using an HMAC as expected. */
  23786. if (ssl->ctx->CBIOCookie != NULL &&
  23787. ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz,
  23788. ssl->IOCB_CookieCtx) != cookieSz) {
  23789. return COOKIE_ERROR;
  23790. }
  23791. /* Check the cookie, see if we progress the state machine. */
  23792. if (peerCookieSz != cookieSz ||
  23793. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  23794. /* Send newCookie to client in a HelloVerifyRequest message
  23795. * and let the state machine alone. */
  23796. ssl->msgsReceived.got_client_hello = 0;
  23797. ssl->keys.dtls_handshake_number = 0;
  23798. ssl->keys.dtls_expected_peer_handshake_number = 0;
  23799. *inOutIdx += helloSz;
  23800. return SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  23801. }
  23802. }
  23803. /* This was skipped in the DTLS case so we could handle the hello
  23804. * verify request. */
  23805. ret = HashInput(ssl, input + *inOutIdx, helloSz);
  23806. if (ret != 0) return ret;
  23807. }
  23808. #endif /* WOLFSSL_DTLS */
  23809. {
  23810. /* compression match types */
  23811. int matchNo = 0;
  23812. int matchZlib = 0;
  23813. while (b--) {
  23814. byte comp = input[i++];
  23815. if (comp == NO_COMPRESSION) {
  23816. matchNo = 1;
  23817. }
  23818. if (comp == ZLIB_COMPRESSION) {
  23819. matchZlib = 1;
  23820. }
  23821. }
  23822. if (ssl->options.usingCompression == 0 && matchNo) {
  23823. WOLFSSL_MSG("Matched No Compression");
  23824. } else if (ssl->options.usingCompression && matchZlib) {
  23825. WOLFSSL_MSG("Matched zlib Compression");
  23826. } else if (ssl->options.usingCompression && matchNo) {
  23827. WOLFSSL_MSG("Could only match no compression, turning off");
  23828. ssl->options.usingCompression = 0; /* turn off */
  23829. } else {
  23830. WOLFSSL_MSG("Could not match compression");
  23831. #ifdef WOLFSSL_EXTRA_ALERTS
  23832. SendAlert(ssl, alert_fatal, illegal_parameter);
  23833. #endif
  23834. return COMPRESSION_ERROR;
  23835. }
  23836. }
  23837. *inOutIdx = i;
  23838. /* tls extensions */
  23839. if ((i - begin) < helloSz) {
  23840. #ifdef HAVE_TLS_EXTENSIONS
  23841. #ifdef HAVE_QSH
  23842. QSH_Init(ssl);
  23843. #endif
  23844. if (TLSX_SupportExtensions(ssl))
  23845. #else
  23846. if (IsAtLeastTLSv1_2(ssl))
  23847. #endif
  23848. {
  23849. /* Process the hello extension. Skip unsupported. */
  23850. word16 totalExtSz;
  23851. #ifdef HAVE_TLS_EXTENSIONS
  23852. /* auto populate extensions supported unless user defined */
  23853. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  23854. return ret;
  23855. #endif
  23856. if ((i - begin) + OPAQUE16_LEN > helloSz)
  23857. return BUFFER_ERROR;
  23858. ato16(&input[i], &totalExtSz);
  23859. i += OPAQUE16_LEN;
  23860. if ((i - begin) + totalExtSz > helloSz)
  23861. return BUFFER_ERROR;
  23862. #ifdef HAVE_TLS_EXTENSIONS
  23863. /* tls extensions */
  23864. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  23865. client_hello, &clSuites)))
  23866. return ret;
  23867. #ifdef WOLFSSL_TLS13
  23868. if (TLSX_Find(ssl->extensions,
  23869. TLSX_SUPPORTED_VERSIONS) != NULL) {
  23870. WOLFSSL_MSG(
  23871. "Client attempting to connect with higher version");
  23872. return VERSION_ERROR;
  23873. }
  23874. #endif
  23875. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  23876. if((ret=SNI_Callback(ssl)))
  23877. return ret;
  23878. ssl->options.side = WOLFSSL_SERVER_END;
  23879. #endif
  23880. i += totalExtSz;
  23881. #else
  23882. while (totalExtSz) {
  23883. word16 extId, extSz;
  23884. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  23885. return BUFFER_ERROR;
  23886. ato16(&input[i], &extId);
  23887. i += OPAQUE16_LEN;
  23888. ato16(&input[i], &extSz);
  23889. i += OPAQUE16_LEN;
  23890. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  23891. return BUFFER_ERROR;
  23892. if (extId == HELLO_EXT_SIG_ALGO) {
  23893. word16 hashSigAlgoSz;
  23894. ato16(&input[i], &hashSigAlgoSz);
  23895. i += OPAQUE16_LEN;
  23896. if (OPAQUE16_LEN + hashSigAlgoSz > extSz)
  23897. return BUFFER_ERROR;
  23898. if (hashSigAlgoSz % 2 != 0)
  23899. return BUFFER_ERROR;
  23900. clSuites.hashSigAlgoSz = hashSigAlgoSz;
  23901. if (clSuites.hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  23902. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  23903. "truncating");
  23904. clSuites.hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  23905. }
  23906. XMEMCPY(clSuites.hashSigAlgo, &input[i],
  23907. clSuites.hashSigAlgoSz);
  23908. i += hashSigAlgoSz;
  23909. }
  23910. #ifdef HAVE_EXTENDED_MASTER
  23911. else if (extId == HELLO_EXT_EXTMS)
  23912. ssl->options.haveEMS = 1;
  23913. #endif
  23914. else
  23915. i += extSz;
  23916. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  23917. }
  23918. #endif
  23919. *inOutIdx = i;
  23920. }
  23921. else
  23922. *inOutIdx = begin + helloSz; /* skip extensions */
  23923. }
  23924. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  23925. ssl->options.haveSessionId = 1;
  23926. /* ProcessOld uses same resume code */
  23927. if (ssl->options.resuming) {
  23928. ret = HandleTlsResumption(ssl, bogusID, &clSuites);
  23929. if (ret != 0)
  23930. return ret;
  23931. #ifdef HAVE_SECURE_RENEGOTIATION
  23932. if (ssl->secure_renegotiation &&
  23933. ssl->secure_renegotiation->enabled &&
  23934. IsEncryptionOn(ssl, 0))
  23935. ssl->secure_renegotiation->startScr = 1;
  23936. #endif
  23937. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  23938. WOLFSSL_LEAVE("DoClientHello", ret);
  23939. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  23940. return ret;
  23941. }
  23942. }
  23943. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
  23944. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  23945. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  23946. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  23947. * present and no matches in the server's list. */
  23948. ret = TLSX_SupportedFFDHE_Set(ssl);
  23949. if (ret != 0)
  23950. return ret;
  23951. }
  23952. #endif
  23953. #endif
  23954. ret = MatchSuite(ssl, &clSuites);
  23955. #ifdef WOLFSSL_EXTRA_ALERTS
  23956. if (ret == BUFFER_ERROR)
  23957. SendAlert(ssl, alert_fatal, decode_error);
  23958. else if (ret < 0)
  23959. SendAlert(ssl, alert_fatal, handshake_failure);
  23960. #endif
  23961. #ifdef HAVE_SECURE_RENEGOTIATION
  23962. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  23963. IsEncryptionOn(ssl, 0)) {
  23964. ssl->secure_renegotiation->startScr = 1;
  23965. }
  23966. #endif
  23967. #ifdef WOLFSSL_DTLS
  23968. if (ret == 0 && ssl->options.dtls)
  23969. DtlsMsgPoolReset(ssl);
  23970. #endif
  23971. WOLFSSL_LEAVE("DoClientHello", ret);
  23972. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  23973. return ret;
  23974. }
  23975. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  23976. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  23977. typedef struct DcvArgs {
  23978. byte* output; /* not allocated */
  23979. word32 sendSz;
  23980. word16 sz;
  23981. word32 sigSz;
  23982. word32 idx;
  23983. word32 begin;
  23984. byte hashAlgo;
  23985. byte sigAlgo;
  23986. } DcvArgs;
  23987. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  23988. {
  23989. DcvArgs* args = (DcvArgs*)pArgs;
  23990. (void)ssl;
  23991. (void)args;
  23992. }
  23993. /* handle processing of certificate_verify (15) */
  23994. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  23995. word32* inOutIdx, word32 size)
  23996. {
  23997. int ret = 0;
  23998. #ifdef WOLFSSL_ASYNC_CRYPT
  23999. DcvArgs* args = (DcvArgs*)ssl->async.args;
  24000. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  24001. (void)sizeof(args_test);
  24002. #else
  24003. DcvArgs args[1];
  24004. #endif
  24005. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  24006. WOLFSSL_ENTER("DoCertificateVerify");
  24007. #ifdef WOLFSSL_ASYNC_CRYPT
  24008. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  24009. if (ret != WC_NOT_PENDING_E) {
  24010. /* Check for error */
  24011. if (ret < 0)
  24012. goto exit_dcv;
  24013. }
  24014. else
  24015. #endif
  24016. {
  24017. /* Reset state */
  24018. ret = 0;
  24019. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  24020. XMEMSET(args, 0, sizeof(DcvArgs));
  24021. args->hashAlgo = sha_mac;
  24022. args->sigAlgo = anonymous_sa_algo;
  24023. args->idx = *inOutIdx;
  24024. args->begin = *inOutIdx;
  24025. #ifdef WOLFSSL_ASYNC_CRYPT
  24026. ssl->async.freeArgs = FreeDcvArgs;
  24027. #endif
  24028. }
  24029. switch(ssl->options.asyncState)
  24030. {
  24031. case TLS_ASYNC_BEGIN:
  24032. {
  24033. #ifdef WOLFSSL_CALLBACKS
  24034. if (ssl->hsInfoOn)
  24035. AddPacketName(ssl, "CertificateVerify");
  24036. if (ssl->toInfoOn)
  24037. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  24038. #endif
  24039. /* Advance state and proceed */
  24040. ssl->options.asyncState = TLS_ASYNC_BUILD;
  24041. } /* case TLS_ASYNC_BEGIN */
  24042. FALL_THROUGH;
  24043. case TLS_ASYNC_BUILD:
  24044. {
  24045. if (IsAtLeastTLSv1_2(ssl)) {
  24046. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  24047. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  24048. }
  24049. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  24050. &args->sigAlgo);
  24051. args->idx += 2;
  24052. }
  24053. #ifndef NO_RSA
  24054. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  24055. args->sigAlgo = rsa_sa_algo;
  24056. #endif
  24057. #ifdef HAVE_ECC
  24058. else if (ssl->peerEccDsaKeyPresent)
  24059. args->sigAlgo = ecc_dsa_sa_algo;
  24060. #endif
  24061. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  24062. else if (ssl->peerEd25519KeyPresent)
  24063. args->sigAlgo = ed25519_sa_algo;
  24064. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  24065. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  24066. else if (ssl->peerEd448KeyPresent)
  24067. args->sigAlgo = ed448_sa_algo;
  24068. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  24069. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24070. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  24071. }
  24072. ato16(input + args->idx, &args->sz);
  24073. args->idx += OPAQUE16_LEN;
  24074. if ((args->idx - args->begin) + args->sz > size ||
  24075. args->sz > ENCRYPT_LEN) {
  24076. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  24077. }
  24078. #ifdef HAVE_ECC
  24079. if (ssl->peerEccDsaKeyPresent) {
  24080. WOLFSSL_MSG("Doing ECC peer cert verify");
  24081. /* make sure a default is defined */
  24082. #if !defined(NO_SHA)
  24083. SetDigest(ssl, sha_mac);
  24084. #elif !defined(NO_SHA256)
  24085. SetDigest(ssl, sha256_mac);
  24086. #elif defined(WOLFSSL_SHA384)
  24087. SetDigest(ssl, sha384_mac);
  24088. #elif defined(WOLFSSL_SHA512)
  24089. SetDigest(ssl, sha512_mac);
  24090. #else
  24091. #error No digest enabled for ECC sig verify
  24092. #endif
  24093. if (IsAtLeastTLSv1_2(ssl)) {
  24094. if (args->sigAlgo != ecc_dsa_sa_algo) {
  24095. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  24096. }
  24097. SetDigest(ssl, args->hashAlgo);
  24098. }
  24099. }
  24100. #endif /* HAVE_ECC */
  24101. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  24102. if (ssl->peerEd25519KeyPresent) {
  24103. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  24104. if (IsAtLeastTLSv1_2(ssl) &&
  24105. args->sigAlgo != ed25519_sa_algo) {
  24106. WOLFSSL_MSG(
  24107. "Oops, peer sent ED25519 key but not in verify");
  24108. }
  24109. }
  24110. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  24111. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  24112. if (ssl->peerEd448KeyPresent) {
  24113. WOLFSSL_MSG("Doing ED448 peer cert verify");
  24114. if (IsAtLeastTLSv1_2(ssl) &&
  24115. args->sigAlgo != ed448_sa_algo) {
  24116. WOLFSSL_MSG(
  24117. "Oops, peer sent ED448 key but not in verify");
  24118. }
  24119. }
  24120. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  24121. /* Advance state and proceed */
  24122. ssl->options.asyncState = TLS_ASYNC_DO;
  24123. } /* case TLS_ASYNC_BUILD */
  24124. FALL_THROUGH;
  24125. case TLS_ASYNC_DO:
  24126. {
  24127. #ifndef NO_RSA
  24128. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  24129. WOLFSSL_MSG("Doing RSA peer cert verify");
  24130. ret = RsaVerify(ssl,
  24131. input + args->idx,
  24132. args->sz,
  24133. &args->output,
  24134. args->sigAlgo, args->hashAlgo,
  24135. ssl->peerRsaKey,
  24136. #ifdef HAVE_PK_CALLBACKS
  24137. &ssl->buffers.peerRsaKey
  24138. #else
  24139. NULL
  24140. #endif
  24141. );
  24142. if (ret >= 0) {
  24143. if (args->sigAlgo == rsa_sa_algo)
  24144. args->sendSz = ret;
  24145. else {
  24146. args->sigSz = ret;
  24147. args->sendSz = ssl->buffers.digest.length;
  24148. }
  24149. ret = 0;
  24150. }
  24151. }
  24152. #endif /* !NO_RSA */
  24153. #ifdef HAVE_ECC
  24154. if (ssl->peerEccDsaKeyPresent) {
  24155. WOLFSSL_MSG("Doing ECC peer cert verify");
  24156. ret = EccVerify(ssl,
  24157. input + args->idx, args->sz,
  24158. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  24159. ssl->peerEccDsaKey,
  24160. #ifdef HAVE_PK_CALLBACKS
  24161. &ssl->buffers.peerEccDsaKey
  24162. #else
  24163. NULL
  24164. #endif
  24165. );
  24166. }
  24167. #endif /* HAVE_ECC */
  24168. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  24169. if (ssl->peerEd25519KeyPresent) {
  24170. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  24171. ret = Ed25519Verify(ssl,
  24172. input + args->idx, args->sz,
  24173. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  24174. ssl->peerEd25519Key,
  24175. #ifdef HAVE_PK_CALLBACKS
  24176. &ssl->buffers.peerEd25519Key
  24177. #else
  24178. NULL
  24179. #endif
  24180. );
  24181. }
  24182. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  24183. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  24184. if (ssl->peerEd448KeyPresent) {
  24185. WOLFSSL_MSG("Doing Ed448 peer cert verify");
  24186. ret = Ed448Verify(ssl,
  24187. input + args->idx, args->sz,
  24188. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  24189. ssl->peerEd448Key,
  24190. #ifdef HAVE_PK_CALLBACKS
  24191. &ssl->buffers.peerEd448Key
  24192. #else
  24193. NULL
  24194. #endif
  24195. );
  24196. }
  24197. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  24198. #ifdef WOLFSSL_ASYNC_CRYPT
  24199. /* handle async pending */
  24200. if (ret == WC_PENDING_E)
  24201. goto exit_dcv;
  24202. #endif
  24203. /* Check for error */
  24204. if (ret != 0) {
  24205. ret = SIG_VERIFY_E;
  24206. goto exit_dcv;
  24207. }
  24208. /* Advance state and proceed */
  24209. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  24210. } /* case TLS_ASYNC_DO */
  24211. FALL_THROUGH;
  24212. case TLS_ASYNC_VERIFY:
  24213. {
  24214. #ifndef NO_RSA
  24215. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  24216. if (IsAtLeastTLSv1_2(ssl)) {
  24217. #ifdef WC_RSA_PSS
  24218. if (args->sigAlgo == rsa_pss_sa_algo) {
  24219. SetDigest(ssl, args->hashAlgo);
  24220. #ifdef HAVE_SELFTEST
  24221. ret = wc_RsaPSS_CheckPadding(
  24222. ssl->buffers.digest.buffer,
  24223. ssl->buffers.digest.length,
  24224. args->output, args->sigSz,
  24225. HashAlgoToType(args->hashAlgo));
  24226. #else
  24227. ret = wc_RsaPSS_CheckPadding_ex(
  24228. ssl->buffers.digest.buffer,
  24229. ssl->buffers.digest.length,
  24230. args->output, args->sigSz,
  24231. HashAlgoToType(args->hashAlgo), -1,
  24232. mp_count_bits(&ssl->peerRsaKey->n));
  24233. #endif
  24234. if (ret != 0) {
  24235. ret = SIG_VERIFY_E;
  24236. goto exit_dcv;
  24237. }
  24238. }
  24239. else
  24240. #endif
  24241. {
  24242. #ifdef WOLFSSL_SMALL_STACK
  24243. byte* encodedSig;
  24244. #else
  24245. byte encodedSig[MAX_ENCODED_SIG_SZ];
  24246. #endif
  24247. #ifdef WOLFSSL_SMALL_STACK
  24248. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  24249. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24250. if (encodedSig == NULL) {
  24251. ERROR_OUT(MEMORY_E, exit_dcv);
  24252. }
  24253. #endif
  24254. if (args->sigAlgo != rsa_sa_algo) {
  24255. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  24256. "in verify");
  24257. }
  24258. SetDigest(ssl, args->hashAlgo);
  24259. args->sigSz = wc_EncodeSignature(encodedSig,
  24260. ssl->buffers.digest.buffer,
  24261. ssl->buffers.digest.length,
  24262. TypeHash(args->hashAlgo));
  24263. if (args->sendSz != args->sigSz || !args->output ||
  24264. XMEMCMP(args->output, encodedSig,
  24265. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  24266. ret = VERIFY_CERT_ERROR;
  24267. }
  24268. #ifdef WOLFSSL_SMALL_STACK
  24269. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24270. #endif
  24271. }
  24272. }
  24273. else {
  24274. if (args->sendSz != FINISHED_SZ || !args->output ||
  24275. XMEMCMP(args->output,
  24276. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  24277. ret = VERIFY_CERT_ERROR;
  24278. }
  24279. }
  24280. }
  24281. #endif /* !NO_RSA */
  24282. /* Advance state and proceed */
  24283. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  24284. } /* case TLS_ASYNC_VERIFY */
  24285. FALL_THROUGH;
  24286. case TLS_ASYNC_FINALIZE:
  24287. {
  24288. if (IsEncryptionOn(ssl, 0)) {
  24289. args->idx += ssl->keys.padSz;
  24290. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  24291. if (ssl->options.startedETMRead)
  24292. args->idx += MacSize(ssl);
  24293. #endif
  24294. }
  24295. ssl->options.havePeerVerify = 1;
  24296. /* Set final index */
  24297. args->idx += args->sz;
  24298. *inOutIdx = args->idx;
  24299. /* Advance state and proceed */
  24300. ssl->options.asyncState = TLS_ASYNC_END;
  24301. } /* case TLS_ASYNC_FINALIZE */
  24302. case TLS_ASYNC_END:
  24303. {
  24304. break;
  24305. }
  24306. default:
  24307. ret = INPUT_CASE_ERROR;
  24308. } /* switch(ssl->options.asyncState) */
  24309. exit_dcv:
  24310. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  24311. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  24312. #ifdef WOLFSSL_ASYNC_CRYPT
  24313. /* Handle async operation */
  24314. if (ret == WC_PENDING_E) {
  24315. /* Mark message as not received so it can process again */
  24316. ssl->msgsReceived.got_certificate_verify = 0;
  24317. return ret;
  24318. }
  24319. #endif /* WOLFSSL_ASYNC_CRYPT */
  24320. #ifdef WOLFSSL_EXTRA_ALERTS
  24321. if (ret == BUFFER_ERROR)
  24322. SendAlert(ssl, alert_fatal, decode_error);
  24323. else if (ret == SIG_VERIFY_E)
  24324. SendAlert(ssl, alert_fatal, decrypt_error);
  24325. else if (ret != 0)
  24326. SendAlert(ssl, alert_fatal, bad_certificate);
  24327. #endif
  24328. /* Digest is not allocated, so do this to prevent free */
  24329. ssl->buffers.digest.buffer = NULL;
  24330. ssl->buffers.digest.length = 0;
  24331. /* Final cleanup */
  24332. FreeDcvArgs(ssl, args);
  24333. FreeKeyExchange(ssl);
  24334. return ret;
  24335. }
  24336. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  24337. /* handle generation of server_hello_done (14) */
  24338. int SendServerHelloDone(WOLFSSL* ssl)
  24339. {
  24340. byte* output;
  24341. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  24342. int ret;
  24343. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  24344. WOLFSSL_ENTER("SendServerHelloDone");
  24345. #ifdef WOLFSSL_DTLS
  24346. if (ssl->options.dtls)
  24347. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24348. #endif
  24349. if (IsEncryptionOn(ssl, 1))
  24350. sendSz += MAX_MSG_EXTRA;
  24351. /* check for available size */
  24352. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  24353. return ret;
  24354. /* get output buffer */
  24355. output = ssl->buffers.outputBuffer.buffer +
  24356. ssl->buffers.outputBuffer.length;
  24357. AddHeaders(output, 0, server_hello_done, ssl);
  24358. if (IsEncryptionOn(ssl, 1)) {
  24359. byte* input;
  24360. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  24361. int recordHeaderSz = RECORD_HEADER_SZ;
  24362. if (ssl->options.dtls) {
  24363. recordHeaderSz += DTLS_RECORD_EXTRA;
  24364. inputSz += DTLS_HANDSHAKE_EXTRA;
  24365. }
  24366. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24367. if (input == NULL)
  24368. return MEMORY_E;
  24369. XMEMCPY(input, output + recordHeaderSz, inputSz);
  24370. #ifdef WOLFSSL_DTLS
  24371. if (IsDtlsNotSctpMode(ssl) &&
  24372. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
  24373. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24374. return ret;
  24375. }
  24376. #endif
  24377. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  24378. handshake, 1, 0, 0, CUR_ORDER);
  24379. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24380. if (sendSz < 0)
  24381. return sendSz;
  24382. } else {
  24383. #ifdef WOLFSSL_DTLS
  24384. if (IsDtlsNotSctpMode(ssl)) {
  24385. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
  24386. return ret;
  24387. }
  24388. if (ssl->options.dtls)
  24389. DtlsSEQIncrement(ssl, CUR_ORDER);
  24390. #endif
  24391. ret = HashOutput(ssl, output, sendSz, 0);
  24392. if (ret != 0)
  24393. return ret;
  24394. }
  24395. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  24396. if (ssl->hsInfoOn)
  24397. AddPacketName(ssl, "ServerHelloDone");
  24398. if (ssl->toInfoOn)
  24399. AddPacketInfo(ssl, "ServerHelloDone", handshake, output, sendSz,
  24400. WRITE_PROTO, ssl->heap);
  24401. #endif
  24402. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  24403. ssl->buffers.outputBuffer.length += sendSz;
  24404. ret = SendBuffered(ssl);
  24405. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  24406. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  24407. return ret;
  24408. }
  24409. #endif /* !WOLFSSL_NO_TLS12 */
  24410. #ifdef HAVE_SESSION_TICKET
  24411. #define WOLFSSL_TICKET_FIXED_SZ (WOLFSSL_TICKET_NAME_SZ + \
  24412. WOLFSSL_TICKET_IV_SZ + WOLFSSL_TICKET_MAC_SZ + LENGTH_SZ)
  24413. #define WOLFSSL_TICKET_ENC_SZ (SESSION_TICKET_LEN - WOLFSSL_TICKET_FIXED_SZ)
  24414. /* our ticket format */
  24415. typedef struct InternalTicket {
  24416. ProtocolVersion pv; /* version when ticket created */
  24417. byte suite[SUITE_LEN]; /* cipher suite when created */
  24418. byte msecret[SECRET_LEN]; /* master secret */
  24419. word32 timestamp; /* born on */
  24420. word16 haveEMS; /* have extended master secret */
  24421. #ifdef WOLFSSL_TLS13
  24422. word32 ageAdd; /* Obfuscation of age */
  24423. word16 namedGroup; /* Named group used */
  24424. TicketNonce ticketNonce; /* Ticket nonce */
  24425. #ifdef WOLFSSL_EARLY_DATA
  24426. word32 maxEarlyDataSz; /* Max size of early data */
  24427. #endif
  24428. #endif
  24429. } InternalTicket;
  24430. /* RFC 5077 defines this for session tickets */
  24431. /* fit within SESSION_TICKET_LEN */
  24432. typedef struct ExternalTicket {
  24433. byte key_name[WOLFSSL_TICKET_NAME_SZ]; /* key context name */
  24434. byte iv[WOLFSSL_TICKET_IV_SZ]; /* this ticket's iv */
  24435. byte enc_len[LENGTH_SZ]; /* encrypted length */
  24436. byte enc_ticket[WOLFSSL_TICKET_ENC_SZ]; /* encrypted internal ticket */
  24437. byte mac[WOLFSSL_TICKET_MAC_SZ]; /* total mac */
  24438. /* !! if add to structure, add to TICKET_FIXED_SZ !! */
  24439. } ExternalTicket;
  24440. /* create a new session ticket, 0 on success */
  24441. int CreateTicket(WOLFSSL* ssl)
  24442. {
  24443. InternalTicket it;
  24444. ExternalTicket* et = (ExternalTicket*)ssl->session.ticket;
  24445. int encLen;
  24446. int ret;
  24447. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  24448. XMEMSET(&it, 0, sizeof(it));
  24449. /* build internal */
  24450. it.pv.major = ssl->version.major;
  24451. it.pv.minor = ssl->version.minor;
  24452. it.suite[0] = ssl->options.cipherSuite0;
  24453. it.suite[1] = ssl->options.cipherSuite;
  24454. #ifdef WOLFSSL_EARLY_DATA
  24455. it.maxEarlyDataSz = ssl->options.maxEarlyDataSz;
  24456. #endif
  24457. if (!ssl->options.tls1_3) {
  24458. XMEMCPY(it.msecret, ssl->arrays->masterSecret, SECRET_LEN);
  24459. c32toa(LowResTimer(), (byte*)&it.timestamp);
  24460. it.haveEMS = ssl->options.haveEMS;
  24461. }
  24462. else {
  24463. #ifdef WOLFSSL_TLS13
  24464. /* Client adds to ticket age to obfuscate. */
  24465. ret = wc_RNG_GenerateBlock(ssl->rng, (byte*)&it.ageAdd,
  24466. sizeof(it.ageAdd));
  24467. if (ret != 0)
  24468. return BAD_TICKET_ENCRYPT;
  24469. ssl->session.ticketAdd = it.ageAdd;
  24470. it.namedGroup = ssl->session.namedGroup;
  24471. it.timestamp = TimeNowInMilliseconds();
  24472. /* Resumption master secret. */
  24473. XMEMCPY(it.msecret, ssl->session.masterSecret, SECRET_LEN);
  24474. XMEMCPY(&it.ticketNonce, &ssl->session.ticketNonce,
  24475. sizeof(TicketNonce));
  24476. #endif
  24477. }
  24478. /* build external */
  24479. XMEMCPY(et->enc_ticket, &it, sizeof(InternalTicket));
  24480. /* encrypt */
  24481. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  24482. if (ssl->ctx->ticketEncCb == NULL) {
  24483. ret = WOLFSSL_TICKET_RET_FATAL;
  24484. }
  24485. else {
  24486. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac, 1,
  24487. et->enc_ticket, sizeof(InternalTicket),
  24488. &encLen, ssl->ctx->ticketEncCtx);
  24489. }
  24490. if (ret == WOLFSSL_TICKET_RET_OK) {
  24491. if (encLen < (int)sizeof(InternalTicket) ||
  24492. encLen > WOLFSSL_TICKET_ENC_SZ) {
  24493. WOLFSSL_MSG("Bad user ticket encrypt size");
  24494. return BAD_TICKET_KEY_CB_SZ;
  24495. }
  24496. /* sanity checks on encrypt callback */
  24497. /* internal ticket can't be the same if encrypted */
  24498. if (XMEMCMP(et->enc_ticket, &it, sizeof(InternalTicket)) == 0) {
  24499. WOLFSSL_MSG("User ticket encrypt didn't encrypt");
  24500. return BAD_TICKET_ENCRYPT;
  24501. }
  24502. XMEMSET(zeros, 0, sizeof(zeros));
  24503. /* name */
  24504. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  24505. WOLFSSL_MSG("User ticket encrypt didn't set name");
  24506. return BAD_TICKET_ENCRYPT;
  24507. }
  24508. /* iv */
  24509. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  24510. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  24511. return BAD_TICKET_ENCRYPT;
  24512. }
  24513. /* mac */
  24514. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  24515. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  24516. return BAD_TICKET_ENCRYPT;
  24517. }
  24518. /* set size */
  24519. c16toa((word16)encLen, et->enc_len);
  24520. ssl->session.ticketLen = (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  24521. if (encLen < WOLFSSL_TICKET_ENC_SZ) {
  24522. /* move mac up since whole enc buffer not used */
  24523. XMEMMOVE(et->enc_ticket +encLen, et->mac,WOLFSSL_TICKET_MAC_SZ);
  24524. }
  24525. }
  24526. return ret;
  24527. }
  24528. /* Parse ticket sent by client, returns callback return value */
  24529. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  24530. {
  24531. ExternalTicket* et;
  24532. InternalTicket* it;
  24533. int ret;
  24534. int outLen;
  24535. word16 inLen;
  24536. WOLFSSL_START(WC_FUNC_TICKET_DO);
  24537. WOLFSSL_ENTER("DoClientTicket");
  24538. if (len > SESSION_TICKET_LEN ||
  24539. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  24540. return BAD_TICKET_MSG_SZ;
  24541. }
  24542. et = (ExternalTicket*)input;
  24543. it = (InternalTicket*)et->enc_ticket;
  24544. /* decrypt */
  24545. ato16(et->enc_len, &inLen);
  24546. if (inLen > (word16)(len - WOLFSSL_TICKET_FIXED_SZ)) {
  24547. return BAD_TICKET_MSG_SZ;
  24548. }
  24549. outLen = inLen; /* may be reduced by user padding */
  24550. if (ssl->ctx->ticketEncCb == NULL) {
  24551. ret = WOLFSSL_TICKET_RET_FATAL;
  24552. }
  24553. else {
  24554. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv,
  24555. et->enc_ticket + inLen, 0,
  24556. et->enc_ticket, inLen, &outLen,
  24557. ssl->ctx->ticketEncCtx);
  24558. }
  24559. if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) return ret;
  24560. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  24561. WOLFSSL_MSG("Bad user ticket decrypt len");
  24562. return BAD_TICKET_KEY_CB_SZ;
  24563. }
  24564. /* get master secret */
  24565. if (ret == WOLFSSL_TICKET_RET_OK || ret == WOLFSSL_TICKET_RET_CREATE) {
  24566. if (ssl->version.minor < it->pv.minor) {
  24567. WOLFSSL_MSG("Ticket has greater version");
  24568. return VERSION_ERROR;
  24569. }
  24570. else if (ssl->version.minor > it->pv.minor) {
  24571. if (!ssl->options.downgrade) {
  24572. WOLFSSL_MSG("Ticket has lesser version");
  24573. return VERSION_ERROR;
  24574. }
  24575. WOLFSSL_MSG("Downgrading protocol due to ticket");
  24576. if (it->pv.minor < ssl->options.minDowngrade)
  24577. return VERSION_ERROR;
  24578. ssl->version.minor = it->pv.minor;
  24579. }
  24580. if (!IsAtLeastTLSv1_3(ssl->version)) {
  24581. XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN);
  24582. /* Copy the haveExtendedMasterSecret property from the ticket to
  24583. * the saved session, so the property may be checked later. */
  24584. ssl->session.haveEMS = it->haveEMS;
  24585. #ifndef NO_RESUME_SUITE_CHECK
  24586. ssl->session.cipherSuite0 = it->suite[0];
  24587. ssl->session.cipherSuite = it->suite[1];
  24588. #endif
  24589. }
  24590. else {
  24591. #ifdef WOLFSSL_TLS13
  24592. /* Restore information to renegotiate. */
  24593. ssl->session.ticketSeen = it->timestamp;
  24594. ssl->session.ticketAdd = it->ageAdd;
  24595. ssl->session.cipherSuite0 = it->suite[0];
  24596. ssl->session.cipherSuite = it->suite[1];
  24597. #ifdef WOLFSSL_EARLY_DATA
  24598. ssl->session.maxEarlyDataSz = it->maxEarlyDataSz;
  24599. #endif
  24600. /* Resumption master secret. */
  24601. XMEMCPY(ssl->session.masterSecret, it->msecret, SECRET_LEN);
  24602. XMEMCPY(&ssl->session.ticketNonce, &it->ticketNonce,
  24603. sizeof(TicketNonce));
  24604. ssl->session.namedGroup = it->namedGroup;
  24605. #endif
  24606. }
  24607. }
  24608. WOLFSSL_LEAVE("DoClientTicket", ret);
  24609. WOLFSSL_END(WC_FUNC_TICKET_DO);
  24610. return ret;
  24611. }
  24612. /* send Session Ticket */
  24613. int SendTicket(WOLFSSL* ssl)
  24614. {
  24615. byte* output;
  24616. int ret;
  24617. int sendSz;
  24618. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  24619. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  24620. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  24621. WOLFSSL_ENTER("SendTicket");
  24622. if (ssl->options.createTicket) {
  24623. ret = CreateTicket(ssl);
  24624. if (ret != 0) return ret;
  24625. }
  24626. length += ssl->session.ticketLen;
  24627. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  24628. if (!ssl->options.dtls) {
  24629. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  24630. sendSz += MAX_MSG_EXTRA;
  24631. }
  24632. else {
  24633. #ifdef WOLFSSL_DTLS
  24634. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24635. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24636. #endif
  24637. }
  24638. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  24639. sendSz += cipherExtraData(ssl);
  24640. /* check for available size */
  24641. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  24642. return ret;
  24643. /* get output buffer */
  24644. output = ssl->buffers.outputBuffer.buffer +
  24645. ssl->buffers.outputBuffer.length;
  24646. AddHeaders(output, length, session_ticket, ssl);
  24647. /* hint */
  24648. c32toa(ssl->ctx->ticketHint, output + idx);
  24649. idx += SESSION_HINT_SZ;
  24650. /* length */
  24651. c16toa(ssl->session.ticketLen, output + idx);
  24652. idx += LENGTH_SZ;
  24653. /* ticket */
  24654. XMEMCPY(output + idx, ssl->session.ticket, ssl->session.ticketLen);
  24655. idx += ssl->session.ticketLen;
  24656. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  24657. byte* input;
  24658. int inputSz = idx; /* build msg adds rec hdr */
  24659. int recordHeaderSz = RECORD_HEADER_SZ;
  24660. if (ssl->options.dtls)
  24661. recordHeaderSz += DTLS_RECORD_EXTRA;
  24662. inputSz -= recordHeaderSz;
  24663. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24664. if (input == NULL)
  24665. return MEMORY_E;
  24666. XMEMCPY(input, output + recordHeaderSz, inputSz);
  24667. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  24668. handshake, 1, 0, 0, CUR_ORDER);
  24669. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24670. if (sendSz < 0)
  24671. return sendSz;
  24672. }
  24673. else {
  24674. #ifdef WOLFSSL_DTLS
  24675. if (ssl->options.dtls) {
  24676. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
  24677. return ret;
  24678. DtlsSEQIncrement(ssl, CUR_ORDER);
  24679. }
  24680. #endif
  24681. ret = HashOutput(ssl, output, sendSz, 0);
  24682. if (ret != 0)
  24683. return ret;
  24684. }
  24685. ssl->buffers.outputBuffer.length += sendSz;
  24686. if (!ssl->options.groupMessages)
  24687. ret = SendBuffered(ssl);
  24688. WOLFSSL_LEAVE("SendTicket", ret);
  24689. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  24690. return ret;
  24691. }
  24692. #endif /* HAVE_SESSION_TICKET */
  24693. #ifndef WOLFSSL_NO_TLS12
  24694. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  24695. defined(HAVE_SERVER_RENEGOTIATION_INFO) && \
  24696. !defined(WOLFSSL_NO_SERVER)
  24697. /* handle generation of server's hello_request (0) */
  24698. int SendHelloRequest(WOLFSSL* ssl)
  24699. {
  24700. byte* output;
  24701. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  24702. int ret;
  24703. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  24704. WOLFSSL_ENTER("SendHelloRequest");
  24705. if (IsEncryptionOn(ssl, 1))
  24706. sendSz += MAX_MSG_EXTRA;
  24707. if (ssl->options.dtls)
  24708. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24709. /* check for available size */
  24710. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  24711. return ret;
  24712. /* get output buffer */
  24713. output = ssl->buffers.outputBuffer.buffer +
  24714. ssl->buffers.outputBuffer.length;
  24715. AddHeaders(output, 0, hello_request, ssl);
  24716. if (IsEncryptionOn(ssl, 1)) {
  24717. byte* input;
  24718. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  24719. int recordHeaderSz = RECORD_HEADER_SZ;
  24720. if (ssl->options.dtls) {
  24721. recordHeaderSz += DTLS_RECORD_EXTRA;
  24722. inputSz += DTLS_HANDSHAKE_EXTRA;
  24723. }
  24724. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24725. if (input == NULL)
  24726. return MEMORY_E;
  24727. XMEMCPY(input, output + recordHeaderSz, inputSz);
  24728. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  24729. handshake, 0, 0, 0, CUR_ORDER);
  24730. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24731. if (sendSz < 0)
  24732. return sendSz;
  24733. }
  24734. ssl->buffers.outputBuffer.length += sendSz;
  24735. ret = SendBuffered(ssl);
  24736. WOLFSSL_LEAVE("SendHelloRequest", ret);
  24737. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  24738. return ret;
  24739. }
  24740. #endif /* HAVE_SECURE_RENEGOTIATION && HAVE_SERVER_RENEGOTIATION_INFO */
  24741. #ifdef WOLFSSL_DTLS
  24742. /* handle generation of DTLS hello_verify_request (3) */
  24743. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  24744. const byte* cookie, byte cookieSz)
  24745. {
  24746. byte* output;
  24747. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  24748. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  24749. int sendSz = length + idx;
  24750. int ret;
  24751. /* are we in scr */
  24752. if (IsEncryptionOn(ssl, 1)) {
  24753. sendSz += MAX_MSG_EXTRA;
  24754. }
  24755. /* check for available size */
  24756. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  24757. return ret;
  24758. /* get output buffer */
  24759. output = ssl->buffers.outputBuffer.buffer +
  24760. ssl->buffers.outputBuffer.length;
  24761. /* Hello Verify Request should use the same sequence number as the
  24762. * Client Hello. */
  24763. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  24764. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  24765. AddHeaders(output, length, hello_verify_request, ssl);
  24766. #ifdef OPENSSL_EXTRA
  24767. output[idx++] = DTLS_MAJOR;
  24768. output[idx++] = DTLS_MINOR;
  24769. #else
  24770. output[idx++] = ssl->version.major;
  24771. output[idx++] = ssl->version.minor;
  24772. #endif
  24773. output[idx++] = cookieSz;
  24774. if (cookie == NULL || cookieSz == 0)
  24775. return COOKIE_ERROR;
  24776. XMEMCPY(output + idx, cookie, cookieSz);
  24777. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  24778. if (ssl->hsInfoOn)
  24779. AddPacketName(ssl, "HelloVerifyRequest");
  24780. if (ssl->toInfoOn)
  24781. AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  24782. sendSz, WRITE_PROTO, ssl->heap);
  24783. #endif
  24784. /* are we in scr */
  24785. if (IsEncryptionOn(ssl, 1)) {
  24786. byte* input;
  24787. int inputSz = HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
  24788. int recordHeaderSz = RECORD_HEADER_SZ;
  24789. if (ssl->options.dtls) {
  24790. recordHeaderSz += DTLS_RECORD_EXTRA;
  24791. inputSz += DTLS_HANDSHAKE_EXTRA;
  24792. }
  24793. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24794. if (input == NULL)
  24795. return MEMORY_E;
  24796. XMEMCPY(input, output + recordHeaderSz, inputSz);
  24797. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  24798. handshake, 0, 0, 0, CUR_ORDER);
  24799. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24800. if (sendSz < 0)
  24801. return sendSz;
  24802. }
  24803. ssl->buffers.outputBuffer.length += sendSz;
  24804. return SendBuffered(ssl);
  24805. }
  24806. #endif /* WOLFSSL_DTLS */
  24807. typedef struct DckeArgs {
  24808. byte* output; /* not allocated */
  24809. word32 length;
  24810. word32 idx;
  24811. word32 begin;
  24812. word32 sigSz;
  24813. #ifndef NO_RSA
  24814. int lastErr;
  24815. #endif
  24816. } DckeArgs;
  24817. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  24818. {
  24819. DckeArgs* args = (DckeArgs*)pArgs;
  24820. (void)ssl;
  24821. (void)args;
  24822. }
  24823. /* handle processing client_key_exchange (16) */
  24824. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  24825. word32 size)
  24826. {
  24827. int ret;
  24828. #ifdef WOLFSSL_ASYNC_CRYPT
  24829. DckeArgs* args = (DckeArgs*)ssl->async.args;
  24830. typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
  24831. (void)sizeof(args_test);
  24832. #else
  24833. DckeArgs args[1];
  24834. #endif
  24835. (void)size;
  24836. (void)input;
  24837. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  24838. WOLFSSL_ENTER("DoClientKeyExchange");
  24839. #ifdef WOLFSSL_ASYNC_CRYPT
  24840. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  24841. if (ret != WC_NOT_PENDING_E) {
  24842. /* Check for error */
  24843. if (ret < 0)
  24844. goto exit_dcke;
  24845. }
  24846. else
  24847. #endif /* WOLFSSL_ASYNC_CRYPT */
  24848. {
  24849. /* Reset state */
  24850. ret = 0;
  24851. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  24852. XMEMSET(args, 0, sizeof(DckeArgs));
  24853. args->idx = *inOutIdx;
  24854. args->begin = *inOutIdx;
  24855. #ifdef WOLFSSL_ASYNC_CRYPT
  24856. ssl->async.freeArgs = FreeDckeArgs;
  24857. #endif
  24858. }
  24859. /* Do Client Key Exchange State Machine */
  24860. switch(ssl->options.asyncState)
  24861. {
  24862. case TLS_ASYNC_BEGIN:
  24863. {
  24864. /* Sanity checks */
  24865. if (ssl->options.side != WOLFSSL_SERVER_END) {
  24866. WOLFSSL_MSG("Client received client keyexchange, attack?");
  24867. WOLFSSL_ERROR(ssl->error = SIDE_ERROR);
  24868. ERROR_OUT(WOLFSSL_FATAL_ERROR, exit_dcke);
  24869. }
  24870. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  24871. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  24872. SendAlert(ssl, alert_fatal, unexpected_message);
  24873. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  24874. }
  24875. #ifndef NO_CERTS
  24876. if (ssl->options.verifyPeer && ssl->options.failNoCert) {
  24877. if (!ssl->options.havePeerCert) {
  24878. WOLFSSL_MSG("client didn't present peer cert");
  24879. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  24880. }
  24881. }
  24882. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  24883. if (!ssl->options.havePeerCert &&
  24884. !ssl->options.usingPSK_cipher) {
  24885. WOLFSSL_MSG("client didn't present peer cert");
  24886. return NO_PEER_CERT;
  24887. }
  24888. }
  24889. #endif /* !NO_CERTS */
  24890. #if defined(WOLFSSL_CALLBACKS)
  24891. if (ssl->hsInfoOn) {
  24892. AddPacketName(ssl, "ClientKeyExchange");
  24893. }
  24894. if (ssl->toInfoOn) {
  24895. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  24896. }
  24897. #endif
  24898. if (ssl->arrays->preMasterSecret == NULL) {
  24899. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  24900. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  24901. ssl->heap, DYNAMIC_TYPE_SECRET);
  24902. if (ssl->arrays->preMasterSecret == NULL) {
  24903. ERROR_OUT(MEMORY_E, exit_dcke);
  24904. }
  24905. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  24906. }
  24907. switch (ssl->specs.kea) {
  24908. #ifndef NO_RSA
  24909. case rsa_kea:
  24910. {
  24911. break;
  24912. } /* rsa_kea */
  24913. #endif /* !NO_RSA */
  24914. #ifndef NO_PSK
  24915. case psk_kea:
  24916. {
  24917. /* sanity check that PSK server callback has been set */
  24918. if (ssl->options.server_psk_cb == NULL) {
  24919. WOLFSSL_MSG("No server PSK callback set");
  24920. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  24921. }
  24922. break;
  24923. }
  24924. #endif /* !NO_PSK */
  24925. #ifdef HAVE_NTRU
  24926. case ntru_kea:
  24927. {
  24928. /* make sure private key exists */
  24929. if (ssl->buffers.key == NULL ||
  24930. ssl->buffers.key->buffer == NULL) {
  24931. ERROR_OUT(NO_PRIVATE_KEY, exit_dcke);
  24932. }
  24933. break;
  24934. }
  24935. #endif /* HAVE_NTRU */
  24936. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24937. defined(HAVE_CURVE448)
  24938. case ecc_diffie_hellman_kea:
  24939. {
  24940. break;
  24941. }
  24942. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24943. #ifndef NO_DH
  24944. case diffie_hellman_kea:
  24945. {
  24946. break;
  24947. }
  24948. #endif /* !NO_DH */
  24949. #if !defined(NO_DH) && !defined(NO_PSK)
  24950. case dhe_psk_kea:
  24951. {
  24952. /* sanity check that PSK server callback has been set */
  24953. if (ssl->options.server_psk_cb == NULL) {
  24954. WOLFSSL_MSG("No server PSK callback set");
  24955. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  24956. }
  24957. break;
  24958. }
  24959. #endif /* !NO_DH && !NO_PSK */
  24960. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24961. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  24962. case ecdhe_psk_kea:
  24963. {
  24964. /* sanity check that PSK server callback has been set */
  24965. if (ssl->options.server_psk_cb == NULL) {
  24966. WOLFSSL_MSG("No server PSK callback set");
  24967. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  24968. }
  24969. break;
  24970. }
  24971. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  24972. default:
  24973. WOLFSSL_MSG("Bad kea type");
  24974. ret = BAD_KEA_TYPE_E;
  24975. } /* switch (ssl->specs.kea) */
  24976. /* Check for error */
  24977. if (ret != 0) {
  24978. goto exit_dcke;
  24979. }
  24980. /* Advance state and proceed */
  24981. ssl->options.asyncState = TLS_ASYNC_BUILD;
  24982. } /* TLS_ASYNC_BEGIN */
  24983. FALL_THROUGH;
  24984. case TLS_ASYNC_BUILD:
  24985. {
  24986. switch (ssl->specs.kea) {
  24987. #ifndef NO_RSA
  24988. case rsa_kea:
  24989. {
  24990. word16 keySz;
  24991. ssl->buffers.keyType = rsa_sa_algo;
  24992. ret = DecodePrivateKey(ssl, &keySz);
  24993. if (ret != 0) {
  24994. goto exit_dcke;
  24995. }
  24996. args->length = (word32)keySz;
  24997. ssl->arrays->preMasterSz = SECRET_LEN;
  24998. if (ssl->options.tls) {
  24999. word16 check;
  25000. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25001. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25002. }
  25003. ato16(input + args->idx, &check);
  25004. args->idx += OPAQUE16_LEN;
  25005. if ((word32)check != args->length) {
  25006. WOLFSSL_MSG("RSA explicit size doesn't match");
  25007. #ifdef WOLFSSL_EXTRA_ALERTS
  25008. SendAlert(ssl, alert_fatal, bad_record_mac);
  25009. #endif
  25010. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  25011. }
  25012. }
  25013. if ((args->idx - args->begin) + args->length > size) {
  25014. WOLFSSL_MSG("RSA message too big");
  25015. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25016. }
  25017. /* pre-load PreMasterSecret with RNG data */
  25018. ret = wc_RNG_GenerateBlock(ssl->rng,
  25019. &ssl->arrays->preMasterSecret[VERSION_SZ],
  25020. SECRET_LEN - VERSION_SZ);
  25021. if (ret != 0) {
  25022. goto exit_dcke;
  25023. }
  25024. args->output = NULL;
  25025. break;
  25026. } /* rsa_kea */
  25027. #endif /* !NO_RSA */
  25028. #ifndef NO_PSK
  25029. case psk_kea:
  25030. {
  25031. byte* pms = ssl->arrays->preMasterSecret;
  25032. word16 ci_sz;
  25033. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25034. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25035. }
  25036. ato16(input + args->idx, &ci_sz);
  25037. args->idx += OPAQUE16_LEN;
  25038. if (ci_sz > MAX_PSK_ID_LEN) {
  25039. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  25040. }
  25041. if ((args->idx - args->begin) + ci_sz > size) {
  25042. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25043. }
  25044. XMEMCPY(ssl->arrays->client_identity,
  25045. input + args->idx, ci_sz);
  25046. args->idx += ci_sz;
  25047. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  25048. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  25049. ssl->arrays->client_identity, ssl->arrays->psk_key,
  25050. MAX_PSK_KEY_LEN);
  25051. if (ssl->arrays->psk_keySz == 0 ||
  25052. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  25053. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  25054. }
  25055. /* make psk pre master secret */
  25056. /* length of key + length 0s + length of key + key */
  25057. c16toa((word16) ssl->arrays->psk_keySz, pms);
  25058. pms += OPAQUE16_LEN;
  25059. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  25060. pms += ssl->arrays->psk_keySz;
  25061. c16toa((word16) ssl->arrays->psk_keySz, pms);
  25062. pms += OPAQUE16_LEN;
  25063. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25064. ssl->arrays->preMasterSz =
  25065. (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
  25066. break;
  25067. }
  25068. #endif /* !NO_PSK */
  25069. #ifdef HAVE_NTRU
  25070. case ntru_kea:
  25071. {
  25072. word16 cipherLen;
  25073. word16 plainLen = ENCRYPT_LEN;
  25074. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25075. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25076. }
  25077. ato16(input + args->idx, &cipherLen);
  25078. args->idx += OPAQUE16_LEN;
  25079. if (cipherLen > MAX_NTRU_ENCRYPT_SZ) {
  25080. ERROR_OUT(NTRU_KEY_ERROR, exit_dcke);
  25081. }
  25082. if ((args->idx - args->begin) + cipherLen > size) {
  25083. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25084. }
  25085. if (NTRU_OK != ntru_crypto_ntru_decrypt(
  25086. (word16) ssl->buffers.key->length,
  25087. ssl->buffers.key->buffer, cipherLen,
  25088. input + args->idx, &plainLen,
  25089. ssl->arrays->preMasterSecret)) {
  25090. ERROR_OUT(NTRU_DECRYPT_ERROR, exit_dcke);
  25091. }
  25092. if (plainLen != SECRET_LEN) {
  25093. ERROR_OUT(NTRU_DECRYPT_ERROR, exit_dcke);
  25094. }
  25095. args->idx += cipherLen;
  25096. ssl->arrays->preMasterSz = plainLen;
  25097. break;
  25098. }
  25099. #endif /* HAVE_NTRU */
  25100. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25101. defined(HAVE_CURVE448)
  25102. case ecc_diffie_hellman_kea:
  25103. {
  25104. #ifdef HAVE_ECC
  25105. ecc_key* private_key = ssl->eccTempKey;
  25106. /* handle static private key */
  25107. if (ssl->specs.static_ecdh &&
  25108. ssl->ecdhCurveOID != ECC_X25519_OID &&
  25109. ssl->ecdhCurveOID != ECC_X448_OID) {
  25110. word16 keySz;
  25111. ssl->buffers.keyType = ecc_dsa_sa_algo;
  25112. ret = DecodePrivateKey(ssl, &keySz);
  25113. if (ret != 0) {
  25114. goto exit_dcke;
  25115. }
  25116. private_key = (ecc_key*)ssl->hsKey;
  25117. }
  25118. #endif
  25119. /* import peer ECC key */
  25120. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  25121. #ifdef WOLFSSL_EXTRA_ALERTS
  25122. SendAlert(ssl, alert_fatal, decode_error);
  25123. #endif
  25124. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25125. }
  25126. args->length = input[args->idx++];
  25127. if ((args->idx - args->begin) + args->length > size) {
  25128. #ifdef WOLFSSL_EXTRA_ALERTS
  25129. SendAlert(ssl, alert_fatal, decode_error);
  25130. #endif
  25131. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25132. }
  25133. #ifdef HAVE_CURVE25519
  25134. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25135. #ifdef HAVE_PK_CALLBACKS
  25136. /* if callback then use it for shared secret */
  25137. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  25138. break;
  25139. }
  25140. #endif
  25141. if (ssl->peerX25519Key == NULL) {
  25142. /* alloc/init on demand */
  25143. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25144. (void**)&ssl->peerX25519Key);
  25145. if (ret != 0) {
  25146. goto exit_dcke;
  25147. }
  25148. } else if (ssl->peerX25519KeyPresent) {
  25149. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25150. ssl->peerX25519Key);
  25151. ssl->peerX25519KeyPresent = 0;
  25152. if (ret != 0) {
  25153. goto exit_dcke;
  25154. }
  25155. }
  25156. if ((ret = wc_curve25519_check_public(
  25157. input + args->idx, args->length,
  25158. EC25519_LITTLE_ENDIAN)) != 0) {
  25159. #ifdef WOLFSSL_EXTRA_ALERTS
  25160. if (ret == BUFFER_E)
  25161. SendAlert(ssl, alert_fatal, decode_error);
  25162. else if (ret == ECC_OUT_OF_RANGE_E)
  25163. SendAlert(ssl, alert_fatal, bad_record_mac);
  25164. else {
  25165. SendAlert(ssl, alert_fatal,
  25166. illegal_parameter);
  25167. }
  25168. #endif
  25169. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  25170. }
  25171. if (wc_curve25519_import_public_ex(
  25172. input + args->idx, args->length,
  25173. ssl->peerX25519Key,
  25174. EC25519_LITTLE_ENDIAN)) {
  25175. #ifdef WOLFSSL_EXTRA_ALERTS
  25176. SendAlert(ssl, alert_fatal, illegal_parameter);
  25177. #endif
  25178. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  25179. }
  25180. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  25181. ssl->peerX25519KeyPresent = 1;
  25182. break;
  25183. }
  25184. #endif
  25185. #ifdef HAVE_CURVE448
  25186. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25187. #ifdef HAVE_PK_CALLBACKS
  25188. /* if callback then use it for shared secret */
  25189. if (ssl->ctx->X448SharedSecretCb != NULL) {
  25190. break;
  25191. }
  25192. #endif
  25193. if (ssl->peerX448Key == NULL) {
  25194. /* alloc/init on demand */
  25195. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  25196. (void**)&ssl->peerX448Key);
  25197. if (ret != 0) {
  25198. goto exit_dcke;
  25199. }
  25200. } else if (ssl->peerX448KeyPresent) {
  25201. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  25202. ssl->peerX448Key);
  25203. ssl->peerX448KeyPresent = 0;
  25204. if (ret != 0) {
  25205. goto exit_dcke;
  25206. }
  25207. }
  25208. if ((ret = wc_curve448_check_public(
  25209. input + args->idx, args->length,
  25210. EC448_LITTLE_ENDIAN)) != 0) {
  25211. #ifdef WOLFSSL_EXTRA_ALERTS
  25212. if (ret == BUFFER_E)
  25213. SendAlert(ssl, alert_fatal, decode_error);
  25214. else if (ret == ECC_OUT_OF_RANGE_E)
  25215. SendAlert(ssl, alert_fatal, bad_record_mac);
  25216. else {
  25217. SendAlert(ssl, alert_fatal,
  25218. illegal_parameter);
  25219. }
  25220. #endif
  25221. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  25222. }
  25223. if (wc_curve448_import_public_ex(
  25224. input + args->idx, args->length,
  25225. ssl->peerX448Key,
  25226. EC448_LITTLE_ENDIAN)) {
  25227. #ifdef WOLFSSL_EXTRA_ALERTS
  25228. SendAlert(ssl, alert_fatal, illegal_parameter);
  25229. #endif
  25230. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  25231. }
  25232. ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
  25233. ssl->peerX448KeyPresent = 1;
  25234. break;
  25235. }
  25236. #endif
  25237. #ifdef HAVE_ECC
  25238. #ifdef HAVE_PK_CALLBACKS
  25239. /* if callback then use it for shared secret */
  25240. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25241. break;
  25242. }
  25243. #endif
  25244. if (!ssl->specs.static_ecdh &&
  25245. ssl->eccTempKeyPresent == 0) {
  25246. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  25247. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  25248. }
  25249. if (ssl->peerEccKey == NULL) {
  25250. /* alloc/init on demand */
  25251. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  25252. (void**)&ssl->peerEccKey);
  25253. if (ret != 0) {
  25254. goto exit_dcke;
  25255. }
  25256. } else if (ssl->peerEccKeyPresent) {
  25257. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  25258. ssl->peerEccKey);
  25259. ssl->peerEccKeyPresent = 0;
  25260. if (ret != 0) {
  25261. goto exit_dcke;
  25262. }
  25263. }
  25264. if (wc_ecc_import_x963_ex(input + args->idx,
  25265. args->length, ssl->peerEccKey,
  25266. private_key->dp->id)) {
  25267. #ifdef WOLFSSL_EXTRA_ALERTS
  25268. SendAlert(ssl, alert_fatal, illegal_parameter);
  25269. #endif
  25270. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  25271. }
  25272. ssl->arrays->preMasterSz = private_key->dp->size;
  25273. ssl->peerEccKeyPresent = 1;
  25274. #endif /* HAVE_ECC */
  25275. break;
  25276. }
  25277. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25278. #ifndef NO_DH
  25279. case diffie_hellman_kea:
  25280. {
  25281. word16 clientPubSz;
  25282. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25283. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25284. }
  25285. ato16(input + args->idx, &clientPubSz);
  25286. args->idx += OPAQUE16_LEN;
  25287. if ((args->idx - args->begin) + clientPubSz > size) {
  25288. #ifdef WOLFSSL_EXTRA_ALERTS
  25289. SendAlert(ssl, alert_fatal, decode_error);
  25290. #endif
  25291. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25292. }
  25293. args->sigSz = clientPubSz;
  25294. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  25295. (void**)&ssl->buffers.serverDH_Key);
  25296. if (ret != 0) {
  25297. goto exit_dcke;
  25298. }
  25299. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  25300. ssl->buffers.serverDH_P.buffer,
  25301. ssl->buffers.serverDH_P.length,
  25302. ssl->buffers.serverDH_G.buffer,
  25303. ssl->buffers.serverDH_G.length);
  25304. /* set the max agree result size */
  25305. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  25306. break;
  25307. }
  25308. #endif /* !NO_DH */
  25309. #if !defined(NO_DH) && !defined(NO_PSK)
  25310. case dhe_psk_kea:
  25311. {
  25312. word16 clientSz;
  25313. /* Read in the PSK hint */
  25314. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25315. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25316. }
  25317. ato16(input + args->idx, &clientSz);
  25318. args->idx += OPAQUE16_LEN;
  25319. if (clientSz > MAX_PSK_ID_LEN) {
  25320. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  25321. }
  25322. if ((args->idx - args->begin) + clientSz > size) {
  25323. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25324. }
  25325. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  25326. clientSz);
  25327. args->idx += clientSz;
  25328. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  25329. /* Read in the DHE business */
  25330. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25331. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25332. }
  25333. ato16(input + args->idx, &clientSz);
  25334. args->idx += OPAQUE16_LEN;
  25335. if ((args->idx - args->begin) + clientSz > size) {
  25336. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25337. }
  25338. args->sigSz = clientSz;
  25339. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  25340. (void**)&ssl->buffers.serverDH_Key);
  25341. if (ret != 0) {
  25342. goto exit_dcke;
  25343. }
  25344. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  25345. ssl->buffers.serverDH_P.buffer,
  25346. ssl->buffers.serverDH_P.length,
  25347. ssl->buffers.serverDH_G.buffer,
  25348. ssl->buffers.serverDH_G.length);
  25349. break;
  25350. }
  25351. #endif /* !NO_DH && !NO_PSK */
  25352. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25353. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25354. case ecdhe_psk_kea:
  25355. {
  25356. word16 clientSz;
  25357. /* Read in the PSK hint */
  25358. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25359. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25360. }
  25361. ato16(input + args->idx, &clientSz);
  25362. args->idx += OPAQUE16_LEN;
  25363. if (clientSz > MAX_PSK_ID_LEN) {
  25364. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  25365. }
  25366. if ((args->idx - args->begin) + clientSz > size) {
  25367. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25368. }
  25369. XMEMCPY(ssl->arrays->client_identity,
  25370. input + args->idx, clientSz);
  25371. args->idx += clientSz;
  25372. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  25373. /* import peer ECC key */
  25374. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  25375. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25376. }
  25377. args->length = input[args->idx++];
  25378. if ((args->idx - args->begin) + args->length > size) {
  25379. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25380. }
  25381. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  25382. #ifdef HAVE_CURVE25519
  25383. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25384. #ifdef HAVE_PK_CALLBACKS
  25385. /* if callback then use it for shared secret */
  25386. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  25387. break;
  25388. }
  25389. #endif
  25390. if (ssl->eccTempKeyPresent == 0) {
  25391. WOLFSSL_MSG(
  25392. "X25519 ephemeral key not made correctly");
  25393. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  25394. }
  25395. if (ssl->peerX25519Key == NULL) {
  25396. /* alloc/init on demand */
  25397. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25398. (void**)&ssl->peerX25519Key);
  25399. if (ret != 0) {
  25400. goto exit_dcke;
  25401. }
  25402. } else if (ssl->peerX25519KeyPresent) {
  25403. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25404. ssl->peerX25519Key);
  25405. ssl->peerX25519KeyPresent = 0;
  25406. if (ret != 0) {
  25407. goto exit_dcke;
  25408. }
  25409. }
  25410. if ((ret = wc_curve25519_check_public(
  25411. input + args->idx, args->length,
  25412. EC25519_LITTLE_ENDIAN)) != 0) {
  25413. #ifdef WOLFSSL_EXTRA_ALERTS
  25414. if (ret == BUFFER_E)
  25415. SendAlert(ssl, alert_fatal, decode_error);
  25416. else if (ret == ECC_OUT_OF_RANGE_E)
  25417. SendAlert(ssl, alert_fatal, bad_record_mac);
  25418. else {
  25419. SendAlert(ssl, alert_fatal,
  25420. illegal_parameter);
  25421. }
  25422. #endif
  25423. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  25424. }
  25425. if (wc_curve25519_import_public_ex(
  25426. input + args->idx, args->length,
  25427. ssl->peerX25519Key,
  25428. EC25519_LITTLE_ENDIAN)) {
  25429. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  25430. }
  25431. ssl->peerX25519KeyPresent = 1;
  25432. break;
  25433. }
  25434. #endif
  25435. #ifdef HAVE_CURVE448
  25436. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25437. #ifdef HAVE_PK_CALLBACKS
  25438. /* if callback then use it for shared secret */
  25439. if (ssl->ctx->X448SharedSecretCb != NULL) {
  25440. break;
  25441. }
  25442. #endif
  25443. if (ssl->eccTempKeyPresent == 0) {
  25444. WOLFSSL_MSG(
  25445. "X448 ephemeral key not made correctly");
  25446. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  25447. }
  25448. if (ssl->peerX448Key == NULL) {
  25449. /* alloc/init on demand */
  25450. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  25451. (void**)&ssl->peerX448Key);
  25452. if (ret != 0) {
  25453. goto exit_dcke;
  25454. }
  25455. } else if (ssl->peerX448KeyPresent) {
  25456. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  25457. ssl->peerX448Key);
  25458. ssl->peerX448KeyPresent = 0;
  25459. if (ret != 0) {
  25460. goto exit_dcke;
  25461. }
  25462. }
  25463. if ((ret = wc_curve448_check_public(
  25464. input + args->idx, args->length,
  25465. EC448_LITTLE_ENDIAN)) != 0) {
  25466. #ifdef WOLFSSL_EXTRA_ALERTS
  25467. if (ret == BUFFER_E)
  25468. SendAlert(ssl, alert_fatal, decode_error);
  25469. else if (ret == ECC_OUT_OF_RANGE_E)
  25470. SendAlert(ssl, alert_fatal, bad_record_mac);
  25471. else {
  25472. SendAlert(ssl, alert_fatal,
  25473. illegal_parameter);
  25474. }
  25475. #endif
  25476. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  25477. }
  25478. if (wc_curve448_import_public_ex(
  25479. input + args->idx, args->length,
  25480. ssl->peerX448Key,
  25481. EC448_LITTLE_ENDIAN)) {
  25482. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  25483. }
  25484. ssl->peerX448KeyPresent = 1;
  25485. break;
  25486. }
  25487. #endif
  25488. #ifdef HAVE_PK_CALLBACKS
  25489. /* if callback then use it for shared secret */
  25490. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25491. break;
  25492. }
  25493. #endif
  25494. if (ssl->eccTempKeyPresent == 0) {
  25495. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  25496. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  25497. }
  25498. if (ssl->peerEccKey == NULL) {
  25499. /* alloc/init on demand */
  25500. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  25501. (void**)&ssl->peerEccKey);
  25502. if (ret != 0) {
  25503. goto exit_dcke;
  25504. }
  25505. }
  25506. else if (ssl->peerEccKeyPresent) {
  25507. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  25508. ssl->peerEccKey);
  25509. ssl->peerEccKeyPresent = 0;
  25510. if (ret != 0) {
  25511. goto exit_dcke;
  25512. }
  25513. }
  25514. if (wc_ecc_import_x963_ex(input + args->idx,
  25515. args->length, ssl->peerEccKey,
  25516. ssl->eccTempKey->dp->id)) {
  25517. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  25518. }
  25519. ssl->peerEccKeyPresent = 1;
  25520. break;
  25521. }
  25522. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  25523. default:
  25524. ret = BAD_KEA_TYPE_E;
  25525. } /* switch (ssl->specs.kea) */
  25526. /* Check for error */
  25527. if (ret != 0) {
  25528. goto exit_dcke;
  25529. }
  25530. /* Advance state and proceed */
  25531. ssl->options.asyncState = TLS_ASYNC_DO;
  25532. } /* TLS_ASYNC_BUILD */
  25533. FALL_THROUGH;
  25534. case TLS_ASYNC_DO:
  25535. {
  25536. switch (ssl->specs.kea) {
  25537. #ifndef NO_RSA
  25538. case rsa_kea:
  25539. {
  25540. RsaKey* key = (RsaKey*)ssl->hsKey;
  25541. ret = RsaDec(ssl,
  25542. input + args->idx,
  25543. args->length,
  25544. &args->output,
  25545. &args->sigSz,
  25546. key,
  25547. #ifdef HAVE_PK_CALLBACKS
  25548. ssl->buffers.key
  25549. #else
  25550. NULL
  25551. #endif
  25552. );
  25553. /* Errors that can occur here that should be
  25554. * indistinguishable:
  25555. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  25556. */
  25557. #ifdef WOLFSSL_ASYNC_CRYPT
  25558. if (ret == WC_PENDING_E)
  25559. goto exit_dcke;
  25560. #endif
  25561. if (ret == BAD_FUNC_ARG)
  25562. goto exit_dcke;
  25563. args->lastErr = ret - (SECRET_LEN - args->sigSz);
  25564. ret = 0;
  25565. break;
  25566. } /* rsa_kea */
  25567. #endif /* !NO_RSA */
  25568. #ifndef NO_PSK
  25569. case psk_kea:
  25570. {
  25571. break;
  25572. }
  25573. #endif /* !NO_PSK */
  25574. #ifdef HAVE_NTRU
  25575. case ntru_kea:
  25576. {
  25577. break;
  25578. }
  25579. #endif /* HAVE_NTRU */
  25580. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25581. defined(HAVE_CURVE448)
  25582. case ecc_diffie_hellman_kea:
  25583. {
  25584. void* private_key = ssl->eccTempKey;
  25585. (void)private_key;
  25586. #ifdef HAVE_CURVE25519
  25587. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25588. ret = X25519SharedSecret(ssl,
  25589. (curve25519_key*)private_key,
  25590. ssl->peerX25519Key,
  25591. input + args->idx, &args->length,
  25592. ssl->arrays->preMasterSecret,
  25593. &ssl->arrays->preMasterSz,
  25594. WOLFSSL_SERVER_END
  25595. );
  25596. break;
  25597. }
  25598. #endif
  25599. #ifdef HAVE_CURVE448
  25600. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25601. ret = X448SharedSecret(ssl,
  25602. (curve448_key*)private_key,
  25603. ssl->peerX448Key,
  25604. input + args->idx, &args->length,
  25605. ssl->arrays->preMasterSecret,
  25606. &ssl->arrays->preMasterSz,
  25607. WOLFSSL_SERVER_END
  25608. );
  25609. break;
  25610. }
  25611. #endif
  25612. #ifdef HAVE_ECC
  25613. if (ssl->specs.static_ecdh) {
  25614. private_key = ssl->hsKey;
  25615. }
  25616. /* Generate shared secret */
  25617. ret = EccSharedSecret(ssl,
  25618. (ecc_key*)private_key, ssl->peerEccKey,
  25619. input + args->idx, &args->length,
  25620. ssl->arrays->preMasterSecret,
  25621. &ssl->arrays->preMasterSz,
  25622. WOLFSSL_SERVER_END
  25623. );
  25624. #ifdef WOLFSSL_ASYNC_CRYPT
  25625. if (ret != WC_PENDING_E)
  25626. #endif
  25627. {
  25628. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  25629. (void**)&ssl->peerEccKey);
  25630. ssl->peerEccKeyPresent = 0;
  25631. }
  25632. #endif
  25633. break;
  25634. }
  25635. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25636. #ifndef NO_DH
  25637. case diffie_hellman_kea:
  25638. {
  25639. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  25640. ssl->buffers.serverDH_Priv.buffer,
  25641. ssl->buffers.serverDH_Priv.length,
  25642. input + args->idx,
  25643. (word16)args->sigSz,
  25644. ssl->arrays->preMasterSecret,
  25645. &ssl->arrays->preMasterSz);
  25646. break;
  25647. }
  25648. #endif /* !NO_DH */
  25649. #if !defined(NO_DH) && !defined(NO_PSK)
  25650. case dhe_psk_kea:
  25651. {
  25652. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  25653. ssl->buffers.serverDH_Priv.buffer,
  25654. ssl->buffers.serverDH_Priv.length,
  25655. input + args->idx,
  25656. (word16)args->sigSz,
  25657. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25658. &ssl->arrays->preMasterSz);
  25659. break;
  25660. }
  25661. #endif /* !NO_DH && !NO_PSK */
  25662. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25663. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25664. case ecdhe_psk_kea:
  25665. {
  25666. #ifdef HAVE_CURVE25519
  25667. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25668. ret = X25519SharedSecret(ssl,
  25669. (curve25519_key*)ssl->eccTempKey,
  25670. ssl->peerX25519Key,
  25671. input + args->idx, &args->length,
  25672. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25673. &args->sigSz,
  25674. WOLFSSL_SERVER_END
  25675. );
  25676. #ifdef WOLFSSL_ASYNC_CRYPT
  25677. if (ret != WC_PENDING_E)
  25678. #endif
  25679. {
  25680. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25681. (void**)&ssl->peerX25519Key);
  25682. ssl->peerX25519KeyPresent = 0;
  25683. }
  25684. break;
  25685. }
  25686. #endif
  25687. #ifdef HAVE_CURVE448
  25688. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25689. ret = X448SharedSecret(ssl,
  25690. (curve448_key*)ssl->eccTempKey,
  25691. ssl->peerX448Key,
  25692. input + args->idx, &args->length,
  25693. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25694. &args->sigSz,
  25695. WOLFSSL_SERVER_END
  25696. );
  25697. #ifdef WOLFSSL_ASYNC_CRYPT
  25698. if (ret != WC_PENDING_E)
  25699. #endif
  25700. {
  25701. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  25702. (void**)&ssl->peerX448Key);
  25703. ssl->peerX448KeyPresent = 0;
  25704. }
  25705. break;
  25706. }
  25707. #endif
  25708. /* Generate shared secret */
  25709. ret = EccSharedSecret(ssl,
  25710. ssl->eccTempKey, ssl->peerEccKey,
  25711. input + args->idx, &args->length,
  25712. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25713. &args->sigSz,
  25714. WOLFSSL_SERVER_END
  25715. );
  25716. if (!ssl->specs.static_ecdh
  25717. #ifdef WOLFSSL_ASYNC_CRYPT
  25718. && ret != WC_PENDING_E
  25719. #endif
  25720. ) {
  25721. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  25722. (void**)&ssl->peerEccKey);
  25723. ssl->peerEccKeyPresent = 0;
  25724. }
  25725. break;
  25726. }
  25727. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  25728. default:
  25729. ret = BAD_KEA_TYPE_E;
  25730. } /* switch (ssl->specs.kea) */
  25731. /* Check for error */
  25732. if (ret != 0) {
  25733. goto exit_dcke;
  25734. }
  25735. /* Advance state and proceed */
  25736. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  25737. } /* TLS_ASYNC_DO */
  25738. FALL_THROUGH;
  25739. case TLS_ASYNC_VERIFY:
  25740. {
  25741. switch (ssl->specs.kea) {
  25742. #ifndef NO_RSA
  25743. case rsa_kea:
  25744. {
  25745. byte mask;
  25746. int i;
  25747. /* Add the signature length to idx */
  25748. args->idx += args->length;
  25749. #ifdef DEBUG_WOLFSSL
  25750. /* check version (debug warning message only) */
  25751. if (args->output != NULL) {
  25752. if (args->output[0] != ssl->chVersion.major ||
  25753. args->output[1] != ssl->chVersion.minor) {
  25754. WOLFSSL_MSG("preMasterSecret version mismatch");
  25755. }
  25756. }
  25757. #endif
  25758. /* RFC5246 7.4.7.1:
  25759. * Treat incorrectly formatted message blocks and/or
  25760. * mismatched version numbers in a manner
  25761. * indistinguishable from correctly formatted RSA blocks
  25762. */
  25763. ret = args->lastErr;
  25764. args->lastErr = 0; /* reset */
  25765. /* On error 'ret' will be negative - top bit set */
  25766. mask = ((unsigned int)ret >>
  25767. ((sizeof(ret) * 8) - 1)) - 1;
  25768. /* build PreMasterSecret */
  25769. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  25770. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  25771. if (args->output != NULL) {
  25772. /* Use random secret on error */
  25773. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  25774. ssl->arrays->preMasterSecret[i] =
  25775. ctMaskSel(mask, args->output[i],
  25776. ssl->arrays->preMasterSecret[i]);
  25777. }
  25778. }
  25779. /* preMasterSecret has RNG and version set
  25780. * return proper length and ignore error
  25781. * error will be caught as decryption error
  25782. */
  25783. args->sigSz = SECRET_LEN;
  25784. ret = 0;
  25785. break;
  25786. } /* rsa_kea */
  25787. #endif /* !NO_RSA */
  25788. #ifndef NO_PSK
  25789. case psk_kea:
  25790. {
  25791. break;
  25792. }
  25793. #endif /* !NO_PSK */
  25794. #ifdef HAVE_NTRU
  25795. case ntru_kea:
  25796. {
  25797. break;
  25798. }
  25799. #endif /* HAVE_NTRU */
  25800. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25801. defined(HAVE_CURVE448)
  25802. case ecc_diffie_hellman_kea:
  25803. {
  25804. /* skip past the imported peer key */
  25805. args->idx += args->length;
  25806. break;
  25807. }
  25808. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25809. #ifndef NO_DH
  25810. case diffie_hellman_kea:
  25811. {
  25812. args->idx += (word16)args->sigSz;
  25813. break;
  25814. }
  25815. #endif /* !NO_DH */
  25816. #if !defined(NO_DH) && !defined(NO_PSK)
  25817. case dhe_psk_kea:
  25818. {
  25819. byte* pms = ssl->arrays->preMasterSecret;
  25820. word16 clientSz = (word16)args->sigSz;
  25821. args->idx += clientSz;
  25822. c16toa((word16)ssl->arrays->preMasterSz, pms);
  25823. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  25824. pms += ssl->arrays->preMasterSz;
  25825. /* Use the PSK hint to look up the PSK and add it to the
  25826. * preMasterSecret here. */
  25827. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  25828. ssl->arrays->client_identity, ssl->arrays->psk_key,
  25829. MAX_PSK_KEY_LEN);
  25830. if (ssl->arrays->psk_keySz == 0 ||
  25831. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  25832. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  25833. }
  25834. c16toa((word16) ssl->arrays->psk_keySz, pms);
  25835. pms += OPAQUE16_LEN;
  25836. XMEMCPY(pms, ssl->arrays->psk_key,
  25837. ssl->arrays->psk_keySz);
  25838. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
  25839. OPAQUE16_LEN;
  25840. break;
  25841. }
  25842. #endif /* !NO_DH && !NO_PSK */
  25843. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25844. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25845. case ecdhe_psk_kea:
  25846. {
  25847. byte* pms = ssl->arrays->preMasterSecret;
  25848. word16 clientSz = (word16)args->sigSz;
  25849. /* skip past the imported peer key */
  25850. args->idx += args->length;
  25851. /* Add preMasterSecret */
  25852. c16toa(clientSz, pms);
  25853. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  25854. pms += ssl->arrays->preMasterSz;
  25855. /* Use the PSK hint to look up the PSK and add it to the
  25856. * preMasterSecret here. */
  25857. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  25858. ssl->arrays->client_identity, ssl->arrays->psk_key,
  25859. MAX_PSK_KEY_LEN);
  25860. if (ssl->arrays->psk_keySz == 0 ||
  25861. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  25862. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  25863. }
  25864. c16toa((word16) ssl->arrays->psk_keySz, pms);
  25865. pms += OPAQUE16_LEN;
  25866. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25867. ssl->arrays->preMasterSz +=
  25868. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  25869. break;
  25870. }
  25871. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  25872. default:
  25873. ret = BAD_KEA_TYPE_E;
  25874. } /* switch (ssl->specs.kea) */
  25875. /* Check for error */
  25876. if (ret != 0) {
  25877. goto exit_dcke;
  25878. }
  25879. /* Advance state and proceed */
  25880. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  25881. } /* TLS_ASYNC_VERIFY */
  25882. FALL_THROUGH;
  25883. case TLS_ASYNC_FINALIZE:
  25884. {
  25885. if (IsEncryptionOn(ssl, 0)) {
  25886. args->idx += ssl->keys.padSz;
  25887. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  25888. if (ssl->options.startedETMRead)
  25889. args->idx += MacSize(ssl);
  25890. #endif
  25891. }
  25892. #ifdef HAVE_QSH
  25893. word16 name;
  25894. if (ssl->options.haveQSH) {
  25895. /* extension name */
  25896. ato16(input + args->idx, &name);
  25897. args->idx += OPAQUE16_LEN;
  25898. if (name == TLSX_QUANTUM_SAFE_HYBRID) {
  25899. int qshSz;
  25900. /* if qshSz is larger than 0 it is the
  25901. length of buffer used */
  25902. if ((qshSz = TLSX_QSHCipher_Parse(ssl,
  25903. input + args->idx,
  25904. size - args->idx + args->begin, 1)) < 0) {
  25905. ERROR_OUT(qshSz, exit_dcke);
  25906. }
  25907. args->idx += qshSz;
  25908. }
  25909. else {
  25910. /* unknown extension sent client ignored handshake */
  25911. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  25912. }
  25913. }
  25914. #endif /* HAVE_QSH */
  25915. ret = MakeMasterSecret(ssl);
  25916. /* Check for error */
  25917. if (ret != 0) {
  25918. goto exit_dcke;
  25919. }
  25920. /* Advance state and proceed */
  25921. ssl->options.asyncState = TLS_ASYNC_END;
  25922. } /* TLS_ASYNC_FINALIZE */
  25923. FALL_THROUGH;
  25924. case TLS_ASYNC_END:
  25925. {
  25926. /* Set final index */
  25927. *inOutIdx = args->idx;
  25928. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  25929. #ifndef NO_CERTS
  25930. if (ssl->options.verifyPeer) {
  25931. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  25932. }
  25933. #endif
  25934. break;
  25935. } /* TLS_ASYNC_END */
  25936. default:
  25937. ret = INPUT_CASE_ERROR;
  25938. } /* switch(ssl->options.asyncState) */
  25939. exit_dcke:
  25940. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  25941. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  25942. #ifdef WOLFSSL_ASYNC_CRYPT
  25943. /* Handle async operation */
  25944. if (ret == WC_PENDING_E) {
  25945. /* Mark message as not received so it can process again */
  25946. ssl->msgsReceived.got_client_key_exchange = 0;
  25947. return ret;
  25948. }
  25949. #endif /* WOLFSSL_ASYNC_CRYPT */
  25950. /* Cleanup PMS */
  25951. if (ssl->arrays->preMasterSecret != NULL) {
  25952. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  25953. }
  25954. ssl->arrays->preMasterSz = 0;
  25955. /* Final cleanup */
  25956. FreeDckeArgs(ssl, args);
  25957. FreeKeyExchange(ssl);
  25958. return ret;
  25959. }
  25960. #endif /* !WOLFSSL_NO_TLS12 */
  25961. #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
  25962. defined(WOLFSSL_HAPROXY)
  25963. int SNI_Callback(WOLFSSL* ssl)
  25964. {
  25965. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  25966. * when SNI is received. Call it now if exists */
  25967. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  25968. WOLFSSL_MSG("Calling custom sni callback");
  25969. if(ssl->ctx->sniRecvCb(ssl, NULL, ssl->ctx->sniRecvCbArg)
  25970. == alert_fatal) {
  25971. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  25972. SendAlert(ssl, alert_fatal, unrecognized_name);
  25973. return FATAL_ERROR;
  25974. }
  25975. }
  25976. return 0;
  25977. }
  25978. #endif /* OPENSSL_ALL || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
  25979. #endif /* NO_WOLFSSL_SERVER */
  25980. #ifdef WOLFSSL_ASYNC_CRYPT
  25981. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  25982. {
  25983. int ret = 0;
  25984. WC_ASYNC_DEV* asyncDev;
  25985. WOLF_EVENT* event;
  25986. if (ssl == NULL) {
  25987. return BAD_FUNC_ARG;
  25988. }
  25989. /* check for pending async */
  25990. asyncDev = ssl->async.dev;
  25991. if (asyncDev) {
  25992. /* grab event pointer */
  25993. event = &asyncDev->event;
  25994. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  25995. if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) {
  25996. /* advance key share state if doesn't need called again */
  25997. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  25998. (*state)++;
  25999. }
  26000. /* clear event */
  26001. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  26002. /* clear async dev */
  26003. ssl->async.dev = NULL;
  26004. }
  26005. }
  26006. else {
  26007. ret = WC_NOT_PENDING_E;
  26008. }
  26009. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  26010. return ret;
  26011. }
  26012. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  26013. {
  26014. int ret;
  26015. WOLF_EVENT* event;
  26016. if (ssl == NULL || asyncDev == NULL) {
  26017. return BAD_FUNC_ARG;
  26018. }
  26019. /* grab event pointer */
  26020. event = &asyncDev->event;
  26021. /* init event */
  26022. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  26023. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  26024. return ret;
  26025. }
  26026. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  26027. {
  26028. int ret;
  26029. WOLF_EVENT* event;
  26030. if (ssl == NULL || asyncDev == NULL) {
  26031. return BAD_FUNC_ARG;
  26032. }
  26033. /* grab event pointer */
  26034. event = &asyncDev->event;
  26035. /* store reference to active async operation */
  26036. ssl->async.dev = asyncDev;
  26037. /* place event into queue */
  26038. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  26039. /* success means return WC_PENDING_E */
  26040. if (ret == 0) {
  26041. ret = WC_PENDING_E;
  26042. }
  26043. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  26044. return ret;
  26045. }
  26046. #endif /* WOLFSSL_ASYNC_CRYPT */
  26047. /* return the max record size */
  26048. int wolfSSL_GetMaxRecordSize(WOLFSSL* ssl, int maxFragment)
  26049. {
  26050. (void) ssl; /* Avoid compiler warnings */
  26051. if (maxFragment > MAX_RECORD_SIZE) {
  26052. maxFragment = MAX_RECORD_SIZE;
  26053. }
  26054. #ifdef HAVE_MAX_FRAGMENT
  26055. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  26056. maxFragment = ssl->max_fragment;
  26057. }
  26058. #endif /* HAVE_MAX_FRAGMENT */
  26059. #ifdef WOLFSSL_DTLS
  26060. if (IsDtlsNotSctpMode(ssl) && (maxFragment > MAX_UDP_SIZE)) {
  26061. maxFragment = MAX_UDP_SIZE;
  26062. }
  26063. #endif
  26064. return maxFragment;
  26065. }
  26066. #undef ERROR_OUT
  26067. #endif /* WOLFCRYPT_ONLY */